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
| File | What it does |
|---|---|
pump.mjs | pump.fun instructions: create_v2, buy, sell, fee sharing, with simulation |
rh.mjs | Robinhood Chain: the launcher and vault ABIs, curve reads |
logic.mjs | Turns the engine's plan into the raw arguments of a transaction, with slippage |
fx.mjs | The SOL/ETH rate from Coinbase, Binance and Jupiter, the median, and a flag when they disagree |
guards.mjs | Limits on every trade, the kill switch, the ledger |
pipeline.mjs | The launch as a saved state machine, with retries and refunds |
deposits.mjs | Finds the creator's SOL deposit on Solana by its Memo reference |
metadata.mjs | Uploads the image and metadata to pump.fun's IPFS endpoint |
adapters.mjs | The real chain calls behind each pipeline step, dry or live |
server.mjs | The HTTP API for the launch page and the loops that watch deposits and run launches |
index.mjs | The dry runs and the maker loop |
The API
| Route | What it does |
|---|---|
POST /api/requests | Validates the parameters, reads the rate, returns an id, the deposit address, the amount in SOL and the expiry |
GET /api/requests/:id | Status and public log of a launch |
GET /api/status | What the maker is doing, from the status file |
GET /api/health | Alive |
Commands
| Command | What it does |
|---|---|
node keeper/index.mjs newest | Dry 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.json | Dry 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 --live | The real launch, with keys |
node keeper/index.mjs watch coins.json | The maker loop, dry by default, every 15 seconds, writes site/data/status.json |
node keeper/index.mjs watch coins.json --live | The same with real trades |
node keeper/server.mjs | The API and the background loops, dry by default |
node keeper/check-solana.mjs | Simulates a buy, a sell, a create_v2 and a create_v2 with the fee sharing config against mainnet state |
node keeper/test-rh-fork.mjs | Integration test of the Robinhood path on an anvil fork |
What a maker tick does
- Reads the rate from three sources and refuses to trade if they disagree by more than 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.
- Stops for a coin if either curve has graduated.
- Runs the engine and gets a plan, then checks it against the guards.
- Without
--liveit prints the plan. With--liveit sends the trade. - 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:
| Guard | Default |
|---|---|
| One trade | at most $1,500 |
| All trades of one tick | at most $3,000 |
| Cash a coin may deploy, per chain | at most $5,000 |
| Net cash out of a coin | at most $1,500 |
| Age of the data a decision uses | at most 30 seconds |
| Rate sources | must agree within 2 % |
| Kill switch | a file named KILL next to the keeper stops all trading |
| Dust | trades under $5 are skipped |
Keys and configuration
| Variable | Used for |
|---|---|
KEEPER_SOL_SECRET | The Solana keeper wallet: deposit address, creator of record on pump.fun, maker trades |
KEEPER_EVM_KEY | The Robinhood Chain keeper address, the only one the contracts accept |
LAUNCHER | The deployed GlintLauncher |
SOLANA_RPC, RH_RPC | RPC endpoints, public ones by default |
SITE_ORIGIN, PORT | CORS 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
- The Solana buy, sell, creation and fee sharing configuration are valid against the live pump.fun program and state.
- The Robinhood path works against the real Pons: launch, buy, sell and sweep, with the engine's prediction equal to the chain's result.
- The whole pipeline runs from a request to a registered coin against a fork and live Solana state.
- The pipeline from two live chains and a live rate to a decision works end to end.
What they do not prove
- A live run with real funds, which has not been done.
- The behaviour of the keeper through a long outage, an RPC failure or a pump.fun program change.
update_fee_shares_v2on a new coin: its layout comes from the AuronV2 code that ran it on mainnet, and a single transaction with the creation and both fee sharing instructions would exceed the size limit.