Lição 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合約所做的綜合介紹。合約部署完成後,您可以運行該合約,我們將在下一章中詳細探討。

Isenção de responsabilidade
* O investimento em criptomoedas envolve grandes riscos. Prossiga com cautela. O curso não se destina a servir de orientação para investimentos.
* O curso foi criado pelo autor que entrou para o Gate Learn. As opiniões compartilhadas pelo autor não representam o Gate Learn.
Catálogo
Lição 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合約所做的綜合介紹。合約部署完成後,您可以運行該合約,我們將在下一章中詳細探討。

Isenção de responsabilidade
* O investimento em criptomoedas envolve grandes riscos. Prossiga com cautela. O curso não se destina a servir de orientação para investimentos.
* O curso foi criado pelo autor que entrou para o Gate Learn. As opiniões compartilhadas pelo autor não representam o Gate Learn.