合约实现 ERC20 的转入转出

Posted VictorXSS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合约实现 ERC20 的转入转出相关的知识,希望对你有一定的参考价值。

文章目录

概述

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

实现IERC20接口

直接引入openzepplinIER20接口

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调用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 的世界!

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

以上是关于合约实现 ERC20 的转入转出的主要内容,如果未能解决你的问题,请参考以下文章

手把手教你发行代币

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

区块链智能合约美链攻击分析以及安全库的使用

暂停交易?ERC20合约整数溢出安全漏洞案例技术分析(一)

暂停交易?ERC20合约整数溢出安全漏洞案例技术分析一

第89篇 defi实战-质押ERC20智能合约