Contract-Development
撤回發送到合約的任何 ERC-20/ERC-721 代幣的通用功能
我今天正在部署契約。
明天如果某個使用者錯誤地將 ETH 發送到我的合約,如果我實現了支付和發送功能,我可以檢索或退回它。
@external @payable def __default__(): # a basic payable to enable receiving incoming eth log ethReceived(msg.value, msg.sender) @external def withdraw(_to: address): # for sending out any eth transferred in by mistake assert msg.sender == self.owner log ethSent(self.balance, msg.sender) send(_to, self.balance)
但是,如果某些使用者錯誤地將任何其他 ERC-20 代幣或 ERC-721 NFT 發送到我的合約怎麼辦?是否有我可以在我的契約中實現的一般功能,所以我可以檢索那些,只要它們遵循各自的標準?我不會提前知道代幣合約,它可以是任何有效的 ERC-20 或 ERC-721。
首選 Vyper 程式碼,但 Solidity 的答案或範例也很好。
您已經接近您的 ETH 範例,只需要適應 ERC20 標準。
# @version 0.3.2 from vyper.interfaces import ERC20 @external def withdraw(token: ERC20, receiver: address): assert msg.sender == self.owner balance: uint256 = token.balanceOf(self) log TokenSent(token, msg.sender, balance) token.transfer(receiver, balance)
我的契約ERC20Recover完全符合您的要求。
如果你使用的是 npm 包管理器,你可以像這樣安裝我的 contracts 包:
yarn add @prb/contracts // or npm install @prb/contracts
然後在你的 Solidity 合約中:
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.4; import "@prb/contracts/token/erc20/ERC20Recover.sol"; contract MyContract is ERC20Recover { constructor(address nonRecoverableToken) { // Set a list of non-recoverable tokens. nonRecoverableTokens.push(nonRecoverableToken); isRecoverInitialized = true; } }
看看這是如何在野外使用的: