Skip to content
Provably fair

Rules are code. Randomness is public.

Seed

Hash of Monad block 111,518,000 + round × 9,000. Nobody can know it before the block exists.

Engine

One pure TypeScript module, shared by the server and your browser. No hidden randomness, no network calls.

Narration

Text only. It reads a finished result and can never change one. A template fallback runs if no model is available.

How a round is decided

  1. Clock. Round r is seeded by block 111,518,000 + r × 9,000. A round closes once that block is 200 blocks behind head. The league clock is the chain, so there is no scheduler to trust.
  2. Lock before seed. Nudges lock 450 blocks before the seed block is produced. Seed choice cannot be influenced by the nudges, and nudges cannot be chosen with knowledge of the seed.
  3. Pairing. A seeded Fisher-Yates shuffle of the roster pairs Chogs and picks an event type.
  4. Power. Power is the weighted sum of both Chogs' genes (table below), with the stance adjustment.
  5. Rolls. 3 steps. Each step adds a seeded roll of up to 50 (stretched for Bold, tightened for Friendly) plus a +4 counter bonus when a stance beats the other.
  6. Result. Higher total wins. Points: winner 10 to 20 (10 plus 1 per 6 points of margin, capped), loser 3, a draw 6 each, and an upset bonus of +5 when the winner's pre-roll power was lower by more than 4. Alliance Betrayal swaps the last step for a seeded betrayal draw: one betrayer wins 12 and the betrayed gets 2; nobody betraying is shared loot (6 each); both betraying is a double backstab decided by the totals (8 and 3). So a loser can get 2 or 3 depending on the event.
  7. Log hash. The inputs, steps and result are hashed with keccak256 and stored with the event.

Stances form a triangle: Bold crushes Friendly, Friendly charms Sneaky, Sneaky ambushes Bold. Nudges shift weights. They never decide outcomes.

Event weights

Eventmischiefnervewitspeedcharm
prank heist0.350.200.250.100.10
meme duel0.150.100.350.100.30
meadow race0.100.220.150.380.15
alliance betrayal0.300.100.200.100.30

No weight is above 0.38, and the test suite asserts that. A common Chog beats a stronger one often enough to stay competitive.

Trait to gene table

The table is built from the real 1,969 traits of Chog Genesis (Chog Genesis, 0xc96d31f8626c6d03fae5dcd3d61e3fb9f4a73763 (Monad, 1,969 tokens)). Every Chog starts at 40 in each gene and each trait adds the deltas below, capped at +30 per gene so no single trait decides a match. Rarer values (★, fewer than 0.5% of tokens in their category) get somewhat larger deltas, scaled by how uncommon the value is, with a small deterministic variation from keccak256(category:value). The table is generated by scripts/build-data.mjs from the cached metadata, so anyone can rebuild and diff it.

