Solidity

Solidity:ERC-20 TransferFrom 在批准後恢復

  • June 20, 2021

我正在嘗試編寫一個智能合約來獲取進入玩家的代幣。

function enterToken(address token, uint amount) public {
       uint _amount = amount * 10 ** 18;
       IERC20 token_ = IERC20(token);
       require(token_.approve(address(this), _amount), 'Approve failed.');
       require(token_.transferFrom(msg.sender, address(this), _amount), 'Transfer failed.');

我真的不知道為什麼它不起作用,也許有人可以幫助我。

謝謝!

你的問題是你不能在同一筆交易中做approve和。transferFrom

approve必須由令牌所有者執行。所以基本上代幣所有者approve直接呼叫代幣合約的函式來允許你的合約提取代幣。讓我們稱您的契約為contractA。

之後,任何人(通常是使用者)與使用 的 contractA 發起交易transferFrom。因為使用者已經批准合約A提取他的一定數量的代幣,合約A可以轉移那些具有該transferFrom功能的代幣。

如果您的範常式式碼有效,則意​​味著合約可以在未經使用者明確批准的情況下提取使用者的代幣。所以基本上使用者呼叫的任何惡意合約都可以拿走他的代幣。因此,出於安全原因,使用者首先必須明確添加特定合約的限額以提取他的代幣。

引用自:https://ethereum.stackexchange.com/questions/102208