The CLP (Capital and Liquidity Provider) is an on-chain program that owns the protocol’s LP capital and Meteora positions. The CLP PDA per market signs Meteora DLMM CPIs; a global vault PDA holds idle cUSDC available for redeployment. You don’t interact with the CLP as an end user - there are no user-facing deposit or withdraw instructions on it. Everything is operator- or keeper-gated.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.
Why a separate program
Two reasons:- Solvency separation. A keeper wallet shouldn’t own LP positions directly - if a keeper key is compromised, the attacker drains positions. By making the CLP PDA the position owner, position operations are gated by program logic that validates each call against stored pool/position addresses, market PDA, and authority.
- Keeper rotation. Operators can rotate the keeper authority pubkey without re-creating positions. The CLP PDA’s authority is the position owner; only the right to call CLP instructions changes when a keeper rotates.
Account layout
Global
global_clp_vault). Operators fund it via admin_fund; the keeper allocates from it via allocate_to_market.
Per-market
clp_vault) holding its share of cUSDC, plus L, S, cUSDC ATAs for the CLP PDA itself (used as inventory before it’s deployed to Meteora).
→ Full CLP reference
Capital flow
What happens at allocation time
When the seeder callsallocate_to_market(amount):
amountcUSDC moves fromglobal_clp_vaultto per-marketclp_vault.Clp.allocated_from_globalincreases byamount.
- Calls
vault_mint_pairs(amount)on CLP - CPIsmint_redeem::mint_paired. The CLP PDA paysamountcUSDC, receives matched L+S into its ATAs. - Calls
clp_open_meteora_position(side, amount_x, amount_y, ...)on each side - deploys to Meteora.
add_liquidity_by_strategy2 places Y below active and X above.
What happens on rebalance
Every 120s (DLMM_INTERVAL_SECS), the keeper checks:
clp_remove_meteora_liquidity(side, lower_bin, upper_bin)- drains tokens back to CLP PDA’s ATAs.clp_close_meteora_position(side, lower_bin, upper_bin)- closes the position and reclaims rent.clp_init_bin_array(index)(if the new range needs an array that doesn’t exist).clp_open_meteora_position(side, amount_x, amount_y, active_id, target_bin, bin_radius)- fresh position in the new range.
What happens on profit
Two profit sources:- Arb surplus. When the keeper’s arb cycle nets a positive cUSDC delta, the keeper calls
deposit_profit(amount)to route the surplus toGlobalClp. - Meteora fees. Position fees accumulate inside the position. On rebuild, the fees are extracted and counted as part of the post-rebalance balance. The seeder routes any “principal + fees” surplus over
allocated_from_globalback viareturn_to_global.
total_fees_collected per market and total_fees_accumulated globally so operators can see protocol revenue.
Inventory bounds
The CLP enforces hard bounds on per-market state to prevent runaway risk:- q-imbalance: ratio of long-side value to short-side value. A hard upper/lower bound rejects operations that would push past.
- Drawdown: peak value vs current value. A hard bound rejects further deployment when drawdown exceeds threshold.
configure_inventory_budget. The keeper’s hard-bound monitor reads these on every cycle and surfaces breaches in the dashboard.
If a market hits a hard bound:
- New allocations from global vault → blocked.
- Existing positions → unchanged.
- User mint/redeem → unaffected (those are gated by Market PDA fields, not CLP).
Yield strategy (scaffolded, off)
The CLP program has a yield-deployment scaffold for idle collateral -record_deployment, record_withdrawal, record_harvest instructions, plus per-state deployment percentages (Normal / ProxyMode / Stress). This is off by default (YIELD_ENABLED=false).
When enabled, idle collateral can be deployed into external lending protocols (Kamino, etc.) for yield. Withdrawals are blocked until deployment is recalled (InsufficientLiquidCollateral error).
Mainnet activation will go through governance once governance is wired.
Reading CLP state
Why this matters to you as a builder
You don’t call CLP instructions directly. But CLP state tells you:- Pool depth at the protocol layer (
vault_l_deployed,vault_s_deployed). - OI utilization (
current_oi / oi_cap) - useful for warning users approaching cap. - Position addresses - useful for monitoring active bin, fee accumulation directly on Meteora.
- Inventory state - useful for surfacing risk to traders (“market q-imbalanced; redeem limited”).
Read more
CLP program reference
All instructions, account fields, errors.
Solvency invariants
Why CLP isolation matters for protocol safety.

