/* Sybilhunt website — app composition + state. */ function App() { const [how, setHow] = React.useState(false); const [toast, setToast] = React.useState(false); const [huntStage, setHuntStage] = React.useState(0); const deadline = React.useMemo(() => Date.now() + 21 * 86400000 + 9 * 3600000 + 14 * 60000, []); function scrollTo(id) { if (id === 'top') { window.scrollTo({ top: 0, behavior: 'smooth' }); return; } const el = document.getElementById(id); if (el) { const y = el.getBoundingClientRect().top + window.pageYOffset - 80; window.scrollTo({ top: y, behavior: 'smooth' }); } } function startHunt() { setHow(false); if (window.SHVisitor) { window.SHVisitor.getRecord().then(function (rec) { if (rec.onboardingDone) { window.location.href = 'crm.html'; } else { setHuntStage(1); } }); return; } setHuntStage(1); } function acceptHunt() { setHuntStage(0); if (window.SHVisitor) window.SHVisitor.setFlag('onboardingDone', true); window.location.href = 'crm.html'; } function declineHunt() { setHuntStage(0); scrollTo('top'); } return (
setHow(true)} onStart={startHunt} scrollTo={scrollTo} /> setHow(true)} onStart={startHunt} deadline={deadline} />
); } function OnboardingModal({ stage, setStage, onAccept, onDecline }) { const open = stage > 0; const close = () => setStage(0); const blueBtn = { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', gap: 9, height: 56, padding: '0 32px', borderRadius: 'var(--radius-pill)', border: 'none', cursor: 'pointer', background: '#2563EB', color: '#fff', fontFamily: 'var(--font-display)', fontWeight: 600, fontSize: 17, letterSpacing: '-0.01em', boxShadow: '0 8px 28px rgba(37,99,235,0.32)', transition: 'filter var(--dur-fast)', }; return ( setStage(2)} onMouseEnter={(e) => e.currentTarget.style.filter = 'brightness(1.08)'} onMouseLeave={(e) => e.currentTarget.style.filter = 'none'}>Continue : stage === 2 ?
:
}> {stage === 1 && (

When a project pays out rewards, the goal is simple: every share goes to a different real person. One campaign, many genuine participants — each gets their fair part.

One campaign paying ten real, separate people

Here the reward reaches ten real, independent people — Alex, James, Ibraghim and the rest are all different humans who each legitimately received their payout. This is exactly how it's meant to look.

)} {stage === 2 && (

A Sybil fakes that same crowd. Behind seven of these “people” is a single operator — notice how many are literally named John. They drain the pool meant for everyone else.

One Sybil operator faking seven identities among real users
Red — Sybil wallets, all one actor
Green — real, independent people

Seven red “John” wallets are the same person; only Ibrahim, Nikolay and David are genuine. Your job as a hunter is to expose the red cluster so the pool goes to the people who earned it.

)} {stage === 3 && (

Every dollar a Sybil grabs is a dollar stolen from someone who actually showed up. Left unchecked, they don't just take money — they break the whole reason projects run rewards in the first place.

Honest users get less
A fixed pool split with hundreds of fake wallets means real contributors receive a fraction of what they earned — or nothing.
Metrics become lies
Inflated “users” and “volume” hide real traction, so teams make decisions on numbers that aren't true.
Trust erodes
When people see farmers win, they stop participating — and the community the project paid to grow walks away.
$5M That's why projects fund hunters: paying you to expose Sybils is far cheaper than handing the pool to bots. Catch them — and the reward is yours.
Your decision
Ready to hunt Sybils — and get paid for it?

By accepting, you join Sibilhunt as a hunter: you'll investigate wallet clusters, submit evidence, and earn a share of partner reward pools for confirmed findings. Decline and you'll head back to the home page — no commitment.

)}
); } function Toast({ show, onClose }) { return (
Welcome aboard, hunter — your hunt dashboard is being prepared.
); } ReactDOM.createRoot(document.getElementById('root')).render();