合约实现 ERC20 的转入转出
文章目录
概述
这篇文章主要展示如何用合约实现 ERC20 的转入转出功能。主要实现方式是声明IERC20接口,然后在合约中用ERC20的地址实例化ERC20,调用transfer方法实现转出,调用transferFrom方法实现转入。
实现IERC20接口
直接引入openzepplin的IER20接口
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
实现代码可查看:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol
协议说明可查看:https://ethereum.org/zh/developers/docs/standards/tokens/erc-20/
实例化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);
}
}