Skip to main content

Documentation Index

Fetch the complete documentation index at: https://continuum-ec12e897.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

Listing a new market is an operator action today (admin authority on the protocol). Once governance is wired, listings will route through CNTM votes. This page describes the operational flow at a level you can use to:
  1. Anticipate when a market is about to launch.
  2. Replicate the flow in a private deployment (forks, testnet integrations).
  3. 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 fee tier (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 in scripts/ of the protocol repo. Operators run them in order:
1

Create the market

SYMBOL=NVDA INITIAL_PRICE=120 bun run scripts/create-synthetic-market.ts
Creates the 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

SYMBOL=NVDA bun run scripts/initialize-clp.ts
Creates the per-market Clp PDA + per-market vault (cUSDC token account).
3

Set OI cap

SYMBOL=NVDA OI_CAP=250000 bun run scripts/update-clp-oi-cap.ts
OI cap in cUSDC (lamports). Tighter is safer.
4

Create CLP token ATAs

SYMBOL=NVDA bun run scripts/create-clp-token-atas.ts
The CLP PDA needs ATAs for L, S, and cUSDC so it can hold tokens before deploying to Meteora.
5

Create Meteora DLMM pools

Two pools per market - one L/cUSDC, one S/cUSDC. Pool fee tier per asset volatility:
Asset classbinStepBase fee
Index ETF (QQQ, SPY)100.10%
Liquid equity (NVDA, AAPL)200.20%
Volatile equity (TSLA, GME)250.25%
MARKET=NVDA SIDE=long  BIN_STEP=20 BASE_FACTOR=10000 POOL_PRICE=120 \
  bun run scripts/create-meteora-pool.ts

MARKET=NVDA SIDE=short BIN_STEP=20 BASE_FACTOR=10000 POOL_PRICE=0.00833 \
  bun run scripts/create-meteora-pool.ts
6

Wire pools into CLP

MARKET=NVDA LONG_POOL=<long-addr> SHORT_POOL=<short-addr> \
  bun run scripts/configure-meteora-pools.ts
The keeper picks up the new pools on its next cycle.
7

Fund global vault (if not already)

AMOUNT=200000 bun run scripts/admin-fund-global-vault.ts   # devnet (cranks faucet)
AMOUNT=200000 bun run scripts/admin-fund.ts                # mainnet (admin holds USDC)
8

Wait for keeper

The keeper’s seeder runs every 600s. On its next tick it allocates from GlobalClp to the new market’s vault, mints inventory pairs via vault_mint_pairs, opens Meteora positions via clp_open_meteora_position. Within ~10 minutes the market is live.
9

Verify

bun run scripts/protocol-status.ts
Should show the new market with OI utilization, pool depth, seeded amount. The frontend automatically picks up new markets from the registry.

Pool fee tier guidance

base_fee_pct = bin_step × base_factor / 1_000_000. Trade-offs:
Lower fee (binStep 5–10)Higher fee (binStep 20–25)
Tighter NAV peg bandWider NAV peg band
Less LP revenue per swapMore LP revenue per swap
Smaller intra-day range coveredLarger intra-day range covered
Better for stable underlyingsBetter for volatile underlyings
Going below binStep=5 is not recommended - position range collapses too tight, intraday spikes blow active_id out of range, triggering close+reopen rebalance cycles.

What happens once a market is live

Time after listingEvent
0sMarket PDA exists, mints exist, vault exists. Mints will fail because oracle TWAP not populated.
~30sKeeper has pushed enough observations to populate TWAP. Mints succeed at NAV.
~5 minKeeper’s first risk-state mirror, seeder cycle. Capital allocated.
~10 minMeteora positions opened. Pool trading viable.
~30 minFirst arb cycle if pool drifted from NAV during seeding.
~1 hourSteady state - mints, redeems, trades all functional.
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:
SYMBOL=NVDA bun run scripts/register-market.ts
This calls registry::register_market with the new mints, pools, and the MeteoraDlmm venue. 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 from frontend/lib/market-addresses.json. After listing:
  1. Update the JSON with the new market’s pubkeys.
  2. Add SEO metadata, asset description, icon URL.
  3. Push the change → docs and frontend redeploy.
For private deployments, the structure of market-addresses.json is:
{
  "cluster": "devnet",
  "usdcMint": "...",
  "markets": {
    "NVDA": {
      "symbol": "NVDA",
      "name": "Nvidia",
      "marketPDA": "...",
      "longMint": "...",
      "shortMint": "...",
      "oracle": "...",
      "collateralVault": "...",
      "liquidity": { "primaryVenue": "meteoraDlmm", ... },
      "initialPrice": 120,
      "clp": { "pda": "...", "vault": "...", "oiCap": 250000000000, ... }
    }
  },
  "globalClp": { "pda": "...", "vault": "..." },
  "programIds": { ... }
}

Pausing / delisting a market

Soft pause:
SYMBOL=NVDA bun run scripts/set-market-active.ts ACTIVE=false
This flips 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):
  1. Withdraw Meteora positions → CLP PDA ATAs.
  2. Redeem CLP PDA’s L+S balances back to cUSDC.
  3. return_to_global per-market vault → GlobalClp.
  4. set_active(false).
  5. Optionally remove from registry.
The delist procedure is a several-script sequence; see the Operations runbook for current commands.

Future: governance-driven listing

When CNTM governance is activated:
  1. Anyone can propose a new market listing on-chain.
  2. CNTM holders vote with their staked CNTM weight.
  3. Quorum reached → proposal queues for execution.
  4. Time-locked execution → the listing scripts run automatically.
The same operational steps as above; just behind a vote. Until then, listings are operator-driven.

See also

Live markets

Markets currently active on devnet.

Roadmap

Planned markets.

Concepts → Markets

Market structure, OI cap, account layout.