How the score is built.
Every token starts at 100. Each risk vector deducts points. The remaining number is the overall score; the classification (Safe / Risky / Rejected) follows fixed thresholds. Nothing is hidden — the rubric below is the rubric used in production.
100 minus every
red flag.
Score = 100 − Σ penalties. Tier-based vectors (liquidity, holders, tax, unlock window) pick the first matching bucket from the lowest threshold up. Binary vectors (mint, freeze, proxy, etc.) deduct a flat penalty when the condition is true. The final number is clamped to [0, 100].
- Risk vectors
- 21
- Starting score
- 100
Verified contract, locked or burned LP, dispersed holders, real metadata.
Mixed signals — usually OK contract but thin liquidity or short LP lock.
Multiple structural issues — typically unverified, unlocked LP, top-10 dominate.
Contract
vectors.
6 checks grouped under contract. Each one either deducts a flat penalty when triggered, or picks a bucketed penalty from the tier table below.
-
Contract not verified contract_not_verified
Source code is not published — internal logic cannot be inspected.
−10 -
Mint function exposed has_mint_function
Owner can issue new tokens at will, diluting holders.
−20 -
Freeze authority has_freeze_function
Token transfers can be paused unilaterally.
−15 -
Blacklist function has_blacklist_function
Specific addresses can be blocked from trading.
−15 -
Ownership not renounced ownership_not_renounced
Deployer still controls the contract owner role.
−15 -
Proxy contract is_proxy
Implementation can be swapped, breaking trust assumptions.
−10
Liquidity
vectors.
5 checks grouped under liquidity. Each one either deducts a flat penalty when triggered, or picks a bucketed penalty from the tier table below.
-
Low liquidity low_liquidity
Pool depth too thin — high slippage and easy rug.
Tiered≤ $1,000−30≤ $10,000−15≤ $50,000−5≤ ∞0Liquidity (USD) bucket — first match wins. -
Liquidity not locked liquidity_not_locked
LP tokens are still in the deployer wallet.
−15 -
Liquidity not burned liquidity_not_burned
LP supply is locked rather than permanently destroyed.
−5 -
Liquidity unlocks soon liquidity_unlocks_soon
Active LP lock expires within hours — sell pressure incoming.
Tiered≤ 1h−30≤ 24h−15≤ 168h−5≤ ∞0Hours until unlock bucket — first match wins. -
LP already unlocked liquidity_unlocked_already
Lock has already expired — deployer can pull liquidity any time.
−30
Distribution
vectors.
3 checks grouped under distribution. Each one either deducts a flat penalty when triggered, or picks a bucketed penalty from the tier table below.
-
Top 10 holders concentration high_top10_concentration
A few wallets hold most of the supply.
Tiered≤ 30%0≤ 50%−10≤ 70%−20≤ 100%−30Top 10 holders bucket — first match wins. -
High deployer holdings high_deployer_holdings
Deployer kept a large slice — exit risk.
Tiered≤ 5%0≤ 15%−10≤ 30%−20≤ 100%−30Deployer holdings bucket — first match wins. -
Coordinated bundling at launch bundling_detected
First buys came from related wallets in tight time windows.
−25
Trading
vectors.
3 checks grouped under trading. Each one either deducts a flat penalty when triggered, or picks a bucketed penalty from the tier table below.
-
Wash trading pattern wash_trading_detected
Volume looks artificially manufactured between related addresses.
−20 -
Low holder count low_holder_count
Too few unique holders — easy to manipulate.
Tiered≤ 50−15≤ 200−5≤ ∞0Holders bucket — first match wins. -
High transfer tax high_tax
Buy / sell tax eats positions and signals extractive design.
Tiered≤ 0%0≤ 5%−5≤ 10%−15≤ 100%−25Transfer tax bucket — first match wins.
Metadata
vectors.
2 checks grouped under metadata. Each one either deducts a flat penalty when triggered, or picks a bucketed penalty from the tier table below.
-
No website no_website
No public landing page or whitepaper to reference.
−5 -
No social media no_social_media
No X / Telegram presence backing the launch.
−5
Deployer reputation
vectors.
2 checks grouped under deployer reputation. Each one either deducts a flat penalty when triggered, or picks a bucketed penalty from the tier table below.
-
Serial rugger deployer deployer_serial_rugger
Same deployer address has shipped multiple rejected tokens.
−30 -
Clean deployer history deployer_clean_record
Past launches from this address mostly hold up — informational, no penalty.
Info
How a deployer
is graded.
Every Solana deployer address gets a separate reputation score (0–100), aggregated from every token they've shipped. The pipeline reads this and either pins a serial-rugger flag or surfaces a clean-record badge — informational, no penalty.
base = 100 × (safe + risky × 0.5) / total_tokens reputation = clamp( base − rejected × 4, 0, 100 )
- Serial rugger
- ≥ 5 rejected tokens AND reputation ≤ 30
- → flag deployer_serial_rugger (−30)
- Clean record
- ≥ 3 tokens AND reputation ≥ 80
- → flag deployer_clean_record (informational)
Coordinated
launches.
Roughly five minutes after detection, a separate job pulls the first ~15 buy transactions from the pool, builds three signals, and produces a bundling score (0–1). Threshold 0.4 flips the binary bundling_detected flag (−25).
-
aTiming density
7+ buys landing within 30 seconds contributes most of the score.
-
bAmount uniformity
Coefficient of variation across buy sizes; clustered buys signal automation.
-
cWallet diversity
Five or more distinct buyers in the cluster bumps the score; sock-puppet heuristic.
Tokens already classified as Rejected are skipped to save RPC budget — bundling won't change their classification anyway.
What this score is, and isn’t.
The score is heuristic and open. It doesn't predict price. It doesn't replace your own due diligence.
- · A heuristic over public on-chain + metadata signals.
- · Deterministic given the same inputs.
- · Re-computed when new data arrives (bundling, unlock state, deployer history).
- · Open — every threshold lives in config/scoring.php.
- · Financial advice — trade decisions are yours.
- · A guarantee — heuristics produce false positives and false negatives.
- · A price prediction — the score does not measure expected return.
- · Static — vectors and thresholds evolve as we see new attack patterns.
See your first honest score in two minutes.
Register, build a profile, start scanning. Every signal in the panel matches the rubric you just read.