简体   繁体   English

ERC20:转账金额超过限额,即使获得批准

[英]ERC20: transfer amount exceeds allowance, even when it is approved

Returned error: VM Exception while processing transaction: revert ERC20: transfer amount exceeds allowance返回错误:VM Exception while processing transaction: revert ERC20: transfer amount exceeds allowance

Code:代码:

ERC20Tokens[tokenTicker].token.approve(ERC20Tokens[tokenTicker].tokenHolder, 10);
    
emit tokenOwnerBalance(ERC20Tokens[tokenTicker].token.balanceOf(ERC20Tokens[tokenTicker].tokenHolder));
    
ERC20Tokens[tokenTicker].token.transferFrom(ERC20Tokens[tokenTicker].tokenHolder, address(this), 1);

Logs:日志:

[
   {
      "from":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
      "topic":"0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925",
      "event":"Approval",
      "args":{
         "0":"0x7A2946b37399fa3F1C9EF81c7Bcf94AE1099D18F",
         "1":"0x95Ba4cF87D6723ad9C0Db21737D862bE80e93911",
         "2":"10",
         "owner":"0x7A2946b37399fa3F1C9EF81c7Bcf94AE1099D18F",
         "spender":"0x95Ba4cF87D6723ad9C0Db21737D862bE80e93911",
         "value":"10"
      }
   },
   {
      "from":"0x7A2946b37399fa3F1C9EF81c7Bcf94AE1099D18F",
      "topic":"0xcff530ae4ada35c1dd7ac314ef643b9eb7ae40665958ad5899e2fbc18865444a",
      "event":"tokenOwnerBalance",
      "args":{
         "0":"31000000"
      }
   }
]
ERC20Tokens[tokenTicker].token.approve(ERC20Tokens[tokenTicker].tokenHolder, 10);

This line approves the tokenHolder to spend your contract's tokens.此行批准tokenHolder花费您合约的代币。 Not the other way around.不是相反。

So the transferFrom() fails because your contract is trying to spend the tokenHolder 's tokens.所以transferFrom()失败了,因为你的合约正试图花费tokenHolder的代币。


If you want your contract to be able to spend tokenHolder 's tokens, the tokenHolder needs to execute the approve() function on the token from their address directly.如果您希望您的合约能够花费tokenHolder的代币,则tokenHolder需要直接从他们的地址对代token执行approve() function。 Not through a contract in between.不是通过两者之间的合同。

For me, it was a mistake of using transferFrom instead of transfer when transferring tokens from the contract.对我来说,从合约中转移代币时使用transferFrom而不是transfer是错误的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM