概述

这篇文章主要展示如何用合约实现 ERC20 的转入转出功能。主要实现方式是声明IERC20接口,然后在合约中用ERC20的地址实例化ERC20,调用transfer方法实现转出,调用transferFrom方法实现转入。

实现IERC20接口

直接引入openzepplinIER20接口

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调用ERC20allownce方法获取授权额度,如果授权额度不够的话,需要调用ERC20approve方法授权额度给当前的合约地址

完整代码

// 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);
    }
}

我是 Victor,Web3 爱好者!希望帮助更多人进入 Web3 的世界!

如果有任何问题,请私信我!


Victor
1 声望2 粉丝

Web3爱好者,希望把更多的人带入Web3的世界!