♟ chess.meme

How it works

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.

Playing

  1. Pick a chain on the landing page, then connect a wallet on that chain.
  2. Start a new game and choose its type (First-tx, Consensus, or Duel), or open an existing game by its id, a shared link, or the in-app game list.
  3. Click a piece, then its destination. In the communal games anyone can play the side to move; in a Duel you play your own side.
  4. The board follows the full rules of chess, so only legal moves go through — castling, en passant, promotion, and every draw rule included (FIDE-complete).

Three ways to play

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.

First-txcommunal · fast

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.

Consensuscrowd votes · strategic

The crowd decides. Each turn, players back a move and the popular choice is played. Coordinated, strategic, hive-mind chess.

Duel1v1 · skill

A head-to-head match. Two players, each on their own side, playing for the win. Pure skill.

Fair by design

  • Everyone plays on equal footing. In the communal games (First-tx and Consensus), you put up a small $CHESS bond to take part, and you get it back at the end of the game.
  • Winners earn. Win a game and you share in the rewards. A Duel is a straight competitive match between two players.
  • The rewards are yours to claim. The reward pools are pre-funded and flow one way, so your winnings are always there for you to collect.

Secure by design

  • The reward vaults have no owner and no admin key. Tokens leave in exactly one way: a winner claiming on a finished game. Your winnings are always yours.
  • Rewards are yours to claim whenever you like — settlement is simple and reliable.
  • The contracts are immutable, so the rules you play by stay exactly as they are.

Multichain (not cross-chain)

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.

For agents & developers

Because it's fully on-chain, a bot can play with just an RPC and a wallet. Reads are free; writes are wallet transactions.

  • Read the board — 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.
  • Decode a square — 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.
  • Make a move — 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.
  • Open a game — 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).
  • Consensus turns — vote(uint256 id, uint8 from, uint8 to, uint8 promo) during the window, then resolveTurn(uint256 id) to apply the winning move.
  • Settle at game end — claimBond(id) to get your bond back and claimReward(id) to collect winnings. forceDraw(id) and claimTimeout(id) resolve games that have gone quiet.
Base · base · base.blockscout.com
Game0xA426E6Aa7b94521cF996F5ab37b1cE0b01476396↗
Every token + its one-way reward vault. 100% of the launch dev-buy is locked in these vaults for players; the studio holds none.
TokenToken addressReward vault
$CHESS0xec7333aA38c8337EC9152617042Bf3C746fd20A2 ↗0xB88D3Ed111886A82c56513b3525859303Aa6E333 ↗
$PAWN0x68A2B00299973F01dfC06c83E4cE2152076bfE3A ↗0x1C92eC9090775e2EE886CAcFCa45104796D949bb ↗
$KNIGHT0x3da49aC9284042355f5DCf6396CDfC1b2A0cFFaE ↗0xAA091ED4C237f1D45cf282F1b4cC914965628099 ↗
$BISHOP0xb3E350b709Fae2A89B9555e426d30D4f6BC81B29 ↗0x132ef383F102fB2C7F6CEBAF8981758a6EB5A30E ↗
$ROOK0x896d25ABE23e6b0D2dED0Bc7b91B997a80149322 ↗0x235255560d37161BCFe630A21Cd1cF19b8591183 ↗
$QUEEN0x8f841f4d79519dF21Da2012fe73Fc2BfB6fb4b61 ↗0x2cBa5c96e80B1832DA75eBea07b22d87e72b6FFE ↗
$KING0xe6D0D9d6788Fb8150219DF713e75b3AE8EAa54F8 ↗0xb88B1B6A42cb8dcFa197099C0df1d7B61Be2e106 ↗