The keeper
A permissionless loop over every vault on one network (~/tender/keeper). Any number can run;
every job re-reads chain state first. Configured by environment: KEEPER_NETWORK,
KEEPER_RPC_URL, KEEPER_PAYER_KEYPAIR, KEEPER_LISTER_KEYPAIR, KEEPER_HISTORY_DIR,
KEEPER_JOBS.
| Area | Jobs (keeper/src/jobs) |
|---|---|
| Launch vaults | openCalls (opens calls on a launch still on its curve, if the launch flow did not), activate (arms and completes activation), poke, settleExpired, closeExpiredNfts, collectFees, unwindStake, burnLeftover, writeOff |
| Backstop | platformStream (claim_platform, roll) |
| Put vaults | recordPrice (19:55 to 20:15 UTC), settleDay, planListing + listDay (lister key only), retireZeroClaims |
| Lookup tables | ensureLaunchAlt |
The mainnet keeper runs from the keeper key E4PwDtEVUUjH8VEwjxNBxuh9j768Pqd4Y78pcC5bpjNn,
which is also the put vaults' lister and the launch vault's AUTO_EXERCISER. Put listings price
off 31 days of GeckoTerminal 1-minute prints of each settlement pool (retried with backoff when
rate-limited). Each listed day costs the keeper about 0.0052 SOL of rent it does not get back.
autoCash (added 2026-09-29): in the last 10 minutes before expiry, auto_cash_out every
in-the-money call for its owner (the keeper's payer must be the program's AUTO_EXERCISER). It
runs at the start and end of each pass. Keeper sends now resend with a fresh blockhash when a
transaction expires unlanded, and the keeper pays a priority fee.
