How to find the best Solana wallets to copy trade
Every week someone posts a fresh list of the best wallets to copy trade on Solana, and every week it is already stale: the sniper retired, the smart money rotated addresses, the top name was one lucky 100x. Lists rot in days — a method does not. This is the method: a 5-filter funnel that turns a pile of candidate addresses into a short, ranked list of wallets to copy on Solana, each filter one call on the Raiden API.
Step 0 — where candidates come from
"How to find profitable pump.fun wallets" has an unglamorous answer: winners leave
fingerprints on the tokens they win on. Take a handful of tokens that actually pumped —
pick them from /tokens/trending, or the ones you watched happen — and ask
who was inside:
/tokens/{mint}/smart— the smart-money wallets holding or trading that token, withsol_invested,sol_receivedandrealized_pnlper position./tokens/{mint}/holders— holders ranked by balance, with realized PnL: who is sitting on the win instead of exit-dumping it./events?min_sol=3000000000— the notable-events feed; every big buy carries anactorworth a look.
Run this across five or ten winners and dedupe: a wallet in the smart list of several
pumps is a candidate; one appearance is noise. For hundreds of addresses, pre-screen
with /wallets/{addr}/stats-lite (a fast positions-only profile) and keep
only positive total_pnl. Then feed the pile into the funnel:
| # | Filter | Endpoint | The kill question |
|---|---|---|---|
| 1 | Consistency | /wallets/{addr}/stats | Is the win rate built on a real sample? |
| 2 | Net profit | /wallets/{addr}/stats | Does the edge survive the fee bill? |
| 3 | Recency | /wallets/{addr}/window-stats?w=7d | Hot now, or good in May? |
| 4 | Clean hands | /wallets/{addr}/dumps | Is the profit extracted from rugs? |
| 5 | Followable | /versus + behavior fields | Can human latency reproduce the entries? |
Filter 1 — consistency: one 100x is luck
curl -H "X-API-Key: $RAIDEN_KEY" \ "https://terminal.raiden.wtf/api/wallets/8psN…VRtf/stats" { "trader": "8psN…VRtf", "realized_pnl": "184500000000", "total_pnl": "171750000000", "fees": "3820000000", "tokens_traded": 312, "tokens_closed": 287, "tokens_won": 168, "win_rate": 0.5853658536585366, "avg_hold_sec": 1837.42, "launch_buys": 41, "fast_flip": 22, "dist": { "d500": 31, "d200": 54, "d0": 83, "dneg": 97, "drug": 22 }, "mc_dist": { "lo": 198, "mid": 89, "hi": 25, "buys": 312 }, "flags": ["sniper", "profitable", "whale"], … }
Two numbers matter here, and only together. win_rate is
tokens_won / tokens_closed — in this profile 168 of 287 closed positions
ended in profit, 58.5%. The denominator is the whole point: a 100% win rate over 3
closes is a coin that landed heads three times; 60% across 200+ closes is a repeatable
edge. The dist object then shows the shape of those outcomes —
a broad base of wins, or one outlier bucket carrying 97 losers. A wallet whose entire
profit sits in one monster trade fails this filter, however green the headline.
Filter 2 — profit that is NET
Every PnL figure in the API — realized_pnl, unrealized,
total_pnl — is net of every fee: platform fee, creator fee,
the LP fee on post-graduation fills, priority fee, validator tip. An aggressive wallet can win most of its races and still
bleed once tips eat the visible edge. The fees field
is the running bill (a lamports string, like every SOL amount: 1 SOL = 1e9): 3.82 SOL
against 184.5 SOL realized here — healthy. A sniper spending a large slice of its gross
on tips is a different animal; /wallets/{addr}/tips shows which submission
providers it pays. This is also why our numbers rarely match a screenshot — full
methodology in the Solana wallet PnL checker
guide.
Filter 3 — recency: hot now, or good in May?
All-time stats reward wallets that were great one meta ago — the fee levels, launch
patterns and bots that made them great may be gone. window-stats is the
same profile narrowed to a recent window (w=1d|7d|30d):
curl -H "X-API-Key: $RAIDEN_KEY" \ "https://terminal.raiden.wtf/api/wallets/8psN…VRtf/window-stats?w=7d" { "trader": "8psN…VRtf", "total_pnl": "21650000000", "tokens_closed": 39, "tokens_won": 24, "win_rate": 0.6153846153846154, … }
Read it against the all-time card: 24 wins from 39 closes this week, in line with the
career 58.5% — in form. The failure modes are just as visible: near-zero
tokens_closed this week means dormant (a copy feed of a dormant wallet
copies nothing); a 7-day win rate collapsing below the career average means the edge
you were about to pay for is gone.
Filter 4 — clean hands: read the dump history
The most dangerous wallet in the funnel is the profitable one whose profit is
extraction: it earns by selling into the dev's rug alongside the operator, and
if you copy its buys you are the liquidity it exits into.
/wallets/{addr}/dumps is the rap sheet — every rugged token the wallet
took part in, one row per token, with roles:
curl -H "X-API-Key: $RAIDEN_KEY" \ "https://terminal.raiden.wtf/api/wallets/8psN…VRtf/dumps?limit=2" { "wallet": "8psN…VRtf", "count": 2, "data": [ { "mint": "9xQm…pump", "symbol": "WIF", "token_created_at": "2026-07-20T11:00:00Z", "same_slot": true, "as_operator": false, "as_sniper": true, "sol_extracted": 3.42 } ], "next_cursor": "2026-07-20T11:00:00.482913Z|9xQm…pump", "summary": { "total_dumps": 1670, "same_slot": 595, "sol_extracted": 421.7 } }
same_slot: true means it sold in the dev's exact dump slot — bundled with
the operator, not reacting to it; as_operator vs as_sniper
separates ring members from professional dump-snipers. The first-page
summary is the career total: 1,670 dumps, 595 same-slot, 421.7 SOL
extracted (sol_extracted is in SOL — a documented exception to lamports).
A few rows can be coincidence; hundreds with same-slot timing is a business model, and
it disqualifies the wallet regardless of PnL. Filter with since,
min_sol and same_slot=1 to judge only recent or serious
offenses.
Filter 5 — followable: can you actually copy it?
A wallet can pass all four filters and still be useless to you, because its edge is
latency you do not have. The behavior fields in the stats card give the first read: the
sniper flag, launch_buys (41 here), fast_flip,
an avg_hold_sec of ~31 minutes, and mc_dist — 198 of 312
entries at the low end of market cap. Launch-cap entries exist for seconds; a human
reacting to a copy signal buys at a multiple of that price and inherits none of the
edge.
The definitive test is head-to-head: put your own wallet into
/versus?w=YOU,CANDIDATE&n=100 and compare
avg_from_creation in per_wallet — how many slots after
creation each of you lands (~400ms per slot). If the candidate fills 3 slots after
creation and you fill 40, you are not copying its trades, you are buying its exits.
Slow wallets with long holds and mid-cap entries are the ones a copy strategy can
actually track.
Score the funnel in Python
One pass over the candidate list, three calls per wallet, one ranked table:
import requests BASE = "https://terminal.raiden.wtf/api" H = {"X-API-Key": "YOUR_KEY"} SOL = 1e9 MIN_CLOSES = 50 # your evidence bar — thin samples prove nothing candidates = ["WALLET_1", "WALLET_2", "WALLET_3"] # from /tokens/{mint}/smart rows = [] for w in candidates: s = requests.get(f"{BASE}/wallets/{w}/stats", headers=H).json() if s["tokens_closed"] < MIN_CLOSES: # filter 1: no sample, no signal continue w7 = requests.get(f"{BASE}/wallets/{w}/window-stats", params={"w": "7d"}, headers=H).json() d = requests.get(f"{BASE}/wallets/{w}/dumps", params={"limit": 1}, headers=H).json() dumps = d.get("summary") or {"total_dumps": 0, "same_slot": 0} rows.append({ "wallet": w, "win": s["win_rate"], # filter 1 "closes": s["tokens_closed"], "net": int(s["total_pnl"]) / SOL, # filter 2: net of ALL fees "net_7d": int(w7["total_pnl"]) / SOL, # filter 3 "dumps": dumps["total_dumps"], # filter 4 "same_slot": dumps["same_slot"], "hold_s": s["avg_hold_sec"], # filter 5 }) # rank: clean hands first, then recent net PnL, then consistency rows.sort(key=lambda r: (r["dumps"], -r["net_7d"], -r["win"])) for r in rows: print(f"{r['wallet'][:6]} win={r['win']:.0%}/{r['closes']} net={r['net']:+.1f} SOL " f"7d={r['net_7d']:+.1f} SOL dumps={r['dumps']}({r['same_slot']} same-slot) " f"hold={r['hold_s']:.0f}s")
The sort encodes the philosophy: rug participation disqualifies, recent net profit beats career net profit, win rate breaks ties. The hold-time column is your filter-5 sanity check.
From shortlist to live feed
Vetting is a snapshot; wallets decay. Persist the survivors and watch them live.
# 1 · persist the survivors as a wallet group curl -X POST -H "X-API-Key: $RAIDEN_KEY" -H "Content-Type: application/json" \ -d '{"name":"Copy candidates"}' "https://terminal.raiden.wtf/api/wallet-groups" # → { "id": "grp_5f3a…", "name": "Copy candidates", "count": 0, … } curl -X POST -H "X-API-Key: $RAIDEN_KEY" -H "Content-Type: application/json" \ -d '{"wallets":["8psN…VRtf","Cb3f…g9rE"]}' \ "https://terminal.raiden.wtf/api/wallet-groups/grp_5f3a…/wallets" # → { "ok": true, "added": 2 } (up to 1000 wallets per group) # 2 · attach a realtime stream to the group curl -X POST -H "X-API-Key: $RAIDEN_KEY" -H "Content-Type: application/json" \ -d '{"name":"copy-feed","kinds":["swaps"],"wallet_list_id":"grp_5f3a…"}' \ "https://terminal.raiden.wtf/api/ws-subscriptions" # → { "id": 3, "token": "sub_a1b2c3…", "kinds": ["swaps"], "active": true, … } # 3 · connect — every fill by every wallet in the group, pushed live wscat -c "wss://terminal.raiden.wtf/ws?key=$RAIDEN_KEY&sub=sub_a1b2c3…"
The swaps kind pushes every buy and sell by any wallet in the list the
moment it lands — one connection, no polling, 3 streams per account by default. The
full realtime setup is in tracking
smart money in real time. Then close the loop: re-run the score every couple of
weeks, drop whoever fails filter 3, refill from Step 0. The wallets change; the funnel
does not.
Copy trading wallets is a data problem before it is an execution problem. To go deeper on a single candidate, the wallet tracking guide covers positions, funding chains and coordination signals; the exact shape of every endpoint used here is in the API reference.
Frequently asked questions
What is a good win rate for a Solana wallet to copy trade?
The number matters less than the sample behind it. A 100% win rate over 3 closed positions is noise; 60% across 200+ closed positions is a repeatable edge. Always read win_rate together with tokens_closed — it is tokens_won / tokens_closed, so a small denominator makes any rate meaningless.
Why can a 'profitable' wallet actually be losing money?
Because gross trade profit ignores the cost of getting filled: platform fees, priority fees and validator tips. Aggressive snipers can pay away most of their visible edge in tips alone. Raiden PnL figures are net of every fee, so a wallet that only wins before costs shows up as flat or negative.
How do I check if a wallet takes part in rug pulls?
Pull its dump history: /wallets/{addr}/dumps lists every rugged token where the wallet sold inside or right after the dev's dump slot, with a same-slot flag, an operator/sniper role and the SOL extracted. A profitable wallet with hundreds of dumps makes its money by exit-liquidating buyers — copying it puts you on the wrong side of that trade.
Can I copy trade a same-slot sniper?
Not with human latency. A wallet that lands within a couple of slots of token creation gets an entry price that exists for around a second; by the time a copy signal reaches you, that price is gone. Check avg_from_creation in /versus and the launch-buy and fast-flip counters in the stats profile before assuming an entry is reproducible.
How do I follow the wallets I selected in real time?
Save the survivors to a wallet group, then create a WebSocket stream with kinds [swaps] bound to that group. Every buy and sell by any wallet in the list is pushed to you in real time — one connection, no polling. Accounts get 3 streams by default.
How much trading history does the data cover?
A rolling 6-month window, with a complete pump.fun record since May 1, 2026. All-time stats profiles are computed on that record; window stats narrow the same profile to the last 1, 7 or 30 days.