keeper/ in the protocol repo.
This page is for operators who want to run their own. Most integrators don’t need to.
Prerequisites
- Rust 1.75+ and Cargo
- Solana CLI 1.18+
- A funded keeper wallet (≥ 0.5 SOL on devnet, more on mainnet)
- A separate CLP authority keypair (≥ 0.1 SOL)
- A private RPC URL (Helius, Triton, etc.) - public devnet is rate-limited
- The keeper wallet must be the canonical
market.keeper_authorityfor any market you want to operate (single-pubkey constraint today); the CLP authority key signs book shapes and inventory plumbing
Build
keeper/target/release/keeper (~50MB binary).
Configure
The keeper reads a singlekeeper/.env (override the path with KEEPER_ENV_FILE). Create it with the keys below — these are the knobs the keeper actually consumes:
Kill switches (all default ON)
Every keeper behavior is an independent task behind an env gate, so any loop can be disabled without a redeploy:
Off by default (opt-in):
Tunables
Run
http://localhost:8485 (devnet) or :8484 (mainnet).
Multi-keeper considerations
The market’skeeper_authority is a single pubkey. Two keepers signing as the same pubkey will collide on keeper_*_single calls - only one tx will land per slot.
If you want redundancy:
- Active/standby: peer heartbeat (already in the keeper) + manual primary/standby logic. The reference keeper has basic peer heartbeat; primary/standby logic is on the roadmap.
- Different markets per operator: rotate
keeper_authorityper market.update_keeper_authorityis admin-callable.
Solvency-checking the keeper
Common issues
”Keeper skipping silently / balances read as 0”
The most common issue. Check:- Is
USDC_MINTset correctly for your cluster? (See the warning above - mainnet fallback breaks every ATA derivation.) - Is the keeper authority correct? Check
market.keeper_authoritymatches yourKEEPER_KEYPAIRpubkey. - Are both wallets funded? Pool inits and refills pay rent from the CLP authority, not the keeper wallet - check both balances on insufficient-lamports errors.
”Unauthorized keeper”
The keeper signed with a key that doesn’t matchmarket.keeper_authority. Two common causes:
- Wrong
KEEPER_KEYPAIRconfigured. - Admin rotated
keeper_authorityand you didn’t update.
”RPC rate-limited”
The keeper has fallback RPC built in - set a comma-separated list:”Keeper wallet has stranded synth tokens”
Restart the keeper. Boot-time sweep handles it. If the keeper can’t run, manually callredeem_paired (paired residue) or keeper_redeem_single (asymmetric) signed with the keeper authority.
”Book prices drifted far from NAV”
First check whether the underlying market is simply closed: the oracle withholds pushes on a stale feed, mint/redeem self-freezes, and the books float at their standing band by design - the first fresh print re-anchors them. If the market is open:- Keeper not repositioning → check
CLMM_POOLS_ENABLEDand the book-manager logs (continuum_keeper::clmm=debug). - Pool depth exhausted → the refill loop should restock within a cycle; check
CLMM_REFILL_ENABLEDand CLP vault balances. - Oracle stale while market open → check the Hermes feed and
HERMES_STALE_SECS.
Production deployment notes
- Multisig the admin keypair. The keeper authority is a hot key by design (signs every cycle). The admin authority should be a Squads multisig - separate from the keeper.
- Run one keeper per cluster. The reference keeper supports dual-network mode (one process, both mainnet and devnet). Separate dashboard ports.
- Monitor the dashboard. It’s on
:8484/:8485. Pipe to your monitoring (Datadog, Grafana, custom Prometheus exporter). - Set up alerts. Watch for: stale oracle while markets are open (> 60s), pending committed orders aging toward TTL, low SOL balance on either signer (< 0.1).
- Keep both signers topped up. The keeper wallet pays oracle pushes and settles; the CLP authority pays book repositions and inventory plumbing.
Logging
continuum_keeper=info- normal operationcontinuum_keeper::clmm=debug- every book reposition and refill decisioncontinuum_keeper::commit=debug- committed-order discovery and settlementcontinuum_keeper::rpc=warn- RPC failures only
Updating
See also
Keeper overview
What the keeper does, why it’s privileged.
Peg maintenance
Why v2 self-pegs and what bounds drift.
Book management
Reposition loop, refill, trim, bid cap.

