How to find the best Solana wallets to copy trade

· 9 min read

copy tradingwalletssmart moneywin ratepnl

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, with sol_invested, sol_received and realized_pnl per 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 an actor worth 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:

#FilterEndpointThe kill question
1Consistency/wallets/{addr}/statsIs the win rate built on a real sample?
2Net profit/wallets/{addr}/statsDoes the edge survive the fee bill?
3Recency/wallets/{addr}/window-stats?w=7dHot now, or good in May?
4Clean hands/wallets/{addr}/dumpsIs the profit extracted from rugs?
5Followable/versus + behavior fieldsCan 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.

Data window: profiles are computed on a rolling 6-month record, complete since May 1, 2026 — enough closes to separate a career from a lucky week.

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.

FAQ

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.

Build on the same data

Private beta — free invite-only keys, full REST + WebSocket access, and the same firehose that powers the Terminal.