Lesson 4

Изучение контракта LearnCoin

К концу этого урока Вы должны уметь: 1.Понимать основные части и функциональные возможности контракта LearnCoin. 2.Понять роль контрактов и библиотек OpenZeppelin в нашем токен-контракте.

Введение

В последнем уроке мы развернули наш контракт LearnCoin в сети Goerli Testnet. В этом уроке мы подробно рассмотрим функциональные возможности контракта 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";

контракт LearnCoin - это 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);
    }

    // Следующие функции являются переопределениями, требуемыми 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);
    }
}

Контракт, который Вы развернули, - это контракт на токен ERC20 под названием LearnCoin. Она включает в себя несколько функций из библиотеки контрактов OpenZeppelin, таких как сгораемые токены, моментальные снимки, контроль доступа, токены с паузой, разрешительные функции, голосования и флэш-мята.

Заявления об импорте контрактов

Операторы импорта в начале контракта втягивают код из библиотеки контрактов OpenZeppelin:

  • ERC20.sol - это базовый контракт для токенов ERC20.
  • ERC20Burnable.sol добавляет возможность держателям токенов уничтожать свои собственные токены.
  • ERC20Snapshot.sol позволяет создавать моментальные снимки баланса токенов.
  • AccessControl.sol - это контрактный модуль для управления доступом к определенной функциональности.
  • Pausable.sol добавляет возможность приостанавливать и распаузировать передачу токенов.
  • ERC20Permit.sol позволяет держателям тратить токены пользователей с помощью разрешений.
  • ERC20Votes.sol добавляет токену возможность голосования.
  • ERC20FlashMint.sol позволяет осуществлять флеш-чеканку токенов.

Декларация контракта LearnCoin

Контракт LearnCoin наследует от импортированных контрактов OpenZeppelin. Это означает, что он будет иметь все методы и свойства из этих контрактов.

Декларации ролей

SNAPSHOT_ROLE и PAUSER_ROLE - это константные значения (созданные с помощью хэш-функции keccak256 ), которые представляют определенные роли для контроля доступа в рамках контракта.

Функция Конструктора

Когда контракт LearnCoin развернут, вызывается функция-конструктор. Он устанавливает имя и символ токена, предоставляет развертывающей учетной записи (msg.sender) роли admin, snapshot и pauser, а также чеканит начальный запас токенов для развертывающей учетной записи.

Дополнительные функции

Снимок, пауза и распауза - это функции, которые позволяют учетным записям с соответствующими ролями выполнять определенные действия. snapshot позволяет сделать моментальный снимок, pause и unpause позволяют останавливать и возобновлять передачу маркера.

Переопределяет

Функции _beforeTokenTransfer, _afterTokenTransfer, _mint и _burn - это внутренние функции, которые переопределяются из родительских контрактов. Они реализуют пользовательскую логику для контракта LearnCoin.

  • _beforeTokenTransfer: Эта функция вызывается перед любой передачей токенов. Это гарантирует, что передача токенов не будет приостановлена.
  • _afterTokenTransfer: Эта функция вызывается после любой передачи токенов. Здесь это пустая функция, но она может быть использована для пользовательской логики, которая должна происходить сразу после переносов.
  • _mint: Эта функция создает новые токены и присваивает их заданному счету.
  • _burn: Эта функция уничтожает токены с данного счета.

Заключение

Это был краткий обзор Вашего контракта LearnCoin. Развернув контракт, Вы теперь готовы к взаимодействию с ним, которое мы рассмотрим в следующем уроке.

Disclaimer
* Crypto investment involves significant risks. Please proceed with caution. The course is not intended as investment advice.
* The course is created by the author who has joined Gate Learn. Any opinion shared by the author does not represent Gate Learn.
Catalog
Lesson 4

Изучение контракта LearnCoin

К концу этого урока Вы должны уметь: 1.Понимать основные части и функциональные возможности контракта LearnCoin. 2.Понять роль контрактов и библиотек OpenZeppelin в нашем токен-контракте.

Введение

В последнем уроке мы развернули наш контракт LearnCoin в сети Goerli Testnet. В этом уроке мы подробно рассмотрим функциональные возможности контракта 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";

контракт LearnCoin - это 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);
    }

    // Следующие функции являются переопределениями, требуемыми 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);
    }
}

Контракт, который Вы развернули, - это контракт на токен ERC20 под названием LearnCoin. Она включает в себя несколько функций из библиотеки контрактов OpenZeppelin, таких как сгораемые токены, моментальные снимки, контроль доступа, токены с паузой, разрешительные функции, голосования и флэш-мята.

Заявления об импорте контрактов

Операторы импорта в начале контракта втягивают код из библиотеки контрактов OpenZeppelin:

  • ERC20.sol - это базовый контракт для токенов ERC20.
  • ERC20Burnable.sol добавляет возможность держателям токенов уничтожать свои собственные токены.
  • ERC20Snapshot.sol позволяет создавать моментальные снимки баланса токенов.
  • AccessControl.sol - это контрактный модуль для управления доступом к определенной функциональности.
  • Pausable.sol добавляет возможность приостанавливать и распаузировать передачу токенов.
  • ERC20Permit.sol позволяет держателям тратить токены пользователей с помощью разрешений.
  • ERC20Votes.sol добавляет токену возможность голосования.
  • ERC20FlashMint.sol позволяет осуществлять флеш-чеканку токенов.

Декларация контракта LearnCoin

Контракт LearnCoin наследует от импортированных контрактов OpenZeppelin. Это означает, что он будет иметь все методы и свойства из этих контрактов.

Декларации ролей

SNAPSHOT_ROLE и PAUSER_ROLE - это константные значения (созданные с помощью хэш-функции keccak256 ), которые представляют определенные роли для контроля доступа в рамках контракта.

Функция Конструктора

Когда контракт LearnCoin развернут, вызывается функция-конструктор. Он устанавливает имя и символ токена, предоставляет развертывающей учетной записи (msg.sender) роли admin, snapshot и pauser, а также чеканит начальный запас токенов для развертывающей учетной записи.

Дополнительные функции

Снимок, пауза и распауза - это функции, которые позволяют учетным записям с соответствующими ролями выполнять определенные действия. snapshot позволяет сделать моментальный снимок, pause и unpause позволяют останавливать и возобновлять передачу маркера.

Переопределяет

Функции _beforeTokenTransfer, _afterTokenTransfer, _mint и _burn - это внутренние функции, которые переопределяются из родительских контрактов. Они реализуют пользовательскую логику для контракта LearnCoin.

  • _beforeTokenTransfer: Эта функция вызывается перед любой передачей токенов. Это гарантирует, что передача токенов не будет приостановлена.
  • _afterTokenTransfer: Эта функция вызывается после любой передачи токенов. Здесь это пустая функция, но она может быть использована для пользовательской логики, которая должна происходить сразу после переносов.
  • _mint: Эта функция создает новые токены и присваивает их заданному счету.
  • _burn: Эта функция уничтожает токены с данного счета.

Заключение

Это был краткий обзор Вашего контракта LearnCoin. Развернув контракт, Вы теперь готовы к взаимодействию с ним, которое мы рассмотрим в следующем уроке.

Disclaimer
* Crypto investment involves significant risks. Please proceed with caution. The course is not intended as investment advice.
* The course is created by the author who has joined Gate Learn. Any opinion shared by the author does not represent Gate Learn.