← Protocols
ERC-20 — Fungible Token Standard
Standard / EIP·EVM

ERC-20 — Fungible Token Standard

01Description

Final ERC standard. Defines the canonical interface for fungible tokens on EVM chains: balances, transfers, allowances, and approval flows that wallets, DEXs, and bridges all rely on.

02Best for
  • 01stablecoins
  • 02governance tokens
  • 03utility tokens
  • 04reward tokens
  • 05any fungible on-chain unit
03Install
  • pnpm add @openzeppelin/contracts
05Prompt snippet
Implement ERC-20 by extending `ERC20` from `@openzeppelin/contracts/token/ERC20/ERC20.sol` (or Solady's `ERC20` for gas-optimized). The required interface (`IERC20`) exposes `totalSupply()`, `balanceOf(address)`, `transfer(address,uint256)`, `transferFrom(address,address,uint256)`, `approve(address,uint256)`, `allowance(address,address)`, plus `Transfer` and `Approval` events. Use `_mint(to, amount)` / `_burn(from, amount)` internally. For permit-style gasless approvals, extend `ERC20Permit` (EIP-2612). Always return `bool` from `transfer`/`transferFrom`/`approve` — non-compliant tokens that don't are a major source of integration bugs (use `SafeERC20` from OpenZeppelin when calling unknown tokens).
06Gotchas
  • Decimals are NOT part of the standard interface guarantee — most use 18 but USDC/USDT use 6 and WBTC uses 8. Never assume 18; always read `decimals()`.
  • Some legacy tokens (USDT mainnet, BNB) don't return `bool` from `transfer`/`approve` — calling them via a typed `IERC20` interface reverts. Use `SafeERC20.safeTransfer`/`safeApprove` to handle both shapes.
  • Fee-on-transfer and rebasing tokens break the invariant `balanceAfter == balanceBefore + amount`. Pools/vaults must measure actual delta, not trust the input amount.
  • The `approve` race condition: changing a non-zero allowance to another non-zero value is exploitable. Use `increaseAllowance`/`decreaseAllowance` or set to 0 first.
  • Transferring tokens to the token contract itself or to address(0) is a common user mistake — funds are usually unrecoverable.
07Alternatives