【问题标题】:Solidity - transfer amount exceeds spender allowanceSolidity - 转账金额超过消费额度
【发布时间】:2021-06-17 07:20:25
【问题描述】:

代码看起来正确,在转账前批准令牌,但失败并出现错误:“转账金额超过消费限额” 发件人帐户的代币余额超过要求。

有什么想法吗? 合约:https://rinkeby.etherscan.io/address/0x2a855c479b14443489963eef90ad449ecdf40cf5#writeContract

pragma solidity ^0.7.0;  


interface IERC20 {
   function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
   function approve(address spender, uint256 amount) external returns (bool); 
   function transfer(address recipient, uint256 amount) external returns (bool);
} 
 
contract FundTokenContract { 
    address public owner;   
     
    constructor(){ 
        owner = msg.sender;
    }   
    
    modifier OnlyOwner() {
        require(msg.sender == owner, "Only owner can call this function.");
        _;
    } 
    
     function fundToken(address tokenAddress, uint amount ) external {  
        require(amount > 0);  
        IERC20(tokenAddress).approve(address(this), amount); 
        IERC20(tokenAddress).transferFrom(msg.sender ,address(this), amount);  
    }  
      
      
    function withdrawToken(address _tokenAddress, address  _recipient, uint _amount) public  OnlyOwner returns (bool){  
        IERC20(_tokenAddress).transfer(_recipient, _amount);
        return true;
    }  
}

【问题讨论】:

  • 请编辑您的问题并分享tokenIn 函数approve()transferFrom() 及其依赖项。使用您问题中的当前代码,无法重现(和解决)您的问题。
  • 您好,已更新,请查看rinkeby地址

标签: transactions ethereum solidity metamask


【解决方案1】:

当你的合约执行tokenAddress函数approve()时,approve()函数中的msg.sender就是你的合约(不是发起交易的用户)。

这有效地批准“你的合同”(第一个参数address(this))花费“你的合同”(msg.sender)资金。

然后它试图transferFrom()用户地址,但它没有得到批准。


如果您希望您的合约使用属于其他用户的代币,他们需要直接(而不是通过合约)从他们的地址执行approve(<yourContract>, <amount>)

注意:请参阅this answer 中的 TLDR,它显示了此要求的用途。

【讨论】:

  • 感谢您的回答,有什么办法可以在同一笔交易中从合同中获得批准?
  • @Giorgiu 由于链接答案中解释的安全原因,无法做到这一点。
猜你喜欢
  • 2022-01-08
  • 2021-11-07
  • 2021-11-02
  • 1970-01-01
  • 2016-03-17
  • 2022-12-05
  • 2021-12-28
  • 2021-10-08
  • 1970-01-01
相关资源
最近更新 更多