Contract-Development

撤回發送到合約的任何 ERC-20/ERC-721 代幣的通用功能

  • April 17, 2022

我今天正在部署契約。

明天如果某個使用者錯誤地將 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;
   }
}

看看這是如何在野外使用的:

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