我用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)
})
答案 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 方法。 :-)