如何解决Solidity - 转账金额超过消费者限额
代码看起来正确,在转移前批准令牌,但失败并出现错误:“转移金额超过了消费者限额” 发件人帐户的令牌余额超过了要求。
有什么想法吗? 合同: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;
}
}
解决方法
当您的合约执行 tokenAddress
函数 approve()
时,msg.sender
函数中的 approve()
是您的合约(不是用户启动交易)。
有效地批准“您的合同”(第一个参数 address(this)
)花费“您的合同”的 (msg.sender
) 资金。
然后它试图transferFrom()
用户地址,但它没有获得批准。
如果您希望您的合同使用属于其他用户的代币,他们需要直接(而不是通过合同)从他们的地址执行 approve(<yourContract>,<amount>)
。
注意:请参阅 this answer 中的 TLDR,它显示了此要求的用途。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。