ERC-20 Token — Web3

ERC-20 Token ERC-20 adalah standar token di Ethereum. Semua token fungible (USDC, UNI, LINK, dll.) mengikuti interface yang sama. Ini memungkinkan…

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:

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();

Yang akan kamu pelajari