Launch and rewardsCCA launch arm
CCA launch arm
The vault arm that runs a Uniswap Continuous Clearing Auction to sell ShareOFT for ETH and open the first Base pool.
CCALaunchArm sells a creator's ShareOFT () for native ETH at a single clearing price, then initializes the ShareOFT/ETH Uniswap V4 pool. It is a vault arm, not a strategy leg (it is not added with addStrategy). The deploy batcher schedules it; keepers settle it.
At a glance
| Role | Price discovery for ShareOFT via a Uniswap Continuous Clearing Auction (CCA), then V4 pool init and oracle wiring |
| Deployed | Per creator, by the DeploymentBatcher |
| Key relationships | Sells ShareOFT from CreatorOVault; prices the floor with CreatorOracle; aligns fees to the gauge controller |
Where the auction inventory comes from
At finalize, the creator's first deposit is wrapped into ShareOFT. The deposit is 100 million creator coins (18 decimals); the vault cannot activate or finalize with any other first deposit. The batcher then splits the wrapped supply. The 12.5/25/25/12.5 split is auction / vesting / Solana / LP; spoke inventory is the remaining 25%.
| Slice | Share | Where it goes |
|---|---|---|
| Base auction | 12.5% | Sold in this CCA for ETH (self-funded) |
| Creator vesting | 25% | 365-day linear vesting |
| Solana | 25% | Bridged over LayerZero during finalize (same ticker) |
| Base LP reserve | 12.5% | Held by the arm to seed the ShareOFT/ETH book after the auction |
| Spoke inventory | 25% | EVM custody only; not a live CCA or LP book |
Constants: VESTING_BPS, SOLANA_BPS, BASE_AUCTION_BPS, BASE_LP_RESERVE_BPS, SPOKE_INVENTORY_BPS on DeploymentBatcher. The split applies to wrapped ShareOFT, not raw creator coin 1:1. The $499 launch fee is not the deposit; see strategy bundle.
What finalize does not do
Phase 2 finalizePhase2 only wraps the deposit and enforces the 12.5/25/25/12.5 split plus spoke inventory. Everything below happens later:
| Deferred step | When it runs | Onchain call |
|---|---|---|
| Earn strategies (Charm 90% · idle 10%) | Phase 3, the next UserOp after finalize | deployPhase3Strategies + vault deployToStrategies() |
| Auction schedule | Phase 4 | launchDeferredAuction |
| Auction settlement | After the auction runs and graduates | sweepCurrency(), then migrate() on this arm |
| Mesh LP seed | After migrate() (the pool can still be empty) | deployShareMeshLpManager, seedLpManager(), seedRebalance() |
New vaults don't use Ajna (Ajna weight 0). Being activated is not the same as trading live; see lifecycle.
How it works
Successful auction
- Schedule. Phase 4
launchDeferredAuctioncreates the auction with the 12.5% auction inventory and the 12.5% LP reserve. It only schedules; it does not graduate or migrate. - Bids open. Auctions start on the next Thursday 00:00 UTC weekly CCA epoch (
_deriveScheduledStartBlock). Bids are accepted untilendBlock. - Graduate. The auction graduates if the minimum raise is met.
- Sweep. A keeper calls
sweepCurrency()to settle the raised ETH to the arm. - Migrate. After the migration delay,
migrate()initializes the ShareOFT/ETH V4 pool at the clearing price and wires the oracle. It does not mint LP. - Seed the mesh LP.
deployShareMeshLpManager, thenseedLpManager()(moves the LP reserve and swept ETH to the LP manager), thenseedRebalance()seeds the book buyers trade. - Align the hook. The V4 hook config must be active and aligned to the intended
tradeFeeCollector. - Trading live. Only now is the ShareOFT/ETH book live on Base. Next: After activation.
Failed auction
- The auction ends without meeting the minimum raise.
- Anyone calls
finalizeFailedAuction()afterendBlock. It sweeps unsold ShareOFT back (sweepUnsoldTokens), archives the auction, and clears the arm so it can relaunch.
Lifecycle phases
getLifecycleStatus() reports one of these phases:
| Phase | Meaning |
|---|---|
Idle | No active auction |
AuctionScheduled | Auction created; bids not open until startBlock |
AuctionLive | Bids accepted until endBlock |
AuctionEndedPending | Auction ended or graduated; waiting for sweepCurrency() |
ClaimReady | Currency swept; migrate() eligible after the migration delay |
PoolInitializing | Set while migrate() initializes the pool |
PoolLive | migrate() done; mesh LP seed and hook alignment still required for trading live |
LaunchFailed | finalizeFailedAuction() cleared state for relaunch |
Launch pricing
The floor price is derived onchain from the lane oracle through IOracle4626 (getAssetPrice, getEthPrice), converted to Q96. A launch discount (launchDiscountBps) and tick spacing (launchTickSpacingBps) are configurable. Stale or invalid oracle data reverts the launch (LaunchOracleStale, LaunchOracleInvalidPrice). The frontend computeMarketFloorQuote is diagnostic only.
Key functions
| Function | What it does | Who can call |
|---|---|---|
launchAuctionWithReserve(amount, lpReserveAmount, floorPrice, requiredRaise, auctionSteps) | Creates the auction with LP reserve metadata; floorPrice and auctionSteps are legacy and ignored | Approved caller or owner (the batcher) |
sweepCurrency() | Settles raised ETH after graduation | Anyone |
migrate() | Initializes the V4 pool at the clearing price and wires the oracle; no LP mint | Anyone, after the migration block |
seedLpManager() | Moves the LP reserve and swept ETH into the mesh LP manager | Approved caller or owner |
finalizeFailedAuction() | Sweeps unsold tokens and clears the arm after a failed auction | Anyone, after endBlock |
sweepUnsoldTokens() | Sweeps unsold auction tokens | Anyone |
getAuctionStatus() | Auction address, active, graduated, clearing price, currency raised | View |
getLifecycleStatus() | Full lifecycle snapshot including phase | View |
previewLaunchPricing() | Floor price (Q96), tick spacing, creator USD price, ETH USD price | View |
Batcher calls referenced above (launchDeferredAuction, deployPhase3Strategies, deployShareMeshLpManager) live on DeploymentBatcher; seedRebalance() lives on OVaultLPManager.
Gotchas
migrate()mints no LP. Launch is complete only after sweep, migrate, the mesh LP seed, and hook alignment to the intendedtradeFeeCollector.- Vault economics keep moving during the auction. When configured with
backingVault, the arm snapshots launch-time backing telemetry. The API and UI show drift fields (assetsDelta,supplyDelta) as warnings only; they never block settlement or migration. - Charm 99/1 bootstrap is not the CCA. When the Charm strategy first seeds an empty LP it targets about 99% creator coin / 1% USDC. That happens in Phase 3, separate from the auction.
- Naming. The contract is
CCALaunchArm. Older app code may still call itCCALaunchStrategy/ccaLaunchStrategy.