Solidity

呼叫 transfer 到合約本身後交易失敗

  • July 29, 2022

我在 ERC721 契約的某些功能中有這一行:

IERC20 實例 = IERC20(token_address); instance.transfer(address(this),1);

並在部署合約時確保函式的呼叫者至少獲得其中一個 ERC20 令牌:

ERC20代幣

$$ -1 $$.mint(account2,1,{“來自”:account1}) 在部署 ERC721 合約並使用 account2 呼叫此特定函式之前,我得到的錯誤是:“gas 估算失敗:‘執行恢復:ERC20:轉賬金額超過餘額’。此交易可能會恢復。如果你想廣播,你必須設置手動設置氣體限制。”

在批准 ERC721 合約從 account2 中花費一些 ERC20 之後,它就可以工作了。在批准這個特定問題時它不起作用.. (instance.approve(address(this),1)) msg​​.sender 是 account2.. 這是怎麼回事?謝謝!

ERC20 中的transfer功能是將代幣從目前合約地址轉移到其他帳戶,因此您的程式碼行試圖將 1 個單位的代幣從合約轉移到自己。

您最有可能尋找的transferFrom(sender, recipient, amount)是一種更通用的形式transfer,允許您的合約從已批准您的合約的賬戶發送代幣。

在您的範例中,它將是:

IERC20 instance = IERC20(token_address);
instance.transferFrom(msg.sender, address(this), 1);

但是,您將無法approve代表您的契約中的其他使用者呼叫 - 這始終是使用者在與您的契約互動之前必須做的事情。

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