BLACKBENCH

All work pumpgod


Trading · Solana · 2026

pumpgod


A collector and sniper for pump.fun token launches, riding a Yellowstone gRPC stream.

Your own record of a market's first minutes, so a decision never waits on somebody else's screener to catch up.

By the numbers

164,737
tokens recorded in the owner's database
10.5M
trades in the archive
5 min
observation window per token
70
test files

The problem

pump.fun mints hundreds of tokens an hour, and most of them are copies of each other: same name, same symbol, same picture. Public screeners aggregate after the fact and lose precisely the first seconds, which is where a launch is decided. The owner wanted a record of his own — who created the token, how much of it the creator bought, and what the trades did while the event was still running.

Subscribing to the stream is the easy part. The stream never stops. A naive collector fills the disk within a day, and without clone detection the feed is useless anyway: twenty tokens named Frog Coin and no way to say which came first. So the real work is bounded writes, plus a rule for picking the original out of a pile of copies.

The solution

A Yellowstone gRPC subscription writes each new token to SQLite along with the creator's own buy and every trade of the first five minutes. The window shuts on the clock: an event is recorded whole or flagged incomplete, with no half state left over to interpret.

Aggregates — buyers at 5, 30, 60 and 300 seconds, SOL in and out, peak and last reserves, the successful-launch flag — are computed once, after the window closes. Nothing is recalculated per tick, which is why the feed stays quick.

Clones group by normalised name and symbol, members of a group are ranked, and rank 0 goes to the original. One look at a token card says whether this is a copy or the thing being copied, and how many descendants it has.

Retention holds the database inside a boundary. A 78-minute soak measured growth at roughly 0.56 MB a minute, which puts a 48-hour window near 1.6 GB instead of wherever it happens to land.

The web console opens the databases read-only, with query_only set on the connection: browse the feed, a token card, a trade history, none of it able to touch what the collector wrote. Database paths and the wallet key come from the environment, so the same code runs against an isolated demo database.

Screens

Synthetic data. Every screen in this case study comes from an isolated demo database filled by a random-number generator, never the production archive: the trades, the ROI figures and the percentages measure nothing and describe no trading result.

The live feed of new tokens — buyers in the last 30 seconds, SOL in, peak reserves and clone count, one row each. Every screenshot in this case study comes from an isolated demo database of synthetic data, never the production archive.
A token card: aggregates from the closed window, rank within a clone group, price across 4m 59s of trades, and the full trade history with the creator's buy marked.
My tokens — the launch log for this wallet. Confirmed, closed, and one unconfirmed row that says plainly: check the signature in an explorer before launching again.
Trading: stake and reserve, simulation sitting next to live mode, with predicted ROI checked against actual on every fill. Every number on this screen comes from the demo database: no trade here was ever sent anywhere, and the 382.9% total measures nothing and promises nothing.
Launching a clone. The form budgets the packet — uri, name and symbol all have to fit inside a 1232-byte transaction — and the server names the exact overage in characters.

Stack

TypeScript · Node.js
Yellowstone gRPC (Geyser) against a Solana validator
SQLite: tokens and trades, shadow entries, launches
Web console with live feed, token card and launch form
70 test files