在上一章中,我們將LearnCoin合約部署到Goerli測試網。在本章中,我們將詳細探討LearnCoin合約的功能併解釋每個部分的作用。
以下是我們的LearnCoin完整合約:
Python
// SPDX-License-Identifier: None
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";
contract LearnCoin is ERC20, ERC20Burnable, ERC20Snapshot, AccessControl, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint {
bytes32 public constant SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
constructor() ERC20("Learn Coin", "LC") ERC20Permit("Learn Coin") {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(SNAPSHOT_ROLE, msg.sender);
_grantRole(PAUSER_ROLE, msg.sender);
_mint(msg.sender, 21000000 * 10 ** decimals());
}
function snapshot() public onlyRole(SNAPSHOT_ROLE) {
_snapshot();
}
function pause() public onlyRole(PAUSER_ROLE) {
_pause();
}
function unpause() public onlyRole(PAUSER_ROLE) {
_unpause();
}
function _beforeTokenTransfer(address from, address to, uint256 amount)
internal
whenNotPaused
override(ERC20, ERC20Snapshot)
{
super._beforeTokenTransfer(from, to, amount);
}
// The following functions are overrides required by Solidity.
function _afterTokenTransfer(address from, address to, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._afterTokenTransfer(from, to, amount);
}
function _mint(address to, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._mint(to, amount);
}
function _burn(address account, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._burn(account, amount);
}
}
我們部署的合約是一個名爲LearnCoin
的ERC20代幣合約。它包含了OpenZeppelin合約庫中的多個功能,如可銷毀代幣、快照、訪問控製、可暫停代幣、許可、投票和閃電鑄幣。
合約開頭的import語句是從OpenZeppelin的合約庫中導入代碼:
ERC20.sol
是ERC20代幣的基礎合約。ERC20Burnable.sol
使代幣持有者能夠銷毀自己的代幣。ERC20Snapshot.sol
支持創建代幣餘額的快照。AccessControl.sol
是一個用於管理對某些功能的訪問權限的合約模塊。Pausable.sol
可以暫停和取消暫停代幣傳輸。ERC20Permit.sol
使持有者能夠通過許可(permits)使用用戶的代幣。ERC20Votes.sol
爲代幣添加了投票功能。ERC20FlashMint.sol
可以實現快速鑄造代幣。LearnCoin
合約繼承了導入的OpenZeppelin合約。因此,LearnCoin
合約將擁有OpenZeppelin合約的所有方法和屬性。
SNAPSHOT_ROLE
和PAUSER_ROLE
是常量值(使用keccak256
哈希函數創建),錶示合約中訪問控製的特定角色。
部署LearnCoin
合約時,會調用構造函數。構造函數設置了代幣的名稱和符號,授予部署帳戶(msg.sender)管理員、快照者和暫停者角色,併鑄造了一定數量的初始代幣供部署賬戶使用。
snapshot
,pause
和unpause
是允許具有相應角色的帳戶執行某些操作的函數。snapshot
函數可以創建快照,pause
和unpause
函數可以停止和重新啟動代幣轉賬。
函數_beforeTokenTransfer
、_afterTokenTransfer
、_mint
和_burn
是從父合約重寫的內部函數。它們執行LearnCoin合約的自定義邏輯。
_beforeTokenTransfer
:在代幣轉賬之前調用此函數,確保代幣轉賬不會暫停。_afterTokenTransfer
:在代幣轉賬之後調用此函數。此處,它是一個空函數,但可用於轉賬後立即執行的自定義邏輯。_mint
:此函數用於創建新代幣併將其分配給給定的帳戶。_burn
:此函數用於銷毀來自給定帳戶的代幣。本章是對LearnCoin
合約所做的綜合介紹。合約部署完成後,您可以運行該合約,我們將在下一章中詳細探討。
在上一章中,我們將LearnCoin合約部署到Goerli測試網。在本章中,我們將詳細探討LearnCoin合約的功能併解釋每個部分的作用。
以下是我們的LearnCoin完整合約:
Python
// SPDX-License-Identifier: None
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";
contract LearnCoin is ERC20, ERC20Burnable, ERC20Snapshot, AccessControl, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint {
bytes32 public constant SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
constructor() ERC20("Learn Coin", "LC") ERC20Permit("Learn Coin") {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(SNAPSHOT_ROLE, msg.sender);
_grantRole(PAUSER_ROLE, msg.sender);
_mint(msg.sender, 21000000 * 10 ** decimals());
}
function snapshot() public onlyRole(SNAPSHOT_ROLE) {
_snapshot();
}
function pause() public onlyRole(PAUSER_ROLE) {
_pause();
}
function unpause() public onlyRole(PAUSER_ROLE) {
_unpause();
}
function _beforeTokenTransfer(address from, address to, uint256 amount)
internal
whenNotPaused
override(ERC20, ERC20Snapshot)
{
super._beforeTokenTransfer(from, to, amount);
}
// The following functions are overrides required by Solidity.
function _afterTokenTransfer(address from, address to, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._afterTokenTransfer(from, to, amount);
}
function _mint(address to, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._mint(to, amount);
}
function _burn(address account, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._burn(account, amount);
}
}
我們部署的合約是一個名爲LearnCoin
的ERC20代幣合約。它包含了OpenZeppelin合約庫中的多個功能,如可銷毀代幣、快照、訪問控製、可暫停代幣、許可、投票和閃電鑄幣。
合約開頭的import語句是從OpenZeppelin的合約庫中導入代碼:
ERC20.sol
是ERC20代幣的基礎合約。ERC20Burnable.sol
使代幣持有者能夠銷毀自己的代幣。ERC20Snapshot.sol
支持創建代幣餘額的快照。AccessControl.sol
是一個用於管理對某些功能的訪問權限的合約模塊。Pausable.sol
可以暫停和取消暫停代幣傳輸。ERC20Permit.sol
使持有者能夠通過許可(permits)使用用戶的代幣。ERC20Votes.sol
爲代幣添加了投票功能。ERC20FlashMint.sol
可以實現快速鑄造代幣。LearnCoin
合約繼承了導入的OpenZeppelin合約。因此,LearnCoin
合約將擁有OpenZeppelin合約的所有方法和屬性。
SNAPSHOT_ROLE
和PAUSER_ROLE
是常量值(使用keccak256
哈希函數創建),錶示合約中訪問控製的特定角色。
部署LearnCoin
合約時,會調用構造函數。構造函數設置了代幣的名稱和符號,授予部署帳戶(msg.sender)管理員、快照者和暫停者角色,併鑄造了一定數量的初始代幣供部署賬戶使用。
snapshot
,pause
和unpause
是允許具有相應角色的帳戶執行某些操作的函數。snapshot
函數可以創建快照,pause
和unpause
函數可以停止和重新啟動代幣轉賬。
函數_beforeTokenTransfer
、_afterTokenTransfer
、_mint
和_burn
是從父合約重寫的內部函數。它們執行LearnCoin合約的自定義邏輯。
_beforeTokenTransfer
:在代幣轉賬之前調用此函數,確保代幣轉賬不會暫停。_afterTokenTransfer
:在代幣轉賬之後調用此函數。此處,它是一個空函數,但可用於轉賬後立即執行的自定義邏輯。_mint
:此函數用於創建新代幣併將其分配給給定的帳戶。_burn
:此函數用於銷毀來自給定帳戶的代幣。本章是對LearnCoin
合約所做的綜合介紹。合約部署完成後,您可以運行該合約,我們將在下一章中詳細探討。