lea*_*ode 9 blockchain ethereum solidity smartcontracts erc20
我创建了一个基本合同。但不知道提现功能。
我尝试创建一个基本功能,但它不起作用
function withdraw() public {
msg.sender.transfer(address(this).balance);
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*jda 20
payable(msg.sender).transfer(address(this).balance);
Run Code Online (Sandbox Code Playgroud)
该行提取本机余额(如果您的合约位于以太坊网络上,则为 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);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这段代码是不安全的——任何人都可以执行该withdrawToken()函数。如果您想在生产中运行它,请添加某种形式的身份验证,例如Ownable模式。
不幸的是,由于代币标准(以及一般的以太坊网络)的设计方式,没有简单的方法可以转移“一次所有代币”,因为没有简单的方法可以获取“地址的非零代币余额”。您在区块链浏览器中看到的内容(例如,地址包含代币 X、Y 和 Z)是不可能在链上执行的聚合的结果。
| 归档时间: |
|
| 查看次数: |
31272 次 |
| 最近记录: |