interface WalletMetrics {
walletAgeInDays: number;
realizedPnlSol: number;
winRate: number; // 0 to 1
uniqueTokensTraded: number;
weeklyTxFrequency: number;
avgHoldTimeHours: number;
totalClosedTrades: number;
}
interface ScoringWeights {
age: number;
pnl: number;
winRate: number;
diversity: number;
frequency: number;
holdPattern: number;
}
const DEFAULT_WEIGHTS: ScoringWeights = {
age: 0.10,
pnl: 0.25,
winRate: 0.25,
diversity: 0.15,
frequency: 0.10,
holdPattern: 0.15,
};
function normalize(value: number, min: number, max: number): number {
return Math.max(0, Math.min(1, (value - min) / (max - min)));
}
function computeWalletScore(
metrics: WalletMetrics,
weights: ScoringWeights = DEFAULT_WEIGHTS
): number {
// Require minimum sample size for statistical confidence
const sampleMultiplier = Math.min(1, metrics.totalClosedTrades / 30);
const scores = {
age: normalize(metrics.walletAgeInDays, 0, 365),
pnl: normalize(metrics.realizedPnlSol, -10, 500),
winRate: normalize(metrics.winRate, 0.15, 0.60),
diversity: normalize(metrics.uniqueTokensTraded, 1, 100),
frequency: normalize(metrics.weeklyTxFrequency, 0, 50),
holdPattern: normalize(metrics.avgHoldTimeHours, 0.5, 168),
};
const raw =
scores.age * weights.age +
scores.pnl * weights.pnl +
scores.winRate * weights.winRate +
scores.diversity * weights.diversity +
scores.frequency * weights.frequency +
scores.holdPattern * weights.holdPattern;
// Scale by sample confidence and convert to 0-100
return Math.round(raw * sampleMultiplier * 100);
}
Tuning the Weights
The default weights above are a starting point. You should adjust them based on your use case:
- Copy-trading focus: Increase
pnl and winRate weights. You care about profitability above all.
- Sybil detection: Increase
age and diversity weights. Sybils tend to be new wallets with narrow activity.
- Alpha discovery: Increase
frequency and diversity weights. Alpha wallets are actively exploring new tokens.
Test your weights against known wallets. Pick 10 wallets you consider high-quality and 10 you consider low-quality. A good scoring system should cleanly separate the two groups.
Use Case: Copy-Trading Signal Quality
The most immediate application of wallet scoring is improving copy-trading systems. Instead of copying every trade from a followed wallet, gate the copy-trade execution on the wallet's score.
Implementation approach:
- Score all wallets in your tracking list daily
- Set a minimum score threshold (e.g., 65 out of 100) for copy-trade execution
- When a tracked wallet makes a trade, check its current score before copying
- Log score-vs-outcome data to continuously validate your scoring model
The MadeOnSol KOL Tracker already surfaces wallet performance data that feeds directly into scoring. Combining KOL tracker data with your own scoring layer gives you a filtered view of only the highest-quality signals from top-performing KOL wallets.
Use Case: Airdrop Sybil Detection
Sybil wallets created for airdrop farming share common patterns that scoring exposes:
- Low wallet age: Created recently, often in clusters
- Low token diversity: Only interact with the target protocol
- Minimal PnL: No genuine trading activity
- Uniform behavior: Transaction patterns look identical across wallets in the cluster
A wallet scoring system flags these automatically. Wallets scoring below 20 out of 100 that suddenly interact with a new protocol are almost certainly sybils. This is valuable both for protocol teams running airdrops and for traders who want to estimate real user counts.
Use Case: Alpha Wallet Identification
The most powerful use of wallet scoring is discovering new alpha wallets before they appear on public leaderboards. The approach is to monitor whale wallets on Solana and score every wallet that interacts with trending tokens early.
Discovery pipeline:
- Monitor new token launches via Birdeye or on-chain listeners
- For tokens that reach a market cap threshold within 24 hours, pull all early buyer wallets
- Score each early buyer wallet
- Wallets scoring above 70 that are not already in your tracking list are alpha wallet candidates
- Add them to your watchlist and validate over the next 2-4 weeks
Nansen provides pre-built smart money labels that can serve as ground truth for validating your scoring model against established alpha wallets.
Scoring tells you who to watch; the next layer is reading what they're doing in aggregate. Our guide to on-chain order flow analysis covers how to read buy/sell pressure across these wallets before a move plays out.
Handling Edge Cases
Real-world wallet scoring requires handling several edge cases:
Multi-wallet users: Sophisticated traders split activity across multiple wallets. Your scoring system sees each wallet independently. This is actually fine — if a wallet scores well on its own, the signal is valid regardless of whether the owner has other wallets.
Bot wallets: MEV bots and arbitrage bots will score high on frequency and win rate but low on diversity and hold time. Decide whether to include or exclude them based on your use case. For copy-trading, bot wallets are usually not useful to follow.
Dormant wallets: A wallet that was highly active and profitable six months ago but has not traded since presents a challenge. Apply a time decay factor — reduce scores for wallets with no activity in the last 30 days.
function applyTimeDecay(score: number, lastActivityDays: number): number {
if (lastActivityDays <= 30) return score;
const decayFactor = Math.max(0.3, 1 - (lastActivityDays - 30) / 180);
return Math.round(score * decayFactor);
}
Putting It All Together
A complete wallet scoring pipeline runs as a scheduled job:
- Maintain a database of tracked wallets (start with wallets from public leaderboards and KOL lists)
- Every 24 hours, pull fresh transaction data from Helius for each wallet
- Recalculate all six metrics and the composite score
- Store scores historically so you can track how a wallet's quality changes over time
- Surface the scores in your trading tools — filter copy-trade signals, rank watchlists, flag new alpha
The entire system can run on a single server with the Helius free tier handling most data needs. As you scale to thousands of wallets, consider caching transaction data locally and only fetching incremental updates.
If you'd rather skip building this pipeline yourself, MadeOnSol's free Solana wallet tracker and PnL analyzer already outputs a comparable trust score, win rate, and bot-detection read for any wallet with a single paste.
FAQ
How many wallets can I realistically score with free API tiers?
The Helius free tier provides 100,000 credits per day, and each getSignaturesForAddress call costs a small number of credits. In practice you can score 200 to 500 wallets daily on the free tier if you cache transaction history and only fetch new data incrementally. For larger-scale scoring, Helius paid plans or a combination of Helius and Birdeye data provides enough throughput for thousands of wallets.
What is a good minimum sample size before trusting a wallet score?
A wallet needs at least 30 closed token positions over a period of at least 60 days for the score to be statistically meaningful. Below that threshold, apply the sample size multiplier discussed above to discount the score. Wallets with fewer than 10 closed trades should not be used for copy-trading decisions regardless of their apparent win rate, because the variance is too high to distinguish skill from luck.
Should I weight recent trades more heavily than older trades?
Yes, in most cases. Wallet behavior changes over time, and a wallet that was profitable six months ago may have shifted strategy. A practical approach is to calculate metrics over two windows — the full history and the last 90 days — then weight the recent window at 60% and the full history at 40%. This captures both long-term track record and current form.
How do I validate that my scoring system actually works?
Run a backtest. Take a snapshot of wallet scores from 30 days ago, then measure the actual trading performance of those wallets over the following 30 days. Group wallets into score quartiles (0-25, 26-50, 51-75, 76-100) and compare average PnL across groups. A working scoring system should show a clear positive correlation between score quartile and subsequent profitability. If it does not, revisit your weights and normalization ranges.
How does this compare to a pre-built leaderboard?
The weighting approach above mirrors the sample-size and consistency filters covered in how to identify smart money wallets on Solana — both require a minimum trade count before treating win rate as signal, and both score wallets across multiple time periods rather than a single hot streak.