Skip to main content
The keeper is an off-chain Rust async bot - the operational layer between on-chain Continuum and the outside world. In v2 its job changed shape: instead of managing external AMM positions, it maintains the protocol’s own venues and the economic loops behind them. Each behavior is an independent task behind an env-var kill switch (default on), so any loop can be disabled without a redeploy; a failure in one task doesn’t crash the others. There’s a reference implementation in the protocol repo. It’s the canonical operator today; multi-operator support is on the roadmap.

What it runs

What it deliberately does not do

  • Price the venues by hand. Spreads come from a model-free stack (realized-q90 ratchet, slow auto-floor, oracle confidence, per-market static floor - see the keeper concept page). The keeper computes and posts; there is no trained forecasting model and no discretion in the loop.
  • Hold custody. Every funds movement is a program instruction with on-chain validation; sources and destinations bind to protocol PDAs and validated token accounts.
  • Guarantee liveness for user funds. Committed orders refund unconditionally after their TTL whether or not the keeper is alive; mint/redeem freezes on a stale oracle rather than trusting the keeper’s last word.

Why it’s privileged, and how much

The keeper holds two signing roles: the per-market keeper_authority (oracle pushes, buffer targets, harvests) and the CLP authority (book shapes, inventory plumbing, fee posts). Neither can move user funds to arbitrary destinations. The trust assumptions that remain - the oracle relay on devnet, settlement cranking - are documented per-flow, with the mainnet hardening path (Pyth-direct settlement reads) flagged in the trade flow.

Running one

See Running the keeper for environment variables, kill switches, and tunables. The defaults are the live devnet configuration.