There is no overload generated to send Ether into the smart contract function call, even though the
contract function is marked payable.
Consider this solidity function
function sendEthWithContract(address payable _recipient) external payable {
require(msg.value > 0);
_recipient.transfer(msg.value);
}
Compile the contract and generate the Java wrapper. It generates
public RemoteFunctionCall<TransactionReceipt> sendEthWithContract(String _recipient) {
final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(
FUNC_SENDETHWITHCONTRACT,
Arrays.<Type>asList(new org.web3j.abi.datatypes.Address(160, _recipient)),
Collections.<TypeReference<?>>emptyList());
return executeRemoteCallTransaction(function);
}
This is wrong as you have to generate an overload that passes Eth all the way down to the execution of the
transaction. This is clear as the function is marked as payable.
Instead it forwards the execution of the transaction to
protected TransactionReceipt executeTransaction(Function function)
throws IOException, TransactionException {
return executeTransaction(function, BigInteger.ZERO);
}
This is clearly wrong.
Have the same issue;
Known issue
the wrapper generator is expecting "payable: true" rather than "stateMutability: payable" to correctly generate wrapper functions for payable function
in the meantime here is an example of a function which will take msg.value and encode it correctly
public RemoteFunctionCall<TransactionReceipt> newGreeting(String _greeting, BigInteger weiValue) {
final Function function = new Function(
FUNC_NEWGREETING,
Arrays.<Type>asList(new org.web3j.abi.datatypes.Utf8String(_greeting)),
Collections.<TypeReference<?>>emptyList());
return executeRemoteCallTransaction(function, weiValue);
}
you should just be able to add the weiValue as a function parameter
and then add it to the executeRemoteCallTransaction parameters
have the same issue, see https://github.com/web3j/web3j/issues/1306
Here is the line that produces the bug https://github.com/web3j/web3j/blob/87d2446324423c0109fc856b1b0026b4e1d85e23/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java#L1466
Most helpful comment
Known issue
the wrapper generator is expecting "payable: true" rather than "stateMutability: payable" to correctly generate wrapper functions for payable function
in the meantime here is an example of a function which will take
msg.valueand encode it correctlyyou should just be able to add the
weiValueas a function parameterand then add it to the
executeRemoteCallTransactionparameters