Erc20代币转出

Erc20 token transferFrom

我用openzepplin + remix创建了一个token,我想link它到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)
})

您需要使用.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) {
});

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

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

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

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