/* Sybilhunt — "Sybilhunters' experience" page. window-mounted. Uses kit-components primitives. */ function EReveal({ children, delay = 0, y = 24 }) { const ref = React.useRef(null); const [shown, setShown] = React.useState(false); React.useEffect(() => { const el = ref.current; if (!el) return; const io = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting) { setShown(true); io.unobserve(el); } }); }, { threshold: 0.14 }); io.observe(el); const fb = setTimeout(() => setShown(true), 240); return () => { io.disconnect(); clearTimeout(fb); }; }, []); return (
{children}
); } function ECountUp({ to, prefix = '', suffix = '', dur = 1500, decimals = 0 }) { const ref = React.useRef(null); const [val, setVal] = React.useState(0); React.useEffect(() => { const el = ref.current; if (!el) return; let raf, started = false; const io = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting && !started) { started = true; const t0 = performance.now(); const tick = (t) => { const p = Math.min(1, (t - t0) / dur); const eased = 1 - Math.pow(1 - p, 3); setVal(to * eased); if (p < 1) raf = requestAnimationFrame(tick); }; raf = requestAnimationFrame(tick); } }); }, { threshold: 0.5 }); io.observe(el); return () => { io.disconnect(); cancelAnimationFrame(raf); }; }, [to, dur]); const fmt = (n) => Number(n).toLocaleString('en-US', { minimumFractionDigits: decimals, maximumFractionDigits: decimals }); return {prefix}{fmt(val)}{suffix}; } function ENav({ onClick, active, children }) { return ( ); } function ExpHeader() { const go = (page) => { window.location.href = page; }; return (
go('index.html')} />
); } // ── Aggregate stats ────────────────────────────────────────── const EXP_TOTALS = [ { v: , label: 'paid to hunters', tone: 'signal' }, { v: , label: 'Sybil wallets exposed', tone: 'default' }, { v: , label: 'confirmed clusters', tone: 'default' }, { v: , label: 'submissions confirmed', tone: 'default' }, ]; // ── Hunter stories ─────────────────────────────────────────── const HUNTERS = [ { handle: ' mule.eth ', tag: 'crypt0zeke', campaign: 'Hop Protocol · bridge hunt', wallets: '1,142', payout: '$84,300', accent: 'var(--signal-500)', hook: 'Fixed-amount bridge deposits gave a whole farm away.', story: 'Noticed 1,142 wallets that each bridged exactly 0.0025 ETH within the same 5-day window, then made identical first swaps. Clustered them by shared funding hops and submitted on day two of the campaign — the earliest report on that farm.', method: ['Bridge-deposit fingerprint', 'Shared funder graph', 'Timing correlation'], }, { handle: 'bitblondy', tag: 'Optimism RetroPGF', campaign: 'Optimism · airdrop filter', wallets: '2,760', payout: '$121,000', accent: 'var(--coral-500)', hook: 'One CEX withdrawal pattern unravelled 2,760 addresses.', story: 'Pulled every wallet that withdrew $2.01 of ETH from the same Binance sub-account across 72 hours. The amounts were too consistent to be human. Cross-checked contract-call order to rule out false positives, then packaged the cluster.', method: ['CEX-withdrawal clustering', 'Amount variance analysis', 'Call-order matching'], }, { handle: 'sonar_ghost', tag: 'anon', campaign: 'zkSync · sybil sweep', wallets: '640', payout: '$47,900', accent: 'var(--cyan-500)', hook: 'A recycled gas wallet linked 640 “strangers”.', story: 'Every wallet in the cluster topped up gas from a single relayer, then returned the dust to it after the snapshot. That round-trip is invisible on a per-wallet view — only the money graph exposes it.', method: ['Gas round-trip trace', 'Dust-return detection', 'Relayer attribution'], }, { handle: 'clusterfox', tag: 'anon', campaign: 'EigenLayer · restaking', wallets: '3,410', payout: '$260,000', accent: 'var(--gold-400)', hook: 'The biggest single payout on the platform so far.', story: 'A restaking farm split 3,410 wallets across three bridges to look independent. clusterfox joined records from Arbitrum, Optimism and Base — identical restake timing across chains was the tell — and proved one operator behind all of them.', method: ['Cross-chain join', 'Restake-timing match', 'Multi-bridge de-anon'], }, { handle: 'lyra.base', tag: 'anon', campaign: 'Gitcoin · grants round', wallets: '880', payout: '$36,500', accent: 'var(--signal-500)', hook: 'Fake donors inflating a matching pool, caught in a day.', story: 'Spotted 880 “donors” that all funded from one Disperse contract minutes before the round opened and gave identical amounts to the same three projects. Quadratic funding punishes this hard — the cluster was confirmed within hours.', method: ['Disperse-contract trace', 'Donation-pattern match', 'Quadratic anomaly flag'], }, { handle: 'nullroute', tag: 'anon', campaign: 'Polymarket · active hunt', wallets: '1,530', payout: '$96,700', accent: 'var(--coral-500)', hook: 'Wash-trading loops hiding as organic volume.', story: 'Mapped 1,530 accounts trading the same markets against each other in tight loops to fake volume. The positions always netted to zero across the ring. nullroute reconstructed the loop graph and filed before the incentive snapshot closed.', method: ['Wash-loop reconstruction', 'Net-position analysis', 'Counterparty ring graph'], }, ]; function initials(h) { const s = h.trim().replace(/[._]/g, ' ').split(' ').filter(Boolean); return (s[0][0] + (s[1] ? s[1][0] : s[0][1] || '')).toUpperCase(); } function ExpApp() { const go = (page) => { window.location.href = page; }; return (
{/* Hero */}
Sybilhunters' experience

Real hunters. Real clusters. Real payouts.

Every reward on Sybilhunt is earned by exposing a specific, provable cluster. Here are six hunters — how they spotted the pattern, how many wallets they unmasked, and what the pool paid them for it.

{/* Totals */}
{EXP_TOTALS.map((s, i) => (
{s.v}
{s.label}
))}
{/* Hunter stories */}
Hunt logs

Six catches, six methods

{HUNTERS.map((h, i) => (
{/* Head: avatar + handle + campaign */}
{initials(h.handle)}
{h.handle.trim()}
{h.campaign}

{h.hook}

{h.story}

{/* Method tags */}
{h.method.map((m) => ( {m} ))}
{/* Result strip */}
{h.wallets}
wallets exposed
{h.payout}
reward paid
))}
{/* CTA */}
go('index.html')} />

Hunter stories are illustrative composites of real Sybil-detection techniques. Handles anonymized. © 2026 Sybilhunt.

go('index.html')}>← Back to home
); } ReactDOM.createRoot(document.getElementById('root')).render();