使用web3 Ropsten Infura TestNet传输ERC20令牌

时间:2017-10-29 17:40:37

标签: token blockchain ethereum solidity

我使用示例可靠性代码教程创建了一个合同令牌。它有一个称为转移的功能,用于在账户之间发送令牌:

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令牌。我真的不知道为什么会这样,并且会感激任何帮助。

2 个答案:

答案 0 :(得分:0)

这可能会迟到,但对于未来的用户。 你发送ethers代替令牌的原因是你在输入“0x1”的原始事务字段中的值。要发送ERC20令牌,您应将其保留为“0x0”。

答案 1 :(得分:0)

如果您在发送以太网时遇到问题, 确保将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();

现在,您可以按照与将信息广播到网络相同的步骤进行操作。