Ethereum has revolutionized the way digital assets are created and managed through smart contracts. At the heart of this innovation lies ERC20, the most widely adopted token standard for fungible tokens on the Ethereum blockchain. This guide dives into the structure, functions, and real-world applications of ERC20 tokens, while also exploring emerging standards like ERC223 and proposed enhancements such as EIP-677, EIP-621, and EIP-662.
Whether you're a developer building decentralized applications (dApps) or an enthusiast seeking deeper technical understanding, this comprehensive overview will clarify how Ethereum-based tokens work and evolve.
What Is ERC20?
ERC20 stands for "Ethereum Request for Comments 20" — a technical standard introduced via EIP-20. After extensive community discussion, it reached its final form in 2017 and has since become the foundation for thousands of tokens powering DeFi, NFTs, gaming, and more.
An ERC20-compliant smart contract must implement a set of mandatory and optional functions that define how tokens are transferred, queried, and managed.
Core Functions of ERC20
Here are the essential functions every ERC20 token must support:
totalSupply()
Returns the total number of tokens in circulation. This value may be fixed or dynamically adjusted depending on the token design.
balanceOf(address _owner)
Takes an Ethereum address as input and returns the token balance held by that account as a uint256.
transfer(address _to, uint256 _value)
Allows a user to send a specified amount of tokens to another address. If successful, it triggers a Transfer event. The transfer fails (and reverts state changes) if the sender lacks sufficient balance.
👉 Discover how token transfers power real-world DeFi transactions.
transferFrom(address _from, address _to, uint256 _value)
Enables third-party transfers — often used by dApps to withdraw tokens from users after approval. Crucial for automated services like exchanges or staking platforms.
approve(address _spender, uint256 _value)
Grants permission to another address (typically a smart contract) to spend up to _value tokens from the owner’s balance using transferFrom.
allowance(address _owner, address _spender)
Queries how many tokens a spender is still allowed to transfer from an owner’s account.
Required Events
ERC20 contracts must emit these events:
Transfer(address indexed _from, address indexed _to, uint256 _value)- Triggered whenever tokens are moved between accounts.
Approval(address indexed _owner, address indexed _spender, uint256 _value)- Emitted when
approve()is called.
- Emitted when
Optional Metadata Functions
While not required, these improve usability:
name()– Full token name (e.g., "Decentralized Coin")symbol()– Ticker symbol (e.g., "DCX")decimals()– Number of decimal places the token supports (usually 18, matching ETH)
⚠️ Note: These metadata functions are optional. Contracts should not assume they always return valid values.
Why Use approve() and transferFrom()?
One of ERC20’s key features is the ability for smart contracts to pull tokens from users rather than relying solely on push transfers (transfer). This solves a critical limitation: when a user sends tokens directly via transfer, the receiving contract cannot detect the incoming transaction.
For example, imagine a staking dApp that requires users to deposit tokens. Without approve and transferFrom, the contract wouldn’t know whether a transfer actually occurred. Instead, users first call approve() to authorize the dApp, then trigger the deposit function — which uses transferFrom() to pull the approved amount securely.
This mechanism ensures atomicity and prevents race conditions in complex interactions.
Introducing ERC223: Solving ERC20’s Shortcomings
While ERC20 is robust, it has known issues — most notably the risk of irreversible loss when sending tokens to contracts that don’t handle them properly. ERC223 was proposed to address this and unify transfer logic.
Key Features of ERC223
ERC223 retains core functions like name(), symbol(), balanceOf(), and totalSupply(), but enhances the transfer mechanism:
Unified Transfer with Callback
Instead of separate transfer and transferFrom flows, ERC223 introduces:
transfer(address _to, uint256 _value)– Backward-compatible version.transfer(address _to, uint256 _value, bytes _data)– Extended version with optional data payload (similar to Bitcoin’sOP_RETURN).
When transferring to a contract, ERC223 requires calling a fallback function:
function tokenFallback(address _from, uint256 _value, bytes _data)This function allows receiving contracts to react to incoming tokens — rejecting invalid transfers or triggering internal logic.
Security Benefits
If the recipient contract doesn’t implement tokenFallback, the transfer reverts automatically. This prevents accidental loss of funds — a common issue under ERC20 where tokens sent to non-receiving contracts become stuck.
👉 See how next-gen token standards enhance security and functionality.
Emerging Proposals: Beyond ERC20 and ERC223
The Ethereum ecosystem continues evolving with new EIPs aiming to extend token capabilities:
EIP-677: transferAndCall — A Bridge to ERC223
This proposal adds a transferAndCall(address _to, uint256 _value, bytes _data) function to ERC20, combining token transfer with immediate execution in the recipient contract — effectively mirroring ERC223 behavior while maintaining backward compatibility.
Use cases include atomic token deposits into liquidity pools or governance systems.
EIP-621: Dynamic Supply Management
Suggests adding:
increaseSupply(uint _value, address _to)– Mints new tokens.decreaseSupply(uint _value, address _from)– Burns existing ones.
Though some developers prefer custom implementations (like mint() and burn()), standardizing supply control improves interoperability across tools and wallets.
EIP-662: Off-Chain Signed Transfers
Aims to enable gasless transactions by allowing users to sign transfer authorizations off-chain. A relayer submits the signed message to a provable_transfer function, which verifies the signature before executing the actual transfer.
This paves the way for meta-transactions and scalable layer-2 solutions.
Practical Implementations & Developer Resources
Several open-source frameworks provide secure, audited implementations of ERC20 and related standards:
- OpenZeppelin – Industry-standard library with modular contracts: OpenZeppelin Tokens
- ConsenSys Tokens – Reference implementations with extended functionality
- dapphub ds-token – Minimalist design focused on simplicity
- MiniMe Token – Cloneable token with snapshot functionality for tracking historical balances
These libraries help developers avoid common pitfalls like reentrancy attacks or integer overflows.
Keyword Integration Summary
Core keywords naturally integrated throughout:
- ERC20
- Ethereum token standard
- Smart contract
- Token transfer
- Decentralized application (dApp)
- Blockchain development
- Fungible tokens
- Solidity programming
Frequently Asked Questions (FAQ)
What is the main difference between ERC20 and ERC223?
ERC20 lacks built-in protection against sending tokens to contracts that can't handle them, risking permanent loss. ERC223 introduces a mandatory tokenFallback function that ensures receiving contracts acknowledge incoming transfers — making it safer and more efficient.
Can I use both ERC20 and ERC223 in the same project?
Yes, but they are not directly compatible. You’d need a wrapper contract or bridge logic. Most projects choose one standard based on security needs and ecosystem support.
Are all functions in ERC20 mandatory?
No. Only totalSupply, balanceOf, transfer, transferFrom, approve, and allowance are required. Functions like name, symbol, and decimals are optional but widely expected.
How do I prevent double-spending during approvals?
Always reset approval to zero before setting a new allowance if changing amounts. This mitigates front-running attacks where malicious actors exploit pending approvals.
What happens if I send ERC20 tokens to a contract without withdrawal logic?
The tokens may become permanently inaccessible. This is why newer standards like ERC223 include safeguards against such errors.
Is there a way to make token transfers gasless?
Yes — via meta-transactions enabled by standards like EIP-662. Users sign messages off-chain, and relayers submit them on their behalf, improving user experience in dApps.
👉 Explore platforms supporting advanced token interactions today.
Conclusion
ERC20 remains the backbone of Ethereum’s token economy — simple, proven, and universally supported. However, newer proposals like ERC223 and various EIPs highlight ongoing efforts to improve security, usability, and flexibility.
As blockchain technology matures, developers must stay informed about evolving standards to build safer, more efficient decentralized systems. Whether adopting established patterns or experimenting with cutting-edge extensions, understanding these fundamentals is crucial for anyone involved in Ethereum development.