合约实现 ERC20 的转入转出
Posted VictorXSS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合约实现 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);
我是 Victor,Web3 爱好者!希望帮助更多人进入 Web3 的世界!
如果有任何问题,请私信我!
以上是关于合约实现 ERC20 的转入转出的主要内容,如果未能解决你的问题,请参考以下文章