Fully on-chain chess, with three ways to play. Every move is a transaction, and the whole board is rebuilt straight from contract state. It runs entirely on-chain.
Pick one when you create a game, and it stays set for that game. They share the same on-chain foundation and differ in who gets to move.
Open to everyone. Anyone can play the side to move, and the first valid move takes the turn. Fast and lively, with the whole crowd joining in.
The crowd decides. Each turn, players back a move and the popular choice is played. Coordinated, strategic, hive-mind chess.
A head-to-head match. Two players, each on their own side, playing for the win. Pure skill.
$CHESS bond to take part, and you get it back at the end of the game.The same contracts run independently on each chain, each with its own $CHESS. A game lives on exactly one chain. Chains run on their own, with no bridging. You pick your chain up front (that's why the URL is chess.meme/<chain>), and each chain has its own world of games.
Because it's fully on-chain, a bot can play with just an RPC and a wallet. Reads are free; writes are wallet transactions.
gameState(id) → (uint256 board, bool blackToMove, uint8 status, bool inCheck). Also movesCount(id) and getMoves(id, offset, limit) → MoveRec[] (from, to, piece, captured, promo, check). No wallet needed.pieceAt(uint256 board, uint8 sq) (pure) returns the piece on square sq (0–63, a1 = 0): 0 = empty, 1–6 = pawn/knight/bishop/rook/queen/king, +8 for black (e.g. 9 = black pawn). The whole position is 64 squares packed 4 bits each into the board word — call it 64 times, or unpack the nibbles yourself.move(uint256 id, uint8 from, uint8 to, uint8 promo). Squares are 0–63 (a1 = 0, h8 = 63); promo is 0, or 2/3/4/5 for knight/bishop/rook/queen.createGame(uint256 moveBond, uint256 timeoutSecs) for a quick communal game, or createGame(GameType gt, uint256 moveBond, uint256 timeoutSecs, CreateOpts opts) to pick the type (gt: 0 = First-tx, 1 = Consensus, 2 = Duel).vote(uint256 id, uint8 from, uint8 to, uint8 promo) during the window, then resolveTurn(uint256 id) to apply the winning move.claimBond(id) to get your bond back and claimReward(id) to collect winnings. forceDraw(id) and claimTimeout(id) resolve games that have gone quiet.| Token | Token address | Reward vault |
|---|---|---|
| $CHESS | 0xec7333aA38c8337EC9152617042Bf3C746fd20A2 ↗ | 0xB88D3Ed111886A82c56513b3525859303Aa6E333 ↗ |
| $PAWN | 0x68A2B00299973F01dfC06c83E4cE2152076bfE3A ↗ | 0x1C92eC9090775e2EE886CAcFCa45104796D949bb ↗ |
| $KNIGHT | 0x3da49aC9284042355f5DCf6396CDfC1b2A0cFFaE ↗ | 0xAA091ED4C237f1D45cf282F1b4cC914965628099 ↗ |
| $BISHOP | 0xb3E350b709Fae2A89B9555e426d30D4f6BC81B29 ↗ | 0x132ef383F102fB2C7F6CEBAF8981758a6EB5A30E ↗ |
| $ROOK | 0x896d25ABE23e6b0D2dED0Bc7b91B997a80149322 ↗ | 0x235255560d37161BCFe630A21Cd1cF19b8591183 ↗ |
| $QUEEN | 0x8f841f4d79519dF21Da2012fe73Fc2BfB6fb4b61 ↗ | 0x2cBa5c96e80B1832DA75eBea07b22d87e72b6FFE ↗ |
| $KING | 0xe6D0D9d6788Fb8150219DF713e75b3AE8EAa54F8 ↗ | 0xb88B1B6A42cb8dcFa197099C0df1d7B61Be2e106 ↗ |