The keeper

The keeper is a Node service in keeper/. It takes launch requests and launches coins on the three chains. It talks to Solana through @solana/web3.js and to Robinhood Chain and BNB Chain through viem.

Modules

FileWhat it does
pump.mjspump.fun instructions: create_v2, fee sharing, with simulation (buy and sell exist but are not used in a launch)
rh.mjsRobinhood Chain: the launcher and vault ABIs, curve reads
bnb.mjsBNB Chain: the launcher ABI, the 7777 salt miner, the upload of the logo and metadata to Flap's gateway
alt.mjsThe address lookup table that lets create_v2 and the creator's dev buy share one transaction on pump.fun
treasury.mjsThe float of SOL, ETH and BNB the keeper needs, the floors below which requests pause, and what to top up
fx.mjsThe SOL, ETH and BNB rates from Coinbase, Binance, OKX and Jupiter, the median, and a flag when they disagree
pipeline.mjsThe launch as a saved state machine, with retries and refunds
soldeposit.mjsVerifies the creator's SOL deposit on Solana: signer, recipient, memo reference, success, amount
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.mjsDry-run reads of the chains

The API

RouteWhat it does
GET /api/configDeposit address, image limits
POST /api/quoteThe deposit for a set of options, itemised
POST /api/metadataUploads the logo (base64, 1.5 MB at most) and the metadata to pump.fun's IPFS and to Flap's gateway, returns the metadata URI, the Pons logo and the Flap CID
POST /api/requestsValidates the parameters, reads the rate, returns an id, the deposit address, the amount in SOL and the expiry
POST /api/requests/:id/depositTakes the transaction signature of the SOL deposit, reads it on Solana and starts the launch if it is valid
GET /api/requests/:idStatus and public log of a launch
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. Sends nothing
node keeper/launch.mjs params.jsonDry run of a whole launch through the pipeline: simulates the pump.fun creation, the Pons launch and the Flap launch, plans the fee sharing
node keeper/treasury.mjsPrints the keeper balances on the three chains, the floors and what to top up
node keeper/launch.mjs params.json --liveThe real launch, with keys
node keeper/server.mjsThe API and the background loops, dry by default; --live for real launches
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
node keeper/test-devbuy-fork.mjsIntegration test of the creator's dev buy on Pons and Flap on anvil forks: tokens in the creator's hands, none left in the contracts, costs booked
node keeper/alt.mjsThe lookup table for the pump.fun dev buy: addresses and transaction sizes, --create to create it
node keeper/test-bnb-fork.mjsIntegration test of the BNB Chain path on an anvil fork: live Flap launch with the mined salt, trades, tax and split

Keys and configuration

VariableUsed for
KEEPER_SOL_SECRETThe Solana keeper wallet: deposit address, creator of record on pump.fun
KEEPER_EVM_KEYThe EVM keeper address, the same on Robinhood Chain and BNB Chain, the only one the contracts accept
LAUNCHERThe address of PivotLauncher (Robinhood Chain) once it is deployed
BNB_LAUNCHERThe address of PivotFlapLauncher (BNB Chain) once it is deployed
SOLANA_RPC, RH_RPC, BNB_RPCRPC endpoints, public ones by default
PUMP_ALTAddress of the lookup table, if not in keeper/data/pump-alt.json
MAX_DEV_BUY_SOLLargest dev buy per chain, in SOL at the current rate, 10 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.

The address lookup table, for a dev buy on pump.fun

create_v2 alone takes 849 bytes of the 1232 a transaction holds, so create and buy do not fit together. pump.fun's own site solves it with an address lookup table that replaces the 24 fixed accounts by one-byte indexes; with it the create and the buy are 828 bytes. Pivot does the same with its own table.

The float: how one deposit in SOL pays for three chains

The creator pays in SOL. The keeper pays the creation fees and the gas in SOL, ETH and BNB from a float it already holds on each chain, so nobody waits for a swap or a bridge while a launch runs. The deposits bring SOL in; the operator tops up the ETH and BNB floats in batches with that SOL.

What the dry runs prove

What they do not prove

Public limits