Account Inspection / General Dev Education
Solana Token Holder Counts: Why Dashboards Disagree
Why two dashboards show different holder totals for one Solana token: token accounts vs wallets, empty accounts, pools, and counting unique holders.
You look up a token on an explorer such as Solscan, then on a trading dashboard, and get two different holder counts. Often neither is wrong. On Solana, "holders" isn't one number. It depends on what a tool counts, what it leaves out, and when it looked.
This guide goes through each difference, measures a real token, and ends with a short checklist you can use on any holder count.
Token accounts are not wallets
A Solana wallet doesn't hold token balances directly. Each balance lives in a separate token account that records three things: the mint, the owner and the amount. The Academy lesson on mints, token accounts and ATAs covers the structure in more detail.
Most wallets have one token account per token: the associated token account, whose address is derived from the wallet and the mint. Nothing stops a wallet owning more. Some trading bots and programs create extra accounts for the same mint, and wallets from before associated accounts were standard sometimes still have one.
That gives you two ways to count:
- By token account. One row per account. This is the raw view the chain gives you.
- By owner. Add up every account under the same owner, then count owners.
A worked example. One wallet holds 60 tokens in its associated account and 40 in a second account. Counted by token account, that's two holders: one with 60 and one with 40. Counted by owner, it's one wallet holding 100. Counting accounts overstates how many holders there are and understates how much the largest ones hold.
Empty accounts that were never closed
A token account doesn't disappear when its balance reaches zero. It stays open, holding its rent deposit, until the owner closes it. Plenty of wallets that sold everything still have an open, empty account for the token.
Some tools count every account that exists for the mint. Others count only accounts with a balance. On a token with a long trading history, the gap can be large. If your question is "who holds this now", zero balances should be out.
Pools, curves and other program-owned addresses
Not every owner is a person with a private key. Many token accounts belong to addresses that a program controls:
- liquidity pools on Raydium, Orca, Meteora and PumpSwap
- bonding curves on Pump.fun, Raydium LaunchLab and Meteora DBC
- token locks and vesting contracts
- vaults and multisigs
- open Jupiter limit orders, which hold the tokens being sold until the order fills
- marketplace escrows that hold listed NFTs
Most of these owners are program derived addresses: addresses deliberately off the ed25519 curve, with no private key behind them. Others are known authority addresses that one program signs for. Either way, nobody holds a key. A pool's tokens are its reserves, there for traders to buy. A lock's tokens belong to whoever it unlocks to.
These addresses matter because they are often the biggest balance. On a token that trades in one main pool, the pool is usually the number one "holder". A list that doesn't mark it makes the token look more concentrated than it is.
Burn addresses are a separate case. Tokens sent to the incinerator (1nc1nerator11111111111111111111111111111111) or to the system program address (11111111111111111111111111111111) can never move again. They still show as balances, so they appear as holders unless a tool marks them.
Different sources, defaults and moments
Data providers choose different defaults, and the careful ones document them. Birdeye's token holder API, for example, returns one row per token account by default, and groups accounts by owner wallet only when you set mode=wallet. Both are valid. They answer different questions.
Explorers usually list a mint's token accounts along with each account's owner. That's an accurate view of the chain, but it's one row per account, not per wallet.
Timing matters too. A count taken an hour ago and one taken now can differ simply because people traded in between. Cached rankings, indexer lag and the moment a snapshot ran all move the number. Two counts are only comparable if you know when each was taken.
Wallets are not people
Even a perfect wallet count doesn't tell you how many people hold a token. One person or bot can run hundreds of wallets. In the other direction, one custodial exchange wallet can hold tokens for thousands of customers.
You can estimate independent holders by clustering wallets that share a source:
- Shared funder. Wallets whose first SOL came from the same wallet were probably set up by one party.
- Shared buyer. Wallets whose first buy of the token was paid for by one outside wallet are probably one party spreading its supply.
This is an estimate, not a count. It can't see links that pass through an exchange, where thousands of unrelated users withdraw from the same hot wallet, and an operator who is careful can avoid both patterns. The Solana Token Inspector uses the same kind of signals to tag a token's top holders for clustering and bundling.
A real example
Here's one token, measured with Solstack's scan on 2026-10-12. It launched on Pump.fun and graduated to Raydium.
- 1,069 token accounts with a balance
- 1,060 distinct owners
- 1,033 wallets and 27 program-owned addresses
Its Raydium AMM v4 pool was the number one holder. The other program-owned addresses were Orca Whirlpool pools, a Raydium CPMM pool, Jupiter limit orders and Jupiter referral-fee accounts.
The nine-account gap between the first two lines came entirely from programs. One Raydium CPMM authority held three pools' token accounts, and one Jupiter referral account held eight. No wallet held the token in more than one account.
So the same token could fairly be reported as having 1,069, 1,060 or 1,033 holders. The method decides which.
A second data point from the same day: RAY's first 60,000 token accounts belonged to 59,664 owners. Only 23 wallets held RAY in more than one account, and 868 owners were program-owned. On both tokens, wallets with several accounts were rare. Program-owned addresses moved the count more.
A checklist for reading any holder count
Before you compare two holder numbers, ask:
- Accounts or owners? Is it one row per token account, or are accounts grouped by owner?
- Zero balances? Are empty token accounts counted?
- Pools and programs? Are pools, curves, locks and orders included, and are they marked?
- Burned tokens? Do burn addresses count as holders?
- When? What time was the count taken, and is it a cached ranking or a fresh read?
- People? Does it try to estimate independent holders, or is every wallet one holder?
If two sources answer these differently, a different total is expected, not suspicious.
How Solstack's Holder Snapshot counts
The Solana Token Holder Snapshot answers each of those questions on the page.
- Wallets by owner. Every token account for the mint is read, and balances are added together under their owner. A wallet with 60 in one account and 40 in another is one wallet holding 100.
- Empty accounts dropped. Accounts with a zero balance are removed before anything is counted.
- Program-owned and burn addresses marked. Owners off the ed25519 curve, and known pool, curve and lock authorities, are labelled, for example "Raydium AMM v4 pool" or "Pump.fun bonding curve". They stay in the list and the CSV but are kept out of the wallet count. Burn addresses are counted separately.
- A "How these numbers are counted" panel sits under every snapshot. It gives the token accounts with a balance, how many empty accounts were left out, how many wallets hold the token in more than one account, and how many program-owned addresses were kept out of the wallet count.
- Find linked wallets checks the largest 100 wallets for shared funders and shared buyers, marks each linked group, and gives an estimate of independent holders. Exchanges and trading services that fund thousands of unrelated wallets don't count as links.
One exception: on Mainnet, a popular token picked from the one-click list uses Birdeye's ranking grouped by wallet instead of a full on-chain scan, and the panel says so.
The CSV has one row per holder. Next to rank, owner and amount, it includes type (wallet, program or burn), label (what the address is), share_of_supply_pct, token_accounts (how many accounts were added together) and linked_group (filled in once Find linked wallets has run).
Running a snapshot is free, and so are its counts and the first 200 rows. The full CSV is 0.05 SOL per snapshot, or 0.2 SOL when it has more than 10,000 rows. The Holder Snapshot docs cover the rest, including NFT collections and saved snapshots.