Solidity / ERC-20 token стандарт

ERC-20 token стандарт

ERC-20 бол Ethereum дээрх хамгийн өргөн хэрэглэгддэг token стандарт юм. USDT, USDC, UNI, LINK зэрэг мянга мянган token энэ стандартыг дагадаг.

ERC-20 гэж юу вэ?

ERC — Ethereum Request for Comments. Ethereum-ийн нийгэмлэг саналаа оруулж, зөвшилцсөний үндсэн дээр гаргасан стандарт.

ERC-20 нь 2015 онд тодорхойлогдсон token стандарт бөгөөд дараах асуудлыг шийдсэн:

Стандартгүй байвал:

код
TokenA.send(to, amount)
TokenB.transfer(recipient, value)
TokenC.move(destination, tokens)

Stандарттай бол:

код
TokenA.transfer(to, amount)  ✅
TokenB.transfer(to, amount)  ✅
TokenC.transfer(to, amount)  ✅

Uniswap, Aave, Compound зэрэг протоколууд ямар ч ERC-20 токенийг нэг кодоор дэмжиж чадна — стандартын ачаар.

IERC20 — бүтэн интерфэйс

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

interface IERC20 {
    // ── Унших функцүүд ──────────────────────────────

    // Нийт гаргалтын хэмжээ
    function totalSupply() external view returns (uint256);

    // Тухайн хаягийн токений үлдэгдэл
    function balanceOf(address account) external view returns (uint256);

    // owner-ийн spender-т зөвшөөрсөн дүн
    function allowance(address owner, address spender) external view returns (uint256);

    // ── Бичих функцүүд ──────────────────────────────

    // Өөрийн токенийг to руу илгээх
    function transfer(address to, uint256 amount) external returns (bool);

    // spender-т amount токен зарцуулах эрх олгох
    function approve(address spender, uint256 amount) external returns (bool);

    // from-ийн токенийг to руу илгээх (урьдчилсан зөвшөөрөлтэйгээр)
    function transferFrom(address from, address to, uint256 amount) external returns (bool);

    // ── Үйл явдлууд ─────────────────────────────────

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

Функц бүрийн үүрэг

totalSupply — нийт гаргалт

solidity
function totalSupply() external view returns (uint256);

Бүх гаргагдсан токений нийт дүн. Жишээ нь USDT-ийн totalSupply() нь тухайн үеийн нийт гаргалтыг буцаана.

balanceOf — үлдэгдэл шалгах

solidity
function balanceOf(address account) external view returns (uint256);

Тухайн хаягт хэдэн токен байгааг буцаана.

transfer — шууд илгээх

solidity
function transfer(address to, uint256 amount) external returns (bool);

msg.sender-ийн токенийг to руу шилжүүлнэ. Хамгийн энгийн илгээлтийн арга.

approve + transferFrom — гуравдагч этгээдэд зөвшөөрөл

DeFi протоколууд хэрэглэгчийн токенийг шилжүүлэхдээ энэ хосыг ашиглана:

код
1. Хэрэглэгч → approve(Uniswap, 100 USDT)
   "Uniswap миний 100 USDT-г зарцуулж болно"

2. Uniswap → transferFrom(хэрэглэгч, pool, 100 USDT)
   "Зөвшөөрлийн дагуу 100 USDT-г авна"
solidity
// Хэрэглэгч Uniswap-д зөвшөөрөл өгнө
token.approve(uniswapAddress, 100 * 10**18);

// Uniswap хэрэглэгчийн токенийг pool руу шилжүүлнэ
token.transferFrom(userAddress, poolAddress, 100 * 10**18);

allowance — зөвшөөрсөн дүн шалгах

solidity
function allowance(address owner, address spender) external view returns (uint256);

owner-ийн spender-т зөвшөөрсөн үлдэгдэл дүнг буцаана.

Transfer vs TransferFrom урсгал

код
transfer:
  Хэрэглэгч А ──transfer(В, 50)──► Хэрэглэгч В

transferFrom:
  Хэрэглэгч А ──approve(Dapp, 100)──► Dapp
  Dapp ──transferFrom(А, В, 50)──► Хэрэглэгч В

Яагаад стандарт чухал вэ?

Нийцтэй байдал: Etherscan, MetaMask, Uniswap зэрэг бүх хэрэгслүүд ERC-20 токенийг автоматаар таньж, харуулна.

Аюулгүй байдал: Стандартчилагдсан интерфэйс нь audit хийхэд хялбар болгоно.

Нэгдсэн зах зээл: Ямар ч ERC-20 токенийг DEX дээр арилжаалж болно — тусгай нэгтгэл шаардахгүй.

Хөгжүүлэлтийн хялбарчлал: OpenZeppelin зэрэг library нь бүрэн хэрэгжүүлэлтийг өгдөг тул дахин зохион бүтээх шаардлагагүй.

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

OpenZeppelin ашиглан өөрийн ERC-20 токен бүтээнэ.