第4課

LearnCoin合約詳解

通過本章的學習,您應該: 1.了解LearnCoin合約的核心部分和功能。 2.了解OpenZeppelin合約和庫在我們的代幣合約中的作用。

引言

在上一章中,我們將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語句

合約開頭的import語句是從OpenZeppelin的合約庫中導入代碼:

  • ERC20.sol是ERC20代幣的基礎合約。
  • ERC20Burnable.sol使代幣持有者能夠銷毀自己的代幣。
  • ERC20Snapshot.sol支持創建代幣餘額的快照。
  • AccessControl.sol是一個用於管理對某些功能的訪問權限的合約模塊。
  • Pausable.sol可以暫停和取消暫停代幣傳輸。
  • ERC20Permit.sol使持有者能夠通過許可(permits)使用用戶的代幣。
  • ERC20Votes.sol爲代幣添加了投票功能。
  • ERC20FlashMint.sol可以實現快速鑄造代幣。

LearnCoin合約聲明

LearnCoin合約繼承了導入的OpenZeppelin合約。因此,LearnCoin合約將擁有OpenZeppelin合約的所有方法和屬性。

角色聲明

SNAPSHOT_ROLEPAUSER_ROLE是常量值(使用keccak256哈希函數創建),錶示合約中訪問控製的特定角色。

構造函數

部署LearnCoin合約時,會調用構造函數。構造函數設置了代幣的名稱和符號,授予部署帳戶(msg.sender)管理員、快照者和暫停者角色,併鑄造了一定數量的初始代幣供部署賬戶使用。

其他函數

snapshotpauseunpause是允許具有相應角色的帳戶執行某些操作的函數。snapshot函數可以創建快照,pauseunpause函數可以停止和重新啟動代幣轉賬。

重寫

函數_beforeTokenTransfer_afterTokenTransfer_mint_burn是從父合約重寫的內部函數。它們執行LearnCoin合約的自定義邏輯。

  • _beforeTokenTransfer:在代幣轉賬之前調用此函數,確保代幣轉賬不會暫停。
  • _afterTokenTransfer:在代幣轉賬之後調用此函數。此處,它是一個空函數,但可用於轉賬後立即執行的自定義邏輯。
  • _mint:此函數用於創建新代幣併將其分配給給定的帳戶。
  • _burn:此函數用於銷毀來自給定帳戶的代幣。

結語

本章是對LearnCoin合約所做的綜合介紹。合約部署完成後,您可以運行該合約,我們將在下一章中詳細探討。

免責聲明
* 投資有風險,入市須謹慎。本課程不作為投資理財建議。
* 本課程由入駐Gate Learn的作者創作,觀點僅代表作者本人,絕不代表Gate Learn讚同其觀點或證實其描述。
目錄
第4課

LearnCoin合約詳解

通過本章的學習,您應該: 1.了解LearnCoin合約的核心部分和功能。 2.了解OpenZeppelin合約和庫在我們的代幣合約中的作用。

引言

在上一章中,我們將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語句

合約開頭的import語句是從OpenZeppelin的合約庫中導入代碼:

  • ERC20.sol是ERC20代幣的基礎合約。
  • ERC20Burnable.sol使代幣持有者能夠銷毀自己的代幣。
  • ERC20Snapshot.sol支持創建代幣餘額的快照。
  • AccessControl.sol是一個用於管理對某些功能的訪問權限的合約模塊。
  • Pausable.sol可以暫停和取消暫停代幣傳輸。
  • ERC20Permit.sol使持有者能夠通過許可(permits)使用用戶的代幣。
  • ERC20Votes.sol爲代幣添加了投票功能。
  • ERC20FlashMint.sol可以實現快速鑄造代幣。

LearnCoin合約聲明

LearnCoin合約繼承了導入的OpenZeppelin合約。因此,LearnCoin合約將擁有OpenZeppelin合約的所有方法和屬性。

角色聲明

SNAPSHOT_ROLEPAUSER_ROLE是常量值(使用keccak256哈希函數創建),錶示合約中訪問控製的特定角色。

構造函數

部署LearnCoin合約時,會調用構造函數。構造函數設置了代幣的名稱和符號,授予部署帳戶(msg.sender)管理員、快照者和暫停者角色,併鑄造了一定數量的初始代幣供部署賬戶使用。

其他函數

snapshotpauseunpause是允許具有相應角色的帳戶執行某些操作的函數。snapshot函數可以創建快照,pauseunpause函數可以停止和重新啟動代幣轉賬。

重寫

函數_beforeTokenTransfer_afterTokenTransfer_mint_burn是從父合約重寫的內部函數。它們執行LearnCoin合約的自定義邏輯。

  • _beforeTokenTransfer:在代幣轉賬之前調用此函數,確保代幣轉賬不會暫停。
  • _afterTokenTransfer:在代幣轉賬之後調用此函數。此處,它是一個空函數,但可用於轉賬後立即執行的自定義邏輯。
  • _mint:此函數用於創建新代幣併將其分配給給定的帳戶。
  • _burn:此函數用於銷毀來自給定帳戶的代幣。

結語

本章是對LearnCoin合約所做的綜合介紹。合約部署完成後,您可以運行該合約,我們將在下一章中詳細探討。

免責聲明
* 投資有風險,入市須謹慎。本課程不作為投資理財建議。
* 本課程由入駐Gate Learn的作者創作,觀點僅代表作者本人,絕不代表Gate Learn讚同其觀點或證實其描述。
It seems that you are attempting to access our services from a Restricted Location where Gate.io is unable to provide services. We apologize for any inconvenience this may cause. Currently, the Restricted Locations include but not limited to: the United States of America, Canada, Cambodia, Thailand, Cuba, Iran, North Korea and so on. For more information regarding the Restricted Locations, please refer to the User Agreement. Should you have any other questions, please contact our Customer Support Team.