当我使用fransferFrom接口( erc20 interface,IERC20)调用erc20时,会出现一个错误:“所需气体超过允许量(10000000)或总是失败的事务”。
我事先为合同做了准备。
这是一个叫transferFrom的合同。
pragma solidity ^0.6.7;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract TokenSale {
address public token_address;
constructor(address _token_address) public {
token_address = _token_address;
}
function sendEtherFromDeposit(address _token_supplyer) public returns(bool success) {
require(IERC20(token_address).allowance(_token_supplyer, address(this)) >= 10000, "insufficient allowance amount");
IERC20(token_address).transferFrom(address(this), msg.sender, 1000);
success = true;
}
}
我的代码有什么问题吗?你能给我点建议吗?
发布于 2020-09-02 23:48:28
您目前正在尝试从契约本身发送令牌,而不是从_token_supplyer
(我认为这是您打算做的事情)发送令牌。transferFrom
的第一个参数指定要发送令牌的地址,因此如果将其设置为address(this)
,则令牌尝试从契约发送令牌,但由于没有设置备抵或合同没有足够的余额而失败。
如果将_token_supplyer
指定为第一个参数,则它将工作:
IERC20(token_address).transferFrom(_token_supplyer, msg.sender, 1000);
令牌契约可以检查_token_supplyer
是否允许通过检查msg.sender
来使用令牌。您不需要在transferFrom
中指定契约地址本身。
https://ethereum.stackexchange.com/questions/87125
复制相似问题