[英]Smart contract to send ERC20 token from one address to another
我正在嘗試實現一個 Solidity 智能合約,它將部署的令牌從地址 A 發送到地址 B。
地址 A - 應該是調用合約 function “stake”的當前用戶。 地址 B - 應該是來自外部的自定義錢包地址。
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol";
contract TokenTransfer {
IERC20 _token;
constructor(address token) public {
_token = IERC20(token);
}
function stake(address to, uint amount) public {
_token.approve(address(this), amount);
require(_token.allowance(msg.sender, address(this)) >= amount, "Token allowance too low");
bool sent = _token.transferFrom(msg.sender, to, amount);
require(sent, "Token transfer failed");
}
}
當前實施返回津貼錯誤:“令牌津貼太低”
我正在使用 MetaMask(注入 web3)運行它。 我希望 MetaMask 用我的令牌打開一個簡單的轉賬 window。
為了從您的合約中使用transferFrom()
,代幣持有者需要直接從他們的地址approve()
支出者(您的合約)。 不是通過你的合同。
_token.approve(address(this), amount);
此代碼段批准TokenTransfer
( address(this)
) 使用TokenTransfer
的 ( approve()
function 調用程序) 令牌,因為 function 是從TokenTransfer
的地址有效調用的。
這就是require()
條件失敗的原因。 代幣持有者 ( msg.sender
) 尚未批准您的合約 ( address(this)
) 來使用他們的代幣。 如果您將條件替換為_token.allowance(address(this), address(this))
,那么它將通過(參見上一段)。
調用該方法的質押者需要自己調用approve
。 這是因為approve
允許從msg.sender
到另一個地址的令牌,如下所示:
approve(address spender, uint256 amount)
與您的代碼一樣,approval 調用中的msg.sender
是TokenTransfer
合約本身,它調用_token
的allowance
方法。
這意味着,由於在approve
調用期間他們不是msg.sender
,所以TokenTransfer
合約不是為TokenTransfer
合約提供津貼,而是為自己提供津貼。
除此之外,我通常還建議使用increaseAllowance
和decreaseAllowance
來為地址提供津貼。 有關更多信息,請參閱 https : //docs.openzeppelin.com/contracts/4.x/api/token/erc20 上的IERC20
approve
問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.