{
  "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"
    }
  ],
  "address": "0x60f13265a83022aEDFf0b01Fa07fF262642F1589",
  "args": [
    "120",
    "2",
    "0",
    "0",
    "0x02b1786A85Ec3f71fBbBa46507780dB7cF9014f6",
    "0xfd1D2e729aE8eEe2E146c033bf4400fE75284301",
    "12"
  ],
  "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."
        }
      }
    }
  },
  "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\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Initialized\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"l2OutputIndex\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"l1Timestamp\",\"type\":\"uint256\",\"indexed\":false}],\"type\":\"event\",\"name\":\"OutputProposed\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"prevNextOutputIndex\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"newNextOutputIndex\",\"type\":\"uint256\",\"indexed\":true}],\"type\":\"event\",\"name\":\"OutputsDeleted\",\"anonymous\":false},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"CHALLENGER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"L2_BLOCK_TIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PROPOSER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"SUBMISSION_INTERVAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"computeL2Timestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"deleteL2Outputs\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"getL2Output\",\"outputs\":[{\"internalType\":\"struct Types.OutputProposal\",\"name\":\"\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"timestamp\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2BlockNumber\",\"type\":\"uint128\"}]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"getL2OutputAfter\",\"outputs\":[{\"internalType\":\"struct Types.OutputProposal\",\"name\":\"\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"timestamp\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2BlockNumber\",\"type\":\"uint128\"}]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"getL2OutputIndexAfter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"initialize\"},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"latestBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"latestOutputIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"nextBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"nextOutputIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"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\"}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"proposeL2Output\"},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"startingBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"startingTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}]}],\"devdoc\":{\"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.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\":{\"kind\":\"user\",\"methods\":{\"CHALLENGER()\":{\"notice\":\"The address of the challenger. Can be updated via upgrade.\"},\"FINALIZATION_PERIOD_SECONDS()\":{\"notice\":\"The 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.\"},\"constructor\":{\"notice\":\"Constructs the L2OutputOracle contract.\"},\"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. Needed to return a struct instead of a tuple.\"},\"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.\"}},\"version\":1}},\"settings\":{\"remappings\":[\":.ignored_clones-with-immutable-args/=node_modules/.ignored_clones-with-immutable-args/src/\",\":.ignored_forge-std/=node_modules/.ignored_forge-std/src/\",\":@cwia/=lib/clones-with-immutable-args/src/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":clones-with-immutable-args/=lib/clones-with-immutable-args/src/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":solmate/=lib/solmate/src/\"],\"optimizer\":{\"enabled\":true,\"runs\":999999},\"metadata\":{\"bytecodeHash\":\"none\"},\"compilationTarget\":{\"src/L1/L2OutputOracle.sol\":\"L2OutputOracle\"},\"libraries\":{}},\"sources\":{\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"keccak256\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"urls\":[\"bzz-raw://6f2cf1c531122bc7ca96b8c8db6a60deae60441e5223065e792553d4849b5638\",\"dweb:/ipfs/QmPBdJmBBABMDCfyDjCbdxgiqRavgiSL88SYPGibgbPas9\"],\"license\":\"MIT\"},\"src/L1/L2OutputOracle.sol\":{\"keccak256\":\"0x38c2d1a745bfc7aaa7253cf9b94d9e09553eeea4047ad1852f3cdf49689d943d\",\"urls\":[\"bzz-raw://e603a437cd481b8f71ef987ffa1f29244ed451b36ec49bb2ebdac4a796c4b9f5\",\"dweb:/ipfs/QmePCvVdHEQgVAYRXExGrEBfsPc21AFGBTcW3is3nNmARr\"],\"license\":\"MIT\"},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"],\"license\":\"MIT\"},\"src/universal/Semver.sol\":{\"keccak256\":\"0xc455c84bb1f17e994dea0451fd363f81f83965bfa86e81ac6c8b3a327b9a0ff0\",\"urls\":[\"bzz-raw://fab499f3c0d7df8eb763b50621848d5d2147fb9c42a8eb9b65a11093090bb482\",\"dweb:/ipfs/QmUKsG4ztwtUZFjuRYAxgUFTgH5YxWSGF1BFFaB7vdM2K3\"],\"license\":\"MIT\"}},\"version\":1}",
  "numDeployments": 3,
  "receipt": {
    "transactionHash": "0x46aeccd11005ab0f6a39da88427ec4016143ceeb47b8d0c74bf6e62ba3601782",
    "transactionIndex": "0xf",
    "blockHash": "0xb54faac6b87db5328d4eb6ff0c3f581c2d870bedfe48d9f0f2e8cad58572c911",
    "blockNumber": "0x3cadeb",
    "from": "0x18394B52d3Cb931dfA76F63251919D051953413d",
    "to": null,
    "cumulativeGasUsed": "0xddb8ea",
    "gasUsed": "0x147d46",
    "contractAddress": "0x60f13265a83022aEDFf0b01Fa07fF262642F1589",
    "logs": [
      {
        "address": "0x60f13265a83022aEDFf0b01Fa07fF262642F1589",
        "topics": [
          "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"
        ],
        "data": "0x0000000000000000000000000000000000000000000000000000000000000001",
        "blockHash": "0xb54faac6b87db5328d4eb6ff0c3f581c2d870bedfe48d9f0f2e8cad58572c911",
        "blockNumber": "0x3cadeb",
        "transactionHash": "0x46aeccd11005ab0f6a39da88427ec4016143ceeb47b8d0c74bf6e62ba3601782",
        "transactionIndex": "0xf",
        "logIndex": "0xc",
        "removed": false
      }
    ],
    "status": "0x1",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000010000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000",
    "type": "0x2",
    "effectiveGasPrice": "0xb2d05e0b"
  },
  "solcInputHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "storageLayout": {
    "storage": [
      {
        "astId": 29580,
        "contract": "src/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "_initialized",
        "offset": 0,
        "slot": "0",
        "type": "t_uint8"
      },
      {
        "astId": 29583,
        "contract": "src/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "_initializing",
        "offset": 1,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 41398,
        "contract": "src/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "startingBlockNumber",
        "offset": 0,
        "slot": "1",
        "type": "t_uint256"
      },
      {
        "astId": 41401,
        "contract": "src/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "startingTimestamp",
        "offset": 0,
        "slot": "2",
        "type": "t_uint256"
      },
      {
        "astId": 41406,
        "contract": "src/L1/L2OutputOracle.sol:L2OutputOracle",
        "label": "l2Outputs",
        "offset": 0,
        "slot": "3",
        "type": "t_array(t_struct(OutputProposal)47034_storage)dyn_storage"
      }
    ],
    "types": {
      "t_array(t_struct(OutputProposal)47034_storage)dyn_storage": {
        "encoding": "dynamic_array",
        "label": "struct Types.OutputProposal[]",
        "numberOfBytes": "32",
        "base": "t_struct(OutputProposal)47034_storage"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_struct(OutputProposal)47034_storage": {
        "encoding": "inplace",
        "label": "struct Types.OutputProposal",
        "numberOfBytes": "64",
        "members": [
          {
            "astId": 47029,
            "contract": "src/L1/L2OutputOracle.sol:L2OutputOracle",
            "label": "outputRoot",
            "offset": 0,
            "slot": "0",
            "type": "t_bytes32"
          },
          {
            "astId": 47031,
            "contract": "src/L1/L2OutputOracle.sol:L2OutputOracle",
            "label": "timestamp",
            "offset": 0,
            "slot": "1",
            "type": "t_uint128"
          },
          {
            "astId": 47033,
            "contract": "src/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"
      }
    }
  },
  "transactionHash": "0x46aeccd11005ab0f6a39da88427ec4016143ceeb47b8d0c74bf6e62ba3601782",
  "userdoc": {
    "version": 1,
    "kind": "user",
    "methods": {
      "CHALLENGER()": {
        "notice": "The address of the challenger. Can be updated via upgrade."
      },
      "FINALIZATION_PERIOD_SECONDS()": {
        "notice": "The 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."
      },
      "constructor": {
        "notice": "Constructs the L2OutputOracle contract."
      },
      "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. Needed to return a struct instead of a tuple."
      },
      "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."
  }
}