ETHERSAND_OS_v1.0 // POWER-ON SELF-TEST
[ 0.001 ] cellular automaton .................. OK
[ 0.045 ] palette ........................... 32 colors loaded
[ 0.092 ] grid 256×144 ..................... 36864 cells
[ 0.124 ] elements ........................... 36 rules registered
[ 0.165 ] viem · mainnet rpc ................. ready
[ 0.218 ] system ready ......................
ETHERSAND_OS_v1.0
36 elements 256×144 grid cellular automaton uniswap v4 hook permissionless treasury 50% burn on packs 5% royalty on creations 0 backends 0 admin keys mainnet · ethereum 36 elements 256×144 grid cellular automaton uniswap v4 hook permissionless treasury 50% burn on packs 5% royalty on creations 0 backends 0 admin keys mainnet · ethereum
ENGINE RUNNING
FPS 60
FRAME 0
GRID 192×108
ACTIVE 0
SCENE SAND_RAIN
LIVE · falling sand sandbox · ethereum mainnet

A sandbox
that survives
the tab close

A 36-element pixel cellular automaton that runs entirely in your browser at 60 frames per second, where you can paint sand into water and drop fire on plants. When you make something good, mint the canvas as an on-chain ERC-721, with the simulation running locally and the chain holding the receipt.

v1.0·2026
100M SAND cap·32M initial
contract authority·renounced
DRAG LMB SAND · RMB WATER · MMB LAVA · SHIFT ERASE
scroll
§ 01 · Proposition

Falling-sand games are good. Owning the result of a falling-sand game is new.

Powder Toy and Sandspiel taught half a generation what cellular automata can do in a browser. Both are masterpieces of single-developer iteration. Both are also fundamentally tab-bound: you paint, you watch, the tab closes, the canvas is gone. There's no mechanism to keep what you discovered.

EtherSand keeps the part that's fun (a fast local simulation) and adds one new layer: ownership. Every element you can paint with is an ERC-1155 token in your wallet. Every snapshot you mint is an ERC-721 with the canvas data stored on chain in RLE. Even the global weather - driven by Uniswap v4 swap activity - is real on-chain state every player reads.

It's not the chain doing the simulation. The chain doesn't know what you're painting and doesn't care. The chain does what the chain is good at: it remembers who owns what, and it makes the rules immutable.

StatePERSISTENT
N_Particles1,048,576
Backends0
SLOT_01 · PROPOSITION
Cells per tick
36,864@60Hz
Local cellular automaton256 × 144 grid · 32-bit packed cells
§ 02 · The 36

Every element
has a written rule

No template reuse. No "well, fire just burns wood" shorthand. Each of the 36 element types has a hand-written updateFn(c, x, y, read, write) that explicitly defines its motion, lifetime, temperature behaviour, and every neighbour interaction.

Common elements are free at registration. Uncommon, Rare, and Legendary drop from mystery packs paid in $SAND. Tap any tile to paint it. The canvas runs the same engine the full game uses.

Tier filter: 12 common · 10 uncommon · 8 rare · 6 legendary

SANDBOX
BRUSH SAND
192×108
FRAME 0
active: SAND
§ 03 · Physics

Rules you can read

The engine is 700 lines of pure JavaScript. No framework, no state library, no ECS. Each rule is a pure function that reads from the previous tick's grid and writes to the next. Race-free by construction.

// Lava - id 13. Falls slow. Reacts on contact.
function lavaRule(c, x, y) {
  // neighbour interactions first
  for (const [dx, dy] of NEIGH4) {
    const n = read(x+dx, y+dy) & ID;
    if (n === WATER) {
      setW(x,    y,    pack(STONE, 0, 200));
      setW(x+dx, y+dy, pack(STEAM, 0, 220));
      return;
    }
    if (n === SAND)
      setW(x+dx, y+dy, pack(GLASS, 0, 200));
    if (n === ICE || n === SNOW)
      setW(x+dx, y+dy, pack(WATER, 0, 200));
    if (isFlammable(n))
      setW(x+dx, y+dy, pack(FIRE, 0, 220));
  }
  // motion: 50% chance to fall, slowing the cascade
  if (rand2() === 0) return;
  if (tryFall(c, x, y)) return;
}

Lava reacts on contact. When a Lava cell finds adjacent Water, both transmute: Lava → Stone, Water → Steam. Sand on contact becomes Glass. Flammables ignite. The rule runs ~once per millisecond per cell, deterministically.

§ 04 · The Hook

Swaps make weather

A custom Uniswap v4 hook intercepts every swap on the SAND/ETH pool. It overrides LP fees per market mood, takes 0.25% of swap volume to the treasury, and writes a global WeatherState that every connected sandbox renders. Big sells trigger storms. Big buys trigger golden rain.

Step 01

Swap on Uniswap v4

User trades SAND/ETH on the canonical pool. Hook intercepts beforeSwap and afterSwap.

Step 02

SandHook computes mood

Reads price vs 60-bucket TWAP. Classifies as Storm / Cloudy / Calm / Clear / Sunny / Heatwave. Sets dynamic LP fee. Detects whale moves.

Step 03

SandCore stores weather

Hook is the only writer of WeatherState. Every connected client polls it every 30s. All sandboxes render the same storm.

Storm

Acid rain in every sandbox

price < -20%
Cloudy

Snow drifts down

-20% to -5%
Calm

Aurora, no physics change

-5% to +5%
Clear

