【问题标题】:Transferring ERC20 Tokens using web3 Ropsten Infura TestNet使用 web3 Ropsten Infura 测试网传输 ERC20 代币
【发布时间】:2018-04-10 17:25:00
【问题描述】:

我使用示例 Solidity 代码教程创建了一个合约代币。它有一个名为 transfer 的功能,用于在账户之间发送代币:

function transfer(address _to, uint256 _value)

我现在需要使用 web3 连接到这个合约,然后将生成的一定数量的代币发送到另一个帐户。我一直在努力解决如何做到这一点,并希望这个社区可以提供帮助。这是我到目前为止所拥有的,使用 web3 版本 0.20.0:

const Web3 = require("web3");
const web3 = new Web3();
web3.setProvider(new 
web3.providers.HttpProvider("https://ropsten.infura.io/XXXXXX"));
var abi = [ {} ] // redacted on purpose
var count = web3.eth.getTransactionCount("0x9...");
var abiArray = abi;
var contractAddress = "0x2...";
var contract =  web3.eth.contract(abiArray).at(contractAddress);

var data = contract.transfer.getData("0x2...", 10000, {from: "0x9..."});
var gasPrice = web3.eth.gasPrice;
var gasLimit = 90000;

var rawTransaction = {
  "from": "0x9...",
  "nonce": web3.toHex(count),
  "gasPrice": web3.toHex(gasPrice),
  "gasLimit": web3.toHex(gasLimit),
  "to": "0x2...",
  "value": "0x1",
  "data": data,
  "chainId": 0x03
};

var privKey = new Buffer('XXXXXXXXXXXXXX', 'hex');
var tx = new Tx(rawTransaction);

tx.sign(privKey);
var serializedTx = tx.serialize();

web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err, hash) {
  if (!err)
      console.log(hash);
  else
      console.log(err);
});

此交易有效,但它发送的是以太币,而不是实际的 ERC20 代币。我真的不知道为什么会这样,并且希望能提供任何帮助。

【问题讨论】:

标签: token blockchain ethereum solidity


【解决方案1】:

这可能会迟到,但对于未来的用户来说。 您发送以太币代替令牌的原因是在原始交易价值字段中输入“0x1”。要发送 ERC20 代币,您应该将其保留在“0x0”。

【讨论】:

    【解决方案2】:

    如果您仅在发送以太币时遇到问题, 确保将value 属性作为"0x0" 放入原始事务对象中 并在to 属性中放入智能合约地址,如下所示:

    var rawTransaction = {
      "from": "0x9...",
      "nonce": web3.toHex(count),
      "gasPrice": web3.toHex(gasPrice),
      "gasLimit": web3.toHex(gasLimit),
      "to": "<contract Address>",
      "value": "0x0",
      "data": data,
      "chainId": 0x03
    };
    

    如果您仍然遇到问题,请阅读以下内容以查看我发送 erc20 令牌的运行版本:

    在创建合约实例时,在选项中添加from 属性,如下所示:

    var contract = new web3.eth.Contract(erc20ABI, contractAddress, {
      from: '<Address from where you are spending>'
    });
    

    其次,在创建原始事务的data 部分时,请执行以下操作:

    var data = contract.methods.transfer('<Toaddress>', amount)).encodeABI();
    

    现在您可以按照向网络广播交易的相同步骤进行操作。

    【讨论】:

      猜你喜欢
      • 2021-10-08
      • 2021-12-17
      • 2022-12-18
      • 1970-01-01
      • 2020-01-31
      • 2018-08-01
      • 2020-10-15
      • 2021-07-28
      • 2023-04-10
      相关资源
      最近更新 更多