[
  {
    "type": "constructor",
    "inputs": [
      {
        "name": "shook_",
        "type": "address",
        "internalType": "contract IERC20"
      },
      {
        "name": "coordinator_",
        "type": "address",
        "internalType": "contract ShookRandomnessCoordinator"
      },
      {
        "name": "feeRouter_",
        "type": "address",
        "internalType": "contract IShookGameFeeRouter"
      },
      {
        "name": "lobbyDuration_",
        "type": "uint64",
        "internalType": "uint64"
      },
      {
        "name": "randomnessSafetyDelay_",
        "type": "uint64",
        "internalType": "uint64"
      },
      {
        "name": "minimumWager_",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "maximumWager_",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "BPS",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "ONCHAIN_RESPONSE_PERIOD",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "uint64",
        "internalType": "uint64"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "RESIGN_TYPEHASH",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "bytes32",
        "internalType": "bytes32"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "START_RANDOMNESS_DOMAIN",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "bytes32",
        "internalType": "bytes32"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "STATE_TYPEHASH",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "bytes32",
        "internalType": "bytes32"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "TOTAL_FEE_BPS",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "applyMove",
    "inputs": [
      {
        "name": "previous",
        "type": "tuple",
        "internalType": "struct ShookTurnBasedGame.GameState",
        "components": [
          {
            "name": "gameId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "sequence",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "board",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "lastCell",
            "type": "uint8",
            "internalType": "uint8"
          },
          {
            "name": "nextPlayer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "outcome",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Outcome"
          },
          {
            "name": "parentHash",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "cell",
        "type": "uint8",
        "internalType": "uint8"
      }
    ],
    "outputs": [
      {
        "name": "nextState",
        "type": "tuple",
        "internalType": "struct ShookTurnBasedGame.GameState",
        "components": [
          {
            "name": "gameId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "sequence",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "board",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "lastCell",
            "type": "uint8",
            "internalType": "uint8"
          },
          {
            "name": "nextPlayer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "outcome",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Outcome"
          },
          {
            "name": "parentHash",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "cancelUnjoinedGame",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "cancelUnstartedGame",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "cellAt",
    "inputs": [
      {
        "name": "board",
        "type": "uint32",
        "internalType": "uint32"
      },
      {
        "name": "cell",
        "type": "uint8",
        "internalType": "uint8"
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "uint8",
        "internalType": "uint8"
      }
    ],
    "stateMutability": "pure"
  },
  {
    "type": "function",
    "name": "challengeSettlement",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "terminal",
        "type": "tuple",
        "internalType": "struct ShookTurnBasedGame.GameState",
        "components": [
          {
            "name": "gameId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "sequence",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "board",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "lastCell",
            "type": "uint8",
            "internalType": "uint8"
          },
          {
            "name": "nextPlayer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "outcome",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Outcome"
          },
          {
            "name": "parentHash",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "signatureA",
        "type": "bytes",
        "internalType": "bytes"
      },
      {
        "name": "signatureB",
        "type": "bytes",
        "internalType": "bytes"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "claimRefund",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "receiver",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [
      {
        "name": "amount",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "claimTimeout",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "claimWinnings",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "receiver",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [
      {
        "name": "amount",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "coordinator",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "address",
        "internalType": "contract ShookRandomnessCoordinator"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "createGame",
    "inputs": [
      {
        "name": "name",
        "type": "bytes32",
        "internalType": "bytes32"
      },
      {
        "name": "sessionSigner",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "wager",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "outputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "disputeStates",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "outputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "sequence",
        "type": "uint32",
        "internalType": "uint32"
      },
      {
        "name": "board",
        "type": "uint32",
        "internalType": "uint32"
      },
      {
        "name": "lastCell",
        "type": "uint8",
        "internalType": "uint8"
      },
      {
        "name": "nextPlayer",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "outcome",
        "type": "uint8",
        "internalType": "enum ShookTurnBasedGame.Outcome"
      },
      {
        "name": "parentHash",
        "type": "bytes32",
        "internalType": "bytes32"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "eip712Domain",
    "inputs": [],
    "outputs": [
      {
        "name": "fields",
        "type": "bytes1",
        "internalType": "bytes1"
      },
      {
        "name": "name",
        "type": "string",
        "internalType": "string"
      },
      {
        "name": "version",
        "type": "string",
        "internalType": "string"
      },
      {
        "name": "chainId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "verifyingContract",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "salt",
        "type": "bytes32",
        "internalType": "bytes32"
      },
      {
        "name": "extensions",
        "type": "uint256[]",
        "internalType": "uint256[]"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "feeRouter",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "address",
        "internalType": "contract IShookGameFeeRouter"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "finalizeEquivocation",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "finalizeSettlement",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "games",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "outputs": [
      {
        "name": "id",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "name",
        "type": "bytes32",
        "internalType": "bytes32"
      },
      {
        "name": "playerA",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "playerB",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "signerA",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "signerB",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "wager",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "joinDeadline",
        "type": "uint64",
        "internalType": "uint64"
      },
      {
        "name": "targetRound",
        "type": "uint64",
        "internalType": "uint64"
      },
      {
        "name": "startDeadline",
        "type": "uint64",
        "internalType": "uint64"
      },
      {
        "name": "responseDeadline",
        "type": "uint64",
        "internalType": "uint64"
      },
      {
        "name": "pendingSequence",
        "type": "uint32",
        "internalType": "uint32"
      },
      {
        "name": "status",
        "type": "uint8",
        "internalType": "enum ShookTurnBasedGame.Status"
      },
      {
        "name": "starter",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "winner",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "winnerPayout",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "pendingStateHash",
        "type": "bytes32",
        "internalType": "bytes32"
      },
      {
        "name": "finalOutcome",
        "type": "uint8",
        "internalType": "enum ShookTurnBasedGame.Outcome"
      },
      {
        "name": "winningsClaimed",
        "type": "bool",
        "internalType": "bool"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "getDisputeState",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "tuple",
        "internalType": "struct ShookTurnBasedGame.GameState",
        "components": [
          {
            "name": "gameId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "sequence",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "board",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "lastCell",
            "type": "uint8",
            "internalType": "uint8"
          },
          {
            "name": "nextPlayer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "outcome",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Outcome"
          },
          {
            "name": "parentHash",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "getGame",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "tuple",
        "internalType": "struct ShookTurnBasedGame.Game",
        "components": [
          {
            "name": "id",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "name",
            "type": "bytes32",
            "internalType": "bytes32"
          },
          {
            "name": "playerA",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "playerB",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "signerA",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "signerB",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "wager",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "joinDeadline",
            "type": "uint64",
            "internalType": "uint64"
          },
          {
            "name": "targetRound",
            "type": "uint64",
            "internalType": "uint64"
          },
          {
            "name": "startDeadline",
            "type": "uint64",
            "internalType": "uint64"
          },
          {
            "name": "responseDeadline",
            "type": "uint64",
            "internalType": "uint64"
          },
          {
            "name": "pendingSequence",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "status",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Status"
          },
          {
            "name": "starter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "winner",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "winnerPayout",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "pendingStateHash",
            "type": "bytes32",
            "internalType": "bytes32"
          },
          {
            "name": "finalOutcome",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Outcome"
          },
          {
            "name": "winningsClaimed",
            "type": "bool",
            "internalType": "bool"
          }
        ]
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "hashResignation",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "player",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "bytes32",
        "internalType": "bytes32"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "hashState",
    "inputs": [
      {
        "name": "state",
        "type": "tuple",
        "internalType": "struct ShookTurnBasedGame.GameState",
        "components": [
          {
            "name": "gameId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "sequence",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "board",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "lastCell",
            "type": "uint8",
            "internalType": "uint8"
          },
          {
            "name": "nextPlayer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "outcome",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Outcome"
          },
          {
            "name": "parentHash",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "bytes32",
        "internalType": "bytes32"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "initialState",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "outputs": [
      {
        "name": "state",
        "type": "tuple",
        "internalType": "struct ShookTurnBasedGame.GameState",
        "components": [
          {
            "name": "gameId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "sequence",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "board",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "lastCell",
            "type": "uint8",
            "internalType": "uint8"
          },
          {
            "name": "nextPlayer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "outcome",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Outcome"
          },
          {
            "name": "parentHash",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "joinGame",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "sessionSigner",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "lobbyDuration",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "uint64",
        "internalType": "uint64"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "maximumWager",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "minimumWager",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "nextGameId",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "openDispute",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "checkpoint",
        "type": "tuple",
        "internalType": "struct ShookTurnBasedGame.GameState",
        "components": [
          {
            "name": "gameId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "sequence",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "board",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "lastCell",
            "type": "uint8",
            "internalType": "uint8"
          },
          {
            "name": "nextPlayer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "outcome",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Outcome"
          },
          {
            "name": "parentHash",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "signatureA",
        "type": "bytes",
        "internalType": "bytes"
      },
      {
        "name": "signatureB",
        "type": "bytes",
        "internalType": "bytes"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "proposeTerminalSettlement",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "checkpoint",
        "type": "tuple",
        "internalType": "struct ShookTurnBasedGame.GameState",
        "components": [
          {
            "name": "gameId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "sequence",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "board",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "lastCell",
            "type": "uint8",
            "internalType": "uint8"
          },
          {
            "name": "nextPlayer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "outcome",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Outcome"
          },
          {
            "name": "parentHash",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "checkpointSignatureA",
        "type": "bytes",
        "internalType": "bytes"
      },
      {
        "name": "checkpointSignatureB",
        "type": "bytes",
        "internalType": "bytes"
      },
      {
        "name": "terminal",
        "type": "tuple",
        "internalType": "struct ShookTurnBasedGame.GameState",
        "components": [
          {
            "name": "gameId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "sequence",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "board",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "lastCell",
            "type": "uint8",
            "internalType": "uint8"
          },
          {
            "name": "nextPlayer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "outcome",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Outcome"
          },
          {
            "name": "parentHash",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "moverSignature",
        "type": "bytes",
        "internalType": "bytes"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "proveEquivocation",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "offender",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "first",
        "type": "tuple",
        "internalType": "struct ShookTurnBasedGame.GameState",
        "components": [
          {
            "name": "gameId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "sequence",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "board",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "lastCell",
            "type": "uint8",
            "internalType": "uint8"
          },
          {
            "name": "nextPlayer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "outcome",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Outcome"
          },
          {
            "name": "parentHash",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "firstSignature",
        "type": "bytes",
        "internalType": "bytes"
      },
      {
        "name": "second",
        "type": "tuple",
        "internalType": "struct ShookTurnBasedGame.GameState",
        "components": [
          {
            "name": "gameId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "sequence",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "board",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "lastCell",
            "type": "uint8",
            "internalType": "uint8"
          },
          {
            "name": "nextPlayer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "outcome",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Outcome"
          },
          {
            "name": "parentHash",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "secondSignature",
        "type": "bytes",
        "internalType": "bytes"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "randomnessSafetyDelay",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "uint64",
        "internalType": "uint64"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "refundClaimed",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "player",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [
      {
        "name": "claimed",
        "type": "bool",
        "internalType": "bool"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "resign",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "resignWithSignature",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "player",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "signature",
        "type": "bytes",
        "internalType": "bytes"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "settleCooperative",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "terminal",
        "type": "tuple",
        "internalType": "struct ShookTurnBasedGame.GameState",
        "components": [
          {
            "name": "gameId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "sequence",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "board",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "lastCell",
            "type": "uint8",
            "internalType": "uint8"
          },
          {
            "name": "nextPlayer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "outcome",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Outcome"
          },
          {
            "name": "parentHash",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "signatureA",
        "type": "bytes",
        "internalType": "bytes"
      },
      {
        "name": "signatureB",
        "type": "bytes",
        "internalType": "bytes"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "shook",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "address",
        "internalType": "contract IERC20"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "start",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "outputs": [
      {
        "name": "starter",
        "type": "address",
        "internalType": "address"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "startWithSignature",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "drandSignature",
        "type": "bytes",
        "internalType": "bytes"
      }
    ],
    "outputs": [
      {
        "name": "starter",
        "type": "address",
        "internalType": "address"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "submitDisputeMove",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "nextState",
        "type": "tuple",
        "internalType": "struct ShookTurnBasedGame.GameState",
        "components": [
          {
            "name": "gameId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "sequence",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "board",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "lastCell",
            "type": "uint8",
            "internalType": "uint8"
          },
          {
            "name": "nextPlayer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "outcome",
            "type": "uint8",
            "internalType": "enum ShookTurnBasedGame.Outcome"
          },
          {
            "name": "parentHash",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "moverSignature",
        "type": "bytes",
        "internalType": "bytes"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "event",
    "name": "DisputeMoveAccepted",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      },
      {
        "name": "sequence",
        "type": "uint32",
        "indexed": true,
        "internalType": "uint32"
      },
      {
        "name": "mover",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "stateHash",
        "type": "bytes32",
        "indexed": false,
        "internalType": "bytes32"
      },
      {
        "name": "responseDeadline",
        "type": "uint64",
        "indexed": false,
        "internalType": "uint64"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "DisputeOpened",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      },
      {
        "name": "sequence",
        "type": "uint32",
        "indexed": true,
        "internalType": "uint32"
      },
      {
        "name": "nextPlayer",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "responseDeadline",
        "type": "uint64",
        "indexed": false,
        "internalType": "uint64"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "EIP712DomainChanged",
    "inputs": [],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "EquivocationProposed",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      },
      {
        "name": "offender",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "winner",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "sequence",
        "type": "uint32",
        "indexed": false,
        "internalType": "uint32"
      },
      {
        "name": "responseDeadline",
        "type": "uint64",
        "indexed": false,
        "internalType": "uint64"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "GameCancelled",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "GameCreated",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      },
      {
        "name": "creator",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "sessionSigner",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "name",
        "type": "bytes32",
        "indexed": false,
        "internalType": "bytes32"
      },
      {
        "name": "wager",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "joinDeadline",
        "type": "uint64",
        "indexed": false,
        "internalType": "uint64"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "GameJoined",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      },
      {
        "name": "opponent",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "sessionSigner",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "targetRound",
        "type": "uint64",
        "indexed": false,
        "internalType": "uint64"
      },
      {
        "name": "startDeadline",
        "type": "uint64",
        "indexed": false,
        "internalType": "uint64"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "GameSettled",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      },
      {
        "name": "outcome",
        "type": "uint8",
        "indexed": true,
        "internalType": "enum ShookTurnBasedGame.Outcome"
      },
      {
        "name": "winner",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "winnerPayout",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "finalStateHash",
        "type": "bytes32",
        "indexed": false,
        "internalType": "bytes32"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "GameStarted",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      },
      {
        "name": "starter",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "seed",
        "type": "bytes32",
        "indexed": false,
        "internalType": "bytes32"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "PlayerResigned",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      },
      {
        "name": "player",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "RefundClaimed",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      },
      {
        "name": "player",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "receiver",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "amount",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "TerminalSettlementProposed",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      },
      {
        "name": "sequence",
        "type": "uint32",
        "indexed": true,
        "internalType": "uint32"
      },
      {
        "name": "winner",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "stateHash",
        "type": "bytes32",
        "indexed": false,
        "internalType": "bytes32"
      },
      {
        "name": "responseDeadline",
        "type": "uint64",
        "indexed": false,
        "internalType": "uint64"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "WinningsClaimed",
    "inputs": [
      {
        "name": "gameId",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      },
      {
        "name": "winner",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "receiver",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "amount",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      }
    ],
    "anonymous": false
  },
  {
    "type": "error",
    "name": "InvalidConfiguration",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidGame",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidName",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidSessionSigner",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidShortString",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidSignature",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidState",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidStatus",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidTransition",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidWager",
    "inputs": []
  },
  {
    "type": "error",
    "name": "LobbyClosed",
    "inputs": []
  },
  {
    "type": "error",
    "name": "LobbyStillOpen",
    "inputs": []
  },
  {
    "type": "error",
    "name": "NoEquivocation",
    "inputs": []
  },
  {
    "type": "error",
    "name": "NotOngoing",
    "inputs": []
  },
  {
    "type": "error",
    "name": "NotPlayer",
    "inputs": []
  },
  {
    "type": "error",
    "name": "NotTerminal",
    "inputs": []
  },
  {
    "type": "error",
    "name": "NotWinner",
    "inputs": []
  },
  {
    "type": "error",
    "name": "NothingToClaim",
    "inputs": []
  },
  {
    "type": "error",
    "name": "RandomnessWindowClosed",
    "inputs": []
  },
  {
    "type": "error",
    "name": "ReentrancyGuardReentrantCall",
    "inputs": []
  },
  {
    "type": "error",
    "name": "ResponseWindowClosed",
    "inputs": []
  },
  {
    "type": "error",
    "name": "ResponseWindowOpen",
    "inputs": []
  },
  {
    "type": "error",
    "name": "SafeCastOverflowedUintDowncast",
    "inputs": [
      {
        "name": "bits",
        "type": "uint8",
        "internalType": "uint8"
      },
      {
        "name": "value",
        "type": "uint256",
        "internalType": "uint256"
      }
    ]
  },
  {
    "type": "error",
    "name": "SafeERC20FailedOperation",
    "inputs": [
      {
        "name": "token",
        "type": "address",
        "internalType": "address"
      }
    ]
  },
  {
    "type": "error",
    "name": "StringTooLong",
    "inputs": [
      {
        "name": "str",
        "type": "string",
        "internalType": "string"
      }
    ]
  },
  {
    "type": "error",
    "name": "ZeroAddress",
    "inputs": []
  }
]
