⚠️ Alpha · testnets only. ChainRender is in active alpha and deployed on testnets only — Ethereum Sepolia, the Robinhood Chain Testnet, and the Circle Arc Testnet — not on any mainnet. Contracts, addresses, and APIs may change. Do not use with real funds or production assets.
Contracts

Security & Reviews

No external audit. No ChainRender contract has had an external security audit. Every review below was done inside the project: by the maintainer, or by an AI agent working for the project, in some cases an agent that had not written the code. They found and fixed real defects, but they are not an independent audit. All ChainRender contracts are deployed on testnets only, and they are ownerless and immutable: a defect in a deployed contract cannot be patched, only superseded by a new deployment.

This page lists every review that has been done, what it covered, what it found and what it did not cover. Before you put value in a ChainRender contract, read the entry for that contract. A contract not listed here has had no review beyond its own tests.

Status by contract

Contract Review Open findings Deployed on
GameChannel Game stack v1: known limits (superseded by v2) V1-1 (High), V1-2 (High), V1-3 (Low), V1-4 (Medium) Robinhood Chain Testnet, Circle Arc Testnet, Ethereum Sepolia
GameChannelV2 Game stack v2: independent review, two passes none Robinhood Chain Testnet, Circle Arc Testnet, Ethereum Sepolia
GameLobby Game stack v1: known limits (superseded by v2) V1-1 (High), V1-2 (High), V1-3 (Low), V1-4 (Medium) Robinhood Chain Testnet, Circle Arc Testnet, Ethereum Sepolia
GameLobbyV2 Game stack v2: independent review, two passes none Robinhood Chain Testnet, Circle Arc Testnet, Ethereum Sepolia
GameMoveBoard Game stack v2: independent review, two passes none Robinhood Chain Testnet, Circle Arc Testnet, Ethereum Sepolia
RockPaperScissorsRulesV2 Game stack v2: independent review, two passes none Robinhood Chain Testnet, Circle Arc Testnet, Ethereum Sepolia
TicTacToeRules Game stack v2: independent review, two passes none Robinhood Chain Testnet, Circle Arc Testnet, Ethereum Sepolia

Deployment is read from chains.json; for addresses see Deployed Addresses.

Game stack v2: independent review, two passes

Done by internal — an AI agent that had not written the code, two passes
Date 2026-10-27
Scope GameChannelV2, GameLobbyV2, RockPaperScissorsRulesV2, TicTacToeRules, GameMoveBoard
Record docs/185-backend-contracts-games-v2-batch2.md §2.1 in the repository
Tests test/GameChannelV2.ts
Verdict Six findings, all fixed before deployment, each with a regression test. The second pass found no further exploit by a third party or an opponent against a correctly set-up player.
Finding Severity Status What it was Fix
F1 High fixed An ERC-1271 wallet or EIP-7702-delegated EOA could switch its signatures off and on, to hide or re-sign moves and block the equivocation proof. Each player registers a signing key at open; only ecrecover against it counts.
F2 Medium fixed A declined draw offer could be accepted later to escape a loss. Final.validUntil, enforced (Expired).
F3 Low–Medium fixed The due player could settle a winning history after missing the challenge deadline. While Challenged, settlement is accepted only before the deadline.
F4 Medium fixed A challenge could be posted from before the co-signed checkpoint. It must reach at least the checkpoint's move number (StaleCheckpoint).
R1 Low–Medium fixed A checkpoint that lands after a stale challenge could not answer it. respondFromCheckpoint.
R2 Medium fixed A smart account joining with join() registered an address that can never sign, and would forfeit. join and createOffer(signer = 0) revert NeedsSigner for contract code other than an EIP-7702 designator; such accounts use joinWithSigner.

Not covered, or limits to know:

  • The rules contract is fully trusted: a game is only as fair as its IGameRulesV2.
  • The equivocation rule is strict: a client must never re-sign a move.
  • Response windows are wall-clock time.
  • The game key is a hot key in the browser: it holds no stake, but whoever has it can play for you.
  • Rock-paper-scissors commitments are not bound to a game id.

Game stack v1: known limits (superseded by v2)

Done by internal — found while building v2, each reproduced by a test
Date 2026-10-27
Scope GameChannel, GameLobby
Record docs/185-backend-contracts-games-v2-batch2.md §1 in the repository
Tests test/GameChannel.known-limits.ts
Verdict Four defects. v1 is immutable, so they cannot be fixed: it stays deployed and callable, and v2 replaces it. Do not use v1 for stakes.
Finding Severity Status What it was Fix
V1-1 High not fixable (immutable) — use v2 Any account can end any Open or Disputed v1 game as a draw (settleWithHistory replays any signed prefix, including the empty one, with no caller check). No funds can be stolen, but a winner is never guaranteed to be paid. —
V1-2 High not fixable (immutable) — use v2 A GameLobby offer with maxPlayers > 2 permanently strands the stakes of player 3 and later. —
V1-3 Low not fixable (immutable) — use v2 A lobby game id can be pre-opened by anyone, making the filling join revert (griefing only: the offer can be cancelled and every stake refunded). —
V1-4 Medium not fixable (immutable) — use v2 Without a force-move, a staller cannot be made to move; combined with V1-1, a loser always reaches a draw. —

Immutability review of the permanent floor

Done by internal — static analysis of the source, cross-checked against the tests
Scope the floor: 50 implementation contracts under contracts/ (not examples, mocks or tests)
Record docs/82-ChainRender-immutability-review.md in the repository
Verdict Passes the four immutability criteria (ownerless/immutable, append-only content-addressed state, bounded, fails closed). Five decide-before-freeze items, none a security hole.

Not covered, or limits to know:

  • Covers immutability only. It is not a functional security audit: arithmetic, escaping edge cases and resolver-specific logic are out of its scope.

Privacy audit (identity and claim privacy)

Done by internal — design review against ethereum/kohaku
Scope ChainRender's identity and claim privacy features
Record docs/112-privacy-audit-and-kohaku-lessons.md in the repository
Verdict A design review, not a code audit. Two gaps documented, not closed: a viewer's reads reveal what it looks at to its RPC provider, and there is no seam between rendering and value (shielded-pool) privacy.

Not covered, or limits to know:

  • Every value an app writes on-chain is public. Since @chainrender/client 0.14.0 the viewer's sign panel says so for typed-in values, and honestyFindings() / MCP chainrender_review flag an app that does not.