Can a quantitative screen separate genuine opportunities from manipulation in a market built on asymmetric information?
A fraud-screening and scoring pipeline for Solana meme tokens, built to test that question with real money at small size.
Result: no. The score did not work, and this repository documents why.
Two positions were taken on the system's highest-confidence signals. Both lost roughly 80% within hours.
| Token | Entry | Position | ICI | Verdict | Held | Outcome |
|---|---|---|---|---|---|---|
| WOOF | 26 Jan 2026, £59.9k mcap | £5.00 | 81.6 | HOT / BUY | 5h 07m | −87% |
| CPS | 27 Feb 2026, £30.0k mcap | £10.00 | 82.3 | HOT / BUY | 4h 06m | −77% |
Two trades is not a sample. But the scoring behaviour across all 41 audited tokens explains the losses, and that is enough to draw conclusions from.
The ICI is a five-factor composite scored out of 100:
def compute_ici(ac, lmi, hvr, ivsd, sri):
return ac*20 + lmi*15 + hvr*15 + ivsd*20 + 22 + sri*8Three problems, visible only once the score was checked against its own output:
1. Twenty-two points are unconditional. The constant means the theoretical floor is 22/100, not 0. Every token, including outright rug pulls, starts nearly a quarter of the way up the scale.
2. Four of the five factors barely move. Measured across all 41 audits:
| Factor | Meaning | Observed range | Contribution | Of |
|---|---|---|---|---|
ac |
Accumulation (buy/sell balance) | 0.48 – 0.69 | 9.6 – 13.8 | 20 |
lmi |
Liquidity depth (LP ÷ mcap) | 0.05 – 1.00 | 0.8 – 15.0 | 15 |
hvr |
Holder retention (buy/sell ratio) | 0.30 – 0.73 | 4.5 – 10.9 | 15 |
ivsd |
Pump/dump cycle detection | 0.70 – 1.00 | 14.0 – 20.0 | 20 |
sri |
Sell pattern | 0.40 – 0.80 | 3.2 – 6.4 | 8 |
| constant | — | — | 22.0 | 22 |
Only lmi uses its full range. ac moves across 21% of its span, ivsd across 30%, and sri takes just three discrete values. A composite advertised as five-factor behaves in practice like a liquidity ratio plus a large constant.
3. It therefore never rejected anything. Across 41 audits the ICI ranged 62.3 – 84.0 against thresholds of 80 (BUY) and 60 (WATCH). Zero tokens scored below 60. The score has never once produced an AVOID verdict on its own.
All three AVOID verdicts came from a hard holder-concentration override that runs before the score is read — and on two of them the ICI disagreed:
| Top-10 holder share | ICI score | Score's own reading |
|---|---|---|
| 86.8% | 79.2 | 0.8 points below BUY |
| 91.3% | 77.1 | WATCH |
| 55.4% | 73.0 | WATCH |
A token with 91% of supply in ten wallets is the clearest insider-control signal available. The composite scored it 77 out of 100.
The rejection work in this system is done entirely by the binary safety checks — mint authority, freeze authority, holder concentration, honeypot simulation. The quantitative score contributes nothing to rejection and, on the evidence here, actively contradicts the checks that work.
The core error was procedural rather than mathematical: the score was designed, weighted, and then acted on before it had been tested against its own outputs. Ten minutes of checking the distribution against the thresholds would have shown that a screen which never rejects is not a screen.
Helius webhook (new token mint)
└─ DexScreener pair lookup
└─ NVF filter — 4-pass rejection (~98% of candidates)
└─ Audit: safety checks + ICI score
└─ Verdict: HOT / WATCH / AVOID
└─ Position sizing against slippage tolerance
└─ Trade log with P&L
**Discover mode** — scanning new listings for candidates:
\`\`\`
================================================================================
INSIDER PROTOCOL
Scanning new Solana tokens for candidates
================================================================================
[1/3] Fetching token profiles... ✓ 30 retrieved
[2/3] 21 Solana tokens selected
[██████████████████████████████] 21/21
[3/3] Fetching pair data for 21 tokens... ✓ 35 pairs
Applying NVF filters...
[██████████████████████████████]
🔍 CHECK 1: BASIC VIABILITY CHECKS
✓ 0/35 passed (0.0%)
✗ No tokens passed CHECK 1
================================================================================
SCAN COMPLETE
================================================================================
0 candidates this scan — filters working correctly.
Token list refreshes every ~60 minutes.
↻ Try again in 30–60 minutes.
\`\`\`
## Example output
**Audit mode** — full deep-dive risk scoring on a single token:
\`\`\`
================================================================================
🔍 AUDIT
================================================================================
Token: [REDACTED]
Time: 2026-08-04 11:50:15
================================================================================
PHASE 1: MARKET DATA
================================================================================
✓ $LOXI - LOXI
✓ MC: $5,287,934 | LP: $340,959
✓ Vol: $1,054,483
✓ Txns: 1645B / 509S
✓ Age: 59.6h
================================================================================
PHASE 2: MOMENTUM
================================================================================
AC: 0.76 | LMI: 0.13 | HVR: 1.00
IVSD: 1.00 | S_ri: 0.60
================================================================================
PHASE 3: RISK ANALYSIS
================================================================================
📉 Insider Sell Pattern Detection:
✓ LOW RISK (0.20)
• Buy activity dropped 50%+ in last hour
📊 Volume:Liquidity Analysis:
✓ Vol/Liq 3.1x - Healthy ratio
✓ Vol/MC 0.2x - Normal volume
================================================================================
ICI SCORE
================================================================================
🎯 79.0/100 - 🟡 WATCH
MONITOR: Building momentum
📊 ICI Breakdown:
Each metric contributes to final score of 79.0/100:
Metric Weight Score Description
──────────────────────────────────────────────────────
AC ×20 15.3 Buying vs selling pressure
LMI ×15 1.9 Liquidity depth
HVR ×15 15.0 Holder retention
IVSD ×20 20.0 Pump/dump detection
Sybil ×22 22.0 Assumes no clustering
S_ri ×8 4.8 Sell pattern
================================================================================
TIMING
================================================================================
🚨 Already pumping >30%
└─ Likely late entry
================================================================================
POSITION SIZING
================================================================================
Current Liquidity: $340,959
LP/MC Ratio: 6.4%
Safe Position Sizes:
Level | Slippage | Max GBP
--------------------------------------------------
MINIMAL | 0.5% | £1347
LOW | 1.0% | £2694
MODERATE | 3.0% | £8081
HIGH | 5.0% | £13468
💡 Recommendation:
✓ Good liquidity - £5-100 positions are safe
================================================================================
WHAT-IF SCENARIOS (If token pumps 5x)
================================================================================
Assuming: $5,287,934 → $26,439,670 (5x)
Current LP: $340,959
Scenario | Entry Slip | Exit Slip | Net Gain
----------------------------------------------------------------------
Current (£5) | 0.00% | 0.00% | £25 (5x) ✓
Small (£50) | 0.02% | 0.05% | £250 (5x) ✓
Medium (£100) | 0.04% | 0.09% | £500 (5x) ✓
Large (£500) | 0.19% | 0.46% | £2500 (5x) ✓
================================================================================
FINAL RECOMMENDATION
================================================================================
🟡 WATCH - MONITOR
Building momentum
Reasons to skip:
✗ ICI 79.0 below 80 threshold
Positive factors (but not enough):
• IVSD 1.00 - clean price action
================================================================================
CHECKLIST
================================================================================
□ Chart: https://dexscreener.com/robinhood/[REDACTED]
□ RugCheck: https://rugcheck.xyz/tokens/[REDACTED]
□ Solscan: https://solscan.io/token/[REDACTED]
\`\`\`
| Module | Purpose |
|---|---|
helius_webhook_server.py |
Listens for new Solana mints, forwards to filter |
discover.py |
Manual DexScreener scan, rate-limit safe |
nvf_filter.py |
Nascent Virality Filter — four-pass rejection cascade |
audit_v2.py |
Safety checks, ICI computation, verdict |
concentration_monitor.py |
Tracks holder concentration over time for accumulation patterns |
simulate_trade.py |
Simulates a buy/sell against the Pump.fun program to detect honeypots |
position_calculator.py |
Position sizing from liquidity depth and slippage tolerance |
trades_log.py / audit_history.py |
Persistence and P&L tracking |
- Mint authority revoked
- Freeze authority revoked
- Top-10 holder concentration, with a hard override on the score
- Honeypot detection by simulating the sell before entry
- Liquidity-to-market-cap floor
data/token_audit_records.csv— 41 audited tokens, full feature set and verdictsdata/trades_log.csv— 2 trades, entry/exit/P&Ldata/snapshots/— 22 scanner runs, Jan–Mar 2026
Sample sizes are small and stated as such. The scoring conclusions rest on 41 observations; the trading conclusions rest on 2 and should be read as illustration, not evidence.
- Two trades. Nothing about win rate can be concluded. The claim here is about the score's distribution, not its profitability.
- No outcome labels on the other 39 audits. Tokens were scored but not tracked to resolution, so the score has never been validated against outcomes at scale — the underlying failure this repository documents.
- No control comparison. Signals were not tested against a random or naive baseline.
- Survivorship in the data. Scanner snapshots capture tokens that reached DexScreener listing; tokens that died before indexing never enter the dataset.
- Point-in-time API data. DexScreener and Helius responses were not archived, so audits cannot be re-derived from source.
pip install requests python-dotenv solders fastapi uvicorn
cp .env.example .env # add HELIUS_API_KEY and RUGCHECK_TOKEN
python3 discover.pyBuilt as a study of decision-making under adversarial information asymmetry. Published including its failures, because the failures are the finding. Not investment advice; the scoring model documented here demonstrably does not work.