ERC-20 Token
ERC-20 adalah standar token di Ethereum. Semua token fungible (USDC, UNI, LINK, dll.) mengikuti interface yang sama. Ini memungkinkan interoperabilitas — setiap wallet dan DEX bisa support token baru tanpa integrasi khusus.
Interface ERC-20
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
// Setiap ERC-20 token HARUS implement fungsi ini:
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
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);
}
Implementasi dengan OpenZeppelin
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract BelajarToken is ERC20, Ownable {
constructor() ERC20("BelajarToken", "BLJAR") Ownable(msg.sender) {
// Mint 1 juta token ke deployer
// 18 decimals (default ERC-20)
_mint(msg.sender, 1_000_000 * 10 ** decimals());
}
// Owner bisa mint token baru
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
}
Approve & TransferFrom Pattern
Pattern ini penting untuk DeFi. User "approve" sebuah contract (misal Uniswap) untuk spend token mereka.
// Step 1: User approve Uniswap untuk spend 100 token
token.approve(uniswapRouter, 100 * 10**18);
// Step 2: Uniswap (contract) panggil transferFrom
// Di dalam Uniswap contract:
token.transferFrom(user, liquidityPool, 100 * 10**18);
// Ini memungkinkan contract berinteraksi dengan token user
// tanpa user harus kirim token manual
Decimals
Token ERC-20 tidak punya desimal di Solidity (semua integer). Decimals hanya untuk display:
- 18 decimals (default) — 1 token = 1000000000000000000 (10^18)
- 6 decimals (USDC, USDT) — 1 USDC = 1000000
- Selalu gunakan
parseUnitsdanformatUnitsuntuk konversi
Interact dari Frontend
// Baca balance
const balance = await tokenContract.balanceOf(userAddress);
const formatted = ethers.formatUnits(balance, 18);
console.log(`Balance: ${formatted} BLJAR`);
// Transfer token
const tx = await tokenContract.transfer(
recipientAddress,
ethers.parseUnits("50", 18) // kirim 50 token
);
await tx.wait();