Aerodrome Architecture
Aerodrome is a ve(3,3) AMM on Base, inspired by Solidly. It combines vote-escrowed tokenomics with an automated market maker to align incentives between liquidity providers, voters, and token holders.
Overview
code
┌──────────────────────────────────────────────────────────────┐ │ AERODROME PROTOCOL │ ├──────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ AERO │ │ VotingEscrow│ │ Voter │ │ │ │ Token │───►│ (veAERO) │───►│ │ │ │ └─────────────┘ └─────────────┘ └──────┬──────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Minter │ │ Rewards │ │ Gauges │ │ │ │ (Emissions) │ │ Distributor │ │ │ │ │ └─────────────┘ └─────────────┘ └──────┬──────┘ │ │ │ │ │ ┌───────────────────┤ │ │ ▼ ▼ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ Pools │ │ Rewards │ │ │ │(sAMM/vAMM) │ │(Fees/Bribes)│ │ │ └─────────────┘ └─────────────┘ │ │ │ └──────────────────────────────────────────────────────────────┘
Core Contracts
| Contract | Description |
|---|---|
Aero.sol | ERC20 token - the native protocol token |
VotingEscrow.sol | Vote-escrowed NFT (veAERO) for locking AERO |
Voter.sol | Manages votes, gauge creation, emission distribution |
Pool.sol | AMM pools (stable and volatile) |
Router.sol | Swap and liquidity operations |
Gauge.sol | Distributes emissions to LP stakers |
Minter.sol | Controls emission schedule and rebases |
RewardsDistributor.sol | Distributes rebases to veNFT holders |
The ve(3,3) Model
code
┌──────────────────────────────────────────────────────────────┐ │ ve(3,3) FLYWHEEL │ ├──────────────────────────────────────────────────────────────┤ │ │ │ 1. Lock AERO ──► Receive veAERO NFT │ │ │ │ │ ▼ │ │ 2. Vote for Pools ──► Earn fees + bribes from those pools │ │ │ │ │ ▼ │ │ 3. Pools with votes ──► Receive emissions to their gauges │ │ │ │ │ ▼ │ │ 4. LPs stake in gauges ──► Earn AERO emissions │ │ │ │ │ ▼ │ │ 5. More LP activity ──► More fees for voters │ │ │ │ │ └──────────► Back to step 1 (positive feedback loop) │ │ │ └──────────────────────────────────────────────────────────────┘
Epochs
Aerodrome operates on weekly epochs:
- •Epoch Start: Thursday 00:00 UTC
- •Vote Window: First hour after epoch start is blocked (distribution)
- •Vote End: Last hour before epoch end is restricted (only whitelisted NFTs)
- •Duration: 7 days
solidity
library ProtocolTimeLibrary {
uint256 internal constant WEEK = 7 days;
function epochStart(uint256 timestamp) internal pure returns (uint256) {
return (timestamp / WEEK) * WEEK;
}
function epochNext(uint256 timestamp) internal pure returns (uint256) {
return epochStart(timestamp) + WEEK;
}
}
Token Types
AERO Token
Standard ERC20 token minted by the Minter contract:
solidity
contract Aero is IAero {
// Only Minter can mint new tokens
function mint(address account, uint256 amount) external {
if (msg.sender != minter) revert NotMinter();
_mint(account, amount);
}
}
veAERO NFT States
code
┌──────────────────────────────────────────────────────────────┐ │ veNFT STATES │ ├──────────────────────────────────────────────────────────────┤ │ │ │ NORMAL ────────────► Regular veNFT with decaying power │ │ │ Can: vote, merge, split, withdraw │ │ │ │ │ ▼ │ │ NORMAL_PERMANENT ──► Permanently locked, no decay │ │ │ Can: vote, delegate, split │ │ │ │ │ ▼ │ │ MANAGED ──────────► Special NFT for aggregated voting │ │ │ Created by governance, always permanent │ │ │ │ │ ▼ │ │ LOCKED ───────────► Normal NFT deposited into Managed │ │ Restricted functionality, earning │ │ rewards through the managed NFT │ │ │ └──────────────────────────────────────────────────────────────┘
Pool Types
| Type | Formula | Use Case |
|---|---|---|
| Volatile (vAMM) | x * y = k | Uncorrelated assets (ETH/USDC) |
| Stable (sAMM) | x³y + y³x = k | Correlated assets (USDC/DAI) |
solidity
function _k(uint256 x, uint256 y) internal view returns (uint256) {
if (stable) {
// Stable pool curve: x³y + y³x
uint256 _x = (x * 1e18) / decimals0;
uint256 _y = (y * 1e18) / decimals1;
uint256 _a = (_x * _y) / 1e18;
uint256 _b = ((_x * _x) / 1e18 + (_y * _y) / 1e18);
return (_a * _b) / 1e18;
} else {
// Volatile pool: x * y
return x * y;
}
}
Emission Schedule
code
┌──────────────────────────────────────────────────────────────┐ │ EMISSION SCHEDULE │ ├──────────────────────────────────────────────────────────────┤ │ │ │ Phase 1 (First 14 epochs): │ │ • Weekly growth: 3% per epoch │ │ • Starting: 10M AERO/week │ │ │ │ Phase 2 (Epoch 15+): │ │ • Weekly decay: 1% per epoch │ │ • Continues until tail emissions │ │ │ │ Tail Emissions (when weekly < 8.97M): │ │ • Switch to % of total supply │ │ • Rate adjustable via EpochGovernor (0.01% - 1%) │ │ • Default: 0.67% of supply │ │ │ └──────────────────────────────────────────────────────────────┘
Governance Roles
| Role | Permissions |
|---|---|
| Team | Set team rate, manage managed NFTs |
| Governor | Whitelist tokens, set max voting num |
| EpochGovernor | Nudge tail emission rate |
| EmergencyCouncil | Kill/revive gauges, modify pool names |
Key Differences from Uniswap V2
| Feature | Uniswap V2 | Aerodrome |
|---|---|---|
| Fees | Go to LPs | Go to voters (via gauges) |
| Incentives | None | AERO emissions to LPs |
| Governance | External | veAERO voting |
| Pool Types | Volatile only | Stable + Volatile |
| Bribes | None | External rewards for voters |
Deployed Addresses (Base)
| Contract | Address |
|---|---|
| AERO | 0x940181a94A35A4569E4529A3CDfB74e38FD98631 |
| VotingEscrow | 0xeBf418Fe2512e7E6bd9b87a8F0f294aCDC67e6B4 |
| Voter | 0x16613524e02ad97eDfeF371bC883F2F5d6C480A5 |
| Router | 0xcF77a3Ba9A5CA399B7c97c74d54e5b1Beb874E43 |
| PoolFactory | 0x420DD381b31aEf6683db6B902084cB0FFECe40Da |
| Minter | 0xeB018363F0a9Af8f91F06FEe6613a751b2A33FE5 |
| RewardsDistributor | 0x227f65131A261548b057215bB1D5Ab2997964C7d |
Reference Files
- •
contracts/Aero.sol- Protocol token - •
contracts/VotingEscrow.sol- Vote escrow NFT - •
contracts/Voter.sol- Voting and gauge management - •
contracts/Pool.sol- AMM implementation - •
contracts/Router.sol- Swap and liquidity router - •
contracts/Minter.sol- Emission controller - •
SPECIFICATION.md- Full protocol specification