"revert ERC20: transfer amount exceeds allowance" 从智能合约转账时出错
"revert ERC20: transfer amount exceeds allowance" error when transferring from a smart contract
我有一个名为“Manager”的智能合约,带有“claimRewards”方法,用户将调用该方法并向他们转移一些 ERC20 代币。 ERC20是另一个名为“rdk”的智能合约。
function claimRewards() public {
uint256 howMany = calculateRewards(msg.sender);
if (howMany > 0) {
// does the contract wallet have tokens enough?
uint256 walletBalance = rdk.balanceOf(address(this));
emit Log(walletBalance, howMany);
require (walletBalance >= howMany, "empty wallet");
// transfer tokens from contract wallet to player
rdk.transferFrom(address(this), msg.sender, howMany);
}
}
ERC20代币在智能合约钱包中。事件“日志”显示这些值:
Manager.Log(
balance: 101000 (type: uint256),
howMany: 9 (type: uint256)
)
所以智能合约钱包里有101000个代币,要转9到msg.sender
在调用方法“claimRewards”之前,我批准智能合约花费 100000 个这些代币:
it("Should transfer tokens from operator for rewards ", async function () {
await token.approve(manager.address, 100000, { from: accounts[1] });
await token.transfer(manager.address, 100000, { from: accounts[1] });
});
但是当 运行 我在 Truffle 上测试时,我得到了错误:
Error: Returned error: VM Exception while processing transaction: revert ERC20: transfer amount exceeds allowance -- Reason given: ERC20: transfer amount exceeds allowance.
我无法理解智能合约“Manager”是否拥有 100000 个 RDK 代币,甚至已被批准花费 100000 个 RDK 代币,为什么在将其中 9 个代币转移给调用者时显示错误方法。
谁能帮我解决这个问题?
await token.approve(manager.address, 100000, { from: accounts[1] });
此 JS 代码片段批准 Manager
花费 accounts[1]
的代币。
rdk.transferFrom(address(this), msg.sender, howMany);
但是这个 Solidity 片段检查从 Manager
地址(实际上是 rdk
合约中的 msg.sender
到相同的 Manager
地址(第一个参数address(this)
).
如果您想从Manager
合约中转移代币,您只需在Manager
合约中调用代币的transfer()
函数即可。
// transfer `howMany` of `rdk` tokens
// from the `Manager` address
// to the user invoking the `claimRewards()` function
rdk.transfer(msg.sender, howMany);
这不会检查配额,只会检查发件人 (Manager
) 余额。
我有一个名为“Manager”的智能合约,带有“claimRewards”方法,用户将调用该方法并向他们转移一些 ERC20 代币。 ERC20是另一个名为“rdk”的智能合约。
function claimRewards() public {
uint256 howMany = calculateRewards(msg.sender);
if (howMany > 0) {
// does the contract wallet have tokens enough?
uint256 walletBalance = rdk.balanceOf(address(this));
emit Log(walletBalance, howMany);
require (walletBalance >= howMany, "empty wallet");
// transfer tokens from contract wallet to player
rdk.transferFrom(address(this), msg.sender, howMany);
}
}
ERC20代币在智能合约钱包中。事件“日志”显示这些值:
Manager.Log(
balance: 101000 (type: uint256),
howMany: 9 (type: uint256)
)
所以智能合约钱包里有101000个代币,要转9到msg.sender
在调用方法“claimRewards”之前,我批准智能合约花费 100000 个这些代币:
it("Should transfer tokens from operator for rewards ", async function () {
await token.approve(manager.address, 100000, { from: accounts[1] });
await token.transfer(manager.address, 100000, { from: accounts[1] });
});
但是当 运行 我在 Truffle 上测试时,我得到了错误:
Error: Returned error: VM Exception while processing transaction: revert ERC20: transfer amount exceeds allowance -- Reason given: ERC20: transfer amount exceeds allowance.
我无法理解智能合约“Manager”是否拥有 100000 个 RDK 代币,甚至已被批准花费 100000 个 RDK 代币,为什么在将其中 9 个代币转移给调用者时显示错误方法。
谁能帮我解决这个问题?
await token.approve(manager.address, 100000, { from: accounts[1] });
此 JS 代码片段批准 Manager
花费 accounts[1]
的代币。
rdk.transferFrom(address(this), msg.sender, howMany);
但是这个 Solidity 片段检查从 Manager
地址(实际上是 rdk
合约中的 msg.sender
到相同的 Manager
地址(第一个参数address(this)
).
如果您想从Manager
合约中转移代币,您只需在Manager
合约中调用代币的transfer()
函数即可。
// transfer `howMany` of `rdk` tokens
// from the `Manager` address
// to the user invoking the `claimRewards()` function
rdk.transfer(msg.sender, howMany);
这不会检查配额,只会检查发件人 (Manager
) 余额。