无法使用 web3.js 发送 ERC20 令牌

Posted

技术标签:

【中文标题】无法使用 web3.js 发送 ERC20 令牌【英文标题】:Failing to send an ERC20 token using web3.js 【发布时间】:2018-10-01 14:18:32 【问题描述】:

在阅读了几篇文章和指南之后,我一直在努力使用 web3 发送令牌交易。我正在使用 human-standard-token-abi 来获取 ERC20 abi。我只是想将 10 个 ZRX 从我的一个地址转移到另一个地址。

这是失败的函数。

var Tx = require('ethereumjs-tx');
const abi = require('human-standard-token-abi')
import * as Web3 from 'web3';
const fromAddress = '0xB03...'.toLowerCase();
const secondaryAddress = '0xF75...'.toLowerCase();
const zrxAddress = '0xe41d...';

deposit(zrxAddress, secondaryAddress, '10');

function deposit(tokenAddress:string, depositAddress:string, amount:string) 
        var count = web3.eth.getTransactionCount(fromAddress);
        var contract = web3.eth.contract(abi).at(tokenAddress);
        console.log('Contract Address :' + contract.address);

        try 
            var rawTransaction = 
            "from": fromAddress,
            "nonce": web3.toHex(count),
            "gasPrice": "0x04e3b29200",
            "gasLimit": "0x7458",
            "to": contract.address,
            "value": "0x0",
            "data": contract.transfer(depositAddress, size),
            "chainId": "0x01"
        

        console.log(rawTransaction);

        var privKey = new Buffer(key, 'hex');
        var tx = new Tx(rawTransaction);
        console.log(tx);
        //tx.sign(privKey);
        var serializedTx = tx.serialize();
     catch (err) 
        console.log('\n\nfailed to build');
        console.log(err);
    

    try 
    console.log('\n\nAttempting to send tx');
    web3.eth.sendTransaction(tx, function(err, hash) 
        if(!err)
            console.log(hash);
        else
            console.log(err);
    );
     catch (err) 
        console.log('\nfailed to send');
        console.log(err);
    

我目前无法构建原始交易。这是错误输出。

Error: invalid address
    at inputAddressFormatter (/home/jall/ZeroExTrading/node_modules/web3/lib/web3/formatters.js:279:11)
    at inputTransactionFormatter (/home/jall/ZeroExTrading/node_modules/web3/lib/web3/formatters.js:101:20)
    at /home/jall/ZeroExTrading/node_modules/web3/lib/web3/method.js:90:28
    at Array.map (<anonymous>)
    at Method.formatInput (/home/jall/ZeroExTrading/node_modules/web3/lib/web3/method.js:88:32)
    at Method.toPayload (/home/jall/ZeroExTrading/node_modules/web3/lib/web3/method.js:116:23)
    at Eth.send [as sendTransaction] (/home/jall/ZeroExTrading/node_modules/web3/lib/web3/method.js:141:30)
    at SolidityFunction.sendTransaction (/home/jall/ZeroExTrading/node_modules/web3/lib/web3/function.js:170:26)
    at SolidityFunction.execute (/home/jall/ZeroExTrading/node_modules/web3/lib/web3/function.js:256:37)
    at deposit (/home/jall/ZeroExTrading/lib/Transfer.js:56:30)

它似乎拒绝了我提供的其中一个地址,但我不确定是哪一个。当我注销 tokenAddress、contract.address 和我的两个地址时,它们都已定义。但是在 web3 源代码中我添加了一个 print 语句来查看它说的哪个地址是无效的,它得到的地址是'未定义'。

【问题讨论】:

参考这个answer的Send ERC20 token with web3 【参考方案1】:

您在 tx 对象中的 data 部分不正确(可能还有其他问题,但该部分很突出)。您需要为方法调用传入编码字符串。在设置data 时,您实际上是在尝试调用transfer 方法。

var rawTransaction = 
            "from": fromAddress,
            "nonce": web3.toHex(count),
            "gasPrice": "0x04e3b29200",
            "gasLimit": "0x7458",
            "to": contract.address,
            "value": "0x0",
            "data": contract.transfer.getData(depositAddress, amount),
            "chainId": "0x01"

(我也将size 更改为amount。不确定size 来自哪里。)

【讨论】:

以上是关于无法使用 web3.js 发送 ERC20 令牌的主要内容,如果未能解决你的问题,请参考以下文章

获取 ERC20 的所有权数组

使用 web3 发送 ERC20 令牌

如何使用 web3 库发送 ERC20 令牌

使用本地私钥通过 web3.py 发送 ERC20 令牌

发送 ERC-20 令牌失败。交易成功,但没有发送令牌

如何在 RSK 上获取诸如 ERC20 代币符号之类的信息?