Skip to main content

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​

RolePrice discovery for ShareOFT via a Uniswap Continuous Clearing Auction (CCA), then V4 pool init and oracle wiring
DeployedPer creator, by the DeploymentBatcher
Key relationshipsSells 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%.

SliceShareWhere it goes
Base auction12.5%Sold in this CCA for ETH (self-funded)
Creator vesting25%365-day linear vesting
Solana25%Bridged over LayerZero during finalize (same ticker)
Base LP reserve12.5%Held by the arm to seed the ShareOFT/ETH book after the auction
Spoke inventory25%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 stepWhen it runsOnchain call
Earn strategies (Charm 90% · idle 10%)Phase 3, the next UserOp after finalizedeployPhase3Strategies + vault deployToStrategies()
Auction schedulePhase 4launchDeferredAuction
Auction settlementAfter the auction runs and graduatessweepCurrency(), then migrate() on this arm
Mesh LP seedAfter 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​

  1. Schedule. Phase 4 launchDeferredAuction creates the auction with the 12.5% auction inventory and the 12.5% LP reserve. It only schedules; it does not graduate or migrate.
  2. Bids open. Auctions start on the next Thursday 00:00 UTC weekly CCA epoch (_deriveScheduledStartBlock). Bids are accepted until endBlock.
  3. Graduate. The auction graduates if the minimum raise is met.
  4. Sweep. A keeper calls sweepCurrency() to settle the raised ETH to the arm.
  5. 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.
  6. Seed the mesh LP. deployShareMeshLpManager, then seedLpManager() (moves the LP reserve and swept ETH to the LP manager), then seedRebalance() seeds the book buyers trade.
  7. Align the hook. The V4 hook config must be active and aligned to the intended tradeFeeCollector.
  8. Trading live. Only now is the ShareOFT/ETH book live on Base. Next: After activation.

Failed auction​

  1. The auction ends without meeting the minimum raise.
  2. Anyone calls finalizeFailedAuction() after endBlock. 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:

PhaseMeaning
IdleNo active auction
AuctionScheduledAuction created; bids not open until startBlock
AuctionLiveBids accepted until endBlock
AuctionEndedPendingAuction ended or graduated; waiting for sweepCurrency()
ClaimReadyCurrency swept; migrate() eligible after the migration delay
PoolInitializingSet while migrate() initializes the pool
PoolLivemigrate() done; mesh LP seed and hook alignment still required for trading live
LaunchFailedfinalizeFailedAuction() 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​

FunctionWhat it doesWho can call
launchAuctionWithReserve(amount, lpReserveAmount, floorPrice, requiredRaise, auctionSteps)Creates the auction with LP reserve metadata; floorPrice and auctionSteps are legacy and ignoredApproved caller or owner (the batcher)
sweepCurrency()Settles raised ETH after graduationAnyone
migrate()Initializes the V4 pool at the clearing price and wires the oracle; no LP mintAnyone, after the migration block
seedLpManager()Moves the LP reserve and swept ETH into the mesh LP managerApproved caller or owner
finalizeFailedAuction()Sweeps unsold tokens and clears the arm after a failed auctionAnyone, after endBlock
sweepUnsoldTokens()Sweeps unsold auction tokensAnyone
getAuctionStatus()Auction address, active, graduated, clearing price, currency raisedView
getLifecycleStatus()Full lifecycle snapshot including phaseView
previewLaunchPricing()Floor price (Q96), tick spacing, creator USD price, ETH USD priceView

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 intended tradeFeeCollector.
  • 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 it CCALaunchStrategy / ccaLaunchStrategy.

Source​