A seventh program, governance (
6es5KcjMWKGhVWrttUytYiZ3YELXe4HQyrmsMVdbVawT), is deployed on devnet but inactive. None of the six programs, the keeper or the app calls it, and it has no published IDL.
How they relate
withdraw_excess_to_clp only moves cUSDC into a CLP-owned token account). mint-redeem prices from the oracle account only in the Normal risk state, and every devnet market runs in ProxyMode, so devnet mint and redeem price from the keeper’s write to Market.user_twap_price.
IDLs
An IDL is the JSON description of a program’s instructions, accounts, types, events and errors. The program source is private, so the IDLs are published in the docs repository instead, generated from the source of the deployed programs (browse). Each one is athttps://raw.githubusercontent.com/continuum-markets/continuum-docs/main/idl/<program>.json, where <program> is mint_redeem, clp, oracle, registry, faucet or trading. Anchor 0.32 reads the program ID from each IDL’s address field.
IDLs and PDAs has a download script and the TypeScript setup. For Rust CPI there is no published crate: load the same IDL with Anchor’s declare_program! (see CPI).
PDAs at a glance
A script that derives all of these and checks them on devnet is on IDLs and PDAs.
Authority model
Each instruction that changes state checks its signer. The table follows thehas_one, address and require! checks in the program source. cancel_treasury_limits and freeze_treasury accept either of two signers, so they appear in two rows.
The setup instructions (
initialize_*, init_*) create program and market accounts. The Continuum team runs them when it lists a market; integrators never need them. The oracle’s get_* instructions and the CLP’s check_inventory_restrictions and get_yield_status are read-only views with no signer.
On devnet (10 Oct 2026) the Continuum team holds every admin role. 8xhPK1rGK4neoKo4fT8FxHQDZRiCnSYW9hvEdaVTxCni is market.authority on all 14 markets (13 are live), and 9WXGdH5tPCprnATKxnScKt86TUZFYxqeMdejWRrp2RN4 is market.keeper_authority on every market. Both are stored on each Market account, so you can check them on chain.
Errors
Each program numbers its errors from 6000, so one code means different things in different programs. Always read a code together with the program ID that raised it. The full tables, with causes, are on Errors:Choosing what to call
There is no single-leg redeem: a lone L or S position exits through a committed order while the market is open, or through a bin book while its price is stale (see Trade).
pool_swap fails with PoolClosedWhileLive while the price is live. clp_swap, retired on 11 Oct 2026, reverts with SwapDisabled everywhere. Don’t read OracleConfig for live prices, because the oracle program isn’t updated on devnet.
Listing a market (operator process)
Listing is an operator process; integrators get market addresses from Addresses. The program calls run in this order, because each step needs accounts the previous one created.1
Create the mints and the vault
Create the L and S mints (classic SPL Token, 6 decimals, the future Market PDA as mint authority, no freeze authority) and a cUSDC token account owned by the Market PDA (live markets use the PDA’s associated token account).
initialize_market creates none of these.2
Call initialize_market
The program’s upgrade authority calls
initialize_market(params: InitMarketParams), passing the program and its program_data as the last two accounts, with asset_symbol (at most 10 bytes), oracle_type (Pyth or Continuum), initial_l_price, initial_s_price, mint_fee_bps, redeem_fee_bps and keeper_authority. With Continuum, the oracle account must be the market’s OracleConfig PDA, which doesn’t exist yet. The signer becomes market.authority. The market starts with yield_enabled = true and a yield ceiling of 0.3
Create the oracle config
initialize_oracle_config(max_confidence_interval, max_staleness, keeper_authority), signed by market.authority, creates the OracleConfig. upsert_oracle_feed(priority, kind, is_active), signed by the config’s admin, registers a Pyth price account as a feed.4
Create the market's CLP
initialize_clp(oi_cap, oracle_config), signed by market.authority, creates the market’s Clp account.5
Create both bin books
init_pool(side, step_bps, num_bins), signed by GlobalClp.authority, runs once for the long book (side 0) and once for the short book (side 1). A new book stays disabled until the keeper posts its first shape with set_pool_shape.6
Add the market to the keeper
The keeper prices only markets on its configured list, so a new market needs a keeper configuration change before it gets prices and book shapes.
See also
mint-redeem
Market account, paired mint and redeem, keeper and admin instructions.
clp
Vaults, bin books and committed orders.
IDLs and PDAs
IDL downloads and a PDA derivation script.
SDK setup
Bootstrapping a TypeScript project against these programs.

