Solidity
Solidity:ERC-20 TransferFrom 在批准後恢復
我正在嘗試編寫一個智能合約來獲取進入玩家的代幣。
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
功能的代幣。如果您的範常式式碼有效,則意味著合約可以在未經使用者明確批准的情況下提取使用者的代幣。所以基本上使用者呼叫的任何惡意合約都可以拿走他的代幣。因此,出於安全原因,使用者首先必須明確添加特定合約的限額以提取他的代幣。