Snitch Cat tokenomics v2
Status: implemented in contracts/src/PodiumVault.sol (v2), backend/ and web/, with two deltas from the design below: jackpot hits pay 50% through the podium and 50% across the street (lower concentration, see sim/RESULTS.md), and the house floor is 0.01 ETH instead of 0.05 (same holder outcomes, most of the house income kept).
Audit changes (2026-09-08)
An adversarial review before launch changed the contract in ten places; the full table is in LAUNCH.md. The ones that change the numbers on this page: the split is taken from fresh fees only (stash releases and unpaid prize are no longer re-taxed, so the house takes exactly 10% of fees); a rearm pins the draw hash while it is still readable and real rerolls are capped at three per hand; the settler always submits all 40 attempts; every listed wallet must show at least one ticket's worth of bag; the jackpot decision uses the reserve as it stood before the settle's drips.
Goal: attract new holders and keep existing ones through quiet stretches, without rewarding wallet splitting, whales, or bots. Everything below keeps the v1 promise: nothing to click, nothing to claim, the pot is trading fees.
Method: five independent proposals (lottery design, mechanism design, market microstructure, retention behaviour, on-chain feasibility), each attacked by adversarial reviewers where budget allowed; the survivors were combined and the reviewers' fixes applied. Dropped ideas and why are at the end.
1. Diagnosis of v1 (all five lenses agreed)
- The pot is five minutes of fees, spent to zero every hand. Prize per
hand = 69.75% × 4.7% × volume/288. At 20 ETH/day that is a first prize of 0.001 ETH, 288 times a day. Quiet hours show dust, and quiet hours are exactly when a holder decides whether to stay. There is no number that only goes up, no headline for a newcomer, no event to come back for.
- Nothing to lose. The streak is weak (+50% cap at day 10) and binary:
trimming 5% of a bag erases the whole streak, so a small profit-take rationally becomes a full exit. An old dust wallet that receives a whale bag inherits a 10-day streak (aged-wallet hole).
- Winners are the most rational sellers. The payout is a lump sum, the
cooldown makes the next hands worthless to them, and the forfeit check is only "still holds 10,000 tokens", so a winner can dump to 10,001 between snapshot and settle and still be paid.
- The hard 5% cap has an unbounded splitting gain above the cap (raw/cap),
while the convexity meant to punish splitting tops out at 1.5 × 1.5.
- Buybacks are a free sandwich. One buy of up to 0.5 ETH on the first
tick after settle, size public in the event, 3% slippage, on a pool with 4.2 ETH of depth. Simulated: a bot nets 0.06 to 0.18 ETH per buyback.
- The draw can be rerolled. If settle misses the 200-block window,
rearm() picks a new seed; only the operator holds the list, so the operator can reroll a draw it does not like. Tolerable at podium size, fatal once a jackpot exists.
- Launch is exposed. No share cap below 20 holders, no seasoning, house
takes 10% during the only window that decides graduation.
2. Design principles
- Fees are the only source of prize money. Nothing here mints, promises or
pays yield; v2 only moves the same ETH through time and across holders.
- A quiet street must still show a number that never goes to zero and an
event that is getting closer.
- Every anti-whale rule must be split-proof or at least split-neutral.
- No holder transaction is ever required.
- The operator's only lever stays "who is on the list". The draw is pinned.
3. Flows per settled hand
Gross pot G = harvested fees + stash release (see 3.3). Post-graduation:
| Slice | Share of G | Notes |
|---|---|---|
| Settler bounty | 0.25% | unchanged |
| House | 10%, scaling to 0 below a 0.05 ETH pot | "house eats last": houseEff = houseBps × min(1, pot / 0.05 ETH) |
| Buyback and burn reserve | 15% (was 20) | executed as bites, see 3.5 |
| Big Rat jackpot reserve | 15% | pays through the podium on a seed-chosen hand, see 3.4 |
| Stash deposit | 20% | banked in the vault, released at 0.75% of the stash per hand |
| Prize | remainder, ≈ 40% + stash release ≈ 60% in steady state | podium 90% (45 / 27 / 18 of prize), street 10% |
Pre-graduation (owner sets once, keeper flips at PoolCreated): house 0%, burn 25%, jackpot 15%, stash 20%. Every burn bite is a curve buy that counts toward the 4.2 ETH graduation and lifts the curve price.
3.1 Podium and the Street
- Podium: three distinct wallets, 45 / 27 / 18 of the prize, same draw as
today, cooldowns 3 / 2 / 1 hands, one slot per wallet per hand.
- Street: the same attempt sequence keeps going after the podium and pays
five more distinct wallets 2% of the prize each. One of the five is the rookie slot, drawn from a second small root of wallets whose first inbound transfer came from the Pons curve or the V4 pool (a taxed buy, not a wallet-to-wallet transfer) within the last 288 hands, once per address for life. Street winners get a separate 2-hand street cooldown.
- Why: wins per day go from 864 to 2,300; a median wallet sees ETH land
every day or two instead of every couple of weeks, and a first ticket usually pays something in day one. Rookie farming is bounded at 2% of the prize and costs 4.7% of churned capital; acceptable.
- Forfeit tightened: the leaf carries
units(balance at snapshot / 10k). A
slot is forfeited if balanceOf < 90% × units × 10,000, not "< 10,000".
3.2 The Drip (vest while you hold)
- Each podium payout: 60% pushed at settle, 40% pushed automatically 288
hands later (about 24 h) if the wallet still holds at least 90% of the balance it won with. Otherwise the 40% goes to the jackpot reserve.
- Jackpot payouts: 50% at settle, 50% after 288 hands, same rule.
- Street payouts are pushed in full (too small to vest).
- Implementation: a bounded queue in the vault (at most 3 entries per hand,
6 processed per settle), balances read on chain, no claim. Contract wallets fall back to pendingEth as today.
- Effect: the sell-after-win reflex is gone; at any moment most active
holders have a drip in flight, a standing reason not to sell tonight. Sell-and-rebuy around the checkpoint costs ~9.75% round trip and never pays; moving the bag to another wallet is an outbound transfer and forfeits.
3.3 The Stash (never a zero pot)
- 20% of every fresh pot is banked in
stashReserve; every settle releases 0.75% of the stash straight into that hand's prize, untaxed (the split applies to fresh fees only, so the house takes exactly its share of fees). Unpaid prize (forfeits, empty seats) waits incarryReserveand joins the next prize the same way.
- Steady state: the stash holds ~27 pots and is a pass-through (prize
unchanged). When volume dies the release decays with a 7.7-hour half-life and never reaches zero, so the board can always say "next hand pays at least X even if nobody trades". Honest copy: the stash is past fees, delayed, not yield.
- Nobody can drain it faster: the release is a fixed fraction, the owner
can only move stashBps (cap 40%) and stashReleaseBps (0.1% to 5%).
- Launch: start with
stashBps = 0for the first ~50 hands or seed it.
3.4 The Big Rat (seed-triggered jackpot)
- 15% of every pot accrues to
jackpotReserve(excluded frompot()). - On each settle, after the seed exists:
hit = seed % odds == 0with
odds = jackpotInterval / handSeconds (default 2 days → 1 in 576 per hand), or forced when the reserve reaches 2 ETH. On a hit the reserve is added to that hand's prize and flows through the normal podium, cooldowns, cap and forfeit rules. A forfeited first place keeps the jackpot in the reserve rather than rolling it.
- Countercyclical by construction: it fills in hot hours and pays at a
random hour, and most hours are quiet. Expected size ≈ 15% of two days of pot flow (0.28 ETH at 20 ETH/day, 2 ETH cap at ~150 ETH/day).
- Eligibility for the jackpot slot: wallets on the list for at least 12
hands (about 1 h), so a buy-and-dump around a hit is impossible.
- The site shows: reserve (only goes up between hits), "1 in 576 every
hand, average two days, not a schedule", and the 2 ETH must-pay line.
- Requires the pinned draw (3.6). Without it the jackpot is stealable.
3.5 Buybacks as bites
Keeper-only change, no contract change beyond lowering maxBuybackPerTx:
- Tranche ≤ 2% of the venue's quote reserve (≈ 4% price impact, below the
10.8% round-trip fee a sandwicher pays). Pre-graduation read curve.getReserves(), post-graduation the pool's ETH side.
- 1 to 4 bites per hand at random moments inside the hand (keeper CSPRNG,
published after the fact in /api/buybacks), more bites when spot is under the 1-hour TWAP, at most 12 hands of deferral, 1% slippage.
maxBuybackPerTx0.12 ETH as the on-chain ceiling.- The site shows "dinner queued: X ETH" so the reserve reads as a standing
bid, and the burned counter and average entry.
3.6 Trust fixes (contract)
- Pinned draw.
recordDraw()is permissionless: once the draw block
exists anyone stores arbBlockHash(drawBlock) and earns 0.05% of the pot at settle. settle() uses the stored hash and no longer needs the 200- block window. rearm() is only allowed when nothing was recorded, and a rearmed hand can never be a jackpot hit. This closes the operator reroll.
- Harvest inside settle (try/catch, gas-capped), so the pot at settle is
always fully harvested and nobody gains by timing harvest().
- Pot provenance. The indexer separates
Funded(direct ETH) from
Harvested (fees) per hand; the site and the feed label pots that include direct transfers ("includes 4 ETH sent to the vault"). Stops bought headlines.
- Cooldowns count dealt hands. Only settled hands advance the cooldown
clock; abandoned hands do not.
4. Ticket rules v2 (keeper, replayable from Transfer logs)
- Token age instead of a binary streak. One
ageStartper wallet.
Inbound of v to balance b at block n: ageStart += floor(v × (n − ageStart) / (b + v)) (new tokens are age 0; a whale bag moved into an old dust wallet gets age ≈ 0, closing the aged-wallet hole). Outbound of v from b: ageStart = min(n, ageStart + floor(2 × v × (n − ageStart) / b)): selling 10% costs 20% of the age, selling half kills it. Splitting still strictly loses (source loses age, destination starts at zero) but a small profit-take no longer erases weeks.
- Curve to 30 days, concave:
streakBps = 10000 + 500 × min(d, 10) + 200 × clamp(d − 10, 0, 20);
+50% at day 10 as today, +90% at day 30. There is always something left to lose.
- Tiers unchanged (1.1 / 1.2 / 1.3 / 1.5 at 100k / 500k / 1M / 5M).
- Soft cap instead of the hard 5% cap. Above the knee c (5% of the
effective total, iterative fixed point, from 20 eligible wallets): eff(t) = c + isqrt((t − c) × c). Splitting gain drops from unbounded to 1.0× at 2c, 1.24× at 3c, 2.5× at 10c, paid for with tier loss, a 30-day age reset on every new wallet and the fresh-transfer delay. A whale that stays whole keeps ~10% share at 2c, 20% at 10c, then cooldowns rotate it.
- Fresh transfers wait a day. Tokens received by wallet-to-wallet
transfer (not from the curve or pool) do not count for 24 h.
- Seasoning. A wallet is eligible from the hand after the first snapshot
it appears in (5 to 10 minutes after buying). Kills buy-snapshot-dump inside a hand and gives the site a "you're in from hand N+2" moment.
- Warm-up cap. Below 20 holders the cap is
max(5%, 150% / N): 30% at
5 wallets, 15% at 10, 7.5% at 20. Protects the launch hands.
5. Launch regime
- Deployer seeds the vault with 0.1 ETH before announcing, labelled as a
house gift on the site. Hand 1 rolls (nobody seasoned yet), hand 2 pays.
- Owner sets the pre-graduation split (house 0 / burn 25 / jackpot 15 /
stash 20); keeper flips to post-graduation values at PoolCreated.
- Cooldowns 4 / 2 / 1 for the first 12 hands, then 3 / 2 / 1.
- Ticket rules are published in
/api/configand on the site before the
launch and not changed afterwards without a week's notice.
6. Site and feed
- Board: pot, "pays at least X" (stash), Big Rat reserve with its odds line,
dinner queue, next hand countdown, eligible wallets, your odds.
- Odds card (paste an address): tickets = units × tier × age, share, odds
per hand (podium and street), age in days and what a 10% sell would cost in tickets, drip in flight ("0.012 ETH due at hand #N if you still hold ≥ 250,000"), jackpot eligibility, next tier.
- "Paper hands" wall: outbound transfers > 10% of a bag in the last 24 h,
short addresses only, with the tickets and age forfeited. Excludes team and CEX wallets, ignores dust.
- Feed: post podiums only when the prize is above a floor (0.005 ETH), always
post jackpots and buybacks above 0.05 ETH, plus a daily summary. Never an APY, never a receipt without the odds line. Do not post 288 dust hands a day; that is a decay chart in everyone's pocket.
7. Parameters
| Parameter | Value | Cap |
|---|---|---|
| houseBps | 1000 (0 pre-graduation), scales to 0 below 0.05 ETH | 2000 |
| burnBps | 1500 (2500 pre-graduation) | 5000 |
| jackpotBps | 1500 | 2500 |
| jackpotInterval | 172,800 s (1 in 576 per 5-min hand) | ≥ 12 hands |
| jackpotCap | 2 ETH (forces payout) | |
| jackpotMinAgeHands | 12 | |
| stashBps / stashReleaseBps | 2000 / 75 | 4000 / 10..500 |
| podium split | 45 / 27 / 18 of prize | fixed |
| street | 5 slots × 2% (1 rookie) | fixed |
| drip | 60% now, 40% at +288 hands, 90% balance test | |
| cooldowns | 3 / 2 / 1 (4 / 2 / 1 first 12 hands); street 2 | 100 |
| age curve | +5%/day to 10, +2%/day to 30 (+90%) | |
| sell penalty | 2× the sold fraction of age | |
| soft cap knee | 5% from 20 wallets; warm-up 150%/N | |
| fresh-transfer delay | 864,000 blocks (24 h) | |
| buyback bite | ≤ 2% of quote reserve, 1..4 per hand, 1% slippage | maxBuybackPerTx 0.12 ETH |
| recordDraw bounty | 0.05% of pot | |
| forfeit threshold | 90% of snapshot balance |
8. What changes per layer
Contract (redeploy; pre-launch this is free, post-launch the fee stream moves to the new vault with transferCreatorFeeRecipient): recordDraw, harvest-in-settle, stashReserve + release, jackpotReserve + hit rule + cap, street slots (MAX_ATTEMPTS to 40, PODIUM + STREET), rookie root, vest queue, forfeit threshold on units, house scaling, cooldowns on dealt hands, pre/post-graduation split, maxBuybackPerTx 0.12.
Keeper / indexer: token-age accounting, soft cap, fresh-transfer delay, seasoning, warm-up cap, rookie root, bites buyback executor with TWAP, pot provenance, feed gating, recordDraw racing.
Site: stash line, Big Rat panel, dinner queue, drip on the odds card, paper-hands wall, provenance labels, updated rules and FAQ.
Rollout order: trust fixes and stash first (they change nothing for holders and remove the reroll), then Drip and street, then the jackpot, then ticket rules v2 (announce a week ahead).
9. Dropped, and why
- Rolling / pot-floor hands ("no hand until the pot reaches X"): at any
realistic volume every hand rolls to the maximum, "every five minutes" becomes "every 30 minutes", payout touchpoints drop 6×, the feed goes silent, and rolled hands burned the on-chain cooldowns. The stash and the jackpot solve the dust problem without touching cadence.
- Heat ("you are due"): monotonically higher for small wallets, so it
erased the anti-split convexity, and it taxed newcomers and fresh winners.
- Scheduled daily mega hand at a fixed UTC time: creates a buy-before /
dump-after window; the seed-triggered jackpot has no window.
- Made Cats (fourth slot for 7-day holders): good retention idea, but a
second tree plus the Drip and the 30-day curve already reward long holders; candidate for v2.1 once the base is live.
- Receipt images auto-posted on every hand: spam in quiet weeks, ROI
framing conflicts with the honesty rule, rendering in the keeper process risks missing the draw window. Keep the daily summary and jackpot posters.
- Weekly Feast with vault-owned liquidity: promising post-graduation, but
needs fork tests against the live V4 hook; later.
10. Honest risks that remain
- The operator still chooses the list. Published, replayable, but a trust point.
- A whale at 10× the knee still gains ~2.5× by splitting after a month.
No identity-free rule removes that because wallet-to-wallet transfers are tax-free; the site shows it.
- The stash and the jackpot are redistribution across time and holders, not
new money. A dead market is still a dead market; the mechanics only stop the board from broadcasting the decay every five minutes.
- Sequencer-produced block hashes remain the randomness assumption.
- Not audited. The vest queue and the V4 buyback route deserve the most
review.