The keeper

The keeper is a Node service in keeper/. It takes launch requests, launches and aligns coins, and runs the maker. It talks to Solana through @solana/web3.js and to Robinhood Chain through viem.

Modules

FileWhat it does
pump.mjspump.fun instructions: create_v2, buy, sell, fee sharing, with simulation
rh.mjsRobinhood Chain: the launcher and vault ABIs, curve reads
logic.mjsTurns the engine's plan into the raw arguments of a transaction, with slippage
fx.mjsThe SOL/ETH rate from Coinbase, Binance and Jupiter, the median, and a flag when they disagree
guards.mjsLimits on every trade, the kill switch, the ledger
pipeline.mjsThe launch as a saved state machine, with retries and refunds
deposits.mjsFinds the creator's SOL deposit on Solana by its Memo reference
metadata.mjsUploads the image and metadata to pump.fun's IPFS endpoint
adapters.mjsThe real chain calls behind each pipeline step, dry or live
server.mjsThe HTTP API for the launch page and the loops that watch deposits and run launches
index.mjsThe dry runs and the maker loop

The API

RouteWhat it does
POST /api/requestsValidates the parameters, reads the rate, returns an id, the deposit address, the amount in SOL and the expiry
GET /api/requests/:idStatus and public log of a launch
GET /api/statusWhat the maker is doing, from the status file
GET /api/healthAlive

Commands

CommandWhat it does
node keeper/index.mjs newestDry run on the newest live pump.fun coin and the newest Pons coin: reads both curves and the rate, prints the spread and what the maker would do, simulates the Solana trade. Sends nothing
node keeper/launch.mjs params.jsonDry run of a whole launch through the pipeline: simulates the Pons launch and the pump.fun creation, computes the alignment and the fee sharing
node keeper/launch.mjs params.json --liveThe real launch, with keys
node keeper/index.mjs watch coins.jsonThe maker loop, dry by default, every 15 seconds, writes site/data/status.json
node keeper/index.mjs watch coins.json --liveThe same with real trades
node keeper/server.mjsThe API and the background loops, dry by default
node keeper/check-solana.mjsSimulates a buy, a sell, a create_v2 and a create_v2 with the fee sharing config against mainnet state
node keeper/test-rh-fork.mjsIntegration test of the Robinhood path on an anvil fork

What a maker tick does

  1. Reads the rate from three sources and refuses to trade if they disagree by more than 2 %.
  2. For each registered coin, reads the pump.fun curve, the Pons curve, the vault's cash and inventory and the keeper's token balance on Solana.
  3. Stops for a coin if either curve has graduated.
  4. Runs the engine and gets a plan, then checks it against the guards.
  5. Without --live it prints the plan. With --live it sends the trade.
  6. Writes the status file: the rate, each coin's spread, pool cash and inventory, and any guard that blocked a trade.

Guards

Every trade passes guards.mjs before it is sent:

GuardDefault
One tradeat most $1,500
All trades of one tickat most $3,000
Cash a coin may deploy, per chainat most $5,000
Net cash out of a coinat most $1,500
Age of the data a decision usesat most 30 seconds
Rate sourcesmust agree within 2 %
Kill switcha file named KILL next to the keeper stops all trading
Dusttrades under $5 are skipped

Keys and configuration

VariableUsed for
KEEPER_SOL_SECRETThe Solana keeper wallet: deposit address, creator of record on pump.fun, maker trades
KEEPER_EVM_KEYThe Robinhood Chain keeper address, the only one the contracts accept
LAUNCHERThe deployed GlintLauncher
SOLANA_RPC, RH_RPCRPC endpoints, public ones by default
SITE_ORIGIN, PORTCORS origin and port of the API

Without the keys the keeper stays in dry-run mode and can only read and simulate.

What the dry runs prove

What they do not prove