Evidence first. Every claim has a source.
Three ways in, one pipeline, one grade. The grade measures risk and verification. It is not a buy signal. These are draft rules v0.3 (17 Oct 2026; v0.2 added the abandoned/dead-token rules, v0.3 adds X source trust, no-related-CA, MKT-ORGANIC-LOW and the launcher-wallet DEV-SERIAL): thresholds are proposals and may change, and this page is generated from the same code that grades every report.
The grade
Combination logic (draft)
Order of evaluation
Draft- No token data from any source → ? (never shown as a pass)
- Any critical signal → F
- ≥ 2 serious signals → D
- 1 serious signal → C if the official CA is verified, else D
- Official CA not verified (no X, no CA posts, no related CA, official X unknown, X N/A, name-only) → at best C
- Official X unknown (post/community link, or handle only from DexScreener/Jupiter) → official-CA check skipped, so that account can't cause a serious or critical flag
- Market Health (0–100) is a separate score and never changes the grade
- Latest CA wins only among related CAs: same/similar name or ticker (equal, or one contains the other, ≥ 3 chars), or the post announces a CA change (new CA, relaunch, migrated to new contract; bare 'migration' = Pump.fun graduation, ignored), or the newer token can't be looked up. Different-name tokens the project posts are listed as Other tokens by this project (info, no penalty)
- Inactive / abandoned (DEAD-ACTIVITY + ≥ 2 of ATH-DRAWDOWN, TINY-HOLDERS, STALE-SOCIAL, LOW-FOLLOWERS; token ≥ 72h old) → at best D, even with a verified CA
- ≥ 1 notable signal → C
- Verified with only minor signals → B
- Verified, no flags → A
Rules
33 rules · severity → effect on the grade
| Rule | Severity | Fires when | Source |
|---|---|---|---|
Official X's latest CA post names this mintX-VERIFIED | good | The X account linked in the token's own metadata posted this mint (any post explicitly naming it, e.g. 'Cashtag is live' + CA), and no later post names a related CA (same/similar name/ticker or explicit new CA / migration / relaunch). | Pump.fun / metadata_uri twitter field → X posts (FxTwitter API) |
Likely clone: official X posted a different CA with the same name/tickerX-CLONE | critical | The official account posted one or more CAs, never this mint, and a posted CA is a same-name or same-ticker mint. | X posts + Jupiter same-name search |
Official X posts other CAs, never this oneX-OTHER-CA | serious | The official account posted CAs, none is this mint, and none shares its ticker. | X posts |
Replaced CA / relaunch patternX-REPLACED | serious | This mint appears in older posts of the official account, but a later CA post names a different mint that is about the same token: same/similar name or ticker, or the post announces a CA change: new CA / relaunch / migrated to a new contract (bare 'migration' = Pump.fun graduation, ignored), or the newer token's name can't be looked up. Different-name tokens posted later (e.g. assets launched on the project's platform) do not count. | X posts |
Other tokens by this project (no penalty)X-OTHER-TOKENS | info | The official account also posted CAs of tokens with a different name/ticker and no migration wording. Listed for context; never counted as a relaunch. | X posts + Jupiter token lookup |
Official CA not confirmed: no CA in recent postsX-NO-CA | notable | The official account is reachable but none of its recent posts contains a Solana CA. | X posts |
Official CA not confirmed: the account only posts other tokensX-NO-RELATED-CA | notable | The official account posted CAs, but none is this mint or a related CA (same/similar name or ticker, or explicit CA-change wording). Treated like X-NO-CA: an unrelated CA is never used as 'latest CA' against this token, and those tokens are listed as Other tokens by this project. | X posts + Jupiter token lookup |
Official X unknown (post link or aggregator-only)X-UNKNOWN | notable | The X link is a post/community URL instead of a profile, or the handle only comes from DexScreener/Jupiter, not from the token's own metadata (Pump.fun field, metadata_uri JSON, on-chain metadata). The official-CA check is skipped, so no serious/critical flag can come from that account. | Pump.fun / metadata_uri / Jupiter / DexScreener socials |
No official X in token metadataX-NONE | notable | Neither Pump.fun, the metadata_uri JSON nor Jupiter lists an X account. | Pump.fun + metadata_uri + Jupiter |
X read unavailable (N/A)X-NA | notable | An X account is listed but its posts could not be read (free read path failed or disabled). | FxTwitter API |
X link is a post or community, not an accountX-POST-LINK | minor | The twitter field points to a status/community URL instead of a profile. | Pump.fun twitter field |
Other mints share this name and ticker (unverified)CLONE-FAMILY | notable | ≥ 1 other Solana mint has the same name and ticker and the official CA is not verified. | Jupiter tokens v2 search |
Copies exist of this (verified) tokenCLONE-COPIES | info | The official CA is verified and other same-name/ticker mints exist (they are the likely clones). | Jupiter tokens v2 search |
Mcap far above liquidity (> 50×)MKT-THIN | serious | Market cap / pool liquidity > 50 (methodology sanity filter). 20–50× is a notable flag. | Pump.fun mcap + DexScreener/Jupiter liquidity |
Bot / wash volume (organic score < 5 on real volume)MKT-WASH | serious | Jupiter organic score < 5 while 24h volume ≥ $20K. Score < 20 with ≥ $5K volume is notable. | Jupiter tokens v2 organicScore |
Organic volume < 10% on ≥ $50K 24h volumeMKT-ORGANIC-LOW | notable | Jupiter organic buy+sell volume is under 10% of total 24h volume while 24h volume is at least $50K. Separate from the organic score (MKT-WASH). | Jupiter stats24h buyOrganicVolume/sellOrganicVolume |
Scripted buying pattern (almost no net sellers)MKT-NETBUY | notable | > 98% of ≥ 200 traders are net buyers while sells are ≥ 20% of trades (24h). | Jupiter stats24h |
Mint authority is activeCHAIN-MINT | serious | The mint account still has a mint authority (supply can be increased). | Solana RPC getAccountInfo (fallback Jupiter audit) |
Freeze authority is activeCHAIN-FREEZE | serious | The mint has a freeze authority (holder accounts can be frozen). | Solana RPC getAccountInfo (fallback Jupiter audit) |
Dev wallet holds > 20% (5–20% notable)HOLD-DEV | serious | Creator wallet share of supply. | Solana RPC getTokenAccountsByOwner(creator) / supply (fallback Jupiter audit.devBalancePercentage) |
Top holders > 50% (30–50% notable)HOLD-TOP | serious | Share of supply held by the top 10 wallets (liquidity pools and the Pump.fun bonding curve excluded). | Solana RPC getTokenLargestAccounts top 10 wallets, pools/curve excluded (fallback Jupiter audit.topHoldersPercentage) |
Serial launcher (creator minted ≥ 10 tokens; > 1000 = launcher/platform wallet, info)DEV-SERIAL | notable | Jupiter reports the creator wallet minted 10–1000 tokens (notable). Above 1000 it is most likely a launcher/platform/bot wallet that deploys for many users, so it is shown as info with no penalty. | Jupiter audit.devMints |
Banned on Pump.funPUMP-BANNED | critical | Pump.fun marks the coin is_banned. | Pump.fun frontend-api-v3 |
Pump.fun security verdict is warn/dangerPUMP-VERDICT | notable | Pump.fun's own security_verdict is not 'ok'. | Pump.fun security_verdict |
Sniper-heavy launch (≥ 30% of first 50 are Sniper/Bot)WALLET-SNIPERS | notable | Token is in the research snapshot and ≥ 30% of its first 50 buyers are categorised Sniper/Bot (heuristic). | research snapshot |
Inactive / abandoned (combo, caps grade at D)ABANDONED | serious | DEAD-ACTIVITY fires AND at least 2 of ATH-DRAWDOWN, TINY-HOLDERS, STALE-SOCIAL, LOW-FOLLOWERS fire. Only for tokens ≥ 72h old. Caps the grade at D even when the CA is verified; the Verified CA signal is still shown. | Combination of the rules below |
Almost no trading (24h volume < $100, < 5 traders, or no trade for 24h)DEAD-ACTIVITY | notable | Any of: 24h volume < $100; < 5 unique traders in 24h; last Pump.fun trade > 24h ago. Age guard: token ≥ 72h old. Missing fields are skipped, not treated as zero. | DexScreener volume.h24 (fallback Jupiter stats24h buy+sell volume), Jupiter stats24h.numTraders, Pump.fun last_trade_timestamp |
More than 80% below all-time highATH-DRAWDOWN | notable | Current mcap is > 80% below the Pump.fun ATH mcap. Age guard ≥ 72h. N/A off Pump.fun (no free ATH source). | Pump.fun ath_market_cap vs current mcap |
Fewer than 50 holders after 72hTINY-HOLDERS | notable | Jupiter holder count < 50 and the token is ≥ 72h old. (Younger tokens get HOLDERS-FEW, minor.) | Jupiter holderCount |
Official X has not posted in 30 daysSTALE-SOCIAL | notable | Newest post written by the official account (posts, replies, quotes; reposts excluded) is older than 30 days. Age guard ≥ 72h. If X can't be read it shows N/A (info, no penalty), never a guess. | X via FxTwitter API timeline |
Official X has < 500 followersLOW-FOLLOWERS | minor | Follower count of the official account below 500. Counts toward ABANDONED. | X via FxTwitter API profile |
Very new token (< 24h; < 1h notable)AGE-NEW | minor | Time since creation. | Pump.fun created_timestamp / Jupiter firstPool |
Few holders (< 100)HOLDERS-FEW | minor | Jupiter holder count below 100 (not shown when TINY-HOLDERS fires). | Jupiter holderCount |
Severity effects: critical → F · serious → D (C if verified and alone) · notable → C · minor → B · info/good → no penalty. A rule with two thresholds (e.g. MKT-THIN) emits serious above the high line and notable above the low line.
Abandoned / dead-token thresholds
Draft constants
| Constant | Value | Used by | Source |
|---|---|---|---|
| MIN_AGE_H | 72 hours | Age guard for DEAD-ACTIVITY, ATH-DRAWDOWN, TINY-HOLDERS, STALE-SOCIAL (and so ABANDONED). Younger or unknown-age tokens are never called dead. | Pump.fun created_timestamp / Jupiter firstPool |
| VOL24_MAX_USD | $100 | DEAD-ACTIVITY | DexScreener volume.h24 (fallback Jupiter stats24h) |
| TRADERS24_MIN | 5 traders | DEAD-ACTIVITY | Jupiter stats24h.numTraders |
| LAST_TRADE_MAX_H | 24 hours | DEAD-ACTIVITY | Pump.fun last_trade_timestamp |
| ATH_DRAWDOWN_PCT | 80% | ATH-DRAWDOWN | Pump.fun ath_market_cap |
| HOLDERS_MIN | 50 holders | TINY-HOLDERS | Jupiter holderCount |
| STALE_SOCIAL_DAYS | 30 days | STALE-SOCIAL (N/A, no penalty, if X can't be read) | FxTwitter timeline |
| FOLLOWERS_MIN | 500 followers | LOW-FOLLOWERS | FxTwitter profile |
| COMBO_MIN_OTHERS | 2 of 4 | ABANDONED = DEAD-ACTIVITY + this many of ATH-DRAWDOWN, TINY-HOLDERS, STALE-SOCIAL, LOW-FOLLOWERS → grade capped at D. Verified CA stays shown as a positive signal. | combo |
Wallet categories
Heuristic · rules-v1 1.0.0-draft · ported to TypeScript, tested against the reference fixtures
| Priority | Category | Rule |
|---|---|---|
| 0 · R7 | Smart Money | ONLY when a public source labels the wallet (GMGN / Axiom / Birdeye / Arkham / Solscan tag) with source_url + observed_at |
| 1 · R1 | Dev/Insider | wallet == token.creator · OR funding[wallet] is a tracked creator (or the creator funded it) · OR non-creator buy in launch_slot (bundled with the creator buy), excluding migration_event |
| 2 · R2 | Sniper/Bot | dust_bot: median early buy sol < 0.001 · OR fast_entry: entry <= 3 s after created_ms in >= 2 tokens (single-token mode: secondary flag sniper_like) · OR timer_bot: exit_pattern fixed_timer_sell · OR trio_sandwich: member of a trio_sandwich cluster (buyer or seller side) · OR extreme_rate: activity.likely_bot_flag starts with extreme_rate (≥1000 tx in < 24 h) |
| 3 · R3 | Runner Hunter | early in >= 2 runners (history), and not R1/R2 |
| 4 · R6 | Hybrid | early in >= 2 runners AND per-runner outcomes include at least one 'paper' (< 25% of peak, exited before peak) and at least one 'diamond' (>= 50% of peak or still holding) |
| 5 · R4 | Diamond Hand | early in >= 1 runner AND (sell VWAP >= 50% of peak_price_usd OR still holding = no sells seen) AND NOT trio_sandwich buyer |
| 6 · R5 | Paperhand | early in runners AND in every one: sold >= 90% (or partially) before token.ath_ts_ms at sell VWAP < 25% of peak_price_usd |
| 99 · R0 | Early Buyer (unclassified) | fallback: no rule matched, or data missing |
Smart Money (if publicly labeled) is shown as an extra badge, not instead of the behaviour category. Otherwise the first matching category by priority wins (R1 → R2 → R3 → R6 → R4 → R5 → R0). All other matches become secondary_flags. Smart Money needs a public label with a source URL (none yet, so the category stays empty); otherwise wallets that match nothing are Unclassified, or "Early buyer (non-runner)" when the token itself is not a runner. Trio-sandwich buyers are never Diamond Hand.
Runner score
Per token and per wallet · descriptive, never folded into the A–F grade
Runner
multiple >= 100 AND graduated (complete=true) AND created within 30 days of the snapshot
Sanity gate
liquidity_usd >= 150000 AND fdv_usd/liquidity_usd <= 50 (else tag inflated_mcap)
Token runner score
runner_score = clamp(log10(multiple)/3, 0, 1) × (fdv_liq_ok ? 1 : 0.5) × (instant_graduation ? 0.5 : 1)
Wallet runner score
sum over runners where the wallet was early: runner_score × (1 - (rank-1)/50) × capture_weight; capture_weight = 1 if pct_of_peak >= 50 or still holding, 0.5 if 25–50, 0.25 if < 25. Descriptive ranking only. Not PnL, not a win rate.
Exit patterns & clusters
rules-v1 · heuristic
Exit patterns
6- ·fixed_timer_sellfirst sell delay (first sell ts − entry ts) has stdev < 60 s across >= 3 tokens
- ·never_sell_dustentry sol < 0.001 AND no sells seen
- ·single_full_dumpexactly 1 sell AND sold >= 90% of bought
- ·partial_scale_out>= 3 sells AND first sell < 50% of bought AND last sell − first sell >= 10 min
- ·dump_on_graduationbought on bonding curve (program=pump) AND sold >= 50% of bought within 120 s after the first pump_amm trade of the mint (computed when the per-wallet trades include the graduation; else not flagged)
- ·fast_flipsold >= 90% within 10 min of entry
Cluster rules
5- ·same_slot>= 3 distinct early buyers (non-creator) buy the same mint in the same slot within the first 5 s
- ·launch_slot_bundlenon-creator buys in launch_slot (see R1)
- ·shared_funder>= 2 wallets share the same first funder (oldest inbound SOL transfer) Exclusions: funder in known_wallets with label_type public AND label in (exchange, cex) → ignore (CEX hot wallets fund thousands) Budget: first 25 non-dust early buyers per token, 1 RPC page (≤ 1000 signatures) per wallet; wallets with more history are N/A.
- ·trio_sandwichbuy by wallet A of X tokens, then sell by wallet B != A of the same mint with |tokens − X| <= 1e-6·X, ts_B − ts_A <= 1 s AND slot_B − slot_A <= 3
- ·co_occurrence_ring>= 5 wallets each early in the same >= 2 tokens, appearing in near-identical rank order (Spearman >= 0.8) with similar sizes (sol CV <= 0.3)
Data path & budgets
How the early-buyer analysis stays free and rate-limit friendly
1 · Trades
Pump.fun swap-api /v2/coins/{mint}/trades (100 per page, cursor). Launch window grows 1 → 4 → 16 → 64 min until 50 distinct buyers; cap 40 pages. Then each buyer's own trades in that mint (userAddress=) for exits. Limiter 300/min (the API allows ~1000/min per IP, shared), pauses when x-ratelimit-remaining is low.
2 · Token
Pump.fun coins-v2 (creator, created time, ATH), limiter 50/min (API ~60/min). DexScreener for FDV and liquidity.
3 · Funding
Solana RPC: getSignaturesForAddress (1 page) → oldest getTransaction (maxSupportedTransactionVersion 1) → first inbound SOL transfer. Private RPC first, public fallback. Cached forever in the app DB.
4 · Labels & storage
A public label set (≈100.5K wallets) mark exchanges and named wallets. Every analysis is stored (analyses, ea_wallets, clusters, funding), so the DB grows with use and repeat views cost nothing.
Data sources
Free and public only · no API keys · no paid plans
| Source | Used for | Status |
|---|---|---|
| Pump.fun frontend-api-v3 /coins-v2/{mint}, /coins | Primary token metadata: name, ticker, image, creator, created time, mcap, ATH, graduated, pool, X/website fields, security verdict. Needs browser-like headers. /coins/{mint} now 404s; /coins-v2/{mint} is the live per-mint path. | |
| metadata_uri (IPFS JSON) | Socials as the deployer wrote them. ipfs.io answers 429 to servers, so CIDs are retried on: https://4everland.io/ipfs/, https://sumo-ipfs.quicknode-ipfs.com/ipfs/, https://ipfs.io/ipfs/, https://gateway.pinata.cloud/ipfs/. | |
| DexScreener tokens/v1 + search | Pool liquidity, 24h volume and trades, pair link; name search. | |
| Jupiter lite-api tokens v2 search | Holders, organic score, dev/top-holder % (fallback when RPC fails), mint/freeze audit, same-name mints, posted-CA lookups. | |
| Solana RPC (own RPC via SOLANA_RPC_URL, public RPC fallback) | getAccountInfo (mint/freeze authority, Token-2022 metadata), getTokenLargestAccounts + getMultipleAccounts (top-20 holder list, owners, top-10 wallet %), getTokenAccountsByOwner (creator balance → dev %). Cached 5–10 min; the private endpoint backs off 10 s → 10 min after a repeated 429 (5 s after a timeout/5xx); skips appear in the evidence log. Without SOLANA_RPC_URL the public endpoint usually 429s on largest accounts → Jupiter audit fallback, shown as such. | |
| X via FxTwitter API (api.fxtwitter.com) | Official account profile + recent posts, CA extraction. Free, no key, unofficial mirror of public X data. Timeline can skip pinned/older posts. | |
| Own CA snapshots | Every CA post we read is stored server-side, starting from an earlier research snapshot. Detects later deletions; can't see posts deleted before our first read. | |
| Research snapshot (early buyers) | 807 categorised early-buyer wallets, 1,983 activity-screened wallets, 21 tracked tokens. Snapshot 16 Oct 2026. | |
| Pump.fun swap-api (swap-api.pump.fun/v2/coins/{mint}/trades) | First-50-buyer trades and per-wallet exits for the early-buyer analysis (server-side only). | |
| Holder fallback chain | Private RPC → public RPC → Pump.fun top-holders (frontend-api-v3 /coins/top-holders) → Jupiter datapi /v1/holders. N/A only if all four fail; the report names the source used. | |
| CA recorder (background job) | Re-reads every official X account seen here every 15 min, stores CA posts, re-checks vanished posts via /status and marks deletions. | |
| Track record job | Re-reads mcap at +1h, +24h, +7d for every screening (DexScreener, Pump.fun fallback). | |
| Public wallet labels | ≈100.5K public wallet labels (exchanges, named wallets) imported into the app DB on first boot. |
Official X trust & on-chain metadata
Which X account counts as official
Official
A profile link (x.com/<handle>) from the token's own metadata: the Pump.fun twitter field, the metadata_uri JSON, or on-chain metadata. Only then is the official-CA check run.
Official X unknown
A post/community link (the poster may not be the team), or a handle that only comes from DexScreener/Jupiter. X-UNKNOWN (notable); the CA check is skipped, so that account can never cause a serious/critical flag. Its CA posts are still shown for context.
No related CA
If the account only posted CAs of different-name tokens, we never fall back to them as 'latest CA'. X-NO-RELATED-CA (notable, like X-NO-CA); those tokens are listed as Other tokens by this project.
On-chain metadata
When Pump.fun has no record (/coins-v2 404), the metadata URI is read via RPC: Token-2022 tokenMetadata extension first, else the Metaplex metadata account (PDA derived locally). Socials then come from that JSON.
Market Health (0–100)
Draft · a separate score that never changes the A–F grade
| Component | Max | How points are given |
|---|---|---|
| Volume / liquidity | 20 | 24h volume ÷ pool liquidity. Full points between 0.3× and 15×; below scales up from 0; above 15× falls to 0 at 40× (churn). |
| Organic volume | 25 | Jupiter (buy+sell organic volume) ÷ total 24h volume. Full points at ≥ 40%. |
| Organic buyers | 15 | Jupiter organic buyers ÷ traders (24h). Full points at ≥ 15%. |
| Price momentum | 15 | Price change 5m / 1h / 6h / 24h (Jupiter, DexScreener fallback). 24h ≤ −80% = 0, flat = 7.5, +100% = 15; −4 for a 1h drop ≥ 30%, −2 for a 5m drop ≥ 15%. Tokens < 24h: capped at neutral 7.5 (no bonus); 1h/6h ≥ +100% with organic volume < 10% adds a warning. |
| Holder growth | 10 | Jupiter holderChange 24h (1h fallback): ≤ −10% = 0, flat = 5, ≥ +50% = 10. |
| ATH drawdown + ATL | 15 | Pump.fun ATH vs current mcap: no penalty up to 50% below ATH, then down to 0 at 95%. Distance from ATL uses our own recorded mcap snapshots (≥ 3 points, else N/A); sitting < 10% above ATL after a crash costs 30% of these points. |
Missing components are dropped and the score is re-scaled over the rest; with fewer than 50 of 100 points measurable the score is N/A. ≥ 70 Healthy, 40–69 Mixed, < 40 Weak. The health score never raises the grade: a likely clone stays F however good the chart looks. Related grade rule: MKT-ORGANIC-LOW (notable) when organic volume is < 10% on ≥ $50K 24h volume.
Project category
Transparent keyword rules · draft
| Category | Keywords (whole words, optional plural s, case-insensitive) |
|---|---|
| Celebrity/Political | trump, maga, biden, obama, kamala, elon, musk, mrbeast, kanye, drake, taylor swift, president, election, senator, melania, barron, politic, celebrity |
| AI/Agent | ai, agent, agents, agentic, gpt, llm, intelligence, neural, autonomous, machine learning, artificial, sentient, eliza, virtuals, ai16z |
| RWA | rwa, real world asset, real-world asset, real world, tokenized, tokenised, treasury, gold-backed, collateral, collateralized, collaterize, real estate, equity |
| DeFi | defi, swap, dex, lending, lend, borrow, yield, staking, stake, vault, perp, perps, liquidity, amm, stablecoin |
| Gaming | game, gaming, gamefi, play, play-to-earn, p2e, arcade, metaverse, rpg, esports |
| Tool/Utility | tool, tools, utility, platform, app, sdk, api, analytics, tracker, dashboard, terminal, scanner, launchpad, infrastructure, protocol, marketplace, alpha calls |
| Meme | meme, memecoin, dog, doge, inu, cat, pepe, frog, wif, bonk, shib, moon, chad, wojak, monkey, ape, penguin, dolphin, hamster, community coin, no utility |
Fields: name (weight 1.5), ticker (0.5), description, website URL, X bio (1 each). The category with the highest weighted hit count wins; ties go to the order above. No text at all → Unknown; text but no keyword → Other. The report shows the matched words and fields.
Limits
Said plainly
Correlation ≠ proof
Wallets early in many runners are most often snipers or bots, not smart money.
Official ≠ endorsed
"Official" means the X account in the token's own metadata. We don't vouch for the project, and a clone can list the real account.
X read is best-effort
FxTwitter is unofficial; if it fails the report says N/A and the grade is capped at C. Deleted posts before our first read are invisible.
Draft thresholds
20×/50× mcap/liquidity, organic < 5/20, dev 5/20%, top 30/50%, and the dead-token thresholds (72h age guard, $100 volume, 50 holders, 30d, 500 followers) are proposals, not tuned on outcomes yet.
Automated on-chain and social signals, not financial advice. X bot simulator →