Solidity / ERC-20 token бүтээх

ERC-20 token бүтээх

Энэ хичээлд OpenZeppelin-ийн ERC20 contract ашиглан өөрийн токен бүтээж, Remix IDE дээр deploy хийж, MetaMask-д нэмнэ.

OpenZeppelin ERC20

ERC-20-ийг эхнээс бичих нь алдаа гаргах эрсдэлтэй. OpenZeppelin нь audit хийгдсэн, баталгаажсан хэрэгжүүлэлтийг өгдөг тул ашиглах нь зөв.

Remix IDE дээр OpenZeppelin-г npm-гүйгээр import хийж болно:

solidity
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

Энгийн токен

solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20 {
    constructor() ERC20("My Token", "MTK") {
        // 1,000,000 токен үүсгэгч руу mint хийнэ
        // decimals() = 18 тул 10**18-г үржүүлнэ
        _mint(msg.sender, 1_000_000 * 10 ** decimals());
    }
}
  • "My Token" — токений бүрэн нэр (name)
  • "MTK" — товчилсон нэр (symbol)
  • decimals() — анхдагч утга 18 (ETH-тэй адил)
  • _mint — шинэ токен гаргах дотоод функц

Decimals гэж юу вэ?

ERC-20 токен бүтэн тоогоор хадгалагддаг. decimals = 18 гэдэг нь:

код
1 MTK = 1,000,000,000,000,000,000 (10^18) хамгийн жижиг нэгж

Тиймээс 1 MTK илэрхийлэхэд 1 * 10**18 бичдэг.

Mintable токен — эзэмшигч нэмж гаргаж болно

solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MintableToken is ERC20, Ownable {
    uint256 public maxSupply;

    constructor(uint256 _maxSupply) ERC20("Mintable Token", "MINT") Ownable(msg.sender) {
        maxSupply = _maxSupply * 10 ** decimals();
        // Эхний 100,000 токенийг үүсгэгчид өгнө
        _mint(msg.sender, 100_000 * 10 ** decimals());
    }

    // Зөвхөн эзэмшигч нэмж гаргаж болно
    function mint(address to, uint256 amount) public onlyOwner {
        require(totalSupply() + amount <= maxSupply, "Дээд хэмжээнээс хэтэрлээ");
        _mint(to, amount);
    }
}

Burnable токен — устгаж болно

solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";

contract BurnableToken is ERC20, ERC20Burnable {
    constructor() ERC20("Burnable Token", "BURN") {
        _mint(msg.sender, 500_000 * 10 ** decimals());
    }
}

ERC20Burnable extension нь burn(amount) болон burnFrom(account, amount) функцүүдийг нэмнэ.

Бүрэн жишээ — MNT токен

solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MNToken is ERC20, ERC20Burnable, Ownable {
    uint256 public constant MAX_SUPPLY = 10_000_000 * 10 ** 18; // 10 сая токен

    event TokensMinted(address indexed to, uint256 amount);

    constructor() ERC20("Mongolia Token", "MNT") Ownable(msg.sender) {
        // 1 сая токенийг үүсгэгчид өгнө
        _mint(msg.sender, 1_000_000 * 10 ** decimals());
    }

    function mint(address to, uint256 amount) public onlyOwner {
        require(to != address(0), "Хүчингүй хаяг");
        require(totalSupply() + amount <= MAX_SUPPLY, "Дээд хэмжээнээс хэтэрлээ");
        _mint(to, amount);
        emit TokensMinted(to, amount);
    }
}

Remix IDE дээр deploy хийх

1. Файл үүсгэх

Remix IDE (remix.ethereum.org) нээж, contracts/MNToken.sol файл үүсгэж дээрх кодыг хуулна.

2. Compile хийх

  • Зүүн талын "Solidity Compiler" цэс нээнэ
  • "Compile MNToken.sol" товч дарна
  • Алдаагүй бол ногоон тэмдэг гарна

3. Deploy хийх

  • "Deploy & Run Transactions" цэс нээнэ
  • Environment: "Remix VM (Cancun)" сонгоно (тест орчин)
  • Contract: "MNToken" сонгоно
  • "Deploy" товч дарна

4. Тест хийх

Deploy хийсний дараа доор функцүүд гарна:

  • balanceOf — хаягийн үлдэгдэл шалгах
  • transfer — токен илгээх
  • totalSupply — нийт гаргалт харах

MetaMask-д нэмэх

Testnet-д deploy хийсний дараа MetaMask-д нэмж болно:

  1. MetaMask нээж → "Tokens" tab → "Import tokens"
  2. Token contract address оруулна
  3. Symbol болон Decimals автоматаар татагдана
  4. "Add custom token" → "Import tokens"

Токен MetaMask-д харагдаж эхэлнэ.

Дараагийн хичээлд:

Smart contract-ийн нийтлэг аюулгүй байдлын асуудлуудыг судална.