pump-clone
v0.1.11
Published
Watch pump.fun CREATE events, score them for net-new themes, and mirror the interesting ones 1:1 onto a protected-curve launchpad — with optional first buy and borrow.
Maintainers
Readme
pump-clone
Watch pump.fun CREATE events, score them for net-new themes, and mirror
the interesting ones 1:1 onto a protected-curve launchpad.
Unaudited. Spends real money on tokens strangers just minted. Dry-run by default.
Why the naive version doesn't work
Counting word frequency over launch metadata ranks infrastructure noise above real memes — "deployed", "using", tracker handles appear in nearly every description. And "young + fast" as a novelty test badges launcher spam, because spam is always young and always fast.
So this classifies tokens into layers (grammar / chain / social / launcher / url / known-meme / signal), drops the first five, force-keeps known memes, and soft-suppresses ubiquitous words via IDF rather than banning them.
Two rules do most of the work:
- Hapax floor. Every launch has a unique ticker. With
df = 0a burst ratio is infinite, so without a floor every token badges net-new and the bot clones the entire firehose. A theme must recur. - Lift, not raw count. Novelty is the token's share of recent creates over its share of the window — both are shares, so bucket sizes cancel. Comparing a 1h count against a 24h doc-frequency is just wrong.
Use
npm i -g pump-clone
pump-clone watch # stream + score. never spends.
pump-clone run # dry run: shows what it WOULD clone
pump-clone run --execute --max 0.01 --total 0.05Spend safety
Two independent caps, both enforced in SpendGuard, not trusted to the caller:
| knob | meaning |
|---|---|
| maxEthPerClone | ceiling for any single clone |
| maxEthTotal | ceiling for the whole process run |
| cooldownSeconds | minimum gap between clones |
A per-clone cap alone is not a budget — a bot cloning every 10 minutes will
spend it a hundred times. maxEthTotal is what bounds a runaway, and the last
clone is truncated to whatever remains rather than overshooting.
firstBuy and borrow are off by default. borrow: true without
firstBuy: true is rejected at config validation — there'd be nothing to
borrow against.
Pair with nav-loop for the
borrow leg.
MIT.
