ERC-20 token бүтээх
Энэ хичээлд OpenZeppelin-ийн ERC20 contract ашиглан өөрийн токен бүтээж, Remix IDE дээр deploy хийж, MetaMask-д нэмнэ.
OpenZeppelin ERC20
ERC-20-ийг эхнээс бичих нь алдаа гаргах эрсдэлтэй. OpenZeppelin нь audit хийгдсэн, баталгаажсан хэрэгжүүлэлтийг өгдөг тул ашиглах нь зөв.
Remix IDE дээр OpenZeppelin-г npm-гүйгээр import хийж болно:
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
Энгийн токен
// 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 токен — эзэмшигч нэмж гаргаж болно
// 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 токен — устгаж болно
// 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 токен
// 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-д нэмж болно:
- MetaMask нээж → "Tokens" tab → "Import tokens"
- Token contract address оруулна
- Symbol болон Decimals автоматаар татагдана
- "Add custom token" → "Import tokens"
Токен MetaMask-д харагдаж эхэлнэ.
Дараагийн хичээлд:
Smart contract-ийн нийтлэг аюулгүй байдлын асуудлуудыг судална.