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.

A market in Continuum is one synthetic asset. Each market has:
  • A Market PDA (mint-redeem program) holding initial prices, fees, supply, oracle pointer, keeper authority.
  • Two SPL mints - long (L) and short (S) - both with the market PDA as mint authority.
  • One collateral vault (cUSDC token account) holding all collateral backing outstanding L+S supply.
  • An OracleConfig PDA tracking observations, TWAP, and risk state.
  • A Clp PDA tracking per-market capital allocation, OI cap, inventory state, and Meteora position pointers.
  • Two Meteora DLMM pools - L/cUSDC and S/cUSDC - at a chosen fee tier.
Markets are not interchangeable - a QQQL token is a different mint from an SPYL token, even though both are “long” tokens.

Market PDA derivation

seeds = [b"market", asset_symbol_bytes]
program_id = mint-redeem (5MBjhNUUguLTPNR5WG6YBUUw7vUcxQ14ARw3NsS3rKu4 on devnet)
Symbol is the asset ticker as ASCII (e.g. "QQQ"). Different cluster, same symbol → same PDA seed but different derived address (because mint-redeem program ID differs).

What’s stored on the Market account

Public fields you’ll likely read:
FieldTypeMeaning
asset_symbolstringMarket ticker.
oracle_addressPubkeyPointer to the OracleConfig PDA.
oracle_typeenumPyth / Hermes / Switchboard / Manual.
long_mintPubkeyL SPL mint.
short_mintPubkeyS SPL mint.
collateral_mintPubkeycUSDC mint.
collateral_vaultPubkeyToken account holding all backing cUSDC.
mint_fee_bps / redeem_fee_bpsu16Fees in basis points (10 = 0.10%).
initial_l_price / initial_s_priceu646-dec prices fixed at init.
total_l_supply / total_s_supplyu64Outstanding supply on each side.
total_collateralu64Vault balance.
is_activeboolIf false, all mint/redeem reject.
risk_stateenumNormal / ProxyMode / Stress / Recovery.
user_twap_priceu64Source of L_NAV.
keeper_authorityPubkeyPrivileged signer for fee-free single-sided ops.
dev_tax_pctu8Slice of fee routed to fee_recipient.
Full schema in mint-redeem reference.

Reading market state

import { Program, web3 } from "@coral-xyz/anchor";
import idl from "./mint_redeem.json";

const program = new Program(idl, provider);
const [marketPDA] = web3.PublicKey.findProgramAddressSync(
  [Buffer.from("market"), Buffer.from("QQQ")],
  program.programId,
);
const market = await program.account.market.fetch(marketPDA);

console.log("Symbol:", market.assetSymbol);
console.log("L mint:", market.longMint.toBase58());
console.log("Vault:", market.collateralVault.toBase58());
console.log("OI used:", market.totalLSupply.toString(), "/", marketCap);
For all live markets at once, batch via getMultipleAccounts keyed off the registry. See Reading state.

Live markets

Four markets are active on devnet:
SymbolAssetPool fee tierStatus
QQQNasdaq-100 ETF0.10% (binStep=10)Active
SPYSPDR S&P 500 ETF0.10%Active
XAUGold spot0.10%Active
VXXVIX short-term futures ETN0.10%Active
Live markets table with all pubkeys

How a market gets listed

The full operator flow lives in the protocol’s operations runbook. At a high level:
1

Create the market

Picks symbol, initial prices, mint/redeem fees, sets the keeper authority. Creates the Market PDA, L and S SPL mints (mint authority = market PDA), and the collateral vault.
2

Initialize the CLP slot

Per-market Clp PDA holds the OI cap and inventory state. Set OI cap conservatively - typically ~2× expected LP depth.
3

Create CLP token ATAs

The CLP PDA gets ATAs for L, S, and cUSDC so it can hold tokens before deploying them to Meteora.
4

Create Meteora DLMM pools

Two pools: L/cUSDC, S/cUSDC. Pool fee tier is bin_step × base_factor / 1e6. Index ETFs at 0.10%, liquid equities at 0.20%, volatile equities at 0.25%.
5

Wire pools into CLP

configure_meteora_pools(long_pool, short_pool) writes the pool addresses to the CLP account. The keeper picks them up on next tick.
6

Fund the global vault

Admin deposits cUSDC into GlobalClp. The keeper’s seeder allocates from there into per-market vaults every 600s.
7

Start the keeper

Within ~10 minutes the seeder funds the new market, mints inventory pairs via CLP, and opens Meteora positions.
Listing a market

OI cap

Each market has a hard oi_cap enforced on every mint:
require!(total_l_supply + l_to_mint <= oi_cap, OICapExceeded);
When the cap is reached, mints reject. Redeems remain open. Operators raise the cap as pool depth grows. Rule of thumb: oi_cap ≈ 2 × pool_depth. The cap is a per-market field on the Clp account, not on the Market itself. To read it:
const clp = await clpProgram.account.clp.fetch(clpPDA);
console.log("OI cap:", clp.oiCap.toString());
console.log("Current OI:", clp.currentOi.toString());

Asset roadmap

Continuum’s targeted launch coverage is TradFi-only:
  • Indices: SPX, NDX (QQQ), FTSE 100, DAX
  • Equities: NVDA, AAPL, TSLA, GME, AMC
  • Commodities: XAU (Gold), XAG (Silver), WTI (Oil)
  • Forex: EUR/USD, USD/JPY, GBP/USD
No crypto markets. The constant-product invariant gives no edge over an actual perp DEX for crypto pairs. Roadmap

Trading hours

The asset itself trades during traditional market hours, but Continuum markets are 24/7:
  • During TradFi hours, NAV reflects the live oracle.
  • Outside TradFi hours, NAV reflects whatever Pyth’s “off-hours” feed reports - typically the last close, with limited price discovery.
  • The keeper publishes session-aware feeds (Primary / PreMarket / PostMarket / Overnight) so the oracle program selects the right Pyth feed based on time-of-day.
This means you can mint, redeem, and trade Continuum positions any time. P&L attribution outside market hours has lower discovery - the keeper’s arb edge is thinner because there’s less external flow.

Read more

Live market addresses

QQQ, SPY, XAU, VXX - every pubkey.

How to read market state

Batch fetch markets, derive NAV, query position depth.