back
methodology
how the score works.
Every Stable Boy score is the same formula. No hand-tuning, no allow-listing, no leaderboard rigging. Here's the entire algorithm in one page.
architecture
Two layers, computed separately.
- layer 1 · behavioral score (0–100). Weighted average of eight factors that describe how the wallet trades.
- layer 2 · trust penalties (cap −60). Hard deductions for cluster, bundle, sniper, daisy-chain, and wash patterns.
- final · clamp(layer1 + layer2, 0, 100)
wallets with <5 lifetime trades AND <3 lifetime tokens return
insufficient_data instead of a faked score.layer 1 · factors
| signal | weight | source |
|---|---|---|
| Hold duration | 22 | GMGN wallet_stats.avg_holding_period <2min → 0 · 2-10min → 20 · 10min-1h → 40 · 1-6h → 60 · 6-24h → 75 · 1-7d → 88 · >7d → 100 |
| Paperhand ratio | 18 | FIFO entry/exit pairing on wallet_activity >80% → 0 · 60-80% → 15 · 40-60% → 35 · 20-40% → 60 · 5-20% → 85 · <5% → 100 |
| Funding source | 13 | GMGN fund_from_address + Helius CEX/protocol labels direct CEX → 100 · 1 hop CEX → 85 · fund/protocol → 75 · 3+ hops → 60 · no funder → 50 · small (<0.5 SOL) → 35 · daisy-chain → 25 · flagged funder → 0 |
| Wallet age | 12 | GMGN common.created_at <7d → 20 · 7-30d → 45 · 30-180d → 75 · >180d → 100 |
| PnL behavior | 12 | GMGN buy/sell count ratio ratio>3 (dumpy) → 30 · >1.5 → 55 · >0.7 → 80 · ≤0.7 (hoarder) → 70 |
| Token diversity | 10 | GMGN pnl_stat.token_num / 30d >20/day → 15 · 10-20 → 35 · 3-10 → 65 · 1-3 → 85 · <1 + held >24h → 100 · <1 + single token → 60 |
| Win/loss distribution | 8 | GMGN PnL buckets (5 ranges) insider-shape (mostly moons, few losses) → 20 · pure chaser (≥85% losses) → 30 · healthy human → 100 · noisy → 60 |
| SOL balance | 5 | GMGN native_balance (snapshot) >5 SOL idle → 90 · 1-5 → 70 · 0.1-1 → 50 · <0.1 → 25 |
| total | 100 |
layer 2 · penalties
| flag | penalty | trigger · source |
|---|---|---|
| Bundle co-buy | -20 | Wallet bought a pump.fun token in the same slot as ≥3 distinct signers buying the same mint Bitquery same-slot multi-signer scan |
| Sniper window | -5 | Wallet bought a token within 3 blocks of its first pump.fun trade Bitquery earliest-trade-per-mint aggregation |
| Cluster · 1 hop | -15 | Wallet's immediate funder appears in our bundler registry Funder traversal × bundler_taglog (accumulated from token_top_traders) |
| Cluster · 2 hops | -7 | Wallet's funder's funder appears in the registry Same as 1-hop, one level deeper |
| Funding daisy-chain | -15 | 3+ intermediate wallets, each funded within 24h of its own creation Funder chain age inspection |
| Wash trade | -10 | ≥3 tokens with multiple opposite-side trades within 10 minutes of each other Round-trip pattern detector on wallet_activity |
| Dormant-then-coordinated | -10 | Long inactivity then a burst of buys matching a known cluster's timing v3 — not yet implemented |
· bundle co-buy capped at −40 (max 2 bundles count)
· sniper window capped at −20 (max 4 sniped tokens count)
· total layer-2 capped at −60 so penalties can't exceed half the score
verdict bands
| 80–100 | Diamond hands | real user, holds, clean cluster |
| 50–79 | Active trader | legit but rotates fast |
| 20–49 | Degen / sniper | high velocity, low conviction |
| 0–19 | Bundler-adjacent | clustered, suspicious funding, instant dumps |
data sources
gmgn
wallet_stats (1d / 7d / 30d) · wallet_holdings · wallet_activity · token_top_traders
bitquery
pump.fun bundle co-buy detection · earliest-trade-per-mint aggregation for sniper-window flag
helius
entity labels for funder addresses (CEX, protocol, fund) · powers the +13 “direct from CEX” boost
limitations we're honest about
- ·Score is based on the last 30 days of GMGN data — wallets dormant in that window may score insufficient-data even if historically active.
- ·Cluster penalties depend on a self-grown bundler registry. Every wallet scored teaches the next one — early scores have weaker cluster signal than later scores.
- ·Wash-trade detector catches a wallet self-churning a token. Cross-wallet wash (where the counterparty is another wallet of yours) needs deeper tx-level inspection — flagged as v3.
- ·SOL balance uses a snapshot, not a time series. A wallet that just received SOL looks identical to one that's held SOL for months.
- ·Stable Boy is pump.fun / memecoin focused. Wallets that primarily trade Jupiter or non-pump tokens will look small through this lens.
stability scores are a heuristic, not a verdict · cache TTL 24h