atomic-collect — pump.fun creator-fee collection
Collects accumulated creator fees from pump.fun's coinCreatorVault PDA and immediately moves the SOL to a safe destination, in one atomic tx. Designed for the case where the creator key is shared or leaked: any non-atomic flow leaves a window where another key-holder calls collectCoinCreatorFee first.
Scripts (all in src/)
| Script | What it does |
|---|---|
collect-jito.js |
One-shot collect: collectCoinCreatorFee + transfer to DESTINATION + Jito tip, all in one tx inside a Jito bundle. Zero window for a competing collector. |
watch-collect.js |
Long-running poller. Reads the vault balance every 30 s; runs collect-jito when ≥ MIN_COLLECT_SOL. |
consolidate.js |
One Jito bundle that drains everything: vault → safe wallet, creator wallet → safe wallet, funder wallet → safe wallet. Use when retiring a coin or shutting down a leaked key. |
Setup
Run all commands from the repo root — package.json lives there and defines npm scripts (npm run launch, npm run collect, etc.).
npm install
cp .env.example .env # fill in
Flows
Manual one-shot collect:
DESTINATION=<safe-wallet> \
FUNDER_SECRET=<base58> CREATOR_SECRET=<base58> \
JITO_TIP=0.005 \
npm run collect
Long-running watcher (recommended for leaked keys):
DESTINATION=<safe-wallet> \
CREATOR_PUBKEY=<base58-pubkey> \
FUNDER_SECRET=<base58> CREATOR_SECRET=<base58> \
MIN_COLLECT_SOL=0.05 \
npm run watch
MIN_COLLECT_SOL should exceed Jito tip + tx fee so each cycle is net-positive. 0.05 is a sane floor; lower it to 0.02 if vault accrual is slow but consistent.
Full sweep (retire a leaked setup):
DESTINATION=<safe-wallet> \
FUNDER_SECRET=<base58> CREATOR_SECRET=<base58> \
JITO_TIP=0.01 \
npm run consolidate
After this, the creator and funder wallets have only rent-exempt minimums. If you also want to extract that, you must close the wallets (delete their accounts), which the script does not do automatically.
Env vars
RPC_URL— Solana RPC. WS endpoint is not used; HTTP is enough.DESTINATION— base58 pubkey, the safe wallet receiving funds. Should not beCREATOR_PUBKEYorFUNDERpubkey.CREATOR_PUBKEY— base58 pubkey, used bywatch-collect.jsto compute the vault PDA without needing the secret to derive it.FUNDER_SECRET,CREATOR_SECRET— both required so the funder pays Jito tip and the creator signscollectCoinCreatorFee.JITO_TIP— SOL, default 0.005.MIN_COLLECT_SOL— threshold forwatch-collect.js.
Gotchas
- Sweeper bots. A leaked creator key has other watchers. Any non-atomic flow (collect → wait → transfer) loses the SOL. The Jito bundle pattern here is the only safe option.
- Vault PDA. Derived from the coin's mint and creator pubkey.
watch-collect.jsreadsCREATOR_PUBKEYdirectly so you can monitor without ever loading the secret if the secret stays on a different host. - Jito tip starvation. If bundles silently fail (
watch-collectreports zero landings while vault keeps growing), bumpJITO_TIPfirst before debugging other failure modes. - Same-block contention. Two atomic collects in the same block from different key-holders will both succeed at the bundle layer but only one will actually land in the slot. Watcher cadence + Jito tip combined are your only edge.
Security
DESTINATION should be a cold wallet you control alone. Never set it to an exchange deposit address — exchanges credit on confirmation and a sweeper can still race a non-atomic withdrawal out of the exchange if the deposit pubkey is also leaked. The atomicity guarantees of this skill only cover Solana txs, not custodial flows downstream.