diff --git a/rskj-core/src/main/java/co/rsk/rpc/Web3EthModule.java b/rskj-core/src/main/java/co/rsk/rpc/Web3EthModule.java index 71e50475bb7..19f7088b236 100644 --- a/rskj-core/src/main/java/co/rsk/rpc/Web3EthModule.java +++ b/rskj-core/src/main/java/co/rsk/rpc/Web3EthModule.java @@ -47,8 +47,11 @@ default String eth_sign(HexAddressParam addr, HexDataParam data) { return getEthModule().sign(addr.getAddress().toHexString(), data.getAsHexString()); } - default String eth_call(CallArgumentsParam args, BlockIdentifierParam bnOrId) { - return getEthModule().call(args, bnOrId); + default String eth_call(CallArgumentsParam args, BlockRefParam blockRefParam) { + if (blockRefParam.getIdentifier() != null) { + return getEthModule().call(args, new BlockIdentifierParam(blockRefParam.getIdentifier())); + } + return eth_call(args, blockRefParam.getInputs()); } default Map eth_bridgeState() throws Exception { @@ -78,7 +81,7 @@ default String eth_chainId() { String eth_blockNumber(); - String eth_call(CallArgumentsParam args, Map blockRef) throws Exception; // NOSONAR + String eth_call(CallArgumentsParam args, Map blockRef); // NOSONAR String eth_getBalance(HexAddressParam address, BlockRefParam blockRefParam) throws Exception; diff --git a/rskj-core/src/main/java/org/ethereum/rpc/Web3Impl.java b/rskj-core/src/main/java/org/ethereum/rpc/Web3Impl.java index c43896fbb59..e91d9d1eca9 100644 --- a/rskj-core/src/main/java/org/ethereum/rpc/Web3Impl.java +++ b/rskj-core/src/main/java/org/ethereum/rpc/Web3Impl.java @@ -403,7 +403,7 @@ public String eth_blockNumber() { @Override public String eth_call(CallArgumentsParam args, Map inputs) { - return invokeByBlockRef(inputs, blockNumber -> this.eth_call(args, new BlockIdentifierParam(blockNumber))); + return invokeByBlockRef(inputs, blockNumber -> getEthModule().call(args, new BlockIdentifierParam(blockNumber))); } @Override diff --git a/rskj-core/src/main/java/org/ethereum/vm/PrecompiledContracts.java b/rskj-core/src/main/java/org/ethereum/vm/PrecompiledContracts.java index b8533b2a717..f38befbdc7d 100644 --- a/rskj-core/src/main/java/org/ethereum/vm/PrecompiledContracts.java +++ b/rskj-core/src/main/java/org/ethereum/vm/PrecompiledContracts.java @@ -437,6 +437,10 @@ public byte[] execute(byte[] data) { int expLen = parseLen(data, EXPONENT); int modLen = parseLen(data, MODULUS); + if (baseLen == 0 && modLen == 0) { + return ByteUtil.leftPadBytes(ByteUtil.EMPTY_BYTE_ARRAY, modLen); + } + int expOffset = Math.addExact(ARGS_OFFSET, baseLen); int modOffset = Math.addExact(expOffset, expLen); diff --git a/rskj-core/src/test/java/org/ethereum/rpc/Web3ImplTest.java b/rskj-core/src/test/java/org/ethereum/rpc/Web3ImplTest.java index 93972addb83..f538ce0f2fb 100644 --- a/rskj-core/src/test/java/org/ethereum/rpc/Web3ImplTest.java +++ b/rskj-core/src/test/java/org/ethereum/rpc/Web3ImplTest.java @@ -1950,7 +1950,7 @@ function greet(string memory param) public pure returns (string memory) { argsForCall.setTo(HexUtils.toJsonHex(tx.getContractAddress().getBytes())); argsForCall.setData("0xead710c40000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000"); - String result = web3.eth_call(TransactionFactoryHelper.toCallArgumentsParam(argsForCall), new BlockIdentifierParam("latest")); + String result = web3.eth_call(TransactionFactoryHelper.toCallArgumentsParam(argsForCall), new BlockRefParam("latest")); assertEquals("0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000", result); } @@ -1997,7 +1997,7 @@ function greet(string memory param) public pure returns (string memory) { argsForCall.setTo(HexUtils.toJsonHex(tx.getContractAddress().getBytes())); argsForCall.setData("0xead710c40000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000"); - String result = web3.eth_call(TransactionFactoryHelper.toCallArgumentsParam(argsForCall), new BlockIdentifierParam("latest")); + String result = web3.eth_call(TransactionFactoryHelper.toCallArgumentsParam(argsForCall), new BlockRefParam("latest")); assertEquals("0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000", result); } @@ -2030,7 +2030,7 @@ void callNoneContractReturn() { argsForCall.setTo(HexUtils.toUnformattedJsonHex(tx.getContractAddress().getBytes())); argsForCall.setData(HexUtils.toUnformattedJsonHex(func.encode())); - String result = web3.eth_call(TransactionFactoryHelper.toCallArgumentsParam(argsForCall), new BlockIdentifierParam("latest")); + String result = web3.eth_call(TransactionFactoryHelper.toCallArgumentsParam(argsForCall), new BlockRefParam("latest")); assertEquals("0x", result); } @@ -2612,7 +2612,7 @@ void callWithoutReturn() { argsForCall.setTo(HexUtils.toJsonHex(tx.getContractAddress().getBytes())); argsForCall.setData(HexUtils.toJsonHex(noreturn.functions.get("noreturn").encodeSignature())); - String result = web3.eth_call(TransactionFactoryHelper.toCallArgumentsParam(argsForCall), new BlockIdentifierParam("latest")); + String result = web3.eth_call(TransactionFactoryHelper.toCallArgumentsParam(argsForCall), new BlockRefParam("latest")); Assertions.assertEquals("0x", result); }