Erc20 代币转移自

时间:2021-06-25 18:30:31

标签: erc20

我用openzepplin + remix 创建了一个token,我想把它链接到web3,查看余额时,一切正常,当我进行transferFrom 时,弹出错误,好像余额为零。可能是什么问题呢? 错误:返回错误:执行恢复:ERC20:转账金额超过限额

const Web3 = require('web3')
const Apk = require('./build/contracts/APKTEST.json')
let web3 = new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/v3/id'))
var defaultAccount = web3.eth.defaultAccount;
web3.eth.defaultAccount = '0x6a6447CB492186a334ca2A51561D2D70659Ab0B1';
let contractAbi = new web3.eth.Contract(Apk.abi, '0xc45701C31357F0b5a9a22015E2b2601C9cA59A86');
contractAbi.methods.balanceOf('0x6a6447CB492186a334ca2A51561D2D70659Ab0B1').call(function (err, res) {
    if (err) {
      console.log("An error occured", err)
      return
    }
    console.log("The balance is: ", res)
})
contractAbi.methods.transferFrom('0x6a6447CB492186a334ca2A51561D2D70659Ab0B1','0x5B38Da6a701c568545dCfcB03FcB875f56beddC4', 100).call(function (err, res) {
    console.log(err)
})

1 个答案:

答案 0 :(得分:0)

您需要使用 .send() web3js 方法来执行 transferFrom() 合约功能。

根据其余代码,您可能还想使用 transfer() 合约函数,而不是 transferFrom()transferFrom() 用于转移属于其他地址的代币,而不是交易发送者,在他们执行 approve() 方法允许您使用他们的代币后。

由于您使用的是 Infura 提供商,因此没有解锁帐户,因此您需要将您的 web3 私钥传递给您要用于send()交易的帐​​户。

// add the private key (corresponding to the `0x6a64...` address) to your local web3 instance
web3.eth.accounts.wallet.add(privateKey);

// transfer 100 tokens from `0x6a64...` to `0x5B38...`
contractAbi.methods.transfer('0x5B38...', 100).send({from: '0x6a64...'}, function (err, res) {
});

注意:您的代码中已经有一些回调函数。此外,您需要将 transfer() 移动到 balanceOf() 回调中,以便在获得余额后执行转账。

contractAbi.methods.balanceOf(...).call(function (err, res) {
    contractAbi.methods.transfer(...).send({...}, function (err, res) {
    })
})

如果您的代码与问题中的代码保持一致,则两个函数将并行执行。所以有时你会先得到余额结果,有时你会先得到转移——这取决于你的计算机和节点处理请求的速度。

如果您不想陷入 callback hell,请考虑使用 async/await 方法。 :-)