Урок 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.