Deposit USDC, hold it one week, and you're in the draw. One winner takes the week's yield — everyone else still gets their full principal back, any time.
How it works
- 1Deposit USDC into the pool.
- 2Hold it for a full week — that's what makes it a ticket.
- 3At week's end, a winner is drawn — verifiable on-chain, nobody (not even the admin) can pick who wins ahead of time.
- 4Won? Scratch the card to claim. Didn't win? Withdraw your principal — any time, no conditions.
Live right now
Learn more
Tickets & the draw
Every USDC you deposit becomes ticket weight proportional to your share of the pool.
You only have a ticket once your deposit has sat in the pool for a full epoch (7 days). Withdraw mid-week and you forfeit that week's ticket — never your money.
Randomness is two-layer commit-reveal: the keeper commits a hashed secret at the start of the week, reveals it at the end, and it's mixed with a future blockhash unknowable at commit time — so nobody, not even the keeper or the admin, can predict or steer the outcome.
Yield
aprBps = variable, read from the current yield source
(USDC ~6%/year, $ARC ~3%/year — staking is
safer than lending, so it pays less)
realYieldEarned = totalPool × aprBps / 10000 / 52
weeklyPrizePool = eligibleBalance × aprBps / 10000 / 52
surplus = realYieldEarned − weeklyPrizePool → flows to the vault
Why only eligibleBalance, not the whole pool? The draw runs weekly, and only money that's sat a full week has a ticket that week. The prize has to be computed on that exact same slice — not the whole pool — because counting fresh mid-week deposits would inflate the prize for people who don't yet have a shot at winning it. The yield those fresh deposits still earn is real — it just isn't split with anyone that week, so it flows into the vault instead.
Splitting the prize
numWinners = max(1, floor(sqrt(eligibleBalance / 1000)))
numWinners = 1: winner takes 100% of weeklyPrizePool
numWinners > 1: 1st place takes 50%, the rest splits evenly
among (numWinners − 1) people
Winner count and prize size scale automatically with pool size — no fixed thresholds, no contract changes needed as the pool grows.
Claiming
cut = prize × 5% has a referrer → referrer gets the cut no referrer → cut splits evenly into vaultReserve / vaultDev
The vault
vaultReserve — withdrawable only while the contract is paused, reserved for compensating an incident (a hack, a bug that loses funds). There's no way to withdraw it for any other purpose.
vaultDev — withdrawable normally, funds ongoing costs: servers, community, marketing.
Where the yield comes from (once Arc has real DeFi)
Spread across multiple reputable lending markets (Aave, Morpho, Compound...) instead of concentrated in one — if one has an issue, only that slice is affected; the vault and the rest of the yield sources keep standing. Today (no sufficiently trustworthy DeFi on Arc Testnet yet), the admin funds the pool by hand, following the exact formula above.
What never changes, no matter how big the pool gets
- Principal is never at risk and withdrawable any time — no lockups.
- No hidden fees — every cut is shown publicly.
- Admin is a 2-of-2 Safe multisig, not a single wallet.
- Scratching the card is just for fun — it's never a condition for getting paid. Winnings always land in the winner's wallet: scratch immediately for the suspense, or don't bother — after 3 days, anyone (not just the admin) can call
sweep()to push the prize to the winner automatically. No deadline ever costs you a prize. - Pausing only blocks new deposits and new draws — it never locks withdrawals.