我使用openzepplin + remix创建了一个令牌,我想将它链接到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)
})发布于 2021-06-25 19:43:04
您需要使用.send() web3js方法来执行transferFrom()契约函数。
根据其余代码,您还可能希望使用transfer()契约函数,而不是transferFrom()。transferFrom()用于传输属于事务发送方以外的其他地址的令牌,因为它们执行了approve()方法,允许您使用它们的令牌。
由于您使用的是英弗拉提供程序,所以没有未锁定的帐户,因此您需要将您的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) {
})
})如果您的代码与问题中的代码相同,则这两个函数都将并行执行。所以有时候你会首先得到平衡结果,有时你会首先得到传输-取决于你的计算机和节点处理请求的速度。
如果不想陷入回调地狱,可以考虑使用异步/等待方法。:-)
https://stackoverflow.com/questions/68135674
复制相似问题