概述
这篇文章主要展示如何用合约实现 ERC20 的转入转出功能。主要实现方式是声明IERC20
接口,然后在合约中用ERC20
的地址实例化ERC20
,调用transfer
方法实现转出,调用transferFrom
方法实现转入。
实现IERC20
接口
直接引入openzepplin
的IER20
接口
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
实现代码可查看:https://github.com/OpenZeppel...
协议说明可查看:https://ethereum.org/zh/devel...
实例化ERC20
我们在构造方法中传入ERC20
地址,并实例化
IERC20 private token;
constructor(address tokenAddr) {
token = IERC20(tokenAddr);
}
实现ERC20
转出
把合约地址上持有的ERC20
转出到对应地址
function transferOut(address to, uint256 amount) public returns (bool) {
require(token.balanceOf(address(this)) > amount, "lock of balance");
return token.transfer(to, amount);
}
这里要先判断当前合约上的余额是否足够,不然转出会失败。
token.balanceOf
方法获取合约地址当前ERC20
代币的余额address(this)
获取当前合约的地址token.transfer(to, amount)
把合约地址上的代币转到对应地址
实现ERC20
转入
用户调用方法把ERC20
转入合约
function transferIn(uint256 amount) public returns (bool) {
return token.transferFrom(msg.sender, address(this), amount);
}
transferFrom(msg.sender, address(this), amount)
把msg.sender
上的代币转到address(this)
上
用户调用这个方法之前需要先判断用户对于合约地址的授权额度,才能调用该方法,前端使用web3j
或者truffle-js
调用ERC20
的allownce
方法获取授权额度,如果授权额度不够的话,需要调用ERC20
的approve
方法授权额度给当前的合约地址
完整代码
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <=0.9.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract ERC20Transfer {
IERC20 private token;
constructor(address tokenAddr) {
token = IERC20(tokenAddr);
}
function transferOut(address to, uint256 amount) public returns (bool) {
require(token.balanceOf(address(this)) > amount, "lock of balance");
return token.transfer(to, amount);
}
function transferIn(uint256 amount) public returns (bool) {
return token.transferFrom(msg.sender, address(this), amount);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。