token-holder-analysis
Skill366 starsChanged 8 months agoMITView on GitHub
Token holder distribution, concentration metrics, insider detection, and supply analysis for Solana tokens
- Reads credentials
We split this skill into the rules it gives an agent
1 rule. About 0 are common, 1 is distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 309
When computing holder concentration, exclude these addresses which are programs/pools, not individual holders:
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Token Holder Analysis — Concentration, Distribution & Risk
Analyze who holds a token, how concentrated ownership is, and whether insider patterns suggest risk. This is a critical pre-trade safety check — high concentration means a few wallets can crash the price.
Quick Start
import httpx
import math
# Using Helius DAS API for holder data
HELIUS_KEY = os.getenv("HELIUS_API_KEY", "")
HELIUS = f"https://mainnet.helius-rpc.com/?api-key={HELIUS_KEY}"
# Or using SolanaTracker for holder + risk data
ST_KEY = os.getenv("SOLANATRACKER_API_KEY", "")
ST = "https://data.solanatracker.io"
# Get top holders via RPC
def get_top_holders(mint: str) -> list[dict]:
resp = httpx.post(HELIUS, json={
"jsonrpc": "2.0", "id": 1,
"method": "getTokenLargestAccounts",
"params": [mint],
})
return resp.json()["result"]["value"]
holders = get_top_holders("TOKEN_MINT")Data Sources
| Source | What It Provides | Auth |
Solana RPC (getTokenLargestAccounts) | Top 20 holders, supply | RPC key |
Helius DAS (getAsset, token accounts) | Parsed holder data, metadata | API key |
SolanaTracker (/tokens/{t}/holders/top) | Top 100 holders, bundler detection | API key |
Birdeye (/defi/token_security) | Top 10 %, creator balance, freeze/mint auth | API key |
Concentration Metrics
Top-N Holder Percentage
The simplest measure — what % of supply do the top N holders control?
def top_n_percentage(holders: list[dict], supply: int, n: int = 10) -> float:
"""Calculate percentage held by top N holders.
Args:
holders: Sorted list of holders (largest first).
supply: Total token supply.
n: Number of top holders.
Returns:
Percentage (0-100) held by top N.
"""
top_n_amount = sum(int(h.get("amount", 0)) for h in holders[:n])
return top_n_amount / supply * 100 if supply > 0 else 0Risk thresholds:
- Top 10 < 30%: Well distributed
- Top 10 30-50%: Moderate concentration
- Top 10 50-80%: High concentration — significant dump risk
- Top 10 > 80%: Extreme — likely controlled by a few wallets
Gini Coefficient
Measures inequality of token distribution (0 = perfectly equal, 1 = one holder owns everything).
def gini_coefficient(amounts: list[float]) -> float:
"""Calculate Gini coefficient for holder distribution.
Args:
amounts: List of holder amounts (any order).
Returns:
Gini coefficient between 0 and 1.
"""
if not amounts or all(a == 0 for a in amounts):
return 0.0
sorted_amounts = sorted(amounts)
n = len(sorted_amounts)
cumsum = sum((i + 1) * a for i, a in enumerate(sorted_amounts))
total = sum(sorted_amounts)
return (2 * cumsum) / (n * total) - (n + 1) / nInterpretation for crypto tokens:
- Gini < 0.6: Unusual, very well distributed
- Gini 0.6-0.8: Typical for established tokens
- Gini 0.8-0.95: Common for newer tokens
- Gini > 0.95: Extreme concentration, high risk
Herfindahl-Hirschman Index (HHI)
Measures market concentration — sum of squared market shares.
def hhi(amounts: list[float]) -> float:
"""Calculate HHI for holder concentration.
Args:
amounts: List of holder amounts.
Returns:
HHI value (0-10000). Higher = more concentrated.
"""
total = sum(amounts)
if total == 0:
return 0.0
shares = [a / total * 100 for a in amounts]
return sum(s ** 2 for s in shares)Interpretation:
- HHI < 1500: Competitive (unconcentrated)
- HHI 1500-2500: Moderately concentrated
- HHI > 2500: Highly concentrated
Nakamoto Coefficient
Minimum number of holders needed to control >50% of supply.
def nakamoto_coefficient(amounts: list[float]) -> int:
"""Calculate Nakamoto coefficient (holders needed for 51%).
Args:
amounts: Sorted list of holder amounts (largest first).
Returns:
Number of holders needed for majority control.
"""
total = sum(amounts)
if total == 0:
return 0
threshold = total * 0.51
cumulative = 0
for i, amount in enumerate(sorted(amounts, reverse=True)):
cumulative += amount
if cumulative >= threshold:
return i + 1
return len(amounts)Insider Detection Patterns
Bundler Detection
Bundlers use atomic transaction bundles (via Jito) to execute coordinated buys at token launch. Detection signals:
def detect_bundler_patterns(holders: list[dict], first_buyers: list[dict]) -> dict:
"""Identify potential bundler activity.
Args:
holders: Current top holders.
first_buyers: Early buyers from SolanaTracker /first-buyers endpoint.
Returns:
Bundler risk analysis.
"""
early_still_holding = [
b for b in first_buyers
if b.get("holdingAmount", 0) > 0
]
early_holder_pct = sum(
b.get("holdingPercentage", 0) for b in early_still_holding
)
return {
"early_buyers_count": len(first_buyers),
"still_holding_count": len(early_still_holding),
"early_holder_pct": round(early_holder_pct, 2),
"risk": "HIGH" if early_holder_pct > 20 else
"MODERATE" if early_holder_pct > 10 else "LOW",
}Developer Holdings
Creator wallet retention is a risk signal:
def check_developer_risk(token_data: dict) -> dict:
"""Check developer wallet holdings and authority.
Args:
token_data: Token info from SolanaTracker or Birdeye.
Returns:
Developer risk assessment.
"""
risk = token_data.get("risk", {})
flags = []
# Check creator balance (from Birdeye security endpoint)
creator_balance = token_data.get("creatorBalance", 0)
if creator_balance > 10:
flags.append(f"Creator holds {creator_balance:.1f}% of supply")
# Check mint authority
if token_data.get("mintAuthority") or token_data.get("ownerAddress"):
flags.append("Mint authority NOT renounced — supply can increase")
# Check freeze authority
if token_data.get("freezeAuthority") or token_data.get("freezeable"):
flags.append("Freeze authority enabled — tokens can be frozen")
return {
"flags": flags,
"risk_level": "HIGH" if len(flags) >= 2 else
"MODERATE" if len(flags) == 1 else "LOW",
}Sniper Detection
Snipers buy in the first few seconds/blocks after token creation:
def analyze_sniper_concentration(first_buyers: list[dict], total_supply: float) -> dict:
"""Analyze sniper impact on holder distribution.
Args:
first_buyers: First buyers data from SolanaTracker.
total_supply: Total token supply.
Returns:
Sniper concentration analysis.
"""
# Snipers typically buy in first 10 seconds
snipers = first_buyers[:10] # first N buyers are potential snipers
sniper_holding = sum(b.get("holdingAmount", 0) for b in snipers)
sniper_pct = sniper_holding / total_supply * 100 if total_supply > 0 else 0
return {
"sniper_count": len(snipers),
"sniper_holding_pct": round(sniper_pct, 2),
"sniper_still_holding": sum(1 for s in snipers if s.get("holdingAmount", 0) > 0),
"risk": "HIGH" if sniper_pct > 15 else
"MODERATE" if sniper_pct > 5 else "LOW",
}Complete Analysis Pipeline
def full_holder_analysis(mint: str) -> dict:
"""Run complete holder analysis for a token.
Combines RPC, SolanaTracker, and computed metrics.
"""
# 1. Get supply and top holders via RPC
supply_result = rpc_call("getTokenSupply", [mint])
total_supply = int(supply_result["result"]["value"]["amount"])
holders = get_top_holders(mint)
amounts = [int(h["amount"]) for h in holders]
# 2. Compute concentration metrics
metrics = {
"total_supply": total_supply,
"holder_count": len(holders),
"top_1_pct": top_n_percentage(holders, total_supply, 1),
"top_5_pct": top_n_percentage(holders, total_supply, 5),
"top_10_pct": top_n_percentage(holders, total_supply, 10),
"top_20_pct": top_n_percentage(holders, total_supply, 20),
"gini": round(gini_coefficient(amounts), 4),
"hhi": round(hhi(amounts), 1),
"nakamoto": nakamoto_coefficient(amounts),
}
# 3. Risk classification
t10 = metrics["top_10_pct"]
if t10 > 80:
metrics["risk"] = "EXTREME"
elif t10 > 50:
metrics["risk"] = "HIGH"
elif t10 > 30:
metrics["risk"] = "MODERATE"
else:
metrics["risk"] = "LOW"
return metricsRisk Classification Summary
| Metric | Low Risk | Moderate | High | Extreme |
| Top 10 % | <30% | 30-50% | 50-80% | >80% |
| Gini | <0.7 | 0.7-0.85 | 0.85-0.95 | >0.95 |
| HHI | <1500 | 1500-2500 | 2500-5000 | >5000 |
| Nakamoto | >10 | 5-10 | 2-4 | 1 |
| Mint Auth | Renounced | — | Active | Active + high dev % |
| Freeze Auth | Disabled | — | Enabled | Enabled + low liq |
Known Exclusions
When computing holder concentration, exclude these addresses which are programs/pools, not individual holders:
- DEX pool addresses (Raydium, Orca, Meteora pools)
- Token program vaults
- Bridge escrow accounts
- Known burn addresses
KNOWN_PROGRAMS = {
"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1", # Raydium authority
"GThUX1Atko4tqhN2NaiTazWSeFWMuiUvfFnyJyUghFMJ", # Orca authority
# Add more as needed
}
def filter_real_holders(holders: list[dict]) -> list[dict]:
"""Remove known program/pool accounts from holder list."""
return [h for h in holders if h.get("address") not in KNOWN_PROGRAMS]Files
References
references/concentration_metrics.md— Mathematical formulas and derivations for Gini, HHI, Nakamotoreferences/insider_patterns.md— Bundler, sniper, and developer detection methodologyreferences/data_sources.md— How to fetch holder data from each API source
Scripts
scripts/analyze_holders.py— Full holder analysis: fetch holders, compute metrics, generate risk reportscripts/concentration_scanner.py— Scan multiple tokens for concentration risk
Other versions2 projects use a version of this.
Word for word · 2
- IngAs8/ClaudeSkill★ 0100% same
- Serennity007/claude-trading-skills-67★ 0100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository67 other files it gives its agents.
- backtraderSkill
- birdeye-apiSkill
- coingecko-apiSkill
- cointegration-analysisSkill
- copy-tradingSkill
- correlation-analysisSkill
- cost-basis-engineSkill
- crypto-tax-exportSkill
- custom-indicatorsSkill
- defillama-apiSkill
- dex-executionSkill
- dex-pool-analysisSkill
- dexscreener-apiSkill
- exit-strategiesSkill
- feature-engineeringSkill
- fixed-incomeSkill
- helius-apiSkill
- impermanent-lossSkill
- jito-bundlesSkill
- kalshi-apiSkill
- kalshi-crypto-index-marketsSkill
- kalshi-weather-marketsSkill
- kelly-criterionSkill
- liquidity-analysisSkill
- lp-mathSkill
- market-microstructureSkill
- market-microstructure-traditionalSkill
- mean-reversionSkill
- mev-analysisSkill
- ohlcv-processingSkill
- options-pricingSkill
- pandas-taSkill
- polymarket-apiSkill
- portfolio-analyticsSkill
- position-sizingSkill
- prediction-market-live-opsSkill
- prediction-market-strategySkill
- pumpfun-mechanicsSkill
- raptor-dexSkill
- regime-detectionSkill
- regulatory-reportingSkill
- risk-managementSkill
- rl-executionSkill
- sentiment-analysisSkill
- shredstreamSkill
- signal-classificationSkill
- slippage-modelingSkill
- solana-rpcSkill
- solanatracker-apiSkill
- solana-tx-buildingSkill
- strategy-frameworkSkill
- sybil-detectionSkill
- ta-libSkill
- tax-liability-trackingSkill
- tax-loss-harvestingSkill
- token-economicsSkill
- trade-accountingSkill
- trade-journalSkill
- trading-visualizationSkill
- vectorbtSkill
- The first 60 shown.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

