代码看起来正确,在转移前批准令牌,但失败并出现错误:“转移金额超过了消费者限额” 发件人帐户的令牌余额超过了要求。
有什么想法吗? 合同: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;
}
}
答案 0 :(得分:1)
当您的合约执行 tokenAddress
函数 approve()
时,msg.sender
函数中的 approve()
是您的合约(不是用户启动交易)。
有效地批准“您的合同”(第一个参数 address(this)
)花费“您的合同”的 (msg.sender
) 资金。
然后它试图transferFrom()
用户地址,但它没有获得批准。
如果您希望您的合同使用属于其他用户的代币,他们需要直接(而不是通过合同)从他们的地址执行 approve(<yourContract>, <amount>)
。
注意:请参阅 this answer 中的 TLDR,它显示了此要求的用途。