hyperledger-web3j / web3j

Lightweight Java and Android library for integration with Ethereum clients
https://www.web3labs.com/web3j-sdk
Other
5.12k stars 1.69k forks source link

Java wrapper generator does not properly handle payable functions #1268

Open degloff opened 4 years ago

degloff commented 4 years ago

Java wrapper generator for smart contract does not properly handle payable functions

There is no overload generated to send Ether into the smart contract function call, even though the contract function is marked payable.

Steps To Reproduce

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.

Environment

mr13tech commented 4 years ago

Have the same issue;

iikirilov-wmt commented 4 years ago

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

andre77 commented 3 years ago

have the same issue, see https://github.com/web3j/web3j/issues/1306

oscarguindzberg commented 3 years ago

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

sorinGrecu commented 3 years ago

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

Thanks for this insight.

Any ETA on a fix for this so we don't have to manually apply the workaround?

ertra commented 2 years ago

pls any idea, when this will be merged and released please?

thanks tomas

conor10 commented 2 years ago

This issue has been mentioned on Web3 Labs Community. There might be relevant details there:

https://community.web3labs.com/t/how-to-call-a-safemint-and-send-ether-at-the-same-time-to-pay-the-mint-nft-price/188/2

jacques-martin10 commented 2 years ago

impacted today, subscribing to potential solution in https://github.com/web3j/web3j/pull/1647

jacques-martin10 commented 2 years ago

https://github.com/web3j/web3j/pull/1647 has been merged, this issue ccan be closed.