CONTRACT
Contract details
Source verified. Storage layout published. ABI canonical.
STATUS
Minnow v1.1 (dual-oracle) deployed and verified on Ethereum mainnet. Supra dVRF V3 health-check passed; Chainlink VRF v2.5 wired for the second oracle path. Currently pre-activation · play enables the moment the operator fires
activate().Launch sequence
- DONE: Codex audit on locked design
- DONE: Hardhat tests covering every state transition
- DONE: Mainnet fork tests
- DONE: Chainlink VRF v2.5 subscription owned + funded by the contract
- DONE: Deploy Minnow to Ethereum mainnet
- DONE: Verify on Etherscan + Blockscout
- DONE: Live oracle health-check (Supra mainnet callback in ~45s)
- CURRENT: Pre-activation · play locked until
activate()fires - Operator fires
activate() - Anyone fires
createRound()(orcreateRoundAndEnter()with branding) to open round #001 · pot starts from player entries, no founder pre-seed - Watch #001 settle cleanly
- Owner calls
freezeAdmin()· pause/unpause permanently disabled (emergency refund path survives the freeze)
Addresses
Minnow v1.10x9e16f09ef9d1b122d90cca704fdb9415207b2f8c
Minnow v1 (legacy)0xc989f7c56728b5b6a3db3d13845b71aa1d317259
$BURN (rake destination)0x886fab7097311af73C74DD608001a0d267AbF351
BurnToken Strategy proxy (V1.1)0x8aD4E547d4d23eA64a7887896467236f1ce6DF23
Bracket constants · Minnow v1 vs Minnow v1.1
| Constant | v1 | v1.1 |
|---|---|---|
| MIN_SLOT_VALUE | 0.001 ETH | 0.001 ETH |
| MAX_SLOT_VALUE | 0.100 ETH | 0.100 ETH |
| SLOT_STEP | 0.001 ETH | 0.001 ETH |
| TOTAL_SLOTS | 100 | 100 |
| THRESHOLD | 0.3 ETH (fixed) | 0.015 → 1 ETH · creator-tunable per round (default 0.05) |
| SEED_PHASE_MAX | 6h | 6h |
| ACTIVE_TIMER | 6h (resets) | 6h (resets) |
| ACTIVE_PHASE_MAX | 12h | 12h |
| FINAL_COUNTDOWN | 6h (no resets) | 6h (no resets) |
| MAX_POSSIBLE_POT | 5.050 ETH | 5.050 ETH |
| ORACLE | Chainlink VRF v2.5 | Dual · Chainlink VRF v2.5 + Supra dVRF V3, first-fulfills-wins |
| ROUND BRANDING | — | On-chain name + image URI |
| THRONE LEADERBOARD | — | 1% of every pot to top 3 creators (90-day season) |
Payout splits
| WINNER_BPS | 7150 (71.5%) + keeper cap-rebate + dust |
| SECOND_BPS | 650 (6.5%) |
| THIRD_BPS | 350 (3.5%) |
| SEED_BPS | 1000 (10%) |
| RAKE_BPS | 500 (5%) · to $BURN contract |
| FOUNDER_BPS | 50 (0.5%) · two-step settable |
| VRF_REPLENISH_BPS | 100 (1%) · self-funds both oracle subs |
| KEEPER_BPS / KEEPER_CAP | 100 (1%) capped at 0.01 ETH |
| THRONE_BPS | 100 (1%) · top 3 leaderboard share (v1.1 only · 70/20/10) |
| MAX_ENTRIES_PER_ADDRESS | 50 (per round) |
| MAX_ENTRIES_PER_TX | 10 (enterBatch cap) |
| VRF_RETRY_BOUNTY | 0.0001 ETH per requestRandomnessAgain call |
| MAX_REQUESTS_PER_ORACLE | 3 total per oracle · 1 initial + up to 2 retries |
| VRF_RETRY_TIMEOUT | 30 min after each oracle request |
| EMERGENCY_REFUND_DELAY | 72h from stuck timestamp · survives freezeAdmin |
v1.1 sum: 71.5 + 6.5 + 3.5 + 10 + 5 + 0.5 + 1 + 1 + 1 = 100%. (v1 omits the 1% throne slice; its winner pulls 72.5% instead of 71.5%.)
Key entry-point functions
| createRound() | Open a new round · permissionless (post-activate) |
| enter(roundId, slotIndex) | Claim a slot · payable · msg.value must equal slot price |
| enterBatch(roundId, slotIndex[]) | Up to 10 slots in one tx · payable · msg.value = sum of slot prices |
| settle(roundId) | Fires VRF request · permissionless · no keeper bounty (only fires the request) |
| rawFulfillRandomWords(...) | Chainlink VRF callback · only callable by VRF coordinator |
| finalizeSettlement(roundId) | Ranks top 3, credits payouts, sends $BURN rake, EARNS the keeper bounty |
| requestRandomnessAgain(roundId) | Re-requests VRF · 30min cooldown · capped at 3 total requests per round |
| withdrawPayout(roundId) | Winner / 2nd / 3rd / founder / keeper pull their share for that round |
| withdrawSeedDividend(roundId) | Seed contributors pull their pro-rata slice for that round |
| withdrawRefund(roundId, slotIndex) | Refund per-slot · one call per slot owned in a refunded round |
| emergencyResolveStuckRound(roundId) | Owner-only · flips a stuck round to refund-eligible · no recipient/amount params, no drain · 72h delay |
| freezeAdmin() | One-way · permanently disables pause/unpause · emergency refund path SURVIVES |