Coverage Summary for Class: BlockHeaderContractMethod (co.rsk.pcc.blockheader)
Class |
Class, %
|
Method, %
|
Line, %
|
BlockHeaderContractMethod |
0%
(0/1)
|
0%
(0/5)
|
0%
(0/13)
|
1 package co.rsk.pcc.blockheader;
2
3 import co.rsk.pcc.ExecutionEnvironment;
4 import co.rsk.pcc.NativeMethod;
5 import co.rsk.pcc.exception.NativeContractIllegalArgumentException;
6 import org.ethereum.core.Block;
7 import org.ethereum.util.ByteUtil;
8
9 import java.math.BigInteger;
10 import java.util.Optional;
11
12 /**
13 * Base class of BlockHeader contract methods to provide common functionality to all methods.
14 *
15 * @author Diego Masini
16 */
17 public abstract class BlockHeaderContractMethod extends NativeMethod {
18 private final BlockAccessor blockAccessor;
19
20 public BlockHeaderContractMethod(ExecutionEnvironment executionEnvironment, BlockAccessor blockAccessor) {
21 super(executionEnvironment);
22 this.blockAccessor = blockAccessor;
23 }
24
25 @Override
26 public Object execute(Object[] arguments) throws NativeContractIllegalArgumentException {
27 short blockDepth;
28 try {
29 blockDepth = ((BigInteger) arguments[0]).shortValueExact();
30 } catch (ArithmeticException e) {
31 return ByteUtil.EMPTY_BYTE_ARRAY;
32 }
33
34 Optional<Block> block = blockAccessor.getBlock(blockDepth, getExecutionEnvironment());
35 if (block.isPresent()) {
36 return internalExecute(block.get(), arguments);
37 }
38
39 return ByteUtil.EMPTY_BYTE_ARRAY;
40 }
41
42 protected abstract Object internalExecute(Block block, Object[] arguments) throws NativeContractIllegalArgumentException;
43
44 @Override
45 public boolean isEnabled() {
46 return true;
47 }
48
49 @Override
50 public boolean onlyAllowsLocalCalls() {
51 return false;
52 }
53
54 @Override
55 public long getGas(Object[] parsedArguments, byte[] originalData) {
56 return 4000L + super.getGas(parsedArguments, originalData);
57 }
58 }