"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) 余额。