- Anticipate when a market is about to launch.
- Replicate the flow in a private deployment (forks, testnet integrations).
- Understand which addresses get derived where.
Decision: pick the asset
Continuum’s targeted launch is TradFi only - equities, indices, commodities, FX. No crypto. Asset checklist:- Has a reliable Pyth on-chain feed (preferred) or Hermes feed (fallback).
- Volatility regime is defined enough to pick a book geometry and spread floor (index vs liquid equity vs volatile equity).
- Initial price (
initial_l_price) chosen - this anchors the constant product. Pick something close to the current spot. - OI cap chosen - typically 2× expected initial pool depth.
Sequence
The reference scripts live inscripts/ of the protocol repo. Operators run them in order:
1
Create the market
Market PDA, allocates L and S SPL mints (mint authority = market PDA), creates the collateral vault. Sets keeper_authority and fee_recipient.2
Initialize the per-market CLP
Clp PDA + per-market vault (cUSDC token account).3
Set OI cap
4
Create CLP token ATAs
5
Bootstrap the native books
Two pools per market - one per side - created, configured, seeded, and enabled in one idempotent script:Per pool it runs
init_pool (PDA seeds [b"pool", market, side]), creates the pool vaults, sets the 2-zone geometry (configure_pool_geom), seeds inventory (one paired mint funds both sides’ asks; cUSDC funds the bids), and posts the first set_pool_shape - which enables the pool. Geometry per vol class:The rule of thumb is empirical: the static floor should start at roughly 2x the asset’s 5-minute volatility - the keeper’s slow auto-floor self-corrects it from live data within days, so err high. No model training is required for any listing: the spread engine runs on the realized ratchet and floors alone.
6
Set per-market config
Add the market’s
min_bps, floor_mult, and (for high-vol single names) fee_mult to the keeper’s per-market config. fee_mult enables vol-informed mint/redeem fees - the paired-arb hurdle scales with volatility exactly when the moves that clear it get big.7
Fund global vault (if not already)
8
Wait for keeper
The keeper picks the new pools up on its next book-manager cycle (30s): it re-pins them to NAV with the vol-scaled shape and takes over inventory management (refill / trim / bid cap). The market is live as soon as the bootstrap script finishes.
9
Verify
OI utilization, pool depth, seeded amount. The frontend automatically picks up new markets from the registry.Geometry and spread guidance
The books don’t charge a swap fee - the half-spread (empty inner bins around NAV) is the price of immediacy. Trade-offs when choosing the core step andmin_bps:
Err wide at listing: the slow auto-floor tightens a too-conservative floor within days, but a too-tight floor donates depth to arbitrage from minute one. The reposition gate should sit just below the market’s paired-arb hurdle (first funded bin + 10bps fee), which is also where the backtested optimum lands.
What happens once a market is live
A user could mint during the warm-up window (between t=0 and the first TWAP population) but
OraclePriceUnavailable will reject. Safe to assume markets need ~5 minutes warm-up after listing.
Adding to the registry
The registry is updated separately from market initialization:registry::register_market with the new mints and pools. After this, the registry-driven frontend picks the market up automatically.
If you skip registration, the market still works at the program layer - mint_paired etc. all succeed. But the official frontend won’t know to display it.
Adding to the asset list (frontend)
The frontend pulls market metadata fromfrontend/lib/market-addresses.json. After listing:
- Update the JSON with the new market’s pubkeys.
- Add SEO metadata, asset description, icon URL.
- Push the change → docs and frontend redeploy.
market-addresses.json is:
Pausing / delisting a market
Soft pause:Market.is_active = false. All mints and redeems reject with MarketNotActive. Existing positions remain valid SPL tokens but cannot be redeemed at NAV until the market is reactivated.
Full delist (recover all capital, close pools):
- Sweep the books back to CLP custody (
pool_sweep_usdc/pool_sweep_synth). - Redeem CLP PDA’s L+S balances back to cUSDC.
return_to_globalper-market vault →GlobalClp.set_active(false).- Optionally remove from registry.
Future: governance-driven listing
When CNTM governance is activated:- Anyone can propose a new market listing on-chain.
- CNTM holders vote with their staked CNTM weight.
- Quorum reached → proposal queues for execution.
- Time-locked execution → the listing scripts run automatically.
See also
Live markets
Markets currently active on devnet.
Roadmap
Planned markets.
Concepts → Markets
Market structure, OI cap, account layout.

