A reversible wargame, on chain

Minpentai

In Snowmoon, the children of Dzego play a wargame in which nothing is ever destroyed, only rearranged. $MINP puts it on chain: a thirty-two by thirty-two board, one rule, and two symbols that must outlive each other.

Try the rule by hand Read Snowmoon
32 × 32 · the actual rule, live turn 000000 · tiling even
§ 01

The rule

“For each 2x2 block, if exactly 3 cells filled, rotate 180°.”
— Fin, ch. 4

The board is cut into two-by-two blocks. On even turns the cut begins at the corner; on odd turns it shifts one cell down and one across, so every block is stitched to its neighbours. A block holding exactly three stones turns half a revolution. Every other block holds still.

Nothing is created and nothing is lost. The rule is its own inverse: apply it twice under the same partition and the board is exactly as it was.

Minpentai.solstep()
// board: 32×32 bits packed into uint256[4]
// even turn: tiling at (0,0) · odd turn: (1,1)
function step(uint256[4] memory b, uint256 turn)
    internal pure returns (uint256[4] memory n)
{
    n = b;
    uint256 o = turn & 1;
    for (uint256 y = 0; y < 32; y += 2) {
        for (uint256 x = 0; x < 32; x += 2) {
            uint256 x0 = (x + o) & 31; uint256 x1 = (x0 + 1) & 31;
            uint256 y0 = (y + o) & 31; uint256 y1 = (y0 + 1) & 31;
            uint256 tl = get(b, x0, y0); uint256 tr = get(b, x1, y0);
            uint256 bl = get(b, x0, y1); uint256 br = get(b, x1, y1);
            if (tl + tr + bl + br == 3) {
                // rotate 180°: tl↔br, tr↔bl
                n = put(n, x0, y0, br); n = put(n, x1, y1, tl);
                n = put(n, x1, y0, bl); n = put(n, x0, y1, tr);
            }
        }
    }
}
§ 02

By hand

Six by six, the same rule, the same alternating partition. Place stones, then step. The dashed lines show where the next cut falls; the blocks outlined in green are the ones about to turn.

turns: 0 · tiling: even 0 blocks will turn
spacestep Bstep back Rreset

Step back undoes the last turn by applying the rule again under that turn’s partition. There is no history kept, and none is needed. The sandbox wraps at its edges.

§ 03 · A small proof

Twice is never

A four-by-four board, cut at the corner. Two of its blocks hold exactly three stones; the other two do not.

S₀

The rule is its own inverse: applied twice under the same partition, every state returns.

16/16 cells match S₀
§ 04

The board

A B

One thousand and twenty-four cells, packed into four 256-bit words. Each player’s symbol is revealed onto opposite corners — A at the bottom-left, B at the top-right — and from there the rule does the rest.

Grid
32 × 32, square
Storage
uint256[4]
Seeds
One 3×3 symbol per player, opposite corners
Reach
New stones within Chebyshev distance 30 of a live copy of your symbol
§ 05

The match

  1. I
    Commit

    Each player publishes the hash of a 3×3 symbol and a secret nonce. Nobody sees anybody’s face yet.

  2. II
    Reveal

    Symbols and nonces are opened and checked against the hashes, then placed: A bottom-left, B top-right.

  3. III
    Turns

    The rule runs. Even turns cut at (0,0), odd turns at (1,1). No player touches the board.

  4. IV
    Intervention

    Every 1,000 turns a window opens for 25 blocks. Each stone placed burns 100 MINP, within Chebyshev 30 of a live copy of your symbol — you name the anchor as witness.

  5. V
    Claim

    When a symbol has no live copies left, anyone may call claimWin. The survivor receives a soulbound Trophy.

§ 06

Symbols

Nine cells, five hundred and twelve possible faces. Draw one. Below it is the number the contract would know it by, and the commitment you would publish to open a match without giving it away.

You are looking at what your identity would look like on the board.

Pattern
0x155 = 341 of 511
bits 0–8 · 101 010 101
Nonce
0x…
Commitment
keccak256(abi.encode(uint256 symbol, bytes32 nonce))
0x…
Notable early symbols
§ 07

The coin

A fair launch. No team allocation, no presale. The coin is the fuel of intervention: every stone placed mid-game is paid for by burning it.

Supply
1,000,000,000 MINP
Launch
100% into a single-sided Uniswap V3 pool, $10k → $1M FDV
Tax
2% on buys, none on sells (a V3 SwapRouter constraint)
Steering pot
The buy tax is swept to it, in ETH
§ 08

Contracts

Contract Role Address
MINPThe coin, with the buy taxpending deployment
MinpentaiMatches, the board, the rulepending deployment
TrophySoulbound, minted to the survivorpending deployment
SteeringHolds the swept tax, in ETHpending deployment
§ 09

Live matches

Boards in play, read from the chain. What you see below is a specimen.

Match Players Turn Symbols Status View

This will populate from onchain events once contracts are deployed.

Choose a face. Keep it alive.

Design your symbol Read Snowmoon Uniswap · at launch

Sister project: $ZC · zipcoin