ERC20定义了以太坊网络上同质化代币的标准,通过继承ERC20合约,可以快速创建符合ERC20接口规范的自定义代币。合约引入ERC20方式为:import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
1、快速实践
如下实例展示如何快速实现一个自定义的ERC20代币:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyErc20 is ERC20{
constructor(uint initialValue) ERC20("MyErc20","ME"){
_mint(msg.sender,initialValue*(10**decimals()));
}
}
通过调用父合约的构造方法:ERC20("MyErc20","ME"),定义了自定义代币的symbol和name,symbol和name为ERC20的属性;通过_mint(msg.sender,initialValue*(10**decimals()));为合约创建者分配代币数量,该操作也确定了该代币的总量。
Remix部署后,对外暴露接口如下:

2、接口说明
Functions
ERC20的函数列表如下,其中没有下划线开头的均为公共函数,即能够对外暴露;有下划线的函数均为内部函数,外部不可见。
-
constructor(name_, symbol_):构造函数,定义了ERC20的“名称”和“符号”属性;
-
name():获取代币名称;
-
symbol():获取代币符号;
-
decimals():获取代币精度,默认18位,可在继承后重写decimals()实现精度重定义,后续涉及代币数量时(总量、余额、转账、授权),均包含精度值。精度值可以理解成小数点后的位数,比如你有2个代币,代币精度值为18位,那么调用余额函数返回的值是2*10**18;
-
totalSupply():获取代币总量;
-
balanceOf(account):获取某个地址的代币余额;
-
transfer(to, value):从transfer函数的调用方,向地址“to”进行数量为“value”的代币发送;
-
allowance(owner, spender):查看“owner”地址对“spender”地址的授权额度,含义是“spender”被授权能够从“owner”账户中划走的代币数量;
-
approve(spender, value):从approve函数的调用地址,向“spender”地址授权“value”数量的代币;
-
transferFrom(from, to, value):从“from”地址向“to”地址进行“value”数量的代币转移,要求from对transferFrom函数的调用者有足够的授权(大于等于“value”),消耗授权额度;
-
_transfer(from, to, value):从“from”向“to”进行“value”数量代币转移;
-
_update(from, to, value):所有代币数量变化的底层处理函数,包括代币转移、铸造、销毁
-
_mint(account, value):向指定地址铸造“value”数量的代币,代币总量相应增加“value”;
-
_burn(account, value):销毁指定地址“value”数量的代币,代币总量减小增加“value”;
-
_approve(owner, spender, value):“owner”向“spender”进行数量“value”的授权;
-
_approve(owner, spender, value, emitEvent):“owner”向“spender”进行数量“value”的授权,根据“emitEvent”来决定是否触发事件;
-
_spendAllowance(owner, spender, value):消耗“owner”对“spender”数量“value”的授权额度;
Events
事件定义如下
IERC20
-
Transfer(from, to, value):在_update函数被调用时,触发事件
-
Approval(owner, spender, value):在_approve函数被调用时,触发事件
Errors
revert的ERROR定义如下:
IERC20Errors
1649

被折叠的 条评论
为什么被折叠?



