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 — бүтэн интерфэйс
// 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 — нийт гаргалт
function totalSupply() external view returns (uint256);
Бүх гаргагдсан токений нийт дүн. Жишээ нь USDT-ийн totalSupply() нь тухайн үеийн нийт гаргалтыг буцаана.
balanceOf — үлдэгдэл шалгах
function balanceOf(address account) external view returns (uint256);
Тухайн хаягт хэдэн токен байгааг буцаана.
transfer — шууд илгээх
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-г авна"
// Хэрэглэгч Uniswap-д зөвшөөрөл өгнө
token.approve(uniswapAddress, 100 * 10**18);
// Uniswap хэрэглэгчийн токенийг pool руу шилжүүлнэ
token.transferFrom(userAddress, poolAddress, 100 * 10**18);
allowance — зөвшөөрсөн дүн шалгах
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 токен бүтээнэ.