CategoryFeedsStrength
Auracharm, wit, mischief16
Eyeswit, charm, mischief16
Mouthmischief, charm, wit16
Bodyspeed, nerve16
Basespeed, nerve12
Formnerve, speed, mischief14
Headnerve, wit, mischief16
Tiermischief, nerve, wit, speed, charm10
Accessorytie-break (hash)8
Backgroundtie-break (hash)3
Skintie-break (hash)3
Nakedtie-break (hash)3
Sidetie-break (hash)3
Show every trait value (327 rows)
TraitValuemischiefnervewitspeedcharm
BackgroundAfternoon Orange ★·+1·+1·
BackgroundAqua Blue ★···+1+2
BackgroundAqua Mint·····
BackgroundAqua+1···+1
BackgroundBlood Red ★+1···+1
BackgroundBright Yellow ★·+1+1··
BackgroundCoral Pink+1··+1·
BackgroundDeep Aqua·····
BackgroundDeep Blue·+1···
BackgroundDeep Purple ★·+2·+2·
BackgroundFresh Green··+2·+1
BackgroundGold ★·+1··+1
BackgroundLemon Yellow·····
BackgroundLemon·····
BackgroundLight Magenta·····
BackgroundLight Purple+1·+1··
BackgroundLime Green·····
BackgroundMagenta ★··+2·+3
BackgroundMint+2·+1··
BackgroundMon·+1·+1·
BackgroundNoble Blue ★··+3+2·
BackgroundPeach Pink·····
BackgroundRadioactive·+1··+2
BackgroundRed Sky ★··+3+2·
BackgroundRose Pink ★+2·+1··
BackgroundRosie··+2·+1
BackgroundRosy Pink··+1+1·
BackgroundRoyal Blue ★·····
BackgroundSky Blue·····
BackgroundSoft Lavender+1·+1··
BackgroundSunlight·+1·+1·
BackgroundSupreme Purple ★+1+2···
Base1:1+14+14+14+14+14
BaseOrigin·+3·+4·
BaseRadioactive·+5·+7·
BaseSkull·+5·+8·
SkinBeige ★+1···+1
SkinBlack···+1+1
SkinBlue·+1+1··
SkinGreen ★·····
SkinGrey ★+2+1···
SkinJade ★··+1+1·
SkinMetal ★··+1··
SkinMulti Colored ★·····
SkinOrigin·+1···
SkinPink·+1+2··
SkinPurple ★+3···+2
SkinRed·+1·+1·
SkinWhite+2+2···
SkinYellow+1···+2
SideLeft·+1+1··
SideRight·····
BodyAqua Tuxedo·+5·+5·
BodyArmy Vest·+11·+11·
BodyAstro Suit·+4·+4·
BodyBBC·+5·+5·
BodyBanana suit·+5·+5·
BodyBlack Shirt·+4·+4·
BodyBlack Trackset·+8·+8·
BodyBlack Vest·+5·+5·
BodyBlue 143 Jersey·+7·+7·
BodyBlue Chinese·+3·+3·
BodyBlue Holed Jacket ★·+9·+9·
BodyBlue Homeless Shirt·+4·+4·
BodyBlue Mafia ★·+2·+2·
BodyBlue Sleeveless·+11·+11·
BodyBlue jacket·+5·+5·
BodyBlue tuxedo·+8·+8·
BodyBoner ★·+5·+5·
BodyBrown Homeless Shirt·+4·+4·
BodyCEO Vest ★·+8·+8·
BodyCWO·+9·+9·
BodyChug Life·+6·+6·
BodyCream Tuxedo·+7·+7·
BodyCyan Shirt ★·+2·+2·
BodyCyan tuxedo·+8·+8·
BodyDragon suit·+5·+5·
BodyDuck Float·+2·+2·
BodyElectro Hoodie·+4·+4·
BodyFarmer Shirt·+2·+2·
BodyFire Shirt·+8·+8·
BodyGangster suit·+6·+6·
BodyGlitch Hoodie·+4·+4·
BodyGojo ★·+2·+2·
BodyGolden Armor·+10·+10·
BodyGrey Homeless Shirt·+11·+11·
BodyGrey Shirt·+8·+8·
BodyGuko·+3·+3·
BodyHawaiian Polo·+5·+5·
BodyInmate·+7·+7·
BodyJesus Robe ★·+9·+9·
BodyJesus·+7·+7·
BodyKings Robe·+4·+4·
BodyMILF Lover·+5·+5·
BodyMon Hoodie·+9·+9·
BodyMummy ★·+9·+9·
BodyOrange Holed Jacket ★·+6·+6·
BodyOrange Hoodie·+10·+10·
BodyOrange Sleeveless·+3·+3·
BodyPeach Hoodie ★·+4·+4·
BodyPink Shirt·+2·+2·
BodyPink Tuxedo·+6·+6·
BodyPrisoner·+6·+6·
BodyPurple Shirt·+11·+11·
BodyPurple Tank ★·+3·+3·
BodyRed 143 Jersey·+5·+5·
BodyRed Chinese·+2·+2·
BodyRed Sleeveless·+2·+2·
BodyRed Trackset·+9·+9·
BodyRed Tuxedo·+10·+10·
BodyRed jacket·+8·+8·
BodyRed shirt·+5·+5·
BodySci Fi·+8·+8·
BodyShark Suit·+3·+3·
BodySix Seven·+4·+4·
BodySky Hoodie·+7·+7·
BodySquid Game Guard·+6·+6·
BodySquid Game·+7·+7·
BodyStripe Shirt ★·+10·+10·
BodyStripe shirts ★·+8·+8·
BodyStripes·+3·+3·
BodyTank Top·+8·+8·
BodyToad green Suit·+9·+9·
BodyToad pink suit·+2·+2·
BodyTuxedo·+5·+5·
BodyVirgin·+6·+6·
BodyWhite Pure Shirt·+2·+2·
BodyWhite Shirt·+2·+2·
BodyWhite Sleeveless·+9·+9·
BodyWhite Tank ★·+7·+7·
BodyWhite Yukata·+7·+7·
BodyWhite tuxedo·+5·+5·
BodyWizard Cape ★·+12·+12·
BodyWizard·+3·+3·
BodyYellow 143 Jersey·+10·+10·
BodyYellow Hoodie·+6·+6·
BodyYellow Shirt·+4·+4·
BodyYellow Yukata·+6·+6·
BodyZero THOTS·+6·+6·
Bodyblue tee·+6·+6·
Bodydark jacket·+8·+8·
Bodydark tee·+8·+8·
Bodydark vest·+5·+5·
Bodypink vest·+6·+6·
Bodypurple vest·+11·+11·
Bodyred tee·+4·+4·
Bodytoad blue suit·+6·+6·
Bodywhite tee·+7·+7·
MouthBTC Coin+7·+3·+4
MouthBubblegum+7·+3·+4
MouthClown Mouth+5·+2·+3
MouthDrooling+5·+2·+3
MouthFlat+5·+2·+3
MouthGold Tooth+6·+3·+4
MouthGrit+9·+4·+6
MouthLip Bite+1·+1·+1
MouthMon coin+2·+1·+1
MouthRainbow Puke+6·+2·+4
MouthSad+5·+2·+3
MouthSmile+8·+3·+5
MouthWorried+4·+2·+3
Mouthnormal smile+5·+2·+3
Mouthwo+3·+1·+2
Eyes3D Glass··+1·+1
EyesAngry+1·+2·+1
EyesAnime Glass+1·+2·+1
EyesBTC Glass+2·+4·+3
EyesBase+2·+5·+3
EyesBlue Flat ★+1·+3·+2
EyesBlue Happy ★+5·+12·+7
EyesBlue Retard ★+4·+11·+6
EyesBlue Round Eye ★+2·+4·+2
EyesBlue Smirk ★+2·+5·+3
EyesChog Viper+3·+7·+4
EyesClassic VR+2·+5·+3
EyesClosed Eye Crying+3·+7·+4
EyesClown Eye Mix+2·+5·+3
EyesClown Eye+1·+2·+1
EyesDead+2·+4·+3
EyesFlat+3·+8·+5
EyesFrog+1·+2·+1
EyesGradient visor+2·+4·+3
EyesGreen Happy ★+1·+2·+1
EyesGreen Retard ★+5·+12·+7
EyesGreen Round Eye ★+3·+7·+4
EyesGreen Side Eye ★+4·+10·+6
EyesGreen Smirk ★+3·+7·+4
EyesGreen laser+1·+3·+2
EyesHappy+3·+7·+4
EyesHeart+2·+5·+3
EyesMOG+2·+4·+3
EyesMixed Happy ★+4·+10·+6
EyesMixed Retard ★+4·+9·+6
EyesMixed Round Eye ★+3·+8·+5
EyesMixed Side Eye ★+4·+11·+6
EyesModern VR+2·+4·+2
EyesNormal Eye+2·+6·+4
EyesNormal ★+1·+3·+2
EyesPlasma visor+1·+4·+2
EyesPurple laser+3·+8·+5
EyesRed Flat ★+5·+13·+8
EyesRed Retard ★+1·+3·+2
EyesRed Round Eye ★+3·+8·+5
EyesRetard+1·+2·+1
EyesRetro Glass+3·+7·+4
EyesRound Crying+1·+3·+2
EyesRound Eye+1·+3·+2
EyesRound Tear+3·+7·+4
EyesRound+3·+9·+5
EyesSide Eye+2·+6·+3
EyesSmirk+1·+1·+1
EyesSunset visor+3·+7·+4
EyesTeary+3·+7·+4
EyesThug+3·+6·+4
EyesTired+2·+5·+3
EyesUp ★+3·+8·+5
EyesVertical+3·+8·+5
EyesWorried+4·+11·+6
EyesXD+2·+4·+2
Eyescyan laser+2·+6·+3
Eyesfire laser+3·+7·+4
Head10k TPS Cap+1+2+2··
Head3rd Eye ★+5+9+9··
Head8 Ball Beanie ★+2+5+5··
HeadBOOB Cap ★+4+8+8··
HeadBTC Beanie+1+2+2··
HeadBTC Cap+3+6+6··
HeadBalls Cap+2+3+3··
HeadBlue Bucket Cap+1+2+2··
HeadBlue Laser ★+1+2+2··
HeadBob Hair+1+2+2··
HeadBoob Cap+2+4+4··
HeadButtcoin Cap+2+5+5··
HeadChog Cap+4+8+8··
HeadChoggie Beanie+3+6+6··
HeadChoggie Cap+3+7+7··
HeadCloud Cap·+1+1··
HeadClown Nose+1+3+3··
HeadCrown+3+7+7··
HeadDemon Horn ★+3+6+6··
HeadDiamond ★+3+7+7··
HeadDollar Cap+2+3+3··
HeadDurag+1+1+1··
HeadETH Cap ★+1+3+3··
HeadGold Thorn ★+3+7+7··
HeadGray Bucket Cap+1+2+2··
HeadHead Wrap ★+2+4+4··
HeadHoly Seal ★+2+4+4··
HeadHorny Cap+3+6+6··
HeadJEET Cap+1+2+2··
HeadJapan Headband+1+2+2··
HeadJeet Cap ★+2+5+5··
HeadMCGA Cap+3+5+5··
HeadMCGA+2+5+5··
HeadMEGA Chog+1+2+2··
HeadMMGA Cap+1+1+1··
HeadMafia Hat ★+2+5+5··
HeadMon Beanie+2+4+4··
HeadMon Cap+1+2+2··
HeadNEET+2+3+3··
HeadOrange Bucket Cap+1+2+2··
HeadPeace Cap ★+5+11+11··
HeadPeace hat+4+8+8··
HeadPlumber+2+5+5··
HeadPoison Shroom ★+3+6+6··
HeadPurple Horn ★+5+10+10··
HeadRETARD Cap+2+4+4··
HeadRH Beanie+3+7+7··
HeadRainbow Wig+1+3+3··
HeadRed Bandana ★+5+11+11··
HeadRed Headband+2+4+4··
HeadRed Horn ★+4+7+7··
HeadRed Peace Cap+1+1+1··
HeadRobber+1+2+2··
HeadRussian Hat+3+6+6··
HeadSilver Thorn ★+1+2+2··
HeadSilver wreath ★+4+8+8··
HeadSpartan Helmet+4+7+7··
HeadStar Cap+2+5+5··
HeadTISM Cap+2+4+4··
HeadTaped Banana ★+4+8+8··
HeadThunder Cap+1+2+2··
HeadVoid Horn ★+5+11+11··
HeadWAGMI Cap+1+1+1··
HeadWizard Beanie+3+5+5··
HeadWizard Hat+2+4+4··
Headdevil horn ★+4+7+7··
AccessoryCigar···+1·
AccessoryCoin··+4+5·
AccessoryFwog·+2··+1
AccessoryGreen Candle+3·+4··
AccessoryHeart··+1+1·
AccessoryKnife·+1·+2·
AccessoryPEPE··+5·+3
AccessoryRed Candle··+1·+1
AccessorySB+2···+3
FormChog+1+2·+1·
FormSkull+2+4·+3·
TierCommon·····
TierEpic+5+5+5+5+5
TierLegendary+8+8+8+8+8
TierRare+2+2+2+2+2
TierUncommon+1+1+1+1+1
NakedNo·····
NakedYes··+1··
AuraAqua Aura+2·+3·+5
AuraBurning Aura+1·+2·+4
AuraClean+1·+1·+2
AuraCool Aura+3·+4·+7
AuraElectric Shock ★+1·+1·+2
AuraFiery Aura+3·+5·+8
AuraFire+1·+1·+2
AuraGreen Aura+3·+5·+9
AuraLight Purple+2·+3·+5
AuraMint+2·+3·+5
AuraPink Mist ★+4·+6·+10
AuraPurple+2·+4·+6
AuraRose Aura+2·+3·+5
AuraRose Scent+4·+6·+11
AuraRoyal Aura+3·+4·+6
AuraRoyal Blue Aura+1·+1·+2
AuraRoyal Blue ★+4·+7·+11
AuraSmoke+3·+5·+8
AuraViolet+1·+2·+3
AuraWhite Aura ★+2·+2·+4
AuraWind+3·+4·+7
AuraYellow Aura+3·+4·+7

Career on chain

For each season the app builds a Merkle tree of (season, tokenId, points, wins, losses, bestStreak) leaves and stores only the root in ChaosLedger. Contracts hold no NFTs and no funds. A profile's Verified badge re-checks its proof in your browser and compares the root with the contract. Seasons are 168 rounds (one week).

Verify it yourself

// Verify any event with nothing but Node 20+ and this repository.
//   git clone https://github.com/victorhez/ChogChaosLeague.git && cd ChogChaosLeague && npm i
//   npx tsx scripts/verify.ts r168-e3
// The script fetches the seed block from Monad, rebuilds the round,
// re-runs the engine and compares the log hash.

Or press Replay on any event page. It re-runs the engine in your browser and compares log hashes. You can also ask Monad's RPC for the seed block hash from that page.

Honest limits