Solidity - 转账金额超过消费者限额

时间:2021-06-17 07:20:25

标签: transactions ethereum solidity metamask

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

有什么想法吗? 合同: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;
    }  
}

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

当您的合约执行 tokenAddress 函数 approve() 时,msg.sender 函数中的 approve()您的合约(不是用户启动交易)。

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

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


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

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

相关问题