The keeper is an off-chain Rust async bot. It’s the operational layer that connects on-chain Continuum to external markets - pushing oracle observations, running peg-enforcing arbitrage, and managing the protocol’s LP positions on Meteora DLMM. There’s a reference implementation in the protocol repo. It’s the canonical operator today; multi-operator support is on the roadmap.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.
What it actually does
Arc<RwLock<KeeperState>>. A failure in one (e.g., RPC timeout in DLMM rebalancer) doesn’t crash the others.
Why it’s privileged
The keeper signs asmarket.keeper_authority. This grants:
| Privilege | Why it’s gated |
|---|---|
keeper_mint_single (fee-free single-sided mint) | A user with this could create unbacked claims against the vault. The keeper uses it inside two-phase arb cycles that net back to cUSDC. |
keeper_redeem_single (fee-free single-sided redeem) | Symmetric. |
update_risk_state | Mirrors oracle health → mint-redeem. Must be authoritative; can’t be racy across operators. |
All clp_* Meteora-proxy ixns | Owns LP capital. Errors in position management could leak protocol funds. |
Two signers, not one
The keeper signs with two separate keypairs:KEEPER_KEYPAIR- payer + arb signer. Pays SOL fees, signs direct swap txs andkeeper_*_singleixns.CLP_AUTHORITY_KEYPAIR- signs CLP proxy instructions (Meteora positions, vault mint/redeem, allocate, return).
What an external operator gets
| Reference operator (Continuum) | External operator | |
|---|---|---|
keeper_mint_single / keeper_redeem_single | ✅ | ❌ (single-pubkey authority) |
Paired arb (mint_paired + sell, buy + redeem_paired) | ✅ | ✅ |
| DLMM rebalancing | ✅ | ❌ (CLP authority) |
| Profit | Routes to GlobalClp via deposit_profit | Stays in operator wallet |
| Latency edge | First in line | Competes with other ext. operators |
Solvency guarantees
The keeper enforces several invariants regardless of whether arbs go well or badly:- Boot-time sweep. First action after startup:
redeem_paired(orkeeper_redeem_singlefor asymmetric residue) any L+S in the keeper wallet. Reclaims leftovers from prior crashes. - End-of-cycle sweep. After every arb cycle, measure post-swap balances and redeem residue. The slippage-buffer micro-leak (where actual swap output exceeds
min_amount_out) is recovered, not accumulated. - Profit deposit gating.
deposit_profittoGlobalClpsendsmin(actual_delta, expected_profit). Favorable slippage doesn’t over-deposit; unprofitable arb deposits nothing. - Dynamic trade sizing.
trade_amount = min(pool_depth, 90% × keeper_balance). The keeper never bites off more than its wallet can chew.
What the keeper does NOT do
- Modify market parameters. Fees, OI cap, oracle pointer - all admin-authority, separate keypair.
- Pause oracles. Emergency pause is admin-authority on the oracle program.
- Mint cUSDC. Faucet is its own program; keeper has no mint authority on collateral.
- Custody user funds. User mint/redeem flows go directly to mint-redeem program; keeper is not in the call path.
- Decide protocol-level economics. Fee tiers, OI caps, asset additions - all operator/governance decisions.
Reference dashboard
The reference keeper exposes an HTTP dashboard at:Where to go next
Arb paths
The four arb cycles in detail.
DLMM management
Vol-adaptive radius, fee-weighted centering, skip-rebuild.
Run a keeper
Config, deployment, troubleshooting.
External arb
What you can do without keeper authority.

