TL;DR
- →Hold $TOPPS, get entered every 10 min.
- →100% of trading fees fund the next pack.
- →Prizes auto-airdrop. No claim flow.
- →Win every graded Topps Card opened in your window.
- →Winner picked by commit-reveal, not us.
- →Just a wallet. No signup, no KYC.
STEP 01 · FEE
You trade $TOPPS. The bonding curve sweeps a small creator fee.
100% fair launch on the Meteora DBC bonding curve — no team supply, no presale, no rug surface. Every swap pays a small fee to the creator wallet. That wallet's only job is to forward those fees into the prize loop.
creatorFee = small % of every swap > fee collector wallet
STEP 02 · SWAP
A worker claims the fees and swaps SOL > USDC via Jupiter.
A cron worker hits the Meteora DBC claim instruction every ~30 seconds. When claimed SOL crosses a threshold it routes through Jupiter v6 to USDC at the best public route. No private RPC, no protected mempool — the route hash is on-chain.
claim > Jupiter v6 > USDC (route hash published per sweep)
STEP 03 · PACK
USDC buys a graded Topps Card on Collector Crypt.
When the USDC balance crosses one pack price, the pack-buyer hits the Collector Crypt API and queues a graded Topps slab. PSA / CGC / BGS grades only — no raw packs, no shipping roulette, no condition risk.
balance ≥ packPrice > CC.buyPack() > queue
STEP 04 · OPEN
Packs auto-open. Every slab piles into the current vault.
The pack-opener pulls from the queue, opens each pack through Collector Crypt's API, and ingests every card into the vault for the current 10-minute window. Whatever opens in that window — one card or fifty — is what the next winner takes.
while queue: open() > vault[currentDraw].push(card)
STEP 05 · ROLL
At the close slot, the vault auto-airdrops to one holder.
Snapshot every eligible $TOPPS holder at the close-slot. HMAC-SHA-256 a server seed we committed to before the window opened with the slot hash and the draw id. Walk the weighted prefix sum with the roll — the first holder whose slice covers the offset gets every card opened in the window, directly, no claim.
winner = walk(weights, HMAC(seed, slotHash | drawId))