ERC 20
這套介面、合約和應用程式都與 ERC20 代幣標準相關。
有一些核心合約實現了 EIP 中指定的功能和定義:
- IERC20:包含所有ERC20應該實現的介面
- IERC20Metadata:對ERC20介面的擴充套件,包括Token名稱,符號,和精度。
- ERC20:對ERC20介面的實現,將名稱,符號和精度這些可選的標準擴充套件引入到基本介面中。
另外還有一些自定義的擴充套件可以使用,包括以下內容:
- ERC20Burnable:銷燬持有的token
- ERC20Capped:發行Token時對總供應量指定上限
- ERC20Pausable:能夠暫停Token的交易
- ERC20Snapshot:有效儲存過去的Token餘額,以便以後隨時查詢
- ERC20Permit:token的委託無需Gas(同ERC2612的標準)
- ERC20FlashMint:透過臨時代幣的鑄造和銷燬對閃電貸的代幣級支援(同ERC3156標準)
- ERC20Votes:支援投票和投票委託
- ERC20VotesComp:支援投票和投票委託(相容Compound的Token,有uint96的限制)
- ERC20Wrapper:用於建立由另一個 ERC20 支援的 ERC20 的包裝器,具有儲存Token和撤回Token的方法,通常用於ERC20Votes的裁決
最後,還有一些工具可以以多種方式與ERC20 合約互動:
- SafeERC20:介面的包裝器,無需對布林型別的返回值進行處理。
- TokenTimelock:凍結交易的Token一定時間,直到到達一個指定的時間後才可以持有Token
- ERC20Permit
核心介面
IERC20
ERC20的核心介面大多同IERC20合約繼承過來的,IERC20中包含以下介面:
函式
//返回存在的Token的總數
totalSupply()
//返回賬戶持有的Token的總數
balanceOf(account)
//將指定數量的Token交易到其他賬戶
//如果交易結果返回一個布林值
//同時觸發Transfer事件
transfer(to, amount)
//返回owner持有的,且spender具有消費許可權的Token數量,預設為0
allowance(owner, spender)
//配置一定數量的允許spender消費的Token數量
approve(spender, amount)
//從from賬戶地址交易一定數量的Token到其他地址,該Token透過approve函式賦予消費許可權
transferFrom(from, to, amount)
事件
Transfer(from,to,value)
APproval(owner,spender,value)
IERC20Metadata
ERC20標準中可選的後設資料函式介面:
//返回Token的名稱
name()
//返回Token的符號
symbol()
//返回Token的精度
decimals()
ERC20 Token 合約 構建
使用合約,可以輕鬆建立自己的ERC20 Token合約,可以用於跟蹤虛擬遊戲中的內部貨幣黃金 (GLD)。
一個簡單的示例如下:
// contracts/GLDToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract GLDToken is ERC20 {
constructor(uint256 initialSupply) ERC20("Gold", "GLD") {
_mint(msg.sender, initialSupply);
}
}
在該合約中透過內部介面,並使用ERC20合約實現了ERC20基本的介面和Token名稱、Token符號、Token精度這些可選的擴充套件,另外,透過initialSupply
指定了初始Token數量,並將指定數量的Token賦予到部署合約的賬戶地址。
當合約部署完成,將能夠去查詢合約部署的賬戶的餘額:
> GLDToken.balanceOf(部署者賬戶地址)
1000000000000000000000
同樣,也可將Token交易到其他賬戶:
> GLDToken.transfer(otherAddress, 300000000000000000000)
> GLDToken.balanceOf(otherAddress)
300000000000000000000
> GLDToken.balanceOf(deployerAddress)
700000000000000000000