Standard physics, no event

+5% to +20%
Sunny

Golden rain falls

price > +20%
Heatwave

Ambient temp +20

sustained sunny
§ 05 · $SAND

A small
capped
deflationary
token

Pack opens burn 50% of cost. Creation mints burn 50% of cost. Hook fees route 5% to permanent burn. Most distribution paths shrink the float; the only inflationary path is yield from hook fees, capped by the hard cap of 100M.

The deployer holds the entire 32M initial supply. Use is restricted by social contract: seed liquidity on the SAND/ETH pool, fund the first-week airdrop, retain a small partnership reserve. No team allocation. No vesting. No insiders.

NameEtherSand · SAND
Decimals18
Initial supply32,000,000SAND
Hard cap100,000,000SAND
Mint authority2 contracts (immutable)
PermitEIP-2612

Hook fee distributionper swap, after 5% burn

LP yield 50%
Creators 25%
Stakers 20%
Burn 5%
Distribution is permissionless. Anyone can call claimLP / claimCreators / claimStakers for themselves. No admin trigger, no delay window, no lockup. Stakers earn weighted by element rarity (legendary 4× rare).
Common pack
100SAND
5 rolls · 50% burn / 50% treasury
Common70.0%
Uncommon25.0%
Rare4.9%
Legendary0.1%
Rare pack
500SAND
5 rolls · 50% burn / 50% treasury
Common-
Uncommon60.0%
Rare35.0%
Legendary5.0%
Legendary pack
2,500SAND
5 rolls · 50% burn / 50% treasury
Common-
Uncommon-
Rare70.0%
Legendary30.0%
§ 06 · Trajectory

Ship, iterate, add depth

The launch is intentionally minimal. Future versions add depth without changing the contract surface - every contract is immutable, so every expansion is a new deployment alongside.

Q1 2026 · live

v1.0 - The Sandbox

36 fully-implemented elements. ERC-1155 elements + ERC-721 creations + $SAND token. Mystery pack opener. Uniswap v4 hook driving global weather. Treasury auto-distribution.

Q2 2026

v1.1 - Multi-canvas

Persistent local canvas slots. Named save-states. Shareable canvas URLs that other players can open and continue painting from.

Q2 2026

v1.2 - High-resolution

384 × 216 grid for capable hardware. Web Worker integration to keep 60FPS at the larger size. New ambient particle effects.

Q3 2026

v1.3 - Communal canvases

On-chain shared canvases any registered player can paint to. 24-hour rotating snapshot auto-mints to the most-active painters of that day.

Q3 2026

v1.4 - Element evolution

Combine elements via on-chain recipes. Sand + Heat + Pressure → Glass. Recipe NFTs grant a small yield share to discoverers.

Q4 2026

v2.0 - Realm seasons

Quarterly themed events with limited-edition legendary elements. Each season's elements fork off from the stable core; old seasons stay playable.

indefinite

Open-ended - Community ownership

Once pool depth and creator base are healthy, deployer renounces remaining helper authority. Treasury becomes the sole point of central coordination, governed entirely by its immutable distribution policy.

§ 07 · Council

Asked & answered

01
Is the simulation actually on chain?
+
No. Putting 37k cells through hundreds of rule evaluations per second on the EVM would cost dozens of ETH per minute. The simulation runs locally in your browser. The chain handles ownership, packs, NFTs, and the global weather state. Everything you want trustlessly verifiable is on chain. Everything that just needs to be fun stays in your browser.
02
Why is element ownership on chain then?
+
Because what you can paint with is the meaningful resource of the game. Common elements are free at registration. Rare and legendary elements cost $SAND and come from packs. The game's economic loop - discover new elements through packs, paint with them, mint snapshots - is enforceable only if the chain holds the receipts.
03
What stops me from grinding pack rolls?
+
Each pack roll is seeded by keccak256(block.prevrandao, msg.sender, packCounter). packCounter is a global incrementing nonce so opening twice in the same block gives different seeds. block.prevrandao is constant within a block, so reverting and replaying inside one block produces the identical roll - you can't fish for better outcomes. The only way to "reroll" is to wait for a new block, which is just fresh randomness.
04
Why Uniswap v4 specifically?
+
v4 hooks are the only EVM primitive that lets a contract intervene in every swap on a pool without trusted intermediaries. We need that to drive the weather. v3 oracles can be read but can't react. v4 hooks fire on every action and can write arbitrary state. The cost is the hook address must encode permissions in its lower 14 bits - we mine a CREATE2 salt that satisfies that constraint at deploy time.
05
What does the hook actually do per swap?
+
Three things. (1) It overrides the LP fee per swap based on a mood derived from a 1-hour TWAP. Fees lean against the trend: storms tax sellers, sunny weather rewards buyers. (2) It takes 0.25% of every SAND swap volume and forwards it to Treasury for the four-pool distribution. (3) It detects whale-sized trades (≥ 50k SAND single-tx) and writes a new WeatherState into SandCore. All clients pick up the new weather within 30 seconds.
06
Why is the design so austere?
+
Because the sandbox is the visual. The site exists to explain and direct you to the game. Every pixel of UI that isn't the actual cellular automaton is treated as overhead - kept minimal, monospace, phosphor-on-black. We didn't want this to look like another startup landing page. We wanted it to look like the inside of a CRT.

The sandbox is open

Open the page. Paint. Discover what 36 hand-written rules do when they touch each other.

OPEN SANDBOX