{
  "address": "0x0C2b6590De9D61b37094617b5e6f794Ae118176E",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_submissionInterval",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_l2BlockTime",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_startingBlockNumber",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_startingTimestamp",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_proposer",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_challenger",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_finalizationPeriodSeconds",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "outputRoot",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "l2OutputIndex",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "l2BlockNumber",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "l1Timestamp",
          "type": "uint256"
        }
      ],
      "name": "OutputProposed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "prevNextOutputIndex",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "newNextOutputIndex",
          "type": "uint256"
        }
      ],
      "name": "OutputsDeleted",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "CHALLENGER",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FINALIZATION_PERIOD_SECONDS",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "L2_BLOCK_TIME",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PROPOSER",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SUBMISSION_INTERVAL",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_l2BlockNumber",
          "type": "uint256"
        }
      ],
      "name": "computeL2Timestamp",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_l2OutputIndex",
          "type": "uint256"
        }
      ],
      "name": "deleteL2Outputs",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_l2OutputIndex",
          "type": "uint256"
        }
      ],
      "name": "getL2Output",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "outputRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint128",
              "name": "timestamp",
              "type": "uint128"
            },
            {
              "internalType": "uint128",
              "name": "l2BlockNumber",
              "type": "uint128"
            }
          ],
          "internalType": "struct Types.OutputProposal",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_l2BlockNumber",
          "type": "uint256"
        }
      ],
      "name": "getL2OutputAfter",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "outputRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint128",
              "name": "timestamp",
              "type": "uint128"
            },
            {
              "internalType": "uint128",
              "name": "l2BlockNumber",
              "type": "uint128"
            }
          ],
          "internalType": "struct Types.OutputProposal",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_l2BlockNumber",
          "type": "uint256"
        }
      ],
      "name": "getL2OutputIndexAfter",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_startingBlockNumber",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_startingTimestamp",
          "type": "uint256"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "latestBlockNumber",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "latestOutputIndex",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "nextBlockNumber",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "nextOutputIndex",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_outputRoot",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "_l2BlockNumber",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "_l1BlockHash",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "_l1BlockNumber",
          "type": "uint256"
        }
      ],
      "name": "proposeL2Output",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "startingBlockNumber",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "startingTimestamp",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "version",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "transactionHash": "0xdcf1946ad33d4c86314e085dfdd5532c026873f802f8f3fae697f966c480674a",
  "receipt": {
    "to": null,
    "from": "0x9C822C992b56A3bd35d16A089d99AEc870eF8d37",
    "contractAddress": "0x0C2b6590De9D61b37094617b5e6f794Ae118176E",
    "transactionIndex": 35,
    "gasUsed": "1342787",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000800000000000000000000000000000000000000000000000001000000000000000000000000000000000000",
    "blockHash": "0xeca1ee6c5dc0d52bd525db213e6483f439888384ff5f41c2b5c89ba62e9dc8ef",
    "transactionHash": "0xdcf1946ad33d4c86314e085dfdd5532c026873f802f8f3fae697f966c480674a",
    "logs": [
      {
        "transactionIndex": 35,
        "blockNumber": 8899604,
        "transactionHash": "0xdcf1946ad33d4c86314e085dfdd5532c026873f802f8f3fae697f966c480674a",
        "address": "0x0C2b6590De9D61b37094617b5e6f794Ae118176E",
        "topics": [
          "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"
        ],
        "data": "0x0000000000000000000000000000000000000000000000000000000000000001",
        "logIndex": 69,
        "blockHash": "0xeca1ee6c5dc0d52bd525db213e6483f439888384ff5f41c2b5c89ba62e9dc8ef"
      }
    ],
    "blockNumber": 8899604,
    "cumulativeGasUsed": "17870709",
    "status": 1,
    "byzantium": true
  },
  "args": [
    120,
    2,
    0,
    0,
    "0x02b1786A85Ec3f71fBbBa46507780dB7cF9014f6",
    "0xBc1233d0C3e6B5d53Ab455cF65A6623F6dCd7e4f",
    12
  ],
  "numDeployments": 1,
  "solcInputHash": "86f4d300b3e19ace2c129703d85e47d6",
  "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionInterval\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_proposer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l2OutputIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l1Timestamp\",\"type\":\"uint256\"}],\"name\":\"OutputProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"prevNextOutputIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newNextOutputIndex\",\"type\":\"uint256\"}],\"name\":\"OutputsDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CHALLENGER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_BLOCK_TIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROPOSER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUBMISSION_INTERVAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"computeL2Timestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"}],\"name\":\"deleteL2Outputs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"}],\"name\":\"getL2Output\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"timestamp\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2BlockNumber\",\"type\":\"uint128\"}],\"internalType\":\"struct Types.OutputProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"getL2OutputAfter\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"timestamp\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2BlockNumber\",\"type\":\"uint128\"}],\"internalType\":\"struct Types.OutputProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"getL2OutputIndexAfter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingTimestamp\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestOutputIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextOutputIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_l1BlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l1BlockNumber\",\"type\":\"uint256\"}],\"name\":\"proposeL2Output\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:proxied\":\"@title L2OutputOracle\",\"events\":{\"OutputProposed(bytes32,uint256,uint256,uint256)\":{\"params\":{\"l1Timestamp\":\"The L1 timestamp when proposed.\",\"l2BlockNumber\":\"The L2 block number of the output root.\",\"l2OutputIndex\":\"The index of the output in the l2Outputs array.\",\"outputRoot\":\"The output root.\"}},\"OutputsDeleted(uint256,uint256)\":{\"params\":{\"newNextOutputIndex\":\"Next L2 output index after the deletion.\",\"prevNextOutputIndex\":\"Next L2 output index before the deletion.\"}}},\"kind\":\"dev\",\"methods\":{\"computeL2Timestamp(uint256)\":{\"params\":{\"_l2BlockNumber\":\"The L2 block number of the target block.\"},\"returns\":{\"_0\":\"L2 timestamp of the given block.\"}},\"constructor\":{\"custom:semver\":\"1.3.0\",\"params\":{\"_challenger\":\"The address of the challenger.\",\"_l2BlockTime\":\"The time per L2 block, in seconds.\",\"_proposer\":\"The address of the proposer.\",\"_startingBlockNumber\":\"The number of the first L2 block.\",\"_startingTimestamp\":\"The timestamp of the first L2 block.\",\"_submissionInterval\":\"Interval in blocks at which checkpoints must be submitted.\"}},\"deleteL2Outputs(uint256)\":{\"params\":{\"_l2OutputIndex\":\"Index of the first L2 output to be deleted. All outputs after this                       output will also be deleted.\"}},\"getL2Output(uint256)\":{\"params\":{\"_l2OutputIndex\":\"Index of the output to return.\"},\"returns\":{\"_0\":\"The output at the given index.\"}},\"getL2OutputAfter(uint256)\":{\"params\":{\"_l2BlockNumber\":\"L2 block number to find a checkpoint for.\"},\"returns\":{\"_0\":\"First checkpoint that commits to the given L2 block number.\"}},\"getL2OutputIndexAfter(uint256)\":{\"params\":{\"_l2BlockNumber\":\"L2 block number to find a checkpoint for.\"},\"returns\":{\"_0\":\"Index of the first checkpoint that commits to the given L2 block number.\"}},\"initialize(uint256,uint256)\":{\"params\":{\"_startingBlockNumber\":\"Block number for the first recoded L2 block.\",\"_startingTimestamp\":\"Timestamp for the first recoded L2 block.\"}},\"latestBlockNumber()\":{\"returns\":{\"_0\":\"Latest submitted L2 block number.\"}},\"latestOutputIndex()\":{\"returns\":{\"_0\":\"The number of outputs that have been proposed.\"}},\"nextBlockNumber()\":{\"returns\":{\"_0\":\"Next L2 block number.\"}},\"nextOutputIndex()\":{\"returns\":{\"_0\":\"The index of the next output to be proposed.\"}},\"proposeL2Output(bytes32,uint256,bytes32,uint256)\":{\"params\":{\"_l1BlockHash\":\"A block hash which must be included in the current chain.\",\"_l1BlockNumber\":\"The block number with the specified block hash.\",\"_l2BlockNumber\":\"The L2 block number that resulted in _outputRoot.\",\"_outputRoot\":\"The L2 output of the checkpoint block.\"}},\"version()\":{\"returns\":{\"_0\":\"Semver contract version as a string.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"OutputProposed(bytes32,uint256,uint256,uint256)\":{\"notice\":\"Emitted when an output is proposed.\"},\"OutputsDeleted(uint256,uint256)\":{\"notice\":\"Emitted when outputs are deleted.\"}},\"kind\":\"user\",\"methods\":{\"CHALLENGER()\":{\"notice\":\"The address of the challenger. Can be updated via upgrade.\"},\"FINALIZATION_PERIOD_SECONDS()\":{\"notice\":\"Minimum time (in seconds) that must elapse before a withdrawal can be finalized.\"},\"L2_BLOCK_TIME()\":{\"notice\":\"The time between L2 blocks in seconds. Once set, this value MUST NOT be modified.\"},\"PROPOSER()\":{\"notice\":\"The address of the proposer. Can be updated via upgrade.\"},\"SUBMISSION_INTERVAL()\":{\"notice\":\"The interval in L2 blocks at which checkpoints must be submitted. Although this is         immutable, it can safely be modified by upgrading the implementation contract.\"},\"computeL2Timestamp(uint256)\":{\"notice\":\"Returns the L2 timestamp corresponding to a given L2 block number.\"},\"deleteL2Outputs(uint256)\":{\"notice\":\"Deletes all output proposals after and including the proposal that corresponds to         the given output index. Only the challenger address can delete outputs.\"},\"getL2Output(uint256)\":{\"notice\":\"Returns an output by index. Exists because Solidity's array access will return a         tuple instead of a struct.\"},\"getL2OutputAfter(uint256)\":{\"notice\":\"Returns the L2 output proposal that checkpoints a given L2 block number. Uses a         binary search to find the first output greater than or equal to the given block.\"},\"getL2OutputIndexAfter(uint256)\":{\"notice\":\"Returns the index of the L2 output that checkpoints a given L2 block number. Uses a         binary search to find the first output greater than or equal to the given block.\"},\"initialize(uint256,uint256)\":{\"notice\":\"Initializer.\"},\"latestBlockNumber()\":{\"notice\":\"Returns the block number of the latest submitted L2 output proposal. If no proposals         been submitted yet then this function will return the starting block number.\"},\"latestOutputIndex()\":{\"notice\":\"Returns the number of outputs that have been proposed. Will revert if no outputs         have been proposed yet.\"},\"nextBlockNumber()\":{\"notice\":\"Computes the block number of the next L2 block that needs to be checkpointed.\"},\"nextOutputIndex()\":{\"notice\":\"Returns the index of the next output to be proposed.\"},\"proposeL2Output(bytes32,uint256,bytes32,uint256)\":{\"notice\":\"Accepts an outputRoot and the timestamp of the corresponding L2 block. The timestamp         must be equal to the current value returned by `nextTimestamp()` in order to be         accepted. This function may only be called by the Proposer.\"},\"startingBlockNumber()\":{\"notice\":\"The number of the first L2 block recorded in this contract.\"},\"startingTimestamp()\":{\"notice\":\"The timestamp of the first L2 block recorded in this contract.\"},\"version()\":{\"notice\":\"Returns the full semver contract version.\"}},\"notice\":\"The L2OutputOracle contains an array of L2 state outputs, where each output is a         commitment to the state of the L2 chain. Other contracts like the OptimismPortal use         these outputs to verify information about the state of L2.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/L2OutputOracle.sol\":\"L2OutputOracle\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/=node_modules/@rari-capital/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\"]},\"sources\":{\"contracts/L1/L2OutputOracle.sol\":{\"keccak256\":\"0xba09a5005080e6c7ccc9e0dab17165f20ae0ef9d9c04a13d0b5c158dc1c2a4bb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fce7e5b5fb4882f05ddcd540f4781225bcf95870b5206e1b423a98ddd3e80df2\",\"dweb:/ipfs/QmQxsgVPaZmkW8SKxKtQEmP5ApeXAxaEEC6Hf4AQ4xL3wC\"]},\"contracts/libraries/Types.sol\":{\"keccak256\":\"0x4fe8ec920798661a828430bd30dc2715eeb40534ec01c0a7bf41cb4ab422e134\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://74c8471869900bd459358cd990bda1c8d234c06b788804c7049cf465ae1e299f\",\"dweb:/ipfs/QmakcfP6NmbVUQsKqH7rEyJsbiqckigLahw9g74oencEJ7\"]},\"contracts/universal/Semver.sol\":{\"keccak256\":\"0x400059d3edb9efc9c23e6fbc18de6710f9235a4ffba4ab23bdb9f825273f093b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9baf7797439c0ae6512f4639dfc6a1934dbd4e4d7cbb8e63e99264ff47682c9e\",\"dweb:/ipfs/QmawAuhppPyeoZH3rC1uh87xDELa9Lyfw5pYsBqE8myE1m\"]},\"node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"]},\"node_modules/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6f2cf1c531122bc7ca96b8c8db6a60deae60441e5223065e792553d4849b5638\",\"dweb:/ipfs/QmPBdJmBBABMDCfyDjCbdxgiqRavgiSL88SYPGibgbPas9\"]}},\"version\":1}",
  "bytecode": "[encoded data, 13830 characters]",
  "deployedBytecode": "[encoded data, 11640 characters]",
  "devdoc": {
    "version": 1,
    "kind": "dev",
    "methods": {
      "computeL2Timestamp(uint256)": {
        "params": {
          "_l2BlockNumber": "The L2 block number of the target block."
        },
        "returns": {
          "_0": "L2 timestamp of the given block."
        }
      },
      "constructor": {
        "params": {
          "_challenger": "The address of the challenger.",
          "_l2BlockTime": "The time per L2 block, in seconds.",
          "_proposer": "The address of the proposer.",
          "_startingBlockNumber": "The number of the first L2 block.",
          "_startingTimestamp": "The timestamp of the first L2 block.",
          "_submissionInterval": "Interval in blocks at which checkpoints must be submitted."
        }
      },
      "deleteL2Outputs(uint256)": {
        "params": {
          "_l2OutputIndex": "Index of the first L2 output to be deleted. All outputs after this                       output will also be deleted."
        }
      },
      "getL2Output(uint256)": {
        "params": {
          "_l2OutputIndex": "Index of the output to return."
        },
        "returns": {
          "_0": "The output at the given index."
        }
      },
      "getL2OutputAfter(uint256)": {
        "params": {
          "_l2BlockNumber": "L2 block number to find a checkpoint for."
        },
        "returns": {
          "_0": "First checkpoint that commits to the given L2 block number."
        }
      },
      "getL2OutputIndexAfter(uint256)": {
        "params": {
          "_l2BlockNumber": "L2 block number to find a checkpoint for."
        },
        "returns": {
          "_0": "Index of the first checkpoint that commits to the given L2 block number."
        }
      },
      "initialize(uint256,uint256)": {
        "params": {
          "_startingBlockNumber": "Block number for the first recoded L2 block.",
          "_startingTimestamp": "Timestamp for the first recoded L2 block."
        }
      },
      "latestBlockNumber()": {
        "returns": {
          "_0": "Latest submitted L2 block number."
        }
      },
      "latestOutputIndex()": {
        "returns": {
          "_0": "The number of outputs that have been proposed."
        }
      },
      "nextBlockNumber()": {
        "returns": {
          "_0": "Next L2 block number."
        }
      },
      "nextOutputIndex()": {
        "returns": {
          "_0": "The index of the next output to be proposed."
        }
      },
      "proposeL2Output(bytes32,uint256,bytes32,uint256)": {
        "params": {
          "_l1BlockHash": "A block hash which must be included in the current chain.",
          "_l1BlockNumber": "The block number with the specified block hash.",
          "_l2BlockNumber": "The L2 block number that resulted in _outputRoot.",
          "_outputRoot": "The L2 output of the checkpoint block."
        }
      },
      "version()": {
        "returns": {
          "_0": "Semver contract version as a string."
        }
      }
    },
    "events": {
      "OutputProposed(bytes32,uint256,uint256,uint256)": {
        "params": {
          "l1Timestamp": "The L1 timestamp when proposed.",
          "l2BlockNumber": "The L2 block number of the output root.",
          "l2OutputIndex": "The index of the output in the l2Outputs array.",
          "outputRoot": "The output root."
        }
      },
      "OutputsDeleted(uint256,uint256)": {
        "params": {
          "newNextOutputIndex": "Next L2 output index after the deletion.",
          "prevNextOutputIndex": "Next L2 output index before the deletion."
        }
      }
    }
  },
  "userdoc": {
    "version": 1,
    "kind": "user",
    "methods": {
      "CHALLENGER()": {
        "notice": "The address of the challenger. Can be updated via upgrade."
      },
      "FINALIZATION_PERIOD_SECONDS()": {
        "notice": "Minimum time (in seconds) that must elapse before a withdrawal can be finalized."
      },
      "L2_BLOCK_TIME()": {
        "notice": "The time between L2 blocks in seconds. Once set, this value MUST NOT be modified."
      },
      "PROPOSER()": {
        "notice": "The address of the proposer. Can be updated via upgrade."
      },
      "SUBMISSION_INTERVAL()": {
        "notice": "The interval in L2 blocks at which checkpoints must be submitted. Although this is         immutable, it can safely be modified by upgrading the implementation contract."
      },
      "computeL2Timestamp(uint256)": {
        "notice": "Returns the L2 timestamp corresponding to a given L2 block number."
      },
      "deleteL2Outputs(uint256)": {
        "notice": "Deletes all output proposals after and including the proposal that corresponds to         the given output index. Only the challenger address can delete outputs."
      },
      "getL2Output(uint256)": {
        "notice": "Returns an output by index. Exists because Solidity's array access will return a         tuple instead of a struct."
      },
      "getL2OutputAfter(uint256)": {
        "notice": "Returns the L2 output proposal that checkpoints a given L2 block number. Uses a         binary search to find the first output greater than or equal to the given block."
      },
      "getL2OutputIndexAfter(uint256)": {
        "notice": "Returns the index of the L2 output that checkpoints a given L2 block number. Uses a         binary search to find the first output greater than or equal to the given block."
      },
      "initialize(uint256,uint256)": {
        "notice": "Initializer."
      },
      "latestBlockNumber()": {
        "notice": "Returns the block number of the latest submitted L2 output proposal. If no proposals         been submitted yet then this function will return the starting block number."
      },
      "latestOutputIndex()": {
        "notice": "Returns the number of outputs that have been proposed. Will revert if no outputs         have been proposed yet."
      },
      "nextBlockNumber()": {
        "notice": "Computes the block number of the next L2 block that needs to be checkpointed."
      },
      "nextOutputIndex()": {
        "notice": "Returns the index of the next output to be proposed."
      },
      "proposeL2Output(bytes32,uint256,bytes32,uint256)": {
        "notice": "Accepts an outputRoot and the timestamp of the corresponding L2 block. The timestamp         must be equal to the current value returned by `nextTimestamp()` in order to be         accepted. This function may only be called by the Proposer."
      },
      "startingBlockNumber()": {
        "notice": "The number of the first L2 block recorded in this contract."
      },
      "startingTimestamp()": {
        "notice": "The timestamp of the first L2 block recorded in this contract."
      },
      "version()": {
        "notice": "Returns the full semver contract version."
      }
    },
    "events": {
      "OutputProposed(bytes32,uint256,uint256,uint256)": {
        "notice": "Emitted when an output is proposed."
      },
      "OutputsDeleted(uint256,uint256)": {
        "notice": "Emitted when outputs are deleted."
      }
    },
    "notice": "The L2OutputOracle contains an array of L2 state outputs, where each output is a         commitment to the state of the L2 chain. Other contracts like the OptimismPortal use         these outputs to verify information about the state of L2."
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 49863,
        "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "_initialized",
        "offset": 0,
        "slot": "0",
        "type": "t_uint8"
      },
      {
        "astId": 49866,
        "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "_initializing",
        "offset": 1,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 803,
        "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "startingBlockNumber",
        "offset": 0,
        "slot": "1",
        "type": "t_uint256"
      },
      {
        "astId": 806,
        "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "startingTimestamp",
        "offset": 0,
        "slot": "2",
        "type": "t_uint256"
      },
      {
        "astId": 811,
        "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "l2Outputs",
        "offset": 0,
        "slot": "3",
        "type": "t_array(t_struct(OutputProposal)8566_storage)dyn_storage"
      }
    ],
    "types": {
      "t_array(t_struct(OutputProposal)8566_storage)dyn_storage": {
        "encoding": "dynamic_array",
        "label": "struct Types.OutputProposal[]",
        "numberOfBytes": "32",
        "base": "t_struct(OutputProposal)8566_storage"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_struct(OutputProposal)8566_storage": {
        "encoding": "inplace",
        "label": "struct Types.OutputProposal",
        "numberOfBytes": "64",
        "members": [
          {
            "astId": 8561,
            "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
            "label": "outputRoot",
            "offset": 0,
            "slot": "0",
            "type": "t_bytes32"
          },
          {
            "astId": 8563,
            "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
            "label": "timestamp",
            "offset": 0,
            "slot": "1",
            "type": "t_uint128"
          },
          {
            "astId": 8565,
            "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
            "label": "l2BlockNumber",
            "offset": 16,
            "slot": "1",
            "type": "t_uint128"
          }
        ]
      },
      "t_uint128": {
        "encoding": "inplace",
        "label": "uint128",
        "numberOfBytes": "16"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      }
    }
  }
}