{
  "address": "0x21D568b5139cB35abebB83c24FD1959cc36455C3",
  "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"
        }
      ],
      "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": "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": "0x060c549ad7d8630bfade7103b51cc2ed87213e374ebc3812523f103bbd0d9383",
  "receipt": {
    "to": null,
    "from": "0x2d30335B0b807bBa1682C487BaAFD2Ad6da5D675",
    "contractAddress": "0x21D568b5139cB35abebB83c24FD1959cc36455C3",
    "transactionIndex": 0,
    "gasUsed": "1262021",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000",
    "blockHash": "0xadab359eb77dadab329799a80880cffbff7549a74945bf00104e065f91b7a57e",
    "transactionHash": "0x060c549ad7d8630bfade7103b51cc2ed87213e374ebc3812523f103bbd0d9383",
    "logs": [
      {
        "transactionIndex": 0,
        "blockNumber": 8106684,
        "transactionHash": "0x060c549ad7d8630bfade7103b51cc2ed87213e374ebc3812523f103bbd0d9383",
        "address": "0x21D568b5139cB35abebB83c24FD1959cc36455C3",
        "topics": [
          "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"
        ],
        "data": "0x0000000000000000000000000000000000000000000000000000000000000001",
        "logIndex": 0,
        "blockHash": "0xadab359eb77dadab329799a80880cffbff7549a74945bf00104e065f91b7a57e"
      }
    ],
    "blockNumber": 8106684,
    "cumulativeGasUsed": "1262021",
    "status": 1,
    "byzantium": true
  },
  "args": [
    20,
    2,
    0,
    0,
    "0x88BCa4Af3d950625752867f826E073E337076581",
    "0x88BCa4Af3d950625752867f826E073E337076581"
  ],
  "numDeployments": 1,
  "solcInputHash": "31019ee6c188b31fc9b304ddc761be1b",
  "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\"}],\"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\":\"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\":\"0.0.1\",\"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.\"},\"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\":[\":@eth-optimism/contracts-periphery/=node_modules/@eth-optimism/contracts-periphery/contracts/\",\":@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\":\"0xc3dcad8a52e04e081f6c9065f63f1c932f10628c3c6d4ce870c379c90ca6236d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a01a01b3fed9548737ae8f5e07b3fb033f31c86ea03055cc4516ebcc58ea300f\",\"dweb:/ipfs/QmQk1xADjgXyy7AKoQvFZBKbQyXi7i92UUAc8FPqnQrDvv\"]},\"contracts/libraries/Types.sol\":{\"keccak256\":\"0x822e7c7ac5d45eac20551ba602d8bff3d22db3538fb32be42c1ab12d7bfca110\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://970823854723de895ca7a24d34269e886a20824c75f706cb41541893b7c78838\",\"dweb:/ipfs/QmSQbEECeTxgUT65pK7Czc4ovAv2FdQ9EHyi5Z8mZgNkXc\"]},\"contracts/universal/Semver.sol\":{\"keccak256\":\"0x979b13465de4996a1105850abbf48abe7f71d5e18a8d4af318597ee14c165fdf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d0881ed7d8371fe1c12b931334e107746fa97d9ecd6aa3c0fca0c0db8581474e\",\"dweb:/ipfs/QmQ9UFwZgWkyFAHrzTtS7m6rghZ8nP9QybEuJ5y9vux5Gv\"]},\"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, 12568 characters]",
  "deployedBytecode": "[encoded data, 10924 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."
      },
      "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": 29352,
        "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "_initialized",
        "offset": 0,
        "slot": "0",
        "type": "t_uint8"
      },
      {
        "astId": 29355,
        "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "_initializing",
        "offset": 1,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 691,
        "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "startingBlockNumber",
        "offset": 0,
        "slot": "1",
        "type": "t_uint256"
      },
      {
        "astId": 694,
        "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "startingTimestamp",
        "offset": 0,
        "slot": "2",
        "type": "t_uint256"
      },
      {
        "astId": 699,
        "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "l2Outputs",
        "offset": 0,
        "slot": "3",
        "type": "t_array(t_struct(OutputProposal)5444_storage)dyn_storage"
      }
    ],
    "types": {
      "t_array(t_struct(OutputProposal)5444_storage)dyn_storage": {
        "encoding": "dynamic_array",
        "label": "struct Types.OutputProposal[]",
        "numberOfBytes": "32",
        "base": "t_struct(OutputProposal)5444_storage"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_struct(OutputProposal)5444_storage": {
        "encoding": "inplace",
        "label": "struct Types.OutputProposal",
        "numberOfBytes": "64",
        "members": [
          {
            "astId": 5439,
            "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
            "label": "outputRoot",
            "offset": 0,
            "slot": "0",
            "type": "t_bytes32"
          },
          {
            "astId": 5441,
            "contract": "contracts/L1/L2OutputOracle.sol:L2OutputOracle",
            "label": "timestamp",
            "offset": 0,
            "slot": "1",
            "type": "t_uint128"
          },
          {
            "astId": 5443,
            "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"
      }
    }
  }
}