{
  "address": "0x4E23664C19a80Bc8Cc12EF03d0286B9A6C88874E",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_decider",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "AlreadyClaimed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AlreadySettled",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AssertionNotFound",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AssertionProposed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AwaitingDecider",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidTime",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidValue",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotDisputedAssertion",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotProposedAssertion",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyDecider",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyOwner",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposalDisputed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TransferFailed",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "outcome",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "winner",
          "type": "address"
        }
      ],
      "name": "AssertionSettled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "oldDecider",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "newDecider",
          "type": "address"
        }
      ],
      "name": "DeciderUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "asserter",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "description",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "reward",
          "type": "uint256"
        }
      ],
      "name": "EventAsserted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "disputer",
          "type": "address"
        }
      ],
      "name": "OutcomeDisputed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "proposer",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "outcome",
          "type": "bool"
        }
      ],
      "name": "OutcomeProposed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "asserter",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "RefundClaimed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "winner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "RewardClaimed",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DISPUTE_WINDOW",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MINIMUM_ASSERTION_WINDOW",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "description",
          "type": "string"
        },
        {
          "internalType": "uint256",
          "name": "startTime",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "endTime",
          "type": "uint256"
        }
      ],
      "name": "assertEvent",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "assertions",
      "outputs": [
        {
          "internalType": "address",
          "name": "asserter",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "proposer",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "disputer",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "proposedOutcome",
          "type": "bool"
        },
        {
          "internalType": "bool",
          "name": "resolvedOutcome",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "reward",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "bond",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "startTime",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "endTime",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "claimed",
          "type": "bool"
        },
        {
          "internalType": "address",
          "name": "winner",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "description",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        }
      ],
      "name": "claimDisputedReward",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        }
      ],
      "name": "claimRefund",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        }
      ],
      "name": "claimUndisputedReward",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decider",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        }
      ],
      "name": "disputeOutcome",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        }
      ],
      "name": "getAssertion",
      "outputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "asserter",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "proposer",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "disputer",
              "type": "address"
            },
            {
              "internalType": "bool",
              "name": "proposedOutcome",
              "type": "bool"
            },
            {
              "internalType": "bool",
              "name": "resolvedOutcome",
              "type": "bool"
            },
            {
              "internalType": "uint256",
              "name": "reward",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "bond",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "startTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "endTime",
              "type": "uint256"
            },
            {
              "internalType": "bool",
              "name": "claimed",
              "type": "bool"
            },
            {
              "internalType": "address",
              "name": "winner",
              "type": "address"
            },
            {
              "internalType": "string",
              "name": "description",
              "type": "string"
            }
          ],
          "internalType": "struct OptimisticOracle.EventAssertion",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        }
      ],
      "name": "getResolution",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        }
      ],
      "name": "getState",
      "outputs": [
        {
          "internalType": "enum OptimisticOracle.State",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "nextAssertionId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "outcome",
          "type": "bool"
        }
      ],
      "name": "proposeOutcome",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_decider",
          "type": "address"
        }
      ],
      "name": "setDecider",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assertionId",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "resolvedOutcome",
          "type": "bool"
        }
      ],
      "name": "settleAssertion",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0xceec2842f9aeb0aedb446627d4833ecee21c26d7a44635c7d77e7a225f42da4a",
  "receipt": {
    "to": null,
    "from": "0x23E53302800Ccd8a5b35cFA576B6eB73dab297B4",
    "contractAddress": "0x4E23664C19a80Bc8Cc12EF03d0286B9A6C88874E",
    "transactionIndex": 41,
    "gasUsed": "1650292",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0xdbbd5d88fde32b0f1146c6291c45936825334adddb02caae5ddc381bd0c8107a",
    "transactionHash": "0xceec2842f9aeb0aedb446627d4833ecee21c26d7a44635c7d77e7a225f42da4a",
    "logs": [],
    "blockNumber": 10119862,
    "cumulativeGasUsed": "7386110",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x0e59BE27d04248289DE58287473E5096F5B0487C"
  ],
  "numDeployments": 1,
  "solcInputHash": "dc16856801dd283672eccbfa93625e78",
  "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_decider\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyClaimed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadySettled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AssertionNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AssertionProposed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AwaitingDecider\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTime\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotDisputedAssertion\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotProposedAssertion\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDecider\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ProposalDisputed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFailed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"outcome\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"}],\"name\":\"AssertionSettled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldDecider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newDecider\",\"type\":\"address\"}],\"name\":\"DeciderUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"asserter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"name\":\"EventAsserted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"disputer\",\"type\":\"address\"}],\"name\":\"OutcomeDisputed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"outcome\",\"type\":\"bool\"}],\"name\":\"OutcomeProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"asserter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"RefundClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"RewardClaimed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DISPUTE_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINIMUM_ASSERTION_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"assertEvent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"assertions\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"asserter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"disputer\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"proposedOutcome\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"resolvedOutcome\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bond\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"claimed\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"}],\"name\":\"claimDisputedReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"}],\"name\":\"claimRefund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"}],\"name\":\"claimUndisputedReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decider\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"}],\"name\":\"disputeOutcome\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"}],\"name\":\"getAssertion\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asserter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"disputer\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"proposedOutcome\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"resolvedOutcome\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bond\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"claimed\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"internalType\":\"struct OptimisticOracle.EventAssertion\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"}],\"name\":\"getResolution\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"}],\"name\":\"getState\",\"outputs\":[{\"internalType\":\"enum OptimisticOracle.State\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextAssertionId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"outcome\",\"type\":\"bool\"}],\"name\":\"proposeOutcome\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_decider\",\"type\":\"address\"}],\"name\":\"setDecider\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assertionId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"resolvedOutcome\",\"type\":\"bool\"}],\"name\":\"settleAssertion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"assertEvent(string,uint256,uint256)\":{\"details\":\"Requires ETH payment as reward for correct proposers. Bond requirement is 2x the reward.      Sets default timestamps if not provided. Validates timing requirements.\",\"params\":{\"description\":\"Human-readable description of the event (e.g. \\\"Did X happen by time Y?\\\")\",\"endTime\":\"When the assertion expires (0 for startTime + minimum window)\",\"startTime\":\"When proposals can begin (0 for current block timestamp)\"},\"returns\":{\"_0\":\"The unique assertion ID for the newly created assertion\"}},\"claimDisputedReward(uint256)\":{\"details\":\"Anyone can trigger this function. Pays decider fee and transfers remaining rewards to winner.      Can only be called after decider has settled the dispute.\",\"params\":{\"assertionId\":\"The unique identifier of the disputed assertion to claim rewards for\"}},\"claimRefund(uint256)\":{\"details\":\"Anyone can trigger this function. Returns the original reward to the asserter.      Can only be called after assertion deadline has passed without any proposals.\",\"params\":{\"assertionId\":\"The unique identifier of the expired assertion to claim refund for\"}},\"claimUndisputedReward(uint256)\":{\"details\":\"Anyone can trigger this function. Transfers reward + bond to the proposer.      Can only be called after dispute window has passed without disputes.\",\"params\":{\"assertionId\":\"The unique identifier of the assertion to claim rewards for\"}},\"disputeOutcome(uint256)\":{\"details\":\"Requires bonding ETH equal to the bond amount. Can only dispute once per assertion      and must be within the dispute window after proposal.\",\"params\":{\"assertionId\":\"The unique identifier of the assertion to dispute\"}},\"getAssertion(uint256)\":{\"details\":\"Provides access to all fields of the EventAssertion struct\",\"params\":{\"assertionId\":\"The unique identifier of the assertion to retrieve\"},\"returns\":{\"_0\":\"The complete EventAssertion struct containing all assertion data\"}},\"getResolution(uint256)\":{\"details\":\"For undisputed assertions, returns the proposed outcome after dispute window.      For disputed assertions, returns the decider's resolved outcome.\",\"params\":{\"assertionId\":\"The unique identifier of the assertion to get resolution for\"},\"returns\":{\"_0\":\"The final boolean outcome of the assertion\"}},\"getState(uint256)\":{\"details\":\"Evaluates assertion progress through states: Invalid, Asserted, Proposed, Disputed, Settled, Expired\",\"params\":{\"assertionId\":\"The unique identifier of the assertion to check state for\"},\"returns\":{\"_0\":\"The current State enum value representing the assertion's status\"}},\"proposeOutcome(uint256,bool)\":{\"details\":\"Requires bonding ETH equal to 2x the original reward. Sets dispute window deadline.      Can only be called once per assertion and within the assertion time window.\",\"params\":{\"assertionId\":\"The unique identifier of the assertion to propose an outcome for\",\"outcome\":\"The proposed boolean outcome (true or false) for the event\"}},\"setDecider(address)\":{\"details\":\"Changes the address authorized to settle disputed assertions.      Emits DeciderUpdated event with old and new addresses.\",\"params\":{\"_decider\":\"The new address that will act as decider for disputed assertions\"}},\"settleAssertion(uint256,bool)\":{\"details\":\"Sets the resolved outcome and determines winner based on proposal accuracy.\",\"params\":{\"assertionId\":\"The unique identifier of the disputed assertion to settle\",\"resolvedOutcome\":\"The decider's determination of the true outcome\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"AssertionNotFound()\":[{\"notice\":\"Errors //////\"}]},\"events\":{\"EventAsserted(uint256,address,string,uint256)\":{\"notice\":\"Events /////\"}},\"kind\":\"user\",\"methods\":{\"assertEvent(string,uint256,uint256)\":{\"notice\":\"Creates a new assertion about an event with a true/false outcome\"},\"claimDisputedReward(uint256)\":{\"notice\":\"Claims reward for disputed assertions after decider settlement\"},\"claimRefund(uint256)\":{\"notice\":\"Claims refund for assertions that receive no proposals before deadline\"},\"claimUndisputedReward(uint256)\":{\"notice\":\"Claims reward for undisputed assertions after dispute window expires\"},\"constructor\":{\"notice\":\"Constructor ///\"},\"disputeOutcome(uint256)\":{\"notice\":\"Disputes a proposed outcome by bonding ETH\"},\"getAssertion(uint256)\":{\"notice\":\"Returns the complete assertion details for a given assertion ID\"},\"getResolution(uint256)\":{\"notice\":\"Returns the final resolved outcome of a settled assertion\"},\"getState(uint256)\":{\"notice\":\"Returns the current state of an assertion based on its lifecycle stage\"},\"proposeOutcome(uint256,bool)\":{\"notice\":\"Proposes the outcome (true or false) for an asserted event\"},\"setDecider(address)\":{\"notice\":\"Updates the decider address (only contract owner)\"},\"settleAssertion(uint256,bool)\":{\"notice\":\"Resolves disputed assertions by determining the correct outcome (only decider)\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/02_Optimistic/OptimisticOracle.sol\":\"OptimisticOracle\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/02_Optimistic/OptimisticOracle.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\ncontract OptimisticOracle {\\n    ////////////////\\n    /// Enums //////\\n    ////////////////\\n\\n    enum State {\\n        Invalid,\\n        Asserted,\\n        Proposed,\\n        Disputed,\\n        Settled,\\n        Expired\\n    }\\n\\n    /////////////////\\n    /// Errors //////\\n    /////////////////\\n\\n    error AssertionNotFound();\\n    error AssertionProposed();\\n    error InvalidValue();\\n    error InvalidTime();\\n    error ProposalDisputed();\\n    error NotProposedAssertion();\\n    error AlreadyClaimed();\\n    error AlreadySettled();\\n    error AwaitingDecider();\\n    error NotDisputedAssertion();\\n    error OnlyDecider();\\n    error OnlyOwner();\\n    error TransferFailed();\\n\\n    //////////////////////\\n    /// State Variables //\\n    //////////////////////\\n\\n    struct EventAssertion {\\n        address asserter;\\n        address proposer;\\n        address disputer;\\n        bool proposedOutcome;\\n        bool resolvedOutcome;\\n        uint256 reward;\\n        uint256 bond;\\n        uint256 startTime;\\n        uint256 endTime;\\n        bool claimed;\\n        address winner;\\n        string description;\\n    }\\n\\n    uint256 public constant MINIMUM_ASSERTION_WINDOW = 3 minutes;\\n    uint256 public constant DISPUTE_WINDOW = 3 minutes;\\n    address public decider;\\n    address public owner;\\n    uint256 public nextAssertionId = 1;\\n    mapping(uint256 => EventAssertion) public assertions;\\n\\n    ////////////////\\n    /// Events /////\\n    ////////////////\\n\\n    event EventAsserted(uint256 assertionId, address asserter, string description, uint256 reward);\\n    event OutcomeProposed(uint256 assertionId, address proposer, bool outcome);\\n    event OutcomeDisputed(uint256 assertionId, address disputer);\\n    event AssertionSettled(uint256 assertionId, bool outcome, address winner);\\n    event DeciderUpdated(address oldDecider, address newDecider);\\n    event RewardClaimed(uint256 assertionId, address winner, uint256 amount);\\n    event RefundClaimed(uint256 assertionId, address asserter, uint256 amount);\\n\\n    ///////////////////\\n    /// Modifiers /////\\n    ///////////////////\\n\\n    /**\\n     * @notice Modifier to restrict function access to the designated decider\\n     * @dev Ensures only the decider can settle disputed assertions\\n     */\\n    modifier onlyDecider() {\\n        if (msg.sender != decider) revert OnlyDecider();\\n        _;\\n    }\\n\\n    /**\\n     * @notice Modifier to restrict function access to the contract owner\\n     * @dev Ensures only the owner can update critical contract parameters\\n     */\\n    modifier onlyOwner() {\\n        if (msg.sender != owner) revert OnlyOwner();\\n        _;\\n    }\\n\\n    ///////////////////\\n    /// Constructor ///\\n    ///////////////////\\n\\n    constructor(address _decider) {\\n        decider = _decider;\\n        owner = msg.sender;\\n    }\\n\\n    ///////////////////\\n    /// Functions /////\\n    ///////////////////\\n\\n    /**\\n     * @notice Updates the decider address (only contract owner)\\n     * @dev Changes the address authorized to settle disputed assertions.\\n     *      Emits DeciderUpdated event with old and new addresses.\\n     * @param _decider The new address that will act as decider for disputed assertions\\n     */\\n    function setDecider(address _decider) external onlyOwner {\\n        address oldDecider = address(decider);\\n        decider = _decider;\\n        emit DeciderUpdated(oldDecider, _decider);\\n    }\\n\\n    /**\\n     * @notice Returns the complete assertion details for a given assertion ID\\n     * @dev Provides access to all fields of the EventAssertion struct\\n     * @param assertionId The unique identifier of the assertion to retrieve\\n     * @return The complete EventAssertion struct containing all assertion data\\n     */\\n    function getAssertion(uint256 assertionId) external view returns (EventAssertion memory) {\\n        return assertions[assertionId];\\n    }\\n\\n    /**\\n     * @notice Creates a new assertion about an event with a true/false outcome\\n     * @dev Requires ETH payment as reward for correct proposers. Bond requirement is 2x the reward.\\n     *      Sets default timestamps if not provided. Validates timing requirements.\\n     * @param description Human-readable description of the event (e.g. \\\"Did X happen by time Y?\\\")\\n     * @param startTime When proposals can begin (0 for current block timestamp)\\n     * @param endTime When the assertion expires (0 for startTime + minimum window)\\n     * @return The unique assertion ID for the newly created assertion\\n     */\\n    function assertEvent(\\n        string memory description,\\n        uint256 startTime,\\n        uint256 endTime\\n    ) external payable returns (uint256) {\\n      uint256 assertionId = nextAssertionId;\\n      nextAssertionId++;\\n      if (msg.value == 0) revert InvalidValue();\\n      \\n      if (startTime == 0) startTime = block.timestamp;\\n      if (endTime == 0) endTime = block.timestamp + MINIMUM_ASSERTION_WINDOW;\\n      \\n      if (startTime < block.timestamp) revert InvalidTime();\\n      if (endTime < startTime + MINIMUM_ASSERTION_WINDOW) revert InvalidTime();\\n\\n      assertions[assertionId] = EventAssertion({\\n        asserter: msg.sender,\\n\\tproposer: address(0),\\n\\tdisputer: address(0),\\n\\tproposedOutcome: false,\\n\\tresolvedOutcome: false,\\n\\treward: msg.value,\\n\\tbond: msg.value * 2,\\n\\tstartTime: startTime,\\n\\tendTime: endTime,\\n\\tclaimed: false,\\n\\twinner: address(0),\\n\\tdescription: description\\n      });\\n\\n      emit EventAsserted(assertionId, msg.sender, description, msg.value);\\n      return assertionId;\\n    }\\n\\n    /**\\n     * @notice Proposes the outcome (true or false) for an asserted event\\n     * @dev Requires bonding ETH equal to 2x the original reward. Sets dispute window deadline.\\n     *      Can only be called once per assertion and within the assertion time window.\\n     * @param assertionId The unique identifier of the assertion to propose an outcome for\\n     * @param outcome The proposed boolean outcome (true or false) for the event\\n     */\\n    function proposeOutcome(uint256 assertionId, bool outcome) external payable {\\n      if (assertionId >= nextAssertionId) revert AssertionNotFound();\\n\\n      EventAssertion storage eventAssertion = assertions[assertionId];\\n\\n      if (eventAssertion.proposer != address(0)) revert AssertionProposed();\\n      uint256 currentTime = block.timestamp;\\n      if (currentTime < eventAssertion.startTime || currentTime > eventAssertion.endTime) revert InvalidTime();\\n      if (msg.value != eventAssertion.bond) revert InvalidValue();\\n\\n      eventAssertion.proposer = msg.sender;\\n      eventAssertion.proposedOutcome = outcome;\\n      eventAssertion.endTime = currentTime + DISPUTE_WINDOW;\\n\\n      emit OutcomeProposed(assertionId, msg.sender, outcome);\\n    }\\n\\n    /**\\n     * @notice Disputes a proposed outcome by bonding ETH\\n     * @dev Requires bonding ETH equal to the bond amount. Can only dispute once per assertion\\n     *      and must be within the dispute window after proposal.\\n     * @param assertionId The unique identifier of the assertion to dispute\\n     */\\n    function disputeOutcome(uint256 assertionId) external payable {\\n      EventAssertion storage eventAssertion = assertions[assertionId];\\n\\n      if (eventAssertion.asserter == address(0)) revert AssertionNotFound();\\n      if (eventAssertion.proposer == address(0)) revert NotProposedAssertion();\\n      if (eventAssertion.disputer != address(0)) revert ProposalDisputed();\\n      if (block.timestamp > eventAssertion.endTime) revert InvalidTime();\\n      if (msg.value != eventAssertion.bond) revert InvalidValue();\\n\\n      eventAssertion.disputer = msg.sender;\\n\\n      emit OutcomeDisputed(assertionId, msg.sender);\\n    }\\n\\n    /**\\n     * @notice Claims reward for undisputed assertions after dispute window expires\\n     * @dev Anyone can trigger this function. Transfers reward + bond to the proposer.\\n     *      Can only be called after dispute window has passed without disputes.\\n     * @param assertionId The unique identifier of the assertion to claim rewards for\\n     */\\n    function claimUndisputedReward(uint256 assertionId) external {\\n      EventAssertion storage assertion = assertions[assertionId];\\n      if (assertion.proposer == address(0)) revert NotProposedAssertion();\\n      if (assertion.disputer != address(0)) revert ProposalDisputed();\\n      if (block.timestamp <= assertion.endTime) revert InvalidTime();\\n      if (assertion.claimed) revert AlreadyClaimed();\\n\\n      assertion.claimed = true;\\n      assertion.resolvedOutcome = assertion.proposedOutcome;\\n      assertion.winner = assertion.proposer;\\n      uint256 totalValue = assertion.reward + assertion.bond;\\n      (bool success,) = payable(assertion.proposer).call{value: totalValue}(\\\"\\\");\\n      if (!success) revert TransferFailed();\\n\\n      emit RewardClaimed(assertionId, assertion.proposer, totalValue);\\n    }\\n\\n    /**\\n     * @notice Claims reward for disputed assertions after decider settlement\\n     * @dev Anyone can trigger this function. Pays decider fee and transfers remaining rewards to winner.\\n     *      Can only be called after decider has settled the dispute.\\n     * @param assertionId The unique identifier of the disputed assertion to claim rewards for\\n     */\\n    function claimDisputedReward(uint256 assertionId) external {\\n      EventAssertion storage assertion = assertions[assertionId];\\n      if (assertion.proposer == address(0)) revert NotProposedAssertion();\\n      if (assertion.disputer == address(0)) revert NotDisputedAssertion();\\n      if (assertion.winner == address(0)) revert AwaitingDecider();\\n      if (assertion.claimed) revert AlreadyClaimed();\\n\\n      assertion.claimed = true;\\n      (bool successDecider,) = payable(decider).call{value: assertion.bond}(\\\"\\\");\\n      if (!successDecider) revert TransferFailed();\\n\\n      uint256 totalValue = assertion.reward + assertion.bond;\\n      (bool success,) = payable(assertion.winner).call{value: totalValue}(\\\"\\\");\\n      if (!success) revert TransferFailed();\\n\\n      emit RewardClaimed(assertionId, assertion.winner, totalValue);\\n    }\\n\\n    /**\\n     * @notice Claims refund for assertions that receive no proposals before deadline\\n     * @dev Anyone can trigger this function. Returns the original reward to the asserter.\\n     *      Can only be called after assertion deadline has passed without any proposals.\\n     * @param assertionId The unique identifier of the expired assertion to claim refund for\\n     */\\n    function claimRefund(uint256 assertionId) external {\\n      EventAssertion storage assertion = assertions[assertionId];\\n      if (assertion.asserter == address(0)) revert AssertionNotFound();\\n      if (assertion.proposer != address(0)) revert AssertionProposed();\\n      if (block.timestamp <= assertion.endTime) revert InvalidTime();\\n      if (assertion.claimed) revert AlreadyClaimed();\\n\\n      assertion.claimed = true;\\n      uint256 totalValue = assertion.reward;\\n      (bool success,) = payable(assertion.asserter).call{value: totalValue}(\\\"\\\");\\n      if (!success) revert TransferFailed();\\n\\n      emit RefundClaimed(assertionId, assertion.asserter, totalValue);\\n    }\\n\\n    /**\\n     * @notice Resolves disputed assertions by determining the correct outcome (only decider)\\n     * @dev Sets the resolved outcome and determines winner based on proposal accuracy.\\n     * @param assertionId The unique identifier of the disputed assertion to settle\\n     * @param resolvedOutcome The decider's determination of the true outcome\\n     */\\n    function settleAssertion(uint256 assertionId, bool resolvedOutcome) external onlyDecider {\\n      EventAssertion storage assertion = assertions[assertionId];\\n      if (assertion.proposer == address(0)) revert NotProposedAssertion();\\n      if (assertion.disputer == address(0)) revert NotDisputedAssertion();\\n      if (assertion.winner != address(0)) revert AlreadySettled();\\n\\n      assertion.resolvedOutcome = resolvedOutcome;\\n      assertion.winner = assertion.proposedOutcome == resolvedOutcome ? assertion.proposer : assertion.disputer;\\n\\n      emit AssertionSettled(assertionId, resolvedOutcome, assertion.winner);\\n    }\\n\\n    /**\\n     * @notice Returns the current state of an assertion based on its lifecycle stage\\n     * @dev Evaluates assertion progress through states: Invalid, Asserted, Proposed, Disputed, Settled, Expired\\n     * @param assertionId The unique identifier of the assertion to check state for\\n     * @return The current State enum value representing the assertion's status\\n     */\\n    function getState(uint256 assertionId) external view returns (State) {\\n      EventAssertion memory assertion = assertions[assertionId];\\n      \\n      if (assertion.asserter == address(0)) return State.Invalid;\\n      if (assertion.winner != address(0)) return State.Settled;\\n      if (assertion.disputer != address(0)) return State.Disputed;\\n      if (assertion.proposer != address(0)) {\\n\\tif (block.timestamp >= assertion.endTime) return State.Settled;\\n        return State.Proposed;\\n      }\\n      if (block.timestamp >= assertion.endTime) return State.Expired;\\n      return State.Asserted;\\n    }\\n\\n    /**\\n     * @notice Returns the final resolved outcome of a settled assertion\\n     * @dev For undisputed assertions, returns the proposed outcome after dispute window.\\n     *      For disputed assertions, returns the decider's resolved outcome.\\n     * @param assertionId The unique identifier of the assertion to get resolution for\\n     * @return The final boolean outcome of the assertion\\n     */\\n    function getResolution(uint256 assertionId) external view returns (bool) {\\n      EventAssertion memory assertion = assertions[assertionId];\\n\\n      if (assertion.asserter == address(0)) revert AssertionNotFound();\\n      if (assertion.proposer == address(0)) revert NotProposedAssertion();\\n\\n      if (assertion.winner != address(0)) return assertion.resolvedOutcome;\\n      if (assertion.disputer == address(0)) {\\n\\tif (block.timestamp <= assertion.endTime) revert InvalidTime();\\n        return assertion.proposedOutcome;\\n      }\\n\\n      revert AwaitingDecider();\\n    }\\n}\\n\",\"keccak256\":\"0x39cbe139f9ad84bf77517c78c64745f6cf7868cad094cd9b4898970cf7ded8a8\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "[encoded data, 14468 characters]",
  "deployedBytecode": "[encoded data, 14146 characters]",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "assertEvent(string,uint256,uint256)": {
        "details": "Requires ETH payment as reward for correct proposers. Bond requirement is 2x the reward.      Sets default timestamps if not provided. Validates timing requirements.",
        "params": {
          "description": "Human-readable description of the event (e.g. \"Did X happen by time Y?\")",
          "endTime": "When the assertion expires (0 for startTime + minimum window)",
          "startTime": "When proposals can begin (0 for current block timestamp)"
        },
        "returns": {
          "_0": "The unique assertion ID for the newly created assertion"
        }
      },
      "claimDisputedReward(uint256)": {
        "details": "Anyone can trigger this function. Pays decider fee and transfers remaining rewards to winner.      Can only be called after decider has settled the dispute.",
        "params": {
          "assertionId": "The unique identifier of the disputed assertion to claim rewards for"
        }
      },
      "claimRefund(uint256)": {
        "details": "Anyone can trigger this function. Returns the original reward to the asserter.      Can only be called after assertion deadline has passed without any proposals.",
        "params": {
          "assertionId": "The unique identifier of the expired assertion to claim refund for"
        }
      },
      "claimUndisputedReward(uint256)": {
        "details": "Anyone can trigger this function. Transfers reward + bond to the proposer.      Can only be called after dispute window has passed without disputes.",
        "params": {
          "assertionId": "The unique identifier of the assertion to claim rewards for"
        }
      },
      "disputeOutcome(uint256)": {
        "details": "Requires bonding ETH equal to the bond amount. Can only dispute once per assertion      and must be within the dispute window after proposal.",
        "params": {
          "assertionId": "The unique identifier of the assertion to dispute"
        }
      },
      "getAssertion(uint256)": {
        "details": "Provides access to all fields of the EventAssertion struct",
        "params": {
          "assertionId": "The unique identifier of the assertion to retrieve"
        },
        "returns": {
          "_0": "The complete EventAssertion struct containing all assertion data"
        }
      },
      "getResolution(uint256)": {
        "details": "For undisputed assertions, returns the proposed outcome after dispute window.      For disputed assertions, returns the decider's resolved outcome.",
        "params": {
          "assertionId": "The unique identifier of the assertion to get resolution for"
        },
        "returns": {
          "_0": "The final boolean outcome of the assertion"
        }
      },
      "getState(uint256)": {
        "details": "Evaluates assertion progress through states: Invalid, Asserted, Proposed, Disputed, Settled, Expired",
        "params": {
          "assertionId": "The unique identifier of the assertion to check state for"
        },
        "returns": {
          "_0": "The current State enum value representing the assertion's status"
        }
      },
      "proposeOutcome(uint256,bool)": {
        "details": "Requires bonding ETH equal to 2x the original reward. Sets dispute window deadline.      Can only be called once per assertion and within the assertion time window.",
        "params": {
          "assertionId": "The unique identifier of the assertion to propose an outcome for",
          "outcome": "The proposed boolean outcome (true or false) for the event"
        }
      },
      "setDecider(address)": {
        "details": "Changes the address authorized to settle disputed assertions.      Emits DeciderUpdated event with old and new addresses.",
        "params": {
          "_decider": "The new address that will act as decider for disputed assertions"
        }
      },
      "settleAssertion(uint256,bool)": {
        "details": "Sets the resolved outcome and determines winner based on proposal accuracy.",
        "params": {
          "assertionId": "The unique identifier of the disputed assertion to settle",
          "resolvedOutcome": "The decider's determination of the true outcome"
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "errors": {
      "AssertionNotFound()": [
        {
          "notice": "Errors //////"
        }
      ]
    },
    "events": {
      "EventAsserted(uint256,address,string,uint256)": {
        "notice": "Events /////"
      }
    },
    "kind": "user",
    "methods": {
      "assertEvent(string,uint256,uint256)": {
        "notice": "Creates a new assertion about an event with a true/false outcome"
      },
      "claimDisputedReward(uint256)": {
        "notice": "Claims reward for disputed assertions after decider settlement"
      },
      "claimRefund(uint256)": {
        "notice": "Claims refund for assertions that receive no proposals before deadline"
      },
      "claimUndisputedReward(uint256)": {
        "notice": "Claims reward for undisputed assertions after dispute window expires"
      },
      "constructor": {
        "notice": "Constructor ///"
      },
      "disputeOutcome(uint256)": {
        "notice": "Disputes a proposed outcome by bonding ETH"
      },
      "getAssertion(uint256)": {
        "notice": "Returns the complete assertion details for a given assertion ID"
      },
      "getResolution(uint256)": {
        "notice": "Returns the final resolved outcome of a settled assertion"
      },
      "getState(uint256)": {
        "notice": "Returns the current state of an assertion based on its lifecycle stage"
      },
      "proposeOutcome(uint256,bool)": {
        "notice": "Proposes the outcome (true or false) for an asserted event"
      },
      "setDecider(address)": {
        "notice": "Updates the decider address (only contract owner)"
      },
      "settleAssertion(uint256,bool)": {
        "notice": "Resolves disputed assertions by determining the correct outcome (only decider)"
      }
    },
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 70,
        "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
        "label": "decider",
        "offset": 0,
        "slot": "0",
        "type": "t_address"
      },
      {
        "astId": 72,
        "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
        "label": "owner",
        "offset": 0,
        "slot": "1",
        "type": "t_address"
      },
      {
        "astId": 75,
        "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
        "label": "nextAssertionId",
        "offset": 0,
        "slot": "2",
        "type": "t_uint256"
      },
      {
        "astId": 80,
        "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
        "label": "assertions",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_uint256,t_struct(EventAssertion)62_storage)"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_mapping(t_uint256,t_struct(EventAssertion)62_storage)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => struct OptimisticOracle.EventAssertion)",
        "numberOfBytes": "32",
        "value": "t_struct(EventAssertion)62_storage"
      },
      "t_string_storage": {
        "encoding": "bytes",
        "label": "string",
        "numberOfBytes": "32"
      },
      "t_struct(EventAssertion)62_storage": {
        "encoding": "inplace",
        "label": "struct OptimisticOracle.EventAssertion",
        "members": [
          {
            "astId": 39,
            "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
            "label": "asserter",
            "offset": 0,
            "slot": "0",
            "type": "t_address"
          },
          {
            "astId": 41,
            "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
            "label": "proposer",
            "offset": 0,
            "slot": "1",
            "type": "t_address"
          },
          {
            "astId": 43,
            "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
            "label": "disputer",
            "offset": 0,
            "slot": "2",
            "type": "t_address"
          },
          {
            "astId": 45,
            "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
            "label": "proposedOutcome",
            "offset": 20,
            "slot": "2",
            "type": "t_bool"
          },
          {
            "astId": 47,
            "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
            "label": "resolvedOutcome",
            "offset": 21,
            "slot": "2",
            "type": "t_bool"
          },
          {
            "astId": 49,
            "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
            "label": "reward",
            "offset": 0,
            "slot": "3",
            "type": "t_uint256"
          },
          {
            "astId": 51,
            "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
            "label": "bond",
            "offset": 0,
            "slot": "4",
            "type": "t_uint256"
          },
          {
            "astId": 53,
            "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
            "label": "startTime",
            "offset": 0,
            "slot": "5",
            "type": "t_uint256"
          },
          {
            "astId": 55,
            "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
            "label": "endTime",
            "offset": 0,
            "slot": "6",
            "type": "t_uint256"
          },
          {
            "astId": 57,
            "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
            "label": "claimed",
            "offset": 0,
            "slot": "7",
            "type": "t_bool"
          },
          {
            "astId": 59,
            "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
            "label": "winner",
            "offset": 1,
            "slot": "7",
            "type": "t_address"
          },
          {
            "astId": 61,
            "contract": "contracts/02_Optimistic/OptimisticOracle.sol:OptimisticOracle",
            "label": "description",
            "offset": 0,
            "slot": "8",
            "type": "t_string_storage"
          }
        ],
        "numberOfBytes": "288"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}