# Understanding the Aztec Token Auction: A Deep Dive into Continuous Clearing Auctions
## Introduction
The Aztec Protocol is conducting its token distribution through a novel mechanism called a Continuous Clearing Auction (CCA). Unlike traditional token sales that suffer from mispricing, timing games, and last-minute sniping, CCA introduces automatic bid spreading over time combined with continuous price discovery. This article analyzes the live auction state captured on December 2nd, 2025 (block 23,925,686) during Step 2 of the token release schedule. Foundry scripts and tests were used to get the latest numbers from mainnet.
## Core Concepts: MPS & TICKS
### WHAT IS MPS?
MPS = Milli-basis-points Per Second (actually per block in this implementation)
- Represents the rate at which tokens are released over time
- Total MPS = 10,000,000 (represents 100% of token supply)
- Think of it as '100% divided into 10 million units'
#### HOW MPS WORKS:
- Each auction step has an MPS rate (tokens released per block)
- MPS accumulates over time: cumulative_mps = sum of (step_mps x blocks_in_step)
- Percent released = (cumulative_mps / 10,000,000) x 100%
- Example: MPS = 2,500,000 means 25% of tokens have been released
#### WHY MPS MATTERS FOR BIDDERS:
- Your bid exposure = remaining_mps when you bid
- Bid at 0% released: exposure = 10,000,000 (100% of auction)
- Bid at 25% released: exposure = 7,500,000 (75% of auction)
- Your bid gets filled proportionally as MPS accumulates
- Formula: amount_paid = bid_amount x (current_mps / total_mps)
### WHAT ARE TICKS? ***
Ticks = discrete price levels in the order book
- Similar to limit order book in traditional exchanges
- Each tick represents a specific price point
- Bids aggregate at each tick level
- Ticks are evenly spaced by 'tick spacing'
#### TICK MECHANICS:
- Floor Price (Tick 1): 0.000009516266313599
- Tick Spacing (increment): 0.000000095162663135 (1% of floor price - tick 1)
- Next tick price = current_tick + tick_spacing
- Example: Tick 1 = floor, Tick 2 = floor + spacing, etc.
## The CCA Innovation: Automatic Bid Spreading
Every bid submitted to the Aztec CCA is automatically divided across all remaining auction intervals according to a predefined token release schedule. This creates several key advantages:
- **No timing games**: Participants cannot concentrate demand at a single moment
- **Fair price discovery**: Valuation matters more than bid timing
- **Natural advantages for early bidders**: Longer exposure to lower prices without separate token pools
- **Sniping prevention**: Last-minute gaming becomes ineffective
**Critical insight**: There are no separate "contributor" vs "public" token pools. All bidders compete for the same token supply, with early bidders gaining more exposure to the entire auction, not exclusive access to different tokens.
## Token Release Schedule:
The auction's token release schedule is encoded in the constructor parameter `auctionStepsData` as a byte string: `0x000000000001f61600015b0000001c200000000000000e1000008a0000000e1000008a0000001c2000008a0000001c2000008a0000001c203d66c00000000001`
**The Distribution according to `auctionStepsData` :**
| Step | Bytes (8) | MPS (3 bytes) | BlockDelta (5 bytes) | MPS Dec | Blocks Dec | Days | Dates | Block info (start block 23790741 + ) |
| ---- | ------------------ | ------------- | -------------------- | --------- | ---------- | ---------- | ----------------- | ------------------------------------ |
| 1 | `000000000001f616` | `000000` | `0001f616` | 0 | 128,534 | 17,85 days | Nov 13 - Dec 1st | 23919275 |
| 2 | `00015b0000001c20` | `00015b` | `0000001c20` | 347 | 7,200 | 1 day | Dec 1st - Dec 2nd | 23926475 |
| 3 | `0000000000000e10` | `000000` | `00000e10` | 0 | 3,600 | 12 hours | Dec 2 (pause) | 23930075 |
| 4 | `00008a0000000e10` | `00008a` | `00000e10` | 138 | 3,600 | 12 hours | Dec 2-3 | 23933675 |
| 5 | `00008a0000001c20` | `00008a` | `00001c20` | 138 | 7,200 | 1 day | Dec 3-4 | 23940875 |
| 6 | `00008a0000001c20` | `00008a` | `00001c20` | 138 | 7,200 | 1 day | Dec 4-5 | 23948075 |
| 7 | `00008a0000001c20` | `00008a` | `00001c20` | 138 | 7,200 | 1 day | Dec 5-6 | 23955275 |
| 8 | `3d66c00000000001` | `3d66c0` | `0000000001` | 4,024,000 | 1 | 1 block | Dec 6 | 23955276 |
This decodes into 8 distinct steps that control how tokens are released over time:
### Step 1: Early Bidding Phase (Nov 13 - Dec 1)
- **Blocks**: 23,790,741 - 23,919,275 (128,534 blocks ≈ 17.85 days)
- **MPS (Milli-basis-points per second)**: 0
- **Cumulative tokens released**: 0%
- **Key characteristic**: No tokens released yet, so ALL bids in Step 1 have identical 100% exposure to future token releases
### Step 2: Contributor Token Release (Dec 1 - Dec 2) 🎯 _Current Step_
- **Blocks**: 23,919,275 - 23,926,475 (7,200 blocks ≈ 1 day)
- **MPS**: 347
- **Cumulative tokens released**: 24.98%
- **Total MPS this step**: 2,498,400 (347 × 7,200 blocks)
- **Status**: Contributors-only period. This is where our analysis snapshot was captured (block 23,925,686)
### Step 3: Public Entry Pause (Dec 2)
- **Blocks**: 23,926,475 - 23,930,075 (3,600 blocks ≈ 12 hours)
- **MPS**: 0
- **Cumulative tokens released**: 24.98% (no change)
- **Purpose**: Marks the end of contributor period. Public bidding opens after this step.
### Steps 4-7: Gradual Release (Dec 3 - Dec 6)
Each step releases tokens at MPS = 138 over varying durations:
- **Step 4**: 3,600 blocks (12 hours) → 29.95% cumulative
- **Step 5**: 7,200 blocks (1 day) → 39.89% cumulative
- **Step 6**: 7,200 blocks (1 day) → 49.82% cumulative
- **Step 7**: 7,200 blocks (1 day) → 59.76% cumulative
### Step 8: Final Cleanup (Dec 6, single block)
- **Blocks**: 23,955,275 - 23,955,276 (1 block)
- **MPS**: 4,024,000
- **Cumulative tokens released**: 100%
- **Purpose**: Ensures exactly 100% distribution by releasing remaining 40.24% in the final block
## Current Auction State (Captured During Step 2)
### Live Metrics (Block 23,925,686)
**Price Discovery:**
- Floor Price: 0.000009516266313599 ETH per token
- Current Clearing Price: 0.000009516266313599 ETH per token (at floor)
- Clearing price remains at floor because supply exceeds demand
**Token Distribution Progress:**
- MPS Released: 2,224,617 / 10,000,000 (22.25%)
- Tokens Released: 344,148,249 out of 1,547,000,000 total supply
- Currency Raised: 2,787 ETH
**Bid Volume Analysis:**
- Total bid volume (order book): 13,566 ETH
- Implied total bids above clearing: 12,528 ETH
- Projected final raise: 12,528 ETH
**Understanding the Bid Volume Metrics:**
The difference between "order book volume" (13,566 ETH) and "implied total bids" (12,528 ETH) arises from the bid spreading mechanics:
- **Order book volume**: Sum of all bid amounts across price levels (how bids appear in the tick ladder)
- **Implied total bids**: Actual ETH that will be raised when auction completes
- **Why the difference?**: Bids are scaled by their exposure duration, creating weighted accounting
**Critical clarification**: Since the clearing price equals the floor price, there are NO bids below clearing. All active bids are above the clearing price. Bids cannot exist below the floor price (they would be invalid).
### Understanding "Implied Total Bids"
The formula `currencyRaised = totalBidAmounts × (mpsReleased / totalMPS)` shows how bids are progressively filled. With 22.25% of tokens released:
- If total competitive bids = 12,528 ETH
- Current fill rate = 22.25%
- Current currency raised = 12,528 × 0.2225 ≈ 2,787 ETH ✓
**Important**: This calculation assumes all bids were placed at the auction start. In reality, bids placed later have different exposure weights, making exact prediction complex without knowing bid timing.
### Supply vs Demand Equilibrium
**Current situation:**
- Tokens needed to fill all bids above clearing: 1,316,489,597
- Total token supply: 1,547,000,000
- **Excess supply**: 230,510,402 tokens (~14.9%)
**Price increase threshold:**
- Additional demand needed: 1,154 ETH
- Why? Total supply × clearing price = 14,721 ETH needed to absorb all tokens
- Current demand: 13,566 ETH
- Gap: 1,154 ETH
Once total demand exceeds 14,721 ETH, there won't be enough tokens at the current price, forcing the clearing price to rise to the next tick.
## The Tick Ladder: Price Discovery Mechanism
The auction uses a tick-based order book with 302 active price levels. Each tick represents a 1% price increase (100 basis points):
**Tick Spacing**: 0.000000095162663135 ETH per token increment
**Critical note**: The 13,566 ETH total represents "spread bid volume" where each bid appears across multiple price ticks. A single 100 ETH bid from price A to price B appears in ALL ticks between A and B. This does NOT equal the actual ETH committed by bidders.
## Early Bidder Advantage: Time-Weighted Exposure
### The Two-Bid Comparison
Consider two identical 100 ETH bids at maximum price:
**Bid A: Placed at auction start (Step 1 begins)**
- Exposure: 10,000,000 / 10,000,000 MPS (100%)
- Gets filled proportionally across the entire auction
- Has access to full token supply as it releases
**Bid B: Placed at contributor end (last moment before public)**
- Exposure: 7,501,600 / 10,000,000 MPS (75.01%)
- Only 24.98% of tokens released by this point
- Exposed to remaining 75.02% of supply
**Advantage Ratio**: Bid A has 133% relative exposure vs Bid B
- Translates to 33% more tokens for the same 100 ETH bid
- Both pay the SAME clearing price in each interval
- The difference is purely exposure duration, not price or separate allocations
### Why Step 1 is Special
**Key insight**: Since Step 1 has MPS = 0 (no tokens released), ALL bids placed during Step 1 have identical 100% exposure. Timing within Step 1 doesn't matter - a bid on day 1 equals a bid on day 17 of Step 1.
**Step 2 changes this**: Once MPS > 0 and tokens start releasing, timing becomes crucial. A bid at the start of Step 2 has more exposure than a bid at the end of Step 2.
**Current exposure for new bids (block 23,925,686)**:
- Exposure: 7,775,383 / 10,000,000 MPS (77.75%)
- Already 22.25% of tokens released
- Only exposed to remaining 77.75% of supply
### Contributor vs Public Advantage
The contributor period (Steps 1-3) ends at block 23,926,475:
- Contributors bidding in Step 1: 100% exposure
- Contributors bidding now (block 23,925,686): ~77.75% exposure
- Contributors bidding at end of Step 2: ~75% exposure
- Public bidding after Step 3: Competing with already-established bids for remaining ~75% of supply
This creates a graduated advantage structure rather than a binary contributor/public split.
## Clearing Price Mechanics
### How Price Discovery Works
The clearing price is determined by finding equilibrium between supply and demand:
1. **Aggregate demand** at each price tick (weighted by bid exposure)
2. **Available supply** based on MPS released
3. **Equilibrium point** where demand equals supply sets the clearing price
4. **Uniform pricing**: All participants pay the same clearing price in each interval
### Progressive Filling Example
Alice bids 100 ETH at the current clearing price when MPS = 2,224,617 (22.25%):
- **Immediately**: Alice pays 22 ETH (22.25% of her bid)
- **At 50% MPS**: Alice pays 50 ETH total (50% filled)
- **At 100% MPS**: Alice pays 100 ETH total (fully filled)
Her bid is active for the entire remaining auction duration, getting filled proportionally as tokens release.
### Price Movement Rules
**Critical property**: Price can ONLY increase or stay the same, NEVER decrease.
**Consequences:**
- Once a tick is reached, it becomes the new floor
- No "dip buying" opportunities - you're either competitive at current price or at risk of being priced out
- If price rises above your max bid price, your unfilled portion gets refunded
## Why Simple Price Prediction Fails
Many assume: `average_price = total_bids / total_tokens`
**Example showing why this fails:**
Scenario: 1,000 ETH total bid volume, 1M tokens
- Naive calculation: 1,000 / 1,000,000 = 0.001 ETH per token
But if bid timing was:
- 500 ETH bid at start (spreads over 100% of tokens)
- 500 ETH bid at 50% point (spreads over 50% of tokens)
**The effective demand is different:**
- Bid A appears in ALL intervals with full weight
- Bid B appears in HALF the intervals with full weight
- Total spread demand ≠ sum of original bid amounts
**Accurate prediction requires:**
1. Knowing WHEN each bid was placed
2. Calculating each bid's exposure weight
3. Simulating the CCA clearing algorithm with weights
4. Finding equilibrium price on the tick ladder
Simple arithmetic will give WRONG answers for CCA.
## Graduation Threshold: Auction Success Criteria
**Aztec Configuration:**
- Graduation threshold: 0 ETH
- Current status: GRADUATED
- Meaning: Auction will succeed regardless of raise amount
**Standard graduation logic:**
- If `currencyRaised ≥ graduationThreshold`: Auction succeeds
- If threshold not met: All bidders receive FULL REFUNDS
- If graduated: Liquidity pool deployed on Uniswap V4 at clearing price
With a 0 ETH threshold, Aztec has guaranteed auction completion regardless of participation level.
## Conclusion
The Aztec CCA auction represents a sophisticated approach to token distribution that addresses many weaknesses of traditional mechanisms. Key takeaways:
1. **No timing games**: Automatic bid spreading eliminates concentration risk
2. **Fair price discovery**: Continuous clearing finds true market price
3. **Time-weighted fairness**: Early bidders gain exposure, not exclusive access
4. **Price stability**: Monotonically increasing price prevents manipulation
5. **Transparent mechanics**: All parameters encoded on-chain and verifiable
As of our analysis snapshot (block 23,925,686 during Step 2), the auction shows healthy participation with ~13,500 ETH in total bid volume, though the clearing price remains at the floor due to excess token supply. With 1,154 ETH more in bids needed to push the price to the next tick, the coming days will reveal whether demand intensifies as more contributors enter and the public period approaches.
The auction concludes on December 6th, 2025 (block 23,955,276), after which successful bidders can claim their tokens and a Uniswap V4 liquidity pool will be deployed at the final clearing price, establishing deep, sustainable liquidity for Aztec from day one.
I'm planning to add future status of the sale as days progress.
---
_Note: All data in this analysis was captured at Ethereum mainnet block 23,925,686 during Step 2 of the token release schedule. Price and bid information may change as the auction progresses._
## Technical Reference
### Smart Contract Addresses
#### Virtual Aztec Token Contract
**Address**: [0x4b00c30ceba3f188407c6e6741cc5b43561f1f6e](https://etherscan.io/address/0x4b00c30ceba3f188407c6e6741cc5b43561f1f6e)
**Constructor Arguments:**
```
Name: VirtualAztecToken
Symbol: VAZT
Underlying Token: 0xA27EC0006e59f245217Ff08CD52A7E8b169E62D2 (Aztec.sol)
ATP Factory: 0x42Df694EdF32d5AC19A75E1c7f91C982a7F2a161
Foundation Address: 0x13620833364653fa125cCDD7Cf54b9e4A22AB6d9
```
#### Continuous Clearing Auction Contract
**Address**: [[0x608c4e792C65f5527B3f70715deA44d3b302F4Ee]](https://etherscan.io/address/0x608c4e792C65f5527B3f70715deA44d3b302F4Ee)
**Constructor Arguments:**
```
Token: 0x4B00C30cEBA3F188407C6e6741cc5b43561f1F6e (VirtualAztecToken)
Total Supply: 1,547,000,000 tokens (1,547,000,000,000,000,000,000,000,000 wei)
Parameters:
├─ Currency: 0x0000000000000000000000000000000000000000 (ETH)
├─ Tokens Recipient: 0x13620833364653fa125cCDD7Cf54b9e4A22AB6d9
├─ Funds Recipient: 0xd53006d1e3110fD319a79AEEc4c527a0d265E080
├─ Start Block: 23,790,741
├─ End Block: 23,955,276
├─ Claim Block: 23,955,276
├─ Tick Spacing: 7,539,562,940,228,715,434,083 (Q96 format)
├─ Validation Hook: 0x2DD6e0E331DE9743635590F6c8BC5038374CAc9D
├─ Floor Price: 753,956,294,022,871,543,408,300 (Q96 format)
├─ Required Currency Raised: 0 ETH (no graduation threshold)
└─ Auction Steps Data: 0x000000000001f61600015b0000001c200000000000000e1000008a0000000e1000008a0000001c2000008a0000001c2000008a0000001c203d66c00000000001
```
**Note**: The `auctionStepsData` is decoded by the `StepStorage` constructor to create the 8-step release schedule detailed earlier in this article.
#### Aztec Token (ERC20)
**Address**: [0xA27EC0006e59f245217Ff08CD52A7E8b169E62D2](https://etherscan.io/address/0xA27EC0006e59f245217Ff08CD52A7E8b169E62D2)
**Constructor Arguments:**
-----Decoded View---------------
Arg [0] : _initialOwner (address): [0x2E89fe2011FdB3eb6cFdBfb3A635Ec43bEd42b2A](https://etherscan.io/address/0x2E89fe2011FdB3eb6cFdBfb3A635Ec43bEd42b2A)
#### Auction Hook (Contributor Validation)
**Address**: [0x2DD6e0E331DE9743635590F6c8BC5038374CAc9D](https://etherscan.io/address/0x2DD6e0E331DE9743635590F6c8BC5038374CAc9D)
**Constructor Arguments:**
```
Soulbound Token: 0xBf3CF56c587F5e833337200536A52E171EF29A09
Contributor Period End Block: 23,926,475
```
This hook validates that only holders of the Ignition Participant Soulbound token can bid during the contributor period (blocks 23,790,741 - 23,926,475).
#### Ignition Participant Soulbound Token
**Address**: [0xBf3CF56c587F5e833337200536A52E171EF29A09](https://etherscan.io/address/0xBf3CF56c587F5e833337200536A52E171EF29A09)
**Constructor Arguments:**
```
Token Sale Address: 0x0000000000000000000000000000000000000000
Identity Providers:
- 0x9D67e84B24104648cBd2597C8acF5aeeF7d7DF89
- 0x5F2ca7dbe47068996933e5dCc865481452680300
Genesis Sequencer Merkle Root: 0x8b874f488695850c2a75fc4819776861e597b010c7f86eb209f60a3070b5862a
Contributor Merkle Root: 0xe151ee61d1d4b3fc00a2b7dd7ce64cdc679dea0d21096a574e97c27aa707136f
Address Screening Provider: 0x4eA4BBC070f7b117f264fcba503b4eaadd2F1E59
URI: [empty]
```
#### Genesis Sequencer Sale
**Address**: [0xbE88a980765844E6b9493B7733aC764816fAF748](https://https://etherscan.io/address/0xbE88a980765844E6b9493B7733aC764816fAF748)
**Constructor Arguments:**
```
Owner: 0x85e51a78FE8FE21d881894206A9adbf54e3Df8c3
ATP Factory: 0xEB7442dc9392866324421bfe9aC5367AD9Bbb3A6
Sale Token: 0xA27EC0006e59f245217Ff08CD52A7E8b169E62D2 (Aztec.sol)
Soulbound Token: 0xBf3CF56c587F5e833337200536A52E171EF29A09
Rollup: 0x603bb2c05D474794ea97805e8De69bCcFb3bCA12
Price Per Lot: 1.4 ETH (1,400,000,000,000,000,000 wei)
Sale Start Time: 1,763,042,400 (Unix timestamp)
Sale End Time: 1,764,597,600 (Unix timestamp)
Address Screening Provider: 0x34b682131B617C5Caa6EB1aE1C5b1C5d32111874
```
### Q96 Format Explanation
Several parameters use Q96 fixed-point format (96-bit fractional representation):
**Conversion formula:** `actual_value = q96_value / 2^96`
Examples:
- Tick Spacing: 7,539,562,940,228,715,434,083 / 2^96 ≈ 0.000000095162663135 ETH
- Floor Price: 753,956,294,022,871,543,408,300 / 2^96 ≈ 0.000009516266313599 ETH
This format allows precise representation of fractional values in Solidity's integer-only arithmetic.