Contract-Design
防止將 ERC20 代幣轉移到合約地址?
我希望我的 ERC20 合約只轉移到 EOA 地址和一些特定的合約地址。
我不想因為錯誤地轉移到無法處理 ERC20 代幣的合約地址而失去我的代幣。
如何阻止我的 ERC20 合約以防止代幣轉移到合約地址?
您應該修改合約的
transfer
和approve
函式以檢查目標地址是否為合約地址。如果是,則還原交易。您可以通過以下方式檢查地址是否為合約地址:
function isContract(address _addr) private returns (bool isContract){ uint32 size; assembly { size := extcodesize(_addr) } return (size > 0); }
(來自https://ethereum.stackexchange.com/a/15642/31933)
請注意,這會使任何令牌轉移更加昂貴,因為每次進行轉移/批准時都必須執行相同的檢查。
在 ERC20 傳輸函式的開頭包含這一行:
require (to != address(this));