The keeper
The keeper is a single off-chain process that does the recurring work the contracts cannot do for themselves: fetching prices, repricing pegs, collecting fees, paying holders, and executing the buyback. It never holds user funds. Every action it takes is a public transaction from the keeper address, and every transaction hash is logged.
Jobs
| Job | Cadence | What it does |
|---|---|---|
| price | 60 s | Fetches every source, computes each catalogue price, and pushes the ones that moved more than 0.05% to PriceFeed. |
| reprice | 60 s | For every mining coin, checks needsReprice and calls reprice when the feed tick has left the current band or a side is empty. Then calls refill if the ask is below 50% of seed. |
| collect | 15 min | Calls collectFees on every market, moving accrued swap fees into the ledger. |
| payout | 15 min | Rebuilds each market's holder list from Transfer logs since creation, excludes the launchpad, pool, and treasury, applies the $100 / $5 / $1 / 2% thresholds, and calls payHolders. |
| sweep | 15 min | Calls sellPendingToken, sweepToBuyback, sweepProtocol, then Buyback.execute. |
Price sources
| Input | Primary | Fallback / check |
|---|---|---|
| BTC/USD | Coinbase GET /products/BTC-USD/ticker |
Kraken or CoinGecko as an independent second source; if the two diverge by more than 2%, pushes for HASH, BTC, BLOCK halt. There is no Chainlink feed on Robinhood Chain. |
| Difficulty, height, fees | mempool.space /api/v1/difficulty-adjustment, /api/blocks/tip/height, /api/v1/fees/recommended, /api/v1/blocks |
none |
| ASIC $/TH | a curated price file maintained by the operator, with a source and an as-of date | optional Hashrate Index fetcher |
| MWh | a curated price file maintained by the operator | optional gridstatus fetcher |
Every curated figure is labelled manual in the API, and the coins page shows a badge for it.
Read-only API
The keeper serves a read-only HTTP API with open CORS. The web app reads its market, price, and reward data from it. When the API is unreachable, the web app reads prices, markets, and pool state directly from the chain.
| Endpoint | Returns |
|---|---|
GET /api/prices |
every coin: symbol, name, unit, USD reference price, on-chain price, updatedAt, source, manual, fresh |
GET /api/markets |
every market: token, name, symbol, pair coin, fee, creator, metadata, price in coin and USD, market cap, curve progress, 24 h volume, holder count |
GET /api/markets/:token |
one market plus recent trades |
GET /api/rewards/:wallet |
paid history and pending estimate for a wallet |
GET /api/hashpad |
burned, ETH spent, remaining supply |
GET /api/network |
block height, difficulty, epoch progress, hashprice, next halving height |
What the keeper can and cannot do
It can push prices, reprice and refill pegs, collect fees, direct payouts and sweeps, and trigger the buyback. Every one of these is gated by an onlyKeeper check on the contract side.
It cannot remove liquidity from any market, mint market tokens, change a market's fee, or move a user's balance. No such function exists on any contract.
It is one operator. The keeper address is set by the contract owner, and there is no timelock, multisig, or second keeper. Its ability to push prices and trigger mints into the ask is the largest single trust assumption in the system. See Risks.