Skip to main content
This page catalogues the dispute game types, core contracts, and parameters of the OP Stack’s fault proof system. For how the system works, see the Fault proofs explainer and FP system components.
Contract addresses and several parameter values are set per chain. Look up the values for a specific chain in the Superchain Registry or by querying the deployed contracts directly. The standard values on this page are the defaults op-deployer applies to new standard chains, as defined in op-deployer/pkg/deployer/standard/standard.go.

Dispute game types

Every dispute game is created through the DisputeGameFactory with a GameType, a uint32 that selects which registered game implementation the factory clones. The canonical list lives in the GameTypes library. Notes:
  • A game type is only playable on a chain after the DisputeGameFactory owner registers an implementation for it (setImplementation); the owner also sets the bond required to create games of that type (setInitBond).
  • The respected game type (the game type whose results the system accepts for withdrawals and anchor state updates) is stored in the AnchorStateRegistry and can be changed by the Guardian via setRespectedGameType.
  • op-deployer deploys new standard chains with the permissioned game (type 1) as the initial game type.

Core contracts

All fault proof contracts live in the monorepo under packages/contracts-bedrock/src. Per-chain deployment addresses are listed in the Superchain Registry.

Common lookup functions

Standard parameters

Values below are the op-deployer standard-chain defaults. Individual chains can deviate; always confirm against the chain’s deployed configuration.

Bisection game

Timing and finality

Clocks

Each side of a fault dispute game plays against a chess clock:
  • A claim inherits its clock from its grandparent claim (claims at alternating depths belong to alternating teams).
  • A move can no longer be made against a claim once that claim’s clock has accumulated maxClockDuration seconds.
  • When a move would leave the responder with less than the clock extension remaining, the clock is topped up so the responder gets at least the extension time. The extension is clockExtension in the general case, clockExtension * 2 for the move that starts execution-trace bisection (depth splitDepth - 1, to allow time to generate the instruction trace), and clockExtension + challengePeriodSeconds for the move before a VM step (depth maxGameDepth - 1, to allow for large-preimage proposals).

Bonds

  • Creating a game requires the initialization bond for that game type: DisputeGameFactory.initBonds(gameType), set per chain by the factory owner.
  • Every move (attack or defend) requires a bond of exactly getRequiredBond(position). Bonds grow exponentially with depth: the formula in FaultDisputeGame.getRequiredBond charges an assumed 200 gwei base fee on a gas amount that scales from 400,000 gas at depth 0 to 300,000,000 gas at maxGameDepth, so each depth costs roughly 9.5% more than the one above it. A single move costs 0.08 ETH at depth 0 and 60 ETH at depth 73.
  • Playing a game to maximum depth costs far more than the deepest single bond, because a bond is posted for every move along the path. Summing getRequiredBond over depths 1 through 73 gives roughly 691 ETH in total bonds (about 361 ETH for the side moving at odd depths and 330 ETH for the side at even depths), and the total is dominated by the deepest moves: depths 70 through 73 alone account for roughly 210 ETH. FaultDisputeGame.getRequiredBond is the source of truth for exact values.
  • Bonds are held in the game’s DelayedWETH contract and paid out only after the game resolves and is finalized, and after the DelayedWETH unlock delay passes.
  • Distribution mode: when a game closes it selects a BondDistributionMode. A proper game (created by the DisputeGameFactory, not blacklisted, and not retired) distributes bonds normally: the bond of every successfully countered claim is paid to the countering party, and uncontested claims are refunded. An improper game enters refund mode and returns every bond to its original depositor.

Game statuses

The GameStatus enum in Types.sol:

Next steps