🔍 Scanner — How Suspects Are Found
Data source: Polymarket CLOB order-fill events (74M+ events), scanned via Goldsky subgraph.
Detection window: Orders placed within 6 hours before market resolution. Earlier orders are too common to be signal.
Minimum bet size: $100. Small noise bets ignored.
Minimum wins required: At least 2 wins in the 6h window to qualify as a suspect.
Win rate threshold: Must have ≥ 55% win rate on those bets.
Outcome: A ranked list of wallets with apparent advance knowledge of market resolutions.
📊 Scoring — How Suspects Are Ranked
Each suspect gets a score 0–100 based on:
• Win rate — higher % inside the 6h window → higher score
• Number of wins — more wins = more statistically significant
• Average bet size — larger bets relative to market = more conviction
• Recency — recent activity weighted higher (suspects who stopped trading score lower over time)
High-conviction boost: If a suspect buys at ≥ 0.90 odds (near certainty), their score gets a temporary +5pt boost for 7 days. This signals they had extremely high confidence — their next trade gets a larger tier bet.
🤖 Copy-Trade Bot — Live Rules
Monitoring frequency: Every 3 minutes (Cloudflare Worker cron, lock prevents overlap).
Signal window: Activity API lag ~6 min — bot reacts within one polling cycle.
Max odds copied: 0.95 — don't copy trades priced above 95¢ (too thin margin after slippage).
Min odds: 0.40 — don't copy uncertain coin-flips.
Daily spend cap: $1,000 / day. Resets at UTC midnight.
Tier system:
• Tier 1 — Score ≥ 65, ≥ 5 wins, ≥ 70% win rate → $200 base bet
• Tier 2 — Score ≥ 50, ≥ 2 wins → $100 base bet
• Tier 3 — Score ≥ 45 → $50 base bet
Conviction scaling: If a suspect bets much more than their average, we scale our bet proportionally.
Formula: multiplier = 1 + min((suspectBet ÷ suspectAvg − 1) × 0.25, 2.0)
Range: 1.0× (at or below avg) → 3.0× (4× or more above avg)
Example: Tier 1 suspect bets 9× their avg → our bet = $200 × 2.0 = $400 (capped at 3×=$600)
📈 Backtest — Methodology
Simulates what the bot would have done historically using real Polymarket data.
Entry price: Suspect's actual entry price + configured slippage (5%, 7.5%, or 10%).
Exit — early sell: If the suspect sold before resolution, we exit at their sell price.
Exit — resolution: Market resolves YES → exit at 1.00. Market resolves NO → exit at 0.00.
Position size: Same tier + conviction-scaling logic as the live bot.
Daily cap: $1,000 / calendar day enforced — same as live bot.
Caching: Phase 1 (fetch ~962 suspect exits + resolve ~962 markets via Gamma API) is cached in localStorage for 24h. After the first run, changing the slippage slider is instant — no re-fetching.
🚫 What Gets Skipped & Why
Trades are skipped (not simulated) for these reasons:
No price — Suspect entry price unavailable from API. Can't simulate.
Sure-bet (>0.95) — Entry odds too high. After slippage, profit margin is too thin or negative. The bot would not have copied these. Many skipped trades fall into this category.
Odds out of range — Entry below 0.40. Too uncertain to copy.
Slippage > $1 — Total slippage cost exceeds $1 (e.g., very small bet size). Not profitable to execute.
Daily cap hit — The $1,000 daily cap was already reached on that calendar day. Trade skipped even if it would have won.
Note on sure-bets: Suspects often bet at 0.95–0.99 right before resolution. These bets are almost certain wins, but the profit margin (1–5%) is eaten by slippage. We can only profitably copy trades where the spread from slippage leaves us a positive expected return. The MAX_ODDS of 0.95 will be re-evaluated after 2–3 weeks of dry run data shows real slippage.
🏷️ Market Categories
Markets are auto-classified by scanning the market title for keywords:
POLITICS — president, election, congress, senate, trump, vote, legislation, treaty, nato, tariff…
ECONOMICS — fed rate, fomc, cpi, gdp, inflation, yield, jobs report, recession, earnings, fed funds…
CRYPTO — bitcoin, btc, ethereum, eth, solana, crypto (only if NOT short-term)
SPORTS — nba, nfl, nhl, mlb, soccer, tennis, ufc, mma, champions league, super bowl…
SHORT_TERM — "next 5 min", "next 15 min", "in the next hour", "tonight at", "at 4pm", "hourly"…
These are pure price-prediction markets (BTC price in next 5 min) — checked FIRST before CRYPTO. Excluded by default as there's no insider advantage possible.
OTHER — everything else (celebrity, culture, science, international events, etc.)
Why we keep CRYPTO: Long-term crypto markets (e.g. "Will Trump announce crypto reserves?") CAN have insider leaks. Only SHORT_TERM price bets are noise.
🏃 Dry Run — What We're Measuring
The dry run runs the full bot logic but places no real orders. It logs what the bot would have done.
After 2–3 weeks of dry run data, we need to answer 3 questions:
1. Does the bot detect suspect trades in real time? (6-min signal window, API lag test)
2. What is the real copy-trade slippage? (bot entry price vs suspect entry price — actual, not assumed)
3. Which suspects are still active? (some historical winners from 9 months ago may have stopped)
If dry run shows real slippage of 1–2% (not the assumed 5–10%), MAX_ODDS will be raised from 0.95 → 0.97, capturing more near-certain wins profitably.