The on-chain edge on Solana is not evenly distributed. A small number of wallets — known as Key Opinion Leaders, or KOLs — consistently find high-quality tokens before they become widely known. These are not random lucky traders. They have built networks, refined processes, and developed an intuition for what early Solana tokens worth buying look like. Their on-chain activity is among the most valuable signal you can track.
This guide explains how to systematically track KOL wallets using the Solana API Wallet Tracker, what signal patterns to look for beyond individual trades, and how to combine the KOL leaderboard with programmatic wallet monitoring to build a high-signal watchlist. The general concepts around wallet tracking are also covered in our guide on how to track whale wallets on Solana, but this post focuses specifically on the KOL category and its unique characteristics.
This is the strategy guide. If you're after the hands-on setup tutorial (add wallets, poll trades, TypeScript), that's the Wallet Tracker API setup guide; for push-based delivery instead of polling, see the webhooks integration guide.
Why KOL Wallets Are Different from Random Whale Wallets
When people say "follow smart money," they usually mean large wallets — addresses that hold significant SOL or have traded large dollar amounts. But large does not mean smart. Many high-balance wallets are:
- Liquidity providers making passive range trades, not directional calls
- CEX hot wallets aggregating user withdrawals
- Market makers hedging positions mechanically
- Old holders sitting on bags from 2021 with no recent activity
KOL wallets are different. They are identifiable individuals or teams with a public reputation — influencers, research accounts, fund managers — whose on-chain activity reflects actual investment decisions backed by research or network access. Their trades are directional, sized with conviction, and often precede public commentary that moves retail traders.
The key advantage of KOL tracking is traceability. You can verify their track record on-chain, cross-reference it with their public commentary, and calibrate how much signal weight to assign each wallet based on evidence rather than assumption.
Sourcing KOL Wallets from the Leaderboard
The MadeOnSol KOL tracker maintains a curated list of known KOL wallets with on-chain performance metrics: 30-day PnL, win rate, average trade size, and total swap count. This is your starting point for building a programmatic watchlist.
When evaluating KOLs to track, apply these criteria:
1. Win Rate on a Meaningful Sample
A 90% win rate on 8 trades is noise — that could be luck. Look for wallets with at least 40–50 trades in the past 30 days and a win rate above 60%. The sample size matters more than the rate itself at the low end.
What counts as a "win" in this context? The most useful definition is: closed a position in profit. Wallets that buy and hold forever look like 100% win rate until they dump — exclude wallets with very few sells relative to buys from your win-rate calculations.
2. Consistent Trade Sizing
KOLs that vary their position size widely are harder to follow. A wallet that alternates between 0.5 SOL test buys and 100 SOL conviction plays requires you to make a separate judgment call on every signal. Wallets with consistent sizing (say, always 10–30 SOL per position) let you copy proportionally with confidence.
Check the summary endpoint's sol_bought / buys ratio to estimate average buy size:
import { MadeOnSol } from 'madeonsol';
const client = new MadeOnSol({ apiKey: process.env.MADEONSOL_API_KEY! });
async function analyzeKolWatchlist() {
const summaries = await client.walletTracker.getSummary();
for (const s of summaries) {
const avgBuySize = s.buys > 0 ? (s.sol_bought / s.buys).toFixed(2) : '0';
const buyRatio = s.swap_count > 0
? ((s.buys / s.swap_count) * 100).toFixed(0)
: '0';
console.log(
`${s.label ?? s.wallet.slice(0, 8)}: ` +
`avg buy ${avgBuySize} SOL | ` +
`${buyRatio}% buys | ` +
`last active: ${new Date(s.last_event_at).toLocaleDateString()}`
);
}
}
3. Recency of Activity
A KOL who was active in 2024 but has not traded in 6 months is not useful for a live signal feed. Filter out wallets where last_event_at is more than 2–3 weeks old. They are either switched to a different wallet, no longer trading actively, or operating at a frequency too low to generate useful signals.
4. Token Overlap with Public Commentary
This is qualitative but powerful: does the KOL's on-chain activity match their public commentary? If a known influencer tweets bullish about a token but their wallet sold half the position the day before — that is a red flag about the quality of their public signal. If their on-chain activity consistently precedes their public calls, that tells you the public commentary reflects actual conviction.
Building the KOL Watchlist
Once you have selected your KOL candidates from the leaderboard, add them to your Wallet Tracker watchlist with meaningful labels. The label is returned in every trade event and webhook payload, so use it to capture context:
// src/setup-kol-watchlist.ts
import { MadeOnSol } from 'madeonsol';
const client = new MadeOnSol({ apiKey: process.env.MADEONSOL_API_KEY! });
const KOL_WALLETS = [
{
address: 'KOL_ADDRESS_1',
label: 'KOL: High Win Rate | Memecoin Focus',
},
{
address: 'KOL_ADDRESS_2',
label: 'KOL: DeFi Alpha | Large Cap',
},
{
address: 'KOL_ADDRESS_3',
label: 'KOL: Early Stage | Sub $1M MC',
},
];
async function setup() {
for (const kol of KOL_WALLETS) {
try {
await client.walletTracker.addToWatchlist(kol);
console.log(`Added: ${kol.label}`);
} catch (err: any) {
if (err.status === 409) console.log(`Already tracking: ${kol.label}`);
else throw err;
}
}
}
setup();
You can track up to 10 wallets on BASIC, 50 on PRO, and 100 on ULTRA. For a pure KOL signal strategy, 10–20 carefully selected wallets typically outperforms 100 randomly chosen ones. Quality of selection matters far more than quantity. See the API docs for the complete endpoint reference.
Signal Patterns Worth Watching
Individual trade events are data points. Patterns across time and wallets are signals. Here are the patterns that provide the most actionable signal from a KOL watchlist.
Coordination: Multiple KOLs Buying the Same Token
When two or more KOLs buy the same token within a short window — say, 15–30 minutes — it is a strong signal. Either they are coordinating (sharing alpha in private groups before it goes public), or multiple independent informed traders have reached the same conclusion simultaneously. Both are bullish.
// Track recent buys per token across all KOL wallets
const recentKolBuys = new Map<string, { wallet: string; label: string; timestamp: Date; solAmount: number }[]>();
function recordBuy(data: any) {
const windowMs = 30 * 60 * 1000; // 30-minute window
const now = new Date();
const existing = recentKolBuys.get(data.token_mint) ?? [];
// Prune old entries
const fresh = existing.filter(b => now.getTime() - b.timestamp.getTime() < windowMs);
fresh.push({
wallet: data.wallet,
label: data.wallet_label ?? data.wallet.slice(0, 8),
timestamp: now,
solAmount: data.sol_amount,
});
recentKolBuys.set(data.token_mint, fresh);
return fresh;
}
function getCoordinationSignal(tokenMint: string) {
const buys = recentKolBuys.get(tokenMint) ?? [];
const uniqueKols = new Set(buys.map(b => b.wallet));
const totalSol = buys.reduce((sum, b) => sum + b.solAmount, 0);
return {
kolCount: uniqueKols.size,
totalSol,
participants: [...uniqueKols].map(w => buys.find(b => b.wallet === w)?.label),
};
}
A coordination signal with 3+ KOLs and 50+ SOL combined within 30 minutes warrants priority attention.
Repeat Buys: A KOL Adding to a Position
A single buy might be a test or a hedge. A second buy of the same token — especially if it is larger than the first — signals growing conviction. This is one of the highest-signal patterns in KOL tracking because it means the KOL has seen the position develop in the direction they expected and is doubling down.
// Per-KOL, per-token buy history
const kolPositions = new Map<string, Map<string, number>>(); // wallet -> mint -> buy count
function trackRepeatBuys(data: any): number {
const walletMap = kolPositions.get(data.wallet) ?? new Map();
const currentCount = walletMap.get(data.token_mint) ?? 0;
const newCount = currentCount + 1;
walletMap.set(data.token_mint, newCount);
kolPositions.set(data.wallet, walletMap);
return newCount; // 2 = first repeat, 3 = third buy, etc.
}
When trackRepeatBuys returns 2 or higher, flag the event as higher priority in your signal pipeline.
Cross-Category Confirmation
Some KOLs specialise — one is known for DeFi protocol plays, another for memecoins, a third for infrastructure tokens. When a token gets bought by KOLs across different specialisations, it suggests the thesis is not category-specific but broadly compelling. This is harder to automate but easy to surface manually from labelled wallet data.