← Back to Projects
Kana Mutti cover
Web Game · Sealed Reveal

Kana Mutti

කණ මුට්ටි - the blindfolded pot-smashing game from the Avurudu festival, turned into a cash-out game where you can’t read the board until the round is over.

Role
  • Developer
  • Game designer
Genre
  • Cash-out ladder
  • 3 risk levels
Return
97% (Careful, Risky)
Stack
  • Next.js 15
  • React 19
  • three.js
Accessibility
WebGL + full DOM mirror
Fairness
Block seed, sealed reveal

01The Game

Four clay pots hang from a rope tied between two trees. You place a bet, choose how many of the four pots are empty, and then guide a blindfolded striker to one pot at a time. Every pot full of coins raises your multiplier, but an empty one ends the round.

The ladder itself isn’t the interesting part. The hard part is trust. Afterwards, anyone has to be able to check the board (that’s what provably fair means), but while you’re still picking, it has to be impossible to work out. Kana Mutti is the game in the arcade that shows how to do both at the same time.

Verifiable

The board is built from a public block value that anyone can check independently, rather than a hidden roll on a server.

Secret while it matters

The shuffle code is included in the game’s files, so the seed is kept hidden until the round is over.

A festival pastime

A blindfolded striker, hanging pots, coins and broken shards. It’s a festival game from Avurudu, played in 3D.

02Screenshots

These screenshots were captured straight from the game. Tap any of them to see it bigger.

03Core Loop

  1. 1

    Stake & risk

    Choose Careful (1 empty pot), Risky (2) or Daredevil (3).

  2. 2

    Shuffle

    The block value and a round counter seed mulberry32, which then shuffles the four pots using a Fisher-Yates shuffle.

  3. 3

    Sealed

    The trust badge shows SEALED, and the audit details are kept somewhere the interface can’t read them.

  4. 4

    Smash

    Point the striker at a pot. Coins raise your multiplier, and an empty pot ends the round.

  5. 5

    Unsealed

    Whether you cash out, hit an empty pot or clear the whole board, the block, hash, counter and board are all revealed.

04Key Features

Three risk levels

More empty pots means bigger payouts. With only four pots, two of the risk levels would end up with the same odds, so that tie is settled in the player’s favour.

Three-state trust chip

The badge shows FAIR before a round, SEALED during one and the block number once it’s over. It’s built in real HTML with a data table, closes with Escape and keeps keyboard focus inside while it’s open.

Blindfolded striker

The striker walks over and swings at the pot you chose, and a hit bursts into coins and shards.

Accessible from day one

There’s an HTML copy underneath the WebGL scene, so you can play with a keyboard or a screen reader.

WebAudio

Festival sound effects, all generated in code.

05The Maths

The multiplier after k safe picks is one over the chance of drawing k safe pots in a row without putting any back. That’s a standard hypergeometric calculation rather than a made-up curve, and it’s then scaled by each risk level’s return.

The ladder

m = Π (n − j) / (n − d − j) for j < k, multiplied by the level’s return, which is 0.97 for Careful and Risky.

The Daredevil promise

With four pots, choosing 1 of 4 and 3 of 4 give the same number of combinations, so Careful and Daredevil would end up with the same top prize. That would break the promise that more empty pots means bigger payouts. Daredevil keeps that promise on purpose, and so it pays back 175%.

No positional bias

I ran an exact copy of the shuffle code for 400,000 rounds per risk level, across the full range of block values. Empty pots landed in each position 24.96-25.07%, 49.80-50.17% and 74.84-75.09% of the time, and the biggest difference from perfect was just 0.39 percentage points.

Prime-stride nonce

New blocks come roughly every 12 seconds, but rounds can be quicker than that. So I use a counter that never resets and steps forward by a prime number, which keeps back-to-back boards independent. Boards repeat about 1 time in 6, which is exactly what you’d expect from two independent draws.

06Under the Hood

The seal is a ref

The audit details are stored in a ref that the rendering code can’t read. The visible state resets to empty every round and is only filled in at three moments: when you cash out, when you hit an empty pot, or when you clear the board.

Server seed route

The server route keeps its token private, retries when the block clock lags, caches good results for 9 seconds and failures for 5 seconds, backs off more each time it fails, and always responds with a 200 along with a flag if it had to fall back.

Injectable generator

The shuffle takes its random generator as an input, so I could switch the seed source from the browser’s crypto RNG to the blockchain block without touching the shuffle logic.

Chrome-free corner

The trust badge sits in the bottom-left corner, the one spot the 3D scene never draws into during any phase.

07Challenges & Solutions

ChallengeIf the seed were published at the start of a round, a player could run the public shuffle code themselves and know what’s in every pot.
SolutionThe seed is still public, but it’s held back until the round is over, and the game shows that it’s sealed instead of hiding the fact.
ChallengeThe poker game kept its cards secret by dropping the blockchain seed altogether, but that means nobody can check it afterwards.
SolutionKana Mutti’s secret only needs to last until you’ve finished picking, so it can have both secrecy and the ability to be checked.
ChallengeTwo quick rounds within the same block would end up with the same board.
SolutionA counter that only ever goes up, stepping by a prime number, is mixed into every round.

08Results & Takeaways

0.39 pp
worst positional deviation over 400k rounds
3
reveal points - nothing else unseals
97%
RTP on Careful and Risky
0
tokens in the client bundle
Next.js 15React 19TypeScript (strict)three.jsWebAudiomulberry32Fisher-Yates
  • A finished 3D game based on an Avurudu pastime, which also serves as the arcade’s reference example of sealed-reveal fairness.
  • Next up: bringing the sealed reveal to the racing games, and moving the results to the server so the seal still holds even if someone tampers with their game.

What I learned

  • Trust features are engineering, not decoration. The seal means something because it’s stored in a ref the rendering code can’t read.
  • Showing a lock icon is better than leaving an empty space that looks like a bug.
  • Each game needs its own kind of fairness. A poker deal has to stay secret forever, but a pot board only needs to stay secret until the round ends.