当前位置: 首页 > 知识库问答 >
问题:

如何使用web3j java签署erc20令牌事务

丌官开宇
2023-03-14

我想将erc20代币从一个账户转移到另一个账户。我知道我可以使用智能合约包装类的Transfer或transferFrom函数。但在我的情况下,erc20代币交易需要在客户端签名。并且没有办法在智能合约包装函数中传递signedTransaction。那么,如何在java中使用web3j签署erc20代币交易并执行交易。

我发现了这个类似的问题。但是,它的代码不是用java编写的。我不知道如何在ABI中编码传输函数。使用web3发送ERC20令牌

共有1个答案

何宏博
2023-03-14

有点晚了,但也许会有人:

您可以尝试以下操作:

import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.Address;
import org.web3j.abi.datatypes.Bool;
import org.web3j.abi.datatypes.generated.Uint256;
import org.web3j.crypto.Credentials;
import org.web3j.crypto.RawTransaction;
import org.web3j.protocol.core.methods.response.EthGetTransactionCount;
import org.web3j.utils.Convert;
import org.web3j.utils.Numeric;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.Function;
    // create credentials
    String privateKeyHexValue = Numeric.toHexString(privateKey.data());
    Credentials credentials = Credentials.create(privateKeyHexValue);
    
    // get the next available nonce
    EthGetTransactionCount ethGetTransactionCount = web3.ethGetTransactionCount(credentials.getAddress(), DefaultBlockParameterName.LATEST).send();
    BigInteger nonce = ethGetTransactionCount.getTransactionCount();
    
    // Value to transfer (ERC20 token)
    BigInteger balance = Convert.toWei("1", Convert.Unit.ETHER).toBigInteger();
    
    // create transfer function
    Function function = transfer(dstAddress, balance);
    String encodedFunction = FunctionEncoder.encode(function);
    
    // Gas Parameters
    BigInteger gasLimit = BigInteger.valueOf(71000); // you should get this from api
    BigInteger gasPrice = new BigInteger("d693a400", 16); // decimal 3600000000
    
    // create the transaction
    RawTransaction rawTransaction =
            RawTransaction.createTransaction(
                    nonce, gasPrice, gasLimit, < ERC20_CONTRACT_ADDRESS >, encodedFunction);
    
    // sign the transaction
    byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
    String hexValue = Numeric.toHexString(signedMessage);
    
    // Send transaction
    EthSendTransaction ethSendTransaction = web3.ethSendRawTransaction(hexValue).sendAsync().get();
    String transactionHash = ethSendTransaction.getTransactionHash();

传递函数可以是:

        private Function transfer(String to, BigInteger value) {
            return new Function(
                    "transfer",
                    Arrays.asList(new Address(to), new Uint256(value)),
                    Collections.singletonList(new TypeReference<Bool>() {
                    }));
        }
 类似资料:
  • 我目前使用的是Web3 JavaScript API的0.2x.x版本。我通过在solidity(在REMIX IDE上)中创建智能契约来部署我的自定义ERC20令牌。我安装了元掩码,并在https://wallet.ethereum.org/上测试发送一些自定义ERC令牌到另一个我的帐户。效果很好。我想使用Web3js在我的JavaScript代码中添加“发送自定义ERC20令牌”功能。 这是我

  • 我正在尝试在web3中实现一个可靠的“购买”功能。最终,我希望有一个按钮,然后用户将打开元掩码以将固定金额(简单示例为1个以太币)发送到智能合约以换取ERC20令牌。我已经学会了如何在两个钱包之间转移代币,但现在我想更进一步,学习如何发送以太币来接收ERC20。这是我一直在使用的坚固性“购买”功能: 现在,我一直在使用这个与元amask结合的OnClick按钮来传输ERC20: 您对如何在JS中实

  • 我有一个代表ERC20令牌的智能合约。我已经使用安全帽在币安测试网上部署了智能合约。 我也有一个部署的智能合约地址。 我使用以下链接在PHP laravel项目中集成了Web3库。 我可以调用web3函数来获取令牌符号。它运行良好。 我想使用智能合约的“转移”功能将我的代币转移到某个钱包地址。 我正在使用以下代码。 但我得到以下错误。 有人能指导我解决这个问题吗? 这是Token.json- 阿比

  • 我通过在ERC20.sol文件中实现OpenZeppelin创建了一个基本的ERC20令牌: 然后执行另一个合同。sol如下: 因为,我已经从地址0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2部署了两个合约,所以它拥有100000000000000000000000000个令牌 但当我从同一地址调用函数时,我得到了以下错误: 交易到简单银行.存款错误:虚拟机错

  • Creating your own ERC20 Token on the MOAC blockchain Before you read this page, you should: Understand the following general concepts: blockchain, smart contracts, ERC20 tokens; Be able to write a bas

  • 我找到的签名Google云存储Blob的示例和源代码都需要服务帐户凭据文件(私钥是特定的)。例如: https://cloud.google.com/storage/docs/access-control/signing-urls-with-helpers#storage-签名url获取对象python 但是,由于我遵循此处讨论的授权流程,因此我只有OAuth2.0访问令牌(并且我没有能够访问GC