如何从我的合约中取出所有代币

Posted

技术标签:

【中文标题】如何从我的合约中取出所有代币【英文标题】:how to withdraw all tokens from the my contract in solidity 【发布时间】:2021-10-03 08:10:51 【问题描述】:

谁能帮助我?

我创建了一个基本的合约。但是不知道提款功能。请帮助我。谢谢大家 我尝试创建一个基本功能,但它不起作用

function withdraw() public 
    msg.sender.transfer(address(this).balance);

【问题讨论】:

【参考方案1】:
payable(msg.sender).transfer(address(this).balance);

此行提取本机余额(如果您的合约在以太坊网络上,则为 ETH)。


要提取代币余额,您需要在代币合约上执行transfer() 函数。所以为了提取所有代币,你需要在所有代币合约上执行transfer()函数。

您可以创建一个函数,根据您作为输入传递的代币合约地址提取任何 ERC-20 代币。

pragma solidity ^0.8;

interface IERC20 
    function transfer(address _to, uint256 _amount) external returns (bool);


contract MyContract 
    function withdrawToken(address _tokenContract, uint256 _amount) external 
        IERC20 tokenContract = IERC20(_tokenContract);
        
        // transfer the token from address of this contract
        // to address of the user (executing the withdrawToken() function)
        tokenContract.transfer(msg.sender, _amount);
    

请注意,此代码不安全 - 任何人都可以执行 withdrawToken() 函数。如果您想在生产中运行它,请添加某种形式的身份验证,例如Ownable 模式。

不幸的是,由于代币标准(以及一般的以太坊网络)的设计方式,没有简单的方法可以“一次转移所有代币”,因为没有简单的方法来获得“非零代币余额”地址”。您在区块链浏览器中看到的(例如,一个地址持有代币 X、Y 和 Z)是无法在链上执行的聚合的结果。

【讨论】:

我使用solidity ^0.5.0;它显示错误contracts/1.sol:94:9: DeclarationError: Identifier not found or not unique。 IERC20 代币合约 = IERC20(_tokenContract); ^----^ @learncode 您可能忘记在代码中定义接口。仅当我省略接口定义时,我才会收到相同的错误。 我已经编译成功,但是我得到了 1 个新错误这是:Gas 估计失败你能帮我吗? goerli.etherscan.io/tx/… 请帮助我@petr hejda @learncode 链接的 tx 试图从合约 0xd1a3081... 中提取 20000(不包括小数)代币 WTH,但该合约不持有任何 WTH 代币。所以它在尝试转移你的合约没有的代币时失败了。【参考方案2】:

假设你的合约是 ERC20,EIP 20 中定义的 transfer 函数说:

将 _value 数量的代币转移到地址 _to,并且必须触发 转移事件。如果消息调用者的函数应该抛出 账户余额没有足够的代币消费。

注意 0 值的传输必须被视为正常传输,并且 触发 Transfer 事件。

function transfer(address _to, uint256 _value) public 返回(bool 成功)

当您调用transfer 的实现时,您基本上是在更新调用者和接收者的余额。它们的余额通常保存在映射/查找表数据结构中。

见ConsenSys's implementation of transfer

【讨论】:

如何从智能合约中提取eth、bnb等基本代币?我试了很多次都没有成功你能帮帮我吗? 请给我一个函数 这是我的合同:goerli.etherscan.io/address/… 如果您想将“HRS”转移到另一个帐户,只需调用transfer函数goerli.etherscan.io/address/… 如果你想将“ETH”或“USDT”转移到另一个账户,我需要怎么做?

以上是关于如何从我的合约中取出所有代币的主要内容,如果未能解决你的问题,请参考以下文章

使用智能合约存取erc20代币

如何将 ERC20 代币发送到智能合约余额?

手把手教你发行代币

“蜜罐”合约中的哪个功能阻止买家出售他们的代币?

如何在代币合约中区分在 uniswap 上买卖 erc-20 代币

如何检测以太坊地址是不是为 ERC20 代币合约?