Base (Coinbase's L2) has become the dominant chain for new ERC-20 token launches in 2026. Low fees (~$0.05 per transaction), Coinbase ecosystem integration, and deep liquidity make it the default choice for teams launching on EVM.
This guide covers the technical steps from contract to live trading.
Prerequisites
- Foundry installed (
curl -L https://foundry.paradigm.xyz | bash && foundryup) - ETH on Base Sepolia (testnet faucet: faucet.quicknode.com/base/sepolia)
- ETH on Base mainnet (bridge from Ethereum at bridge.base.org)
- A deployer wallet (separate from personal wallet — never use your main wallet)
Writing the ERC-20 Contract
Standard ERC-20 with OpenZeppelin:
mkdir my-token && cd my-token
forge init
forge install OpenZeppelin/openzeppelin-contracts
// src/MyToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyToken is ERC20, Ownable {
uint256 public constant MAX_SUPPLY = 1_000_000_000 * 10**18; // 1B tokens
constructor(address initialOwner)
ERC20("My Token", "MTK")
Ownable(initialOwner)
{
_mint(initialOwner, MAX_SUPPLY);
}
}
Add to foundry.toml:
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
[rpc_endpoints]
base_sepolia = "https://sepolia.base.org"
base = "https://mainnet.base.org"
[etherscan]
base_sepolia = { key = "${BASESCAN_API_KEY}", url = "https://api-sepolia.basescan.org/api" }
base = { key = "${BASESCAN_API_KEY}", url = "https://api.basescan.org/api" }
Deployment Script
// script/Deploy.s.sol
pragma solidity ^0.8.20;
import "forge-std/Script.sol";
import "../src/MyToken.sol";
contract Deploy is Script {
function run() external {
vm.startBroadcast();
new MyToken(msg.sender);
vm.stopBroadcast();
}
}
Deploy to Testnet First
# Deploy to Base Sepolia
forge script script/Deploy.s.sol \
--rpc-url base_sepolia \
--broadcast \
--verify \
-vvvv
Verify it works on Sepolia Basescan. Check the contract is verified and tokens landed in your deployer wallet.
Deploy to Mainnet
forge script script/Deploy.s.sol \
--rpc-url base \
--broadcast \
--verify \
-vvvv
Costs ~$5–10 in ETH on Base mainnet (much cheaper than Ethereum L1).
Setting Up Liquidity on Uniswap v3 (Base)
After deployment, you need a trading pair. Uniswap v3 on Base is standard:
- Go to app.uniswap.org → select Base network
- New Position → select your token + USDC (or WETH)
- Set price range (full range = simplest, no active management)
- Provide initial liquidity — this sets the opening price
Initial liquidity math: If you seed $10,000 USDC + 1,000,000 tokens, you're implying a $0.01/token price and $10M FDV (at 1B supply). Choose your initial liquidity and token ratio carefully — it sets the opening price.
After Launch
Get listed on CoinGecko/CMC: Submit a listing request. Requires contract address, description, social links. Takes 1–4 weeks.
Verify contract on Basescan: Foundry's --verify flag handles this automatically. Unverified contracts look suspicious.
Lock LP (if applicable): If you want to signal that liquidity won't be pulled, use a lock service to time-lock LP tokens.
Announce on socials: Share the contract address from your official channels so users can verify they have the right token.
Security Checklist Before Launch
- [ ] Contract audited (for significant launches)
- [ ] Owner rights minimized or renounced if appropriate
- [ ] No hidden mint function
- [ ] Max supply enforced
- [ ] No rug-pull vectors (owner can't drain LP)
- [ ] Deployed from a separate deployer wallet, not personal funds wallet