{
  "address": "0x9fCF7D13d10dEdF17d0f24C62f0cf4ED462f65b7",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_libAddressManager",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_fraudProofWindow",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_sequencerPublishWindow",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "_batchRoot",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_batchSize",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_prevTotalElements",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_extraData",
          "type": "bytes"
        }
      ],
      "name": "StateBatchAppended",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "_batchRoot",
          "type": "bytes32"
        }
      ],
      "name": "StateBatchDeleted",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_CHAINID",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FRAUD_PROOF_WINDOW",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SEQUENCER_PUBLISH_WINDOW",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "_batch",
          "type": "bytes32[]"
        },
        {
          "internalType": "uint256",
          "name": "_shouldStartAtElement",
          "type": "uint256"
        }
      ],
      "name": "appendStateBatch",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "bytes32[]",
          "name": "_batch",
          "type": "bytes32[]"
        },
        {
          "internalType": "uint256",
          "name": "_shouldStartAtElement",
          "type": "uint256"
        },
        {
          "internalType": "string",
          "name": "proposer",
          "type": "string"
        }
      ],
      "name": "appendStateBatchByChainId",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "batches",
      "outputs": [
        {
          "internalType": "contract IChainStorageContainer",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "batchIndex",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "batchRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "batchSize",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "prevTotalElements",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "internalType": "struct Lib_OVMCodec.ChainBatchHeader",
          "name": "_batchHeader",
          "type": "tuple"
        }
      ],
      "name": "deleteStateBatch",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "batchIndex",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "batchRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "batchSize",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "prevTotalElements",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "internalType": "struct Lib_OVMCodec.ChainBatchHeader",
          "name": "_batchHeader",
          "type": "tuple"
        }
      ],
      "name": "deleteStateBatchByChainId",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getLastSequencerTimestamp",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_lastSequencerTimestamp",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        }
      ],
      "name": "getLastSequencerTimestampByChainId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_lastSequencerTimestamp",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTotalBatches",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_totalBatches",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        }
      ],
      "name": "getTotalBatchesByChainId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_totalBatches",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTotalElements",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_totalElements",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        }
      ],
      "name": "getTotalElementsByChainId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_totalElements",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "batchIndex",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "batchRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "batchSize",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "prevTotalElements",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "internalType": "struct Lib_OVMCodec.ChainBatchHeader",
          "name": "_batchHeader",
          "type": "tuple"
        }
      ],
      "name": "insideFraudProofWindow",
      "outputs": [
        {
          "internalType": "bool",
          "name": "_inside",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "batchIndex",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "batchRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "batchSize",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "prevTotalElements",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "internalType": "struct Lib_OVMCodec.ChainBatchHeader",
          "name": "_batchHeader",
          "type": "tuple"
        }
      ],
      "name": "insideFraudProofWindowByChainId",
      "outputs": [
        {
          "internalType": "bool",
          "name": "_inside",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "libAddressManager",
      "outputs": [
        {
          "internalType": "contract Lib_AddressManager",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "_name",
          "type": "string"
        }
      ],
      "name": "resolve",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "window",
          "type": "uint256"
        }
      ],
      "name": "setFraudProofWindow",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_element",
          "type": "bytes32"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "batchIndex",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "batchRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "batchSize",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "prevTotalElements",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "internalType": "struct Lib_OVMCodec.ChainBatchHeader",
          "name": "_batchHeader",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "index",
              "type": "uint256"
            },
            {
              "internalType": "bytes32[]",
              "name": "siblings",
              "type": "bytes32[]"
            }
          ],
          "internalType": "struct Lib_OVMCodec.ChainInclusionProof",
          "name": "_proof",
          "type": "tuple"
        }
      ],
      "name": "verifyStateCommitment",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "_element",
          "type": "bytes32"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "batchIndex",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "batchRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "batchSize",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "prevTotalElements",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "internalType": "struct Lib_OVMCodec.ChainBatchHeader",
          "name": "_batchHeader",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "index",
              "type": "uint256"
            },
            {
              "internalType": "bytes32[]",
              "name": "siblings",
              "type": "bytes32[]"
            }
          ],
          "internalType": "struct Lib_OVMCodec.ChainInclusionProof",
          "name": "_proof",
          "type": "tuple"
        }
      ],
      "name": "verifyStateCommitmentByChainId",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "transactionHash": "0x753a7077effe3c7d7188473b28e4c0ca3877a09015b347ef4580286d73b1fb48",
  "receipt": {
    "to": null,
    "from": "0x8943545177806ED17B9F23F0a21ee5948eCaa776",
    "contractAddress": "0x9fCF7D13d10dEdF17d0f24C62f0cf4ED462f65b7",
    "transactionIndex": 0,
    "gasUsed": "2203559",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x1ace797c49d31515217ae2cd0f13269d5ef19cdc7b2a90ddd6a54378d47d7d21",
    "transactionHash": "0x753a7077effe3c7d7188473b28e4c0ca3877a09015b347ef4580286d73b1fb48",
    "logs": [],
    "blockNumber": 151,
    "cumulativeGasUsed": "2203559",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0xb4B46bdAA835F8E4b4d8e208B6559cD267851051",
    0,
    0
  ],
  "numDeployments": 1,
  "solcInputHash": "a4af6a73ed3a5b6911a24e59d7ed5284",
  "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_CHAINID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"name\":\"appendStateBatchByChainId\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contract IChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatchByChainId\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"}],\"name\":\"getLastSequencerTimestampByChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"}],\"name\":\"getTotalBatchesByChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"}],\"name\":\"getTotalElementsByChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindowByChainId\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"window\",\"type\":\"uint256\"}],\"name\":\"setFraudProofWindow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct Lib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitmentByChainId\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM\",\"kind\":\"dev\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"appendStateBatchByChainId(uint256,bytes32[],uint256,string)\":{\"params\":{\"_batch\":\"Batch of state roots.\",\"_chainId\":\"identity for the l2 chain.\",\"_shouldStartAtElement\":\"Index of the element at which this batch should start.\"}},\"batches()\":{\"returns\":{\"_0\":\"Reference to the batch storage container.\"}},\"constructor\":{\"params\":{\"_libAddressManager\":\"Address of the Address Manager.\"}},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\"}},\"deleteStateBatchByChainId(uint256,(uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to start deleting from.\",\"_chainId\":\"identity for the l2 chain.\"}},\"getLastSequencerTimestamp()\":{\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getLastSequencerTimestampByChainId(uint256)\":{\"params\":{\"_chainId\":\"identity for the l2 chain.\"},\"returns\":{\"_lastSequencerTimestamp\":\"Last sequencer batch timestamp.\"}},\"getTotalBatches()\":{\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalBatchesByChainId(uint256)\":{\"params\":{\"_chainId\":\"identity for the l2 chain.\"},\"returns\":{\"_totalBatches\":\"Total submitted batches.\"}},\"getTotalElements()\":{\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"getTotalElementsByChainId(uint256)\":{\"params\":{\"_chainId\":\"identity for the l2 chain.\"},\"returns\":{\"_totalElements\":\"Total submitted elements.\"}},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"insideFraudProofWindowByChainId(uint256,(uint256,bytes32,uint256,uint256,bytes))\":{\"params\":{\"_batchHeader\":\"Header of the batch to check.\",\"_chainId\":\"identity for the l2 chain.\"},\"returns\":{\"_inside\":\"Whether or not the batch is inside the fraud proof window.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}},\"verifyStateCommitmentByChainId(uint256,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"params\":{\"_batchHeader\":\"Header of the batch in which the element was included.\",\"_chainId\":\"identity for the l2 chain.\",\"_element\":\"Hash of the element to verify a proof for.\",\"_proof\":\"Merkle inclusion proof for the element.\"}}},\"title\":\"StateCommitmentChain\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendStateBatch(bytes32[],uint256)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"appendStateBatchByChainId(uint256,bytes32[],uint256,string)\":{\"notice\":\"Appends a batch of state roots to the chain.\"},\"batches()\":{\"notice\":\"Accesses the batch storage container.\"},\"deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"deleteStateBatchByChainId(uint256,(uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Deletes all state roots after (and including) a given batch.\"},\"getLastSequencerTimestamp()\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getLastSequencerTimestampByChainId(uint256)\":{\"notice\":\"Retrieves the timestamp of the last batch submitted by the sequencer.\"},\"getTotalBatches()\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalBatchesByChainId(uint256)\":{\"notice\":\"Retrieves the total number of batches submitted.\"},\"getTotalElements()\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"getTotalElementsByChainId(uint256)\":{\"notice\":\"Retrieves the total number of elements submitted.\"},\"insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"insideFraudProofWindowByChainId(uint256,(uint256,bytes32,uint256,uint256,bytes))\":{\"notice\":\"Checks whether a given batch is still inside its fraud proof window.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"},\"verifyStateCommitmentByChainId(uint256,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))\":{\"notice\":\"Verifies a batch inclusion proof.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/rollup/StateCommitmentChain.sol\":\"StateCommitmentChain\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    constructor() {\\n        _setOwner(_msgSender());\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _setOwner(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        _setOwner(newOwner);\\n    }\\n\\n    function _setOwner(address newOwner) private {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/ICanonicalTransactionChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\n\\n/* Interface Imports */\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface ICanonicalTransactionChain {\\n    /**********\\n     * Events *\\n     **********/\\n    event QueueGlobalMetadataSet(address _sender, uint256 _chainId, bytes27 _globalMetadata);\\n\\n    event QueuePushed(address _sender, uint256 _chainId, Lib_OVMCodec.QueueElement _object);\\n\\n    event QueueSetted(\\n        address _sender,\\n        uint256 _chainId,\\n        uint256 _index,\\n        Lib_OVMCodec.QueueElement _object\\n    );\\n\\n    event QueueElementDeleted(\\n        address _sender,\\n        uint256 _chainId,\\n        uint256 _index,\\n        bytes27 _globalMetadata\\n    );\\n\\n    event BatchesGlobalMetadataSet(address _sender, uint256 _chainId, bytes27 _globalMetadata);\\n\\n    event BatchPushed(address _sender, uint256 _chainId, bytes32 _object, bytes27 _globalMetadata);\\n\\n    event BatchSetted(address _sender, uint256 _chainId, uint256 _index, bytes32 _object);\\n\\n    event BatchElementDeleted(\\n        address _sender,\\n        uint256 _chainId,\\n        uint256 _index,\\n        bytes27 _globalMetadata\\n    );\\n\\n    event L2GasParamsUpdated(\\n        uint256 l2GasDiscountDivisor,\\n        uint256 enqueueGasCost,\\n        uint256 enqueueL2GasPrepaid\\n    );\\n\\n    event TransactionEnqueued(\\n        uint256 _chainId,\\n        address indexed _l1TxOrigin,\\n        address indexed _target,\\n        uint256 _gasLimit,\\n        bytes _data,\\n        uint256 indexed _queueIndex,\\n        uint256 _timestamp\\n    );\\n\\n    event QueueBatchAppended(\\n        uint256 _chainId,\\n        uint256 _startingQueueIndex,\\n        uint256 _numQueueElements,\\n        uint256 _totalElements\\n    );\\n\\n    event SequencerBatchAppended(\\n        uint256 _chainId,\\n        uint256 _startingQueueIndex,\\n        uint256 _numQueueElements,\\n        uint256 _totalElements\\n    );\\n\\n    event TransactionBatchAppended(\\n        uint256 _chainId,\\n        uint256 indexed _batchIndex,\\n        bytes32 _batchRoot,\\n        uint256 _batchSize,\\n        uint256 _prevTotalElements,\\n        bytes _extraData\\n    );\\n\\n    /***********\\n     * Structs *\\n     ***********/\\n\\n    struct BatchContext {\\n        uint256 numSequencedTransactions;\\n        uint256 numSubsequentQueueTransactions;\\n        uint256 timestamp;\\n        uint256 blockNumber;\\n    }\\n\\n    /*******************************\\n     * Authorized Setter Functions *\\n     *******************************/\\n\\n    /**\\n     * Allows the Burn Admin to update the parameters which determine the amount of gas to burn.\\n     * The value of enqueueL2GasPrepaid is immediately updated as well.\\n     */\\n    function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) external;\\n\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    /**\\n     * Accesses the batch storage container.\\n     * @return Reference to the batch storage container.\\n     */\\n    function batches() external view returns (IChainStorageContainer);\\n\\n    /**\\n     * Retrieves the total number of elements submitted.\\n     * @return _totalElements Total submitted elements.\\n     */\\n    function getTotalElements() external view returns (uint256 _totalElements);\\n\\n    /**\\n     * Retrieves the total number of batches submitted.\\n     * @return _totalBatches Total submitted batches.\\n     */\\n    function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n    /**\\n     * Returns the index of the next element to be enqueued.\\n     * @return Index for the next queue element.\\n     */\\n    function getNextQueueIndex() external view returns (uint40);\\n\\n    /**\\n     * Gets the queue element at a particular index.\\n     * @param _index Index of the queue element to access.\\n     * @return _element Queue element at the given index.\\n     */\\n    function getQueueElement(uint256 _index)\\n        external\\n        view\\n        returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n    /**\\n     * Returns the timestamp of the last transaction.\\n     * @return Timestamp for the last transaction.\\n     */\\n    function getLastTimestamp() external view returns (uint40);\\n\\n    /**\\n     * Returns the blocknumber of the last transaction.\\n     * @return Blocknumber for the last transaction.\\n     */\\n    function getLastBlockNumber() external view returns (uint40);\\n\\n    /**\\n     * Get the number of queue elements which have not yet been included.\\n     * @return Number of pending queue elements.\\n     */\\n    function getNumPendingQueueElements() external view returns (uint40);\\n\\n    /**\\n     * Retrieves the length of the queue, including\\n     * both pending and canonical transactions.\\n     * @return Length of the queue.\\n     */\\n    function getQueueLength() external view returns (uint40);\\n\\n    /**\\n     * Adds a transaction to the queue.\\n     * @param _target Target contract to send the transaction to.\\n     * @param _gasLimit Gas limit for the given transaction.\\n     * @param _data Transaction data.\\n     */\\n    function enqueue(\\n        address _target,\\n        uint256 _gasLimit,\\n        bytes memory _data\\n    ) external;\\n\\n    /**\\n     * Allows the sequencer to append a batch of transactions.\\n     * @dev This function uses a custom encoding scheme for efficiency reasons.\\n     * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n     * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n     * .param _contexts Array of batch contexts.\\n     * .param _transactionDataFields Array of raw transaction data.\\n     */\\n    function appendSequencerBatch(\\n        // uint40 _shouldStartAtElement,\\n        // uint24 _totalElementsToAppend,\\n        // BatchContext[] _contexts,\\n        // bytes[] _transactionDataFields\\n    ) external;\\n\\n    //added chain id function\\n\\n    /**\\n     * Retrieves the total number of elements submitted.\\n     * @param _chainId identity for the l2 chain.\\n     * @return _totalElements Total submitted elements.\\n     */\\n    function getTotalElementsByChainId(uint256 _chainId)\\n        external\\n        view\\n        returns (uint256 _totalElements);\\n\\n    /**\\n     * Retrieves the total number of batches submitted.\\n     * @param _chainId identity for the l2 chain.\\n     * @return _totalBatches Total submitted batches.\\n     */\\n    function getTotalBatchesByChainId(uint256 _chainId)\\n        external\\n        view\\n        returns (uint256 _totalBatches);\\n\\n    /**\\n     * Returns the index of the next element to be enqueued.\\n     * @param _chainId identity for the l2 chain.\\n     * @return Index for the next queue element.\\n     */\\n    function getNextQueueIndexByChainId(uint256 _chainId) external view returns (uint40);\\n\\n    /**\\n     * Gets the queue element at a particular index.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _index Index of the queue element to access.\\n     * @return _element Queue element at the given index.\\n     */\\n    function getQueueElementByChainId(uint256 _chainId, uint256 _index)\\n        external\\n        view\\n        returns (Lib_OVMCodec.QueueElement memory _element);\\n\\n    /**\\n     * Returns the timestamp of the last transaction.\\n     * @param _chainId identity for the l2 chain.\\n     * @return Timestamp for the last transaction.\\n     */\\n    function getLastTimestampByChainId(uint256 _chainId) external view returns (uint40);\\n\\n    /**\\n     * Returns the blocknumber of the last transaction.\\n     * @param _chainId identity for the l2 chain.\\n     * @return Blocknumber for the last transaction.\\n     */\\n    function getLastBlockNumberByChainId(uint256 _chainId) external view returns (uint40);\\n\\n    /**\\n     * Get the number of queue elements which have not yet been included.\\n     * @param _chainId identity for the l2 chain.\\n     * @return Number of pending queue elements.\\n     */\\n    function getNumPendingQueueElementsByChainId(uint256 _chainId) external view returns (uint40);\\n\\n    /**\\n     * Retrieves the length of the queue, including\\n     * both pending and canonical transactions.\\n     * @param _chainId identity for the l2 chain.\\n     * @return Length of the queue.\\n     */\\n    function getQueueLengthByChainId(uint256 _chainId) external view returns (uint40);\\n\\n    /**\\n     * Adds a transaction to the queue.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _target Target contract to send the transaction to.\\n     * @param _gasLimit Gas limit for the given transaction.\\n     * @param _data Transaction data.\\n     */\\n    function enqueueByChainId(\\n        uint256 _chainId,\\n        address _target,\\n        uint256 _gasLimit,\\n        bytes memory _data\\n    ) external;\\n\\n    /**\\n     * Allows the sequencer to append a batch of transactions.\\n     * @dev This function uses a custom encoding scheme for efficiency reasons.\\n     * .param _chainId identity for the l2 chain.\\n     * .param _shouldStartAtElement Specific batch we expect to start appending to.\\n     * .param _totalElementsToAppend Total number of batch elements we expect to append.\\n     * .param _contexts Array of batch contexts.\\n     * .param _transactionDataFields Array of raw transaction data.\\n     */\\n    function appendSequencerBatchByChainId(\\n        // uint256 _chainId,\\n        // uint40 _shouldStartAtElement,\\n        // uint24 _totalElementsToAppend,\\n        // BatchContext[] _contexts,\\n        // bytes[] _transactionDataFields\\n    ) external;\\n\\n    function pushQueueByChainId(uint256 _chainId, Lib_OVMCodec.QueueElement calldata _object)\\n        external;\\n\\n    function setQueueByChainId(\\n        uint256 _chainId,\\n        uint256 _index,\\n        Lib_OVMCodec.QueueElement calldata _object\\n    ) external;\\n\\n    function setBatchGlobalMetadataByChainId(uint256 _chainId, bytes27 _globalMetadata) external;\\n\\n    function getBatchGlobalMetadataByChainId(uint256 _chainId) external view returns (bytes27);\\n\\n    function lengthBatchByChainId(uint256 _chainId) external view returns (uint256);\\n\\n    function pushBatchByChainId(\\n        uint256 _chainId,\\n        bytes32 _object,\\n        bytes27 _globalMetadata\\n    ) external;\\n\\n    function setBatchByChainId(\\n        uint256 _chainId,\\n        uint256 _index,\\n        bytes32 _object\\n    ) external;\\n\\n    function getBatchByChainId(uint256 _chainId, uint256 _index) external view returns (bytes32);\\n\\n    function deleteBatchElementsAfterInclusiveByChainId(\\n        uint256 _chainId,\\n        uint256 _index,\\n        bytes27 _globalMetadata\\n    ) external;\\n}\\n\",\"keccak256\":\"0x43c29bda6d5f8fb8f47a2ec0c6807b03e06462c3c3d3a20825a74e03efeaab10\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    /**\\n     * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n     * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n     * 27 bytes to store arbitrary data.\\n     * @param _globalMetadata New global metadata to set.\\n     */\\n    function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n    /**\\n     * Retrieves the container's global metadata field.\\n     * @return Container global metadata field.\\n     */\\n    function getGlobalMetadata() external view returns (bytes27);\\n\\n    /**\\n     * Retrieves the number of objects stored in the container.\\n     * @return Number of objects in the container.\\n     */\\n    function length() external view returns (uint256);\\n\\n    /**\\n     * Pushes an object into the container.\\n     * @param _object A 32 byte value to insert into the container.\\n     */\\n    function push(bytes32 _object) external;\\n\\n    /**\\n     * Pushes an object into the container. Function allows setting the global metadata since\\n     * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n     * metadata (it's an optimization).\\n     * @param _object A 32 byte value to insert into the container.\\n     * @param _globalMetadata New global metadata for the container.\\n     */\\n    function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n    /**\\n     * Set an object into the container. Function allows setting the global metadata since\\n     * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n     * metadata (it's an optimization).\\n     * @param _index position.\\n     * @param _object A 32 byte value to insert into the container.\\n     */\\n    function setByChainId(\\n        uint256 _chainId,\\n        uint256 _index,\\n        bytes32 _object\\n    ) external;\\n\\n    /**\\n     * Retrieves an object from the container.\\n     * @param _index Index of the particular object to access.\\n     * @return 32 byte object value.\\n     */\\n    function get(uint256 _index) external view returns (bytes32);\\n\\n    /**\\n     * Removes all objects after and including a given index.\\n     * @param _index Object index to delete from.\\n     */\\n    function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n    /**\\n     * Removes all objects after and including a given index. Also allows setting the global\\n     * metadata field.\\n     * @param _index Object index to delete from.\\n     * @param _globalMetadata New global metadata for the container.\\n     */\\n    function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n\\n    /**\\n     * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n     * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n     * 27 bytes to store arbitrary data.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _globalMetadata New global metadata to set.\\n     */\\n    function setGlobalMetadataByChainId(uint256 _chainId, bytes27 _globalMetadata) external;\\n\\n    /**\\n     * Retrieves the container's global metadata field.\\n     * @param _chainId identity for the l2 chain.\\n     * @return Container global metadata field.\\n     */\\n    function getGlobalMetadataByChainId(uint256 _chainId) external view returns (bytes27);\\n\\n    /**\\n     * Retrieves the number of objects stored in the container.\\n     * @param _chainId identity for the l2 chain.\\n     * @return Number of objects in the container.\\n     */\\n    function lengthByChainId(uint256 _chainId) external view returns (uint256);\\n\\n    /**\\n     * Pushes an object into the container.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _object A 32 byte value to insert into the container.\\n     */\\n    function pushByChainId(uint256 _chainId, bytes32 _object) external;\\n\\n    /**\\n     * Pushes an object into the container. Function allows setting the global metadata since\\n     * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n     * metadata (it's an optimization).\\n     * @param _chainId identity for the l2 chain.\\n     * @param _object A 32 byte value to insert into the container.\\n     * @param _globalMetadata New global metadata for the container.\\n     */\\n    function pushByChainId(\\n        uint256 _chainId,\\n        bytes32 _object,\\n        bytes27 _globalMetadata\\n    ) external;\\n\\n    /**\\n     * Retrieves an object from the container.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _index Index of the particular object to access.\\n     * @return 32 byte object value.\\n     */\\n    function getByChainId(uint256 _chainId, uint256 _index) external view returns (bytes32);\\n\\n    /**\\n     * Removes all objects after and including a given index.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _index Object index to delete from.\\n     */\\n    function deleteElementsAfterInclusiveByChainId(uint256 _chainId, uint256 _index) external;\\n\\n    /**\\n     * Removes all objects after and including a given index. Also allows setting the global\\n     * metadata field.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _index Object index to delete from.\\n     * @param _globalMetadata New global metadata for the container.\\n     */\\n    function deleteElementsAfterInclusiveByChainId(\\n        uint256 _chainId,\\n        uint256 _index,\\n        bytes27 _globalMetadata\\n    ) external;\\n}\\n\",\"keccak256\":\"0x6e5473cd0f460bd5386c5f111c03d091b165b1b9391394d25326d30174b17fa4\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n    /**********\\n     * Events *\\n     **********/\\n\\n    event StateBatchAppended(\\n        uint256 _chainId,\\n        uint256 indexed _batchIndex,\\n        bytes32 _batchRoot,\\n        uint256 _batchSize,\\n        uint256 _prevTotalElements,\\n        bytes _extraData\\n    );\\n\\n    event StateBatchDeleted(uint256 _chainId, uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    function batches() external view returns (IChainStorageContainer);\\n\\n    /**\\n     * Retrieves the total number of elements submitted.\\n     * @return _totalElements Total submitted elements.\\n     */\\n    function getTotalElements() external view returns (uint256 _totalElements);\\n\\n    /**\\n     * Retrieves the total number of batches submitted.\\n     * @return _totalBatches Total submitted batches.\\n     */\\n    function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n    /**\\n     * Retrieves the timestamp of the last batch submitted by the sequencer.\\n     * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n     */\\n    function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n    /**\\n     * Appends a batch of state roots to the chain.\\n     * @param _batch Batch of state roots.\\n     * @param _shouldStartAtElement Index of the element at which this batch should start.\\n     */\\n    function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n    /**\\n     * Deletes all state roots after (and including) a given batch.\\n     * @param _batchHeader Header of the batch to start deleting from.\\n     */\\n    function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n    /**\\n     * Verifies a batch inclusion proof.\\n     * @param _element Hash of the element to verify a proof for.\\n     * @param _batchHeader Header of the batch in which the element was included.\\n     * @param _proof Merkle inclusion proof for the element.\\n     */\\n    function verifyStateCommitment(\\n        bytes32 _element,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n        Lib_OVMCodec.ChainInclusionProof memory _proof\\n    ) external view returns (bool _verified);\\n\\n    /**\\n     * Checks whether a given batch is still inside its fraud proof window.\\n     * @param _batchHeader Header of the batch to check.\\n     * @return _inside Whether or not the batch is inside the fraud proof window.\\n     */\\n    function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n        external\\n        view\\n        returns (bool _inside);\\n\\n    /********************\\n     * chain id added func *\\n     ********************/\\n\\n    /**\\n     * Retrieves the total number of elements submitted.\\n     * @param _chainId identity for the l2 chain.\\n     * @return _totalElements Total submitted elements.\\n     */\\n    function getTotalElementsByChainId(uint256 _chainId)\\n        external\\n        view\\n        returns (uint256 _totalElements);\\n\\n    /**\\n     * Retrieves the total number of batches submitted.\\n     * @param _chainId identity for the l2 chain.\\n     * @return _totalBatches Total submitted batches.\\n     */\\n    function getTotalBatchesByChainId(uint256 _chainId)\\n        external\\n        view\\n        returns (uint256 _totalBatches);\\n\\n    /**\\n     * Retrieves the timestamp of the last batch submitted by the sequencer.\\n     * @param _chainId identity for the l2 chain.\\n     * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n     */\\n    function getLastSequencerTimestampByChainId(uint256 _chainId)\\n        external\\n        view\\n        returns (uint256 _lastSequencerTimestamp);\\n\\n    /**\\n     * Appends a batch of state roots to the chain.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _batch Batch of state roots.\\n     * @param _shouldStartAtElement Index of the element at which this batch should start.\\n     */\\n    function appendStateBatchByChainId(\\n        uint256 _chainId,\\n        bytes32[] calldata _batch,\\n        uint256 _shouldStartAtElement,\\n        string calldata proposer\\n    ) external;\\n\\n    /**\\n     * Deletes all state roots after (and including) a given batch.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _batchHeader Header of the batch to start deleting from.\\n     */\\n    function deleteStateBatchByChainId(\\n        uint256 _chainId,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n    ) external;\\n\\n    /**\\n     * Verifies a batch inclusion proof.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _element Hash of the element to verify a proof for.\\n     * @param _batchHeader Header of the batch in which the element was included.\\n     * @param _proof Merkle inclusion proof for the element.\\n     */\\n    function verifyStateCommitmentByChainId(\\n        uint256 _chainId,\\n        bytes32 _element,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n        Lib_OVMCodec.ChainInclusionProof memory _proof\\n    ) external view returns (bool _verified);\\n\\n    /**\\n     * Checks whether a given batch is still inside its fraud proof window.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _batchHeader Header of the batch to check.\\n     * @return _inside Whether or not the batch is inside the fraud proof window.\\n     */\\n    function insideFraudProofWindowByChainId(\\n        uint256 _chainId,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n    ) external view returns (bool _inside);\\n}\\n\",\"keccak256\":\"0xa7e8ab4f2dca0197e1a37ef99fe615449e7c3adabece3677ab9a5aee91510c07\",\"license\":\"MIT\"},\"contracts/L1/rollup/StateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../../libraries/utils/Lib_MerkleTree.sol\\\";\\nimport { Lib_Uint } from \\\"../../libraries/utils/Lib_Uint.sol\\\";\\n\\n/* Interface Imports */\\nimport { IStateCommitmentChain } from \\\"./IStateCommitmentChain.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"./ICanonicalTransactionChain.sol\\\";\\nimport { IBondManager } from \\\"../verification/IBondManager.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title StateCommitmentChain\\n * @dev The State Commitment Chain (SCC) contract contains a list of proposed state roots which\\n * Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC).\\n * Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique\\n * state root calculated off-chain by applying the canonical transactions one by one.\\n *\\n * Runtime target: EVM\\n */\\ncontract StateCommitmentChain is IStateCommitmentChain, Lib_AddressResolver {\\n    /*************\\n     * Constants *\\n     *************/\\n\\n    uint256 public FRAUD_PROOF_WINDOW;\\n    uint256 public SEQUENCER_PUBLISH_WINDOW;\\n\\n    uint256 public DEFAULT_CHAINID = 1088;\\n\\n    /***************\\n     * Constructor *\\n     ***************/\\n\\n    /**\\n     * @param _libAddressManager Address of the Address Manager.\\n     */\\n    constructor(\\n        address _libAddressManager,\\n        uint256 _fraudProofWindow,\\n        uint256 _sequencerPublishWindow\\n    ) Lib_AddressResolver(_libAddressManager) {\\n        FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n        SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n    }\\n\\n    function setFraudProofWindow(uint256 window) external {\\n        require(msg.sender == resolve(\\\"METIS_MANAGER\\\"), \\\"now allowed\\\");\\n        FRAUD_PROOF_WINDOW = window;\\n    }\\n\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    /**\\n     * Accesses the batch storage container.\\n     * @return Reference to the batch storage container.\\n     */\\n    function batches() public view returns (IChainStorageContainer) {\\n        return IChainStorageContainer(resolve(\\\"ChainStorageContainer-SCC-batches\\\"));\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function getTotalElements() external view returns (uint256 _totalElements) {\\n        return getTotalElementsByChainId(DEFAULT_CHAINID);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function getTotalBatches() external view returns (uint256 _totalBatches) {\\n        return getTotalBatchesByChainId(DEFAULT_CHAINID);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp) {\\n        return getLastSequencerTimestampByChainId(DEFAULT_CHAINID);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) external {\\n        //require (1==0, \\\"don't use\\\");\\n        string memory proposer = string(\\n            abi.encodePacked(Lib_Uint.uint2str(DEFAULT_CHAINID), \\\"_MVM_Proposer\\\")\\n        );\\n        appendStateBatchByChainId(DEFAULT_CHAINID, _batch, _shouldStartAtElement, proposer);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external {\\n        deleteStateBatchByChainId(DEFAULT_CHAINID, _batchHeader);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function verifyStateCommitment(\\n        bytes32 _element,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n        Lib_OVMCodec.ChainInclusionProof memory _proof\\n    ) external view returns (bool) {\\n        return verifyStateCommitmentByChainId(DEFAULT_CHAINID, _element, _batchHeader, _proof);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n        public\\n        view\\n        returns (bool _inside)\\n    {\\n        (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\\n\\n        require(timestamp != 0, \\\"Batch header timestamp cannot be zero\\\");\\n        return (timestamp + FRAUD_PROOF_WINDOW) > block.timestamp;\\n    }\\n\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Parses the batch context from the extra data.\\n     * @return Total number of elements submitted.\\n     * @return Timestamp of the last batch submitted by the sequencer.\\n     */\\n    function _getBatchExtraData() internal view returns (uint40, uint40) {\\n        // bytes27 extraData = batches().getGlobalMetadata();\\n\\n        // // solhint-disable max-line-length\\n        // uint40 totalElements;\\n        // uint40 lastSequencerTimestamp;\\n        // assembly {\\n        //     extraData := shr(40, extraData)\\n        //     totalElements := and(\\n        //         extraData,\\n        //         0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n        //     )\\n        //     lastSequencerTimestamp := shr(\\n        //         40,\\n        //         and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n        //     )\\n        // }\\n        // // solhint-enable max-line-length\\n\\n        // return (totalElements, lastSequencerTimestamp);\\n\\n        return _getBatchExtraDataByChainId(DEFAULT_CHAINID);\\n    }\\n\\n    /**\\n     * Encodes the batch context for the extra data.\\n     * @param _totalElements Total number of elements submitted.\\n     * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n     * @return Encoded batch context.\\n     */\\n    function _makeBatchExtraData(uint40 _totalElements, uint40 _lastSequencerTimestamp)\\n        internal\\n        pure\\n        returns (bytes27)\\n    {\\n        bytes27 extraData;\\n        assembly {\\n            extraData := _totalElements\\n            extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n            extraData := shl(40, extraData)\\n        }\\n\\n        return extraData;\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function getTotalElementsByChainId(uint256 _chainId)\\n        public\\n        view\\n        override\\n        returns (uint256 _totalElements)\\n    {\\n        (uint40 totalElements, ) = _getBatchExtraDataByChainId(_chainId);\\n        return uint256(totalElements);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function getTotalBatchesByChainId(uint256 _chainId)\\n        public\\n        view\\n        override\\n        returns (uint256 _totalBatches)\\n    {\\n        return batches().lengthByChainId(_chainId);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function getLastSequencerTimestampByChainId(uint256 _chainId)\\n        public\\n        view\\n        override\\n        returns (uint256 _lastSequencerTimestamp)\\n    {\\n        (, uint40 lastSequencerTimestamp) = _getBatchExtraDataByChainId(_chainId);\\n        return uint256(lastSequencerTimestamp);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function appendStateBatchByChainId(\\n        uint256 _chainId,\\n        bytes32[] memory _batch,\\n        uint256 _shouldStartAtElement,\\n        string memory proposer\\n    ) public override {\\n        // Fail fast in to make sure our batch roots aren't accidentally made fraudulent by the\\n        // publication of batches by some other user.\\n        require(\\n            _shouldStartAtElement == getTotalElementsByChainId(_chainId),\\n            \\\"Actual batch start index does not match expected start index.\\\"\\n        );\\n\\n        address proposerAddr = resolve(proposer);\\n\\n        // Proposers must have previously staked at the BondManager\\n        require(\\n            IBondManager(resolve(\\\"BondManager\\\")).isCollateralizedByChainId(\\n                _chainId,\\n                msg.sender,\\n                proposerAddr\\n            ),\\n            \\\"Proposer does not have enough collateral posted\\\"\\n        );\\n\\n        require(_batch.length > 0, \\\"Cannot submit an empty state batch.\\\");\\n\\n        require(\\n            getTotalElementsByChainId(_chainId) + _batch.length <=\\n                ICanonicalTransactionChain(resolve(\\\"CanonicalTransactionChain\\\"))\\n                    .getTotalElementsByChainId(_chainId),\\n            \\\"Number of state roots cannot exceed the number of canonical transactions.\\\"\\n        );\\n\\n        // Pass the block's timestamp and the publisher of the data\\n        // to be used in the fraud proofs\\n        _appendBatchByChainId(\\n            _chainId,\\n            _batch,\\n            abi.encode(block.timestamp, msg.sender),\\n            proposerAddr\\n        );\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function deleteStateBatchByChainId(\\n        uint256 _chainId,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n    ) public override {\\n        require(\\n            msg.sender ==\\n                resolve(\\n                    string(abi.encodePacked(Lib_Uint.uint2str(_chainId), \\\"_MVM_FraudVerifier\\\"))\\n                ),\\n            \\\"State batches can only be deleted by the MVM_FraudVerifier.\\\"\\n        );\\n\\n        require(\\n            insideFraudProofWindow(_batchHeader),\\n            \\\"State batches can only be deleted within the fraud proof window.\\\"\\n        );\\n\\n        _deleteBatchByChainId(_chainId, _batchHeader);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function verifyStateCommitmentByChainId(\\n        uint256 _chainId,\\n        bytes32 _element,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n        Lib_OVMCodec.ChainInclusionProof memory _proof\\n    ) public view override returns (bool) {\\n        require(_isValidBatchHeaderByChainId(_chainId, _batchHeader), \\\"Invalid batch header.\\\");\\n\\n        require(\\n            Lib_MerkleTree.verify(\\n                _batchHeader.batchRoot,\\n                _element,\\n                _proof.index,\\n                _proof.siblings,\\n                _batchHeader.batchSize\\n            ),\\n            \\\"Invalid inclusion proof.\\\"\\n        );\\n\\n        return true;\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function insideFraudProofWindowByChainId(\\n        uint256,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n    ) public view override returns (bool _inside) {\\n        (uint256 timestamp, ) = abi.decode(_batchHeader.extraData, (uint256, address));\\n\\n        require(timestamp != 0, \\\"Batch header timestamp cannot be zero\\\");\\n        return timestamp + FRAUD_PROOF_WINDOW > block.timestamp;\\n    }\\n\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Parses the batch context from the extra data.\\n     * @return Total number of elements submitted.\\n     * @return Timestamp of the last batch submitted by the sequencer.\\n     */\\n    function _getBatchExtraDataByChainId(uint256 _chainId) internal view returns (uint40, uint40) {\\n        bytes27 extraData = batches().getGlobalMetadataByChainId(_chainId);\\n\\n        uint40 totalElements;\\n        uint40 lastSequencerTimestamp;\\n        assembly {\\n            extraData := shr(40, extraData)\\n            totalElements := and(\\n                extraData,\\n                0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF\\n            )\\n            lastSequencerTimestamp := shr(\\n                40,\\n                and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000)\\n            )\\n        }\\n\\n        return (totalElements, lastSequencerTimestamp);\\n    }\\n\\n    /**\\n     * Encodes the batch context for the extra data.\\n     * @param _totalElements Total number of elements submitted.\\n     * @param _lastSequencerTimestamp Timestamp of the last batch submitted by the sequencer.\\n     * @return Encoded batch context.\\n     */\\n    function _makeBatchExtraDataByChainId(uint40 _totalElements, uint40 _lastSequencerTimestamp)\\n        internal\\n        pure\\n        returns (bytes27)\\n    {\\n        bytes27 extraData;\\n        assembly {\\n            extraData := _totalElements\\n            extraData := or(extraData, shl(40, _lastSequencerTimestamp))\\n            extraData := shl(40, extraData)\\n        }\\n\\n        return extraData;\\n    }\\n\\n    /**\\n     * Appends a batch to the chain.\\n     * @param _batch Elements within the batch.\\n     * @param _extraData Any extra data to append to the batch.\\n     */\\n    function _appendBatchByChainId(\\n        uint256 _chainId,\\n        bytes32[] memory _batch,\\n        bytes memory _extraData,\\n        address\\n    ) internal {\\n        (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraDataByChainId(\\n            _chainId\\n        );\\n\\n        lastSequencerTimestamp = uint40(block.timestamp);\\n\\n        // if (msg.sender == proposer) {\\n        //     lastSequencerTimestamp = uint40(block.timestamp);\\n        // } else {\\n        //     // We keep track of the last batch submitted by the sequencer so there's a window in\\n        //     // which only the sequencer can publish state roots. A window like this just reduces\\n        //     // the chance of \\\"system breaking\\\" state roots being published while we're still in\\n        //     // testing mode. This window should be removed or significantly reduced in the future.\\n        //     require(\\n        //         lastSequencerTimestamp + SEQUENCER_PUBLISH_WINDOW < block.timestamp,\\n        //         \\\"Cannot publish state roots within the sequencer publication window.\\\"\\n        //     );\\n        // }\\n\\n        // For efficiency reasons getMerkleRoot modifies the `_batch` argument in place\\n        // while calculating the root hash therefore any arguments passed to it must not\\n        // be used again afterwards\\n        Lib_OVMCodec.ChainBatchHeader memory batchHeader = Lib_OVMCodec.ChainBatchHeader({\\n            batchIndex: getTotalBatchesByChainId(_chainId),\\n            batchRoot: Lib_MerkleTree.getMerkleRoot(_batch),\\n            batchSize: _batch.length,\\n            prevTotalElements: totalElements,\\n            extraData: _extraData\\n        });\\n\\n        emit StateBatchAppended(\\n            _chainId,\\n            batchHeader.batchIndex,\\n            batchHeader.batchRoot,\\n            batchHeader.batchSize,\\n            batchHeader.prevTotalElements,\\n            batchHeader.extraData\\n        );\\n\\n        batches().pushByChainId(\\n            _chainId,\\n            Lib_OVMCodec.hashBatchHeader(batchHeader),\\n            _makeBatchExtraDataByChainId(\\n                uint40(batchHeader.prevTotalElements + batchHeader.batchSize),\\n                lastSequencerTimestamp\\n            )\\n        );\\n    }\\n\\n    /**\\n     * Removes a batch and all subsequent batches from the chain.\\n     * @param _batchHeader Header of the batch to remove.\\n     */\\n    function _deleteBatchByChainId(\\n        uint256 _chainId,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n    ) internal {\\n        require(\\n            _batchHeader.batchIndex < batches().lengthByChainId(_chainId),\\n            \\\"Invalid batch index.\\\"\\n        );\\n\\n        require(_isValidBatchHeaderByChainId(_chainId, _batchHeader), \\\"Invalid batch header.\\\");\\n\\n        batches().deleteElementsAfterInclusiveByChainId(\\n            _chainId,\\n            _batchHeader.batchIndex,\\n            _makeBatchExtraDataByChainId(uint40(_batchHeader.prevTotalElements), 0)\\n        );\\n\\n        emit StateBatchDeleted(_chainId, _batchHeader.batchIndex, _batchHeader.batchRoot);\\n    }\\n\\n    /**\\n     * Checks that a batch header matches the stored hash for the given index.\\n     * @param _batchHeader Batch header to validate.\\n     * @return Whether or not the header matches the stored one.\\n     */\\n    function _isValidBatchHeaderByChainId(\\n        uint256 _chainId,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n    ) internal view returns (bool) {\\n        return\\n            Lib_OVMCodec.hashBatchHeader(_batchHeader) ==\\n            batches().getByChainId(_chainId, _batchHeader.batchIndex);\\n    }\\n}\\n\",\"keccak256\":\"0x4280d516a0b1df528d427afa725647af734776e5b889aab003ded34a05931af8\",\"license\":\"MIT\"},\"contracts/L1/verification/IBondManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title IBondManager\\n */\\ninterface IBondManager {\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    function isCollateralized(address _who) external view returns (bool);\\n\\n    function isCollateralizedByChainId(\\n        uint256 _chainId,\\n        address _who,\\n        address _prop\\n    ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x666cc1401df59fb833615dbe53193fe664ddbb39ec0e5c5812b009fe38c29c08\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n    /*********\\n     * Enums *\\n     *********/\\n\\n    enum QueueOrigin {\\n        SEQUENCER_QUEUE,\\n        L1TOL2_QUEUE\\n    }\\n\\n    /***********\\n     * Structs *\\n     ***********/\\n\\n    struct EVMAccount {\\n        uint256 nonce;\\n        uint256 balance;\\n        bytes32 storageRoot;\\n        bytes32 codeHash;\\n    }\\n\\n    struct ChainBatchHeader {\\n        uint256 batchIndex;\\n        bytes32 batchRoot;\\n        uint256 batchSize;\\n        uint256 prevTotalElements;\\n        bytes extraData;\\n    }\\n\\n    struct ChainInclusionProof {\\n        uint256 index;\\n        bytes32[] siblings;\\n    }\\n\\n    struct Transaction {\\n        uint256 timestamp;\\n        uint256 blockNumber;\\n        QueueOrigin l1QueueOrigin;\\n        address l1TxOrigin;\\n        address entrypoint;\\n        uint256 gasLimit;\\n        bytes data;\\n    }\\n\\n    struct TransactionChainElement {\\n        bool isSequenced;\\n        uint256 queueIndex; // QUEUED TX ONLY\\n        uint256 timestamp; // SEQUENCER TX ONLY\\n        uint256 blockNumber; // SEQUENCER TX ONLY\\n        bytes txData; // SEQUENCER TX ONLY\\n    }\\n\\n    struct QueueElement {\\n        bytes32 transactionHash;\\n        uint40 timestamp;\\n        uint40 blockNumber;\\n    }\\n\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Encodes a standard OVM transaction.\\n     * @param _transaction OVM transaction to encode.\\n     * @return Encoded transaction bytes.\\n     */\\n    function encodeTransaction(Transaction memory _transaction)\\n        internal\\n        pure\\n        returns (bytes memory)\\n    {\\n        return\\n            abi.encodePacked(\\n                _transaction.timestamp,\\n                _transaction.blockNumber,\\n                _transaction.l1QueueOrigin,\\n                _transaction.l1TxOrigin,\\n                _transaction.entrypoint,\\n                _transaction.gasLimit,\\n                _transaction.data\\n            );\\n    }\\n\\n    /**\\n     * Hashes a standard OVM transaction.\\n     * @param _transaction OVM transaction to encode.\\n     * @return Hashed transaction\\n     */\\n    function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n        return keccak256(encodeTransaction(_transaction));\\n    }\\n\\n    /**\\n     * @notice Decodes an RLP-encoded account state into a useful struct.\\n     * @param _encoded RLP-encoded account state.\\n     * @return Account state struct.\\n     */\\n    function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n        Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n        return\\n            EVMAccount({\\n                nonce: Lib_RLPReader.readUint256(accountState[0]),\\n                balance: Lib_RLPReader.readUint256(accountState[1]),\\n                storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n                codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n            });\\n    }\\n\\n    /**\\n     * Calculates a hash for a given batch header.\\n     * @param _batchHeader Header to hash.\\n     * @return Hash of the header.\\n     */\\n    function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n        internal\\n        pure\\n        returns (bytes32)\\n    {\\n        return\\n            keccak256(\\n                abi.encode(\\n                    _batchHeader.batchRoot,\\n                    _batchHeader.batchSize,\\n                    _batchHeader.prevTotalElements,\\n                    _batchHeader.extraData\\n                )\\n            );\\n    }\\n}\\n\",\"keccak256\":\"0xd727df7cc99ff84e9c5722120163e7bf0077170758a4c9b0aa90b8e3abb0e134\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n    /**********\\n     * Events *\\n     **********/\\n\\n    event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n    /*************\\n     * Variables *\\n     *************/\\n\\n    mapping(bytes32 => address) private addresses;\\n\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    /**\\n     * Changes the address associated with a particular name.\\n     * @param _name String name to associate an address with.\\n     * @param _address Address to associate with the name.\\n     */\\n    function setAddress(string memory _name, address _address) external onlyOwner {\\n        bytes32 nameHash = _getNameHash(_name);\\n        address oldAddress = addresses[nameHash];\\n        addresses[nameHash] = _address;\\n\\n        emit AddressSet(_name, _address, oldAddress);\\n    }\\n\\n    /**\\n     * Retrieves the address associated with a given name.\\n     * @param _name Name to retrieve an address for.\\n     * @return Address associated with the given name.\\n     */\\n    function getAddress(string memory _name) external view returns (address) {\\n        return addresses[_getNameHash(_name)];\\n    }\\n\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Computes the hash of a name.\\n     * @param _name Name to compute a hash for.\\n     * @return Hash of the given name.\\n     */\\n    function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n        return keccak256(abi.encodePacked(_name));\\n    }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n    /*************\\n     * Variables *\\n     *************/\\n\\n    Lib_AddressManager public libAddressManager;\\n\\n    /***************\\n     * Constructor *\\n     ***************/\\n\\n    /**\\n     * @param _libAddressManager Address of the Lib_AddressManager.\\n     */\\n    constructor(address _libAddressManager) {\\n        libAddressManager = Lib_AddressManager(_libAddressManager);\\n    }\\n\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    /**\\n     * Resolves the address associated with a given name.\\n     * @param _name Name to resolve an address for.\\n     * @return Address associated with the given name.\\n     */\\n    function resolve(string memory _name) public view returns (address) {\\n        return libAddressManager.getAddress(_name);\\n    }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n    /*************\\n     * Constants *\\n     *************/\\n\\n    uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n    /*********\\n     * Enums *\\n     *********/\\n\\n    enum RLPItemType {\\n        DATA_ITEM,\\n        LIST_ITEM\\n    }\\n\\n    /***********\\n     * Structs *\\n     ***********/\\n\\n    struct RLPItem {\\n        uint256 length;\\n        uint256 ptr;\\n    }\\n\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Converts bytes to a reference to memory position and length.\\n     * @param _in Input bytes to convert.\\n     * @return Output memory reference.\\n     */\\n    function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n        uint256 ptr;\\n        assembly {\\n            ptr := add(_in, 32)\\n        }\\n\\n        return RLPItem({ length: _in.length, ptr: ptr });\\n    }\\n\\n    /**\\n     * Reads an RLP list value into a list of RLP items.\\n     * @param _in RLP list value.\\n     * @return Decoded RLP list items.\\n     */\\n    function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n        (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n        require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n        // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n        // writing to the length. Since we can't know the number of RLP items without looping over\\n        // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n        // simply set a reasonable maximum list length and decrease the size before we finish.\\n        RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n        uint256 itemCount = 0;\\n        uint256 offset = listOffset;\\n        while (offset < _in.length) {\\n            require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n            (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n                RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n            );\\n\\n            out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n            itemCount += 1;\\n            offset += itemOffset + itemLength;\\n        }\\n\\n        // Decrease the array size to match the actual item count.\\n        assembly {\\n            mstore(out, itemCount)\\n        }\\n\\n        return out;\\n    }\\n\\n    /**\\n     * Reads an RLP list value into a list of RLP items.\\n     * @param _in RLP list value.\\n     * @return Decoded RLP list items.\\n     */\\n    function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n        return readList(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP bytes value into bytes.\\n     * @param _in RLP bytes value.\\n     * @return Decoded bytes.\\n     */\\n    function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n        (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n        require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n        return _copy(_in.ptr, itemOffset, itemLength);\\n    }\\n\\n    /**\\n     * Reads an RLP bytes value into bytes.\\n     * @param _in RLP bytes value.\\n     * @return Decoded bytes.\\n     */\\n    function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n        return readBytes(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP string value into a string.\\n     * @param _in RLP string value.\\n     * @return Decoded string.\\n     */\\n    function readString(RLPItem memory _in) internal pure returns (string memory) {\\n        return string(readBytes(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP string value into a string.\\n     * @param _in RLP string value.\\n     * @return Decoded string.\\n     */\\n    function readString(bytes memory _in) internal pure returns (string memory) {\\n        return readString(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP bytes32 value into a bytes32.\\n     * @param _in RLP bytes32 value.\\n     * @return Decoded bytes32.\\n     */\\n    function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n        require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n        (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n        require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n        uint256 ptr = _in.ptr + itemOffset;\\n        bytes32 out;\\n        assembly {\\n            out := mload(ptr)\\n\\n            // Shift the bytes over to match the item size.\\n            if lt(itemLength, 32) {\\n                out := div(out, exp(256, sub(32, itemLength)))\\n            }\\n        }\\n\\n        return out;\\n    }\\n\\n    /**\\n     * Reads an RLP bytes32 value into a bytes32.\\n     * @param _in RLP bytes32 value.\\n     * @return Decoded bytes32.\\n     */\\n    function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n        return readBytes32(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP uint256 value into a uint256.\\n     * @param _in RLP uint256 value.\\n     * @return Decoded uint256.\\n     */\\n    function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n        return uint256(readBytes32(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP uint256 value into a uint256.\\n     * @param _in RLP uint256 value.\\n     * @return Decoded uint256.\\n     */\\n    function readUint256(bytes memory _in) internal pure returns (uint256) {\\n        return readUint256(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP bool value into a bool.\\n     * @param _in RLP bool value.\\n     * @return Decoded bool.\\n     */\\n    function readBool(RLPItem memory _in) internal pure returns (bool) {\\n        require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n        uint256 ptr = _in.ptr;\\n        uint256 out;\\n        assembly {\\n            out := byte(0, mload(ptr))\\n        }\\n\\n        require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n        return out != 0;\\n    }\\n\\n    /**\\n     * Reads an RLP bool value into a bool.\\n     * @param _in RLP bool value.\\n     * @return Decoded bool.\\n     */\\n    function readBool(bytes memory _in) internal pure returns (bool) {\\n        return readBool(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP address value into a address.\\n     * @param _in RLP address value.\\n     * @return Decoded address.\\n     */\\n    function readAddress(RLPItem memory _in) internal pure returns (address) {\\n        if (_in.length == 1) {\\n            return address(0);\\n        }\\n\\n        require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n        return address(uint160(readUint256(_in)));\\n    }\\n\\n    /**\\n     * Reads an RLP address value into a address.\\n     * @param _in RLP address value.\\n     * @return Decoded address.\\n     */\\n    function readAddress(bytes memory _in) internal pure returns (address) {\\n        return readAddress(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads the raw bytes of an RLP item.\\n     * @param _in RLP item to read.\\n     * @return Raw RLP bytes.\\n     */\\n    function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n        return _copy(_in);\\n    }\\n\\n    /*********************\\n     * Private Functions *\\n     *********************/\\n\\n    /**\\n     * Decodes the length of an RLP item.\\n     * @param _in RLP item to decode.\\n     * @return Offset of the encoded data.\\n     * @return Length of the encoded data.\\n     * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n     */\\n    function _decodeLength(RLPItem memory _in)\\n        private\\n        pure\\n        returns (\\n            uint256,\\n            uint256,\\n            RLPItemType\\n        )\\n    {\\n        require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n        uint256 ptr = _in.ptr;\\n        uint256 prefix;\\n        assembly {\\n            prefix := byte(0, mload(ptr))\\n        }\\n\\n        if (prefix <= 0x7f) {\\n            // Single byte.\\n\\n            return (0, 1, RLPItemType.DATA_ITEM);\\n        } else if (prefix <= 0xb7) {\\n            // Short string.\\n\\n            uint256 strLen = prefix - 0x80;\\n\\n            require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n            return (1, strLen, RLPItemType.DATA_ITEM);\\n        } else if (prefix <= 0xbf) {\\n            // Long string.\\n            uint256 lenOfStrLen = prefix - 0xb7;\\n\\n            require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n            uint256 strLen;\\n            assembly {\\n                // Pick out the string length.\\n                strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n            }\\n\\n            require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n            return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n        } else if (prefix <= 0xf7) {\\n            // Short list.\\n            uint256 listLen = prefix - 0xc0;\\n\\n            require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n            return (1, listLen, RLPItemType.LIST_ITEM);\\n        } else {\\n            // Long list.\\n            uint256 lenOfListLen = prefix - 0xf7;\\n\\n            require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n            uint256 listLen;\\n            assembly {\\n                // Pick out the list length.\\n                listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n            }\\n\\n            require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n            return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n        }\\n    }\\n\\n    /**\\n     * Copies the bytes from a memory location.\\n     * @param _src Pointer to the location to read from.\\n     * @param _offset Offset to start reading from.\\n     * @param _length Number of bytes to read.\\n     * @return Copied bytes.\\n     */\\n    function _copy(\\n        uint256 _src,\\n        uint256 _offset,\\n        uint256 _length\\n    ) private pure returns (bytes memory) {\\n        bytes memory out = new bytes(_length);\\n        if (out.length == 0) {\\n            return out;\\n        }\\n\\n        uint256 src = _src + _offset;\\n        uint256 dest;\\n        assembly {\\n            dest := add(out, 32)\\n        }\\n\\n        // Copy over as many complete words as we can.\\n        for (uint256 i = 0; i < _length / 32; i++) {\\n            assembly {\\n                mstore(dest, mload(src))\\n            }\\n\\n            src += 32;\\n            dest += 32;\\n        }\\n\\n        // Pick out the remaining bytes.\\n        uint256 mask;\\n        unchecked {\\n            mask = 256**(32 - (_length % 32)) - 1;\\n        }\\n\\n        assembly {\\n            mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n        }\\n        return out;\\n    }\\n\\n    /**\\n     * Copies an RLP item into bytes.\\n     * @param _in RLP item to copy.\\n     * @return Copied bytes.\\n     */\\n    function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n        return _copy(_in.ptr, 0, _in.length);\\n    }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Calculates a merkle root for a list of 32-byte leaf hashes.  WARNING: If the number\\n     * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n     * If you do not know the original length of elements for the tree you are verifying, then\\n     * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n     * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n     * @param _elements Array of hashes from which to generate a merkle root.\\n     * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n     */\\n    function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\\n        require(_elements.length > 0, \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\");\\n\\n        if (_elements.length == 1) {\\n            return _elements[0];\\n        }\\n\\n        uint256[16] memory defaults = [\\n            0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n            0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n            0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n            0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n            0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n            0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n            0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n            0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n            0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n            0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n            0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n            0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n            0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n            0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n            0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n            0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n        ];\\n\\n        // Reserve memory space for our hashes.\\n        bytes memory buf = new bytes(64);\\n\\n        // We'll need to keep track of left and right siblings.\\n        bytes32 leftSibling;\\n        bytes32 rightSibling;\\n\\n        // Number of non-empty nodes at the current depth.\\n        uint256 rowSize = _elements.length;\\n\\n        // Current depth, counting from 0 at the leaves\\n        uint256 depth = 0;\\n\\n        // Common sub-expressions\\n        uint256 halfRowSize; // rowSize / 2\\n        bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n        while (rowSize > 1) {\\n            halfRowSize = rowSize / 2;\\n            rowSizeIsOdd = rowSize % 2 == 1;\\n\\n            for (uint256 i = 0; i < halfRowSize; i++) {\\n                leftSibling = _elements[(2 * i)];\\n                rightSibling = _elements[(2 * i) + 1];\\n                assembly {\\n                    mstore(add(buf, 32), leftSibling)\\n                    mstore(add(buf, 64), rightSibling)\\n                }\\n\\n                _elements[i] = keccak256(buf);\\n            }\\n\\n            if (rowSizeIsOdd) {\\n                leftSibling = _elements[rowSize - 1];\\n                rightSibling = bytes32(defaults[depth]);\\n                assembly {\\n                    mstore(add(buf, 32), leftSibling)\\n                    mstore(add(buf, 64), rightSibling)\\n                }\\n\\n                _elements[halfRowSize] = keccak256(buf);\\n            }\\n\\n            rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n            depth++;\\n        }\\n\\n        return _elements[0];\\n    }\\n\\n    /**\\n     * Verifies a merkle branch for the given leaf hash.  Assumes the original length\\n     * of leaves generated is a known, correct input, and does not return true for indices\\n     * extending past that index (even if _siblings would be otherwise valid.)\\n     * @param _root The Merkle root to verify against.\\n     * @param _leaf The leaf hash to verify inclusion of.\\n     * @param _index The index in the tree of this leaf.\\n     * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n     * (bottom of the tree).\\n     * @param _totalLeaves The total number of leaves originally passed into.\\n     * @return Whether or not the merkle branch and leaf passes verification.\\n     */\\n    function verify(\\n        bytes32 _root,\\n        bytes32 _leaf,\\n        uint256 _index,\\n        bytes32[] memory _siblings,\\n        uint256 _totalLeaves\\n    ) internal pure returns (bool) {\\n        require(_totalLeaves > 0, \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\");\\n\\n        require(_index < _totalLeaves, \\\"Lib_MerkleTree: Index out of bounds.\\\");\\n\\n        require(\\n            _siblings.length == _ceilLog2(_totalLeaves),\\n            \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n        );\\n\\n        bytes32 computedRoot = _leaf;\\n\\n        for (uint256 i = 0; i < _siblings.length; i++) {\\n            if ((_index & 1) == 1) {\\n                computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n            } else {\\n                computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n            }\\n\\n            _index >>= 1;\\n        }\\n\\n        return _root == computedRoot;\\n    }\\n\\n    /*********************\\n     * Private Functions *\\n     *********************/\\n\\n    /**\\n     * Calculates the integer ceiling of the log base 2 of an input.\\n     * @param _in Unsigned input to calculate the log.\\n     * @return ceil(log_base_2(_in))\\n     */\\n    function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n        require(_in > 0, \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\");\\n\\n        if (_in == 1) {\\n            return 0;\\n        }\\n\\n        // Find the highest set bit (will be floor(log_2)).\\n        // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n        uint256 val = _in;\\n        uint256 highest = 0;\\n        for (uint256 i = 128; i >= 1; i >>= 1) {\\n            if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n                highest += i;\\n                val >>= i;\\n            }\\n        }\\n\\n        // Increment by one if this is not a perfect logarithm.\\n        if ((uint256(1) << highest) != _in) {\\n            highest += 1;\\n        }\\n\\n        return highest;\\n    }\\n}\\n\",\"keccak256\":\"0x84351e7b8be5007b77a67c1e3f34f46ed0c1ddc67e4e76797fd06f01ca9325aa\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Uint.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Uint\\n * @author\\n */\\nlibrary Lib_Uint {\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Convert uint to string\\n     * @param _i uint value.\\n     * @return _uintAsString string momery value.\\n     */\\n    function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) {\\n        if (_i == 0) {\\n            return \\\"0\\\";\\n        }\\n        uint256 j = _i;\\n        uint256 len;\\n        while (j != 0) {\\n            len++;\\n            j /= 10;\\n        }\\n        bytes memory bstr = new bytes(len);\\n        uint256 k = len;\\n        while (_i != 0) {\\n            k = k - 1;\\n            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));\\n            bytes1 b1 = bytes1(temp);\\n            bstr[k] = b1;\\n            _i /= 10;\\n        }\\n        return string(bstr);\\n    }\\n}\\n\",\"keccak256\":\"0x00408d812fdd202f5693796c9b67821b5c7114aca93484c88cdc63b0caa3c288\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x60806040526104406003553480156200001757600080fd5b50604051620026d0380380620026d08339810160408190526200003a9162000067565b600080546001600160a01b0319166001600160a01b039490941693909317909255600155600255620000ac565b6000806000606084860312156200007d57600080fd5b83516001600160a01b03811681146200009557600080fd5b602085015160409095015190969495509392505050565b61261480620000bc6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806381eb62ef116100d8578063ab59f7b81161008c578063cfdf677e11610066578063cfdf677e146102f5578063d710083f146102fd578063e561dddc1461031057600080fd5b8063ab59f7b8146102c6578063b8e189ac146102d9578063c17b291b146102ec57600080fd5b80638c7de742116100bd5780638c7de7421461028d5780638ca5cbb9146102a05780639418bddd146102b357600080fd5b806381eb62ef146102715780638a52e6221461027a57600080fd5b80635cb583741161012f5780637aa63a86116101145780637aa63a861461024e5780637ad168a01461025657806380931e371461025e57600080fd5b80635cb58374146102285780636d3454bf1461023b57600080fd5b8063461a447811610160578063461a4478146101db5780634d69ee57146101ee5780635bbbb7ed1461021157600080fd5b8063299ca4781461017c5780632ab65ec7146101c6575b600080fd5b60005461019c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101d96101d4366004611e7c565b610318565b005b61019c6101e9366004611ee3565b610478565b6102016101fc366004612007565b610525565b60405190151581526020016101bd565b61021a60035481565b6040519081526020016101bd565b61021a610236366004612074565b61053d565b610201610249366004611e7c565b610558565b61021a610601565b61021a610613565b61020161026c36600461208d565b610620565b61021a60025481565b61021a610288366004612074565b6106ec565b61021a61029b366004612074565b610707565b6101d96102ae366004612104565b61079b565b6102016102c1366004612149565b6107dc565b6101d96102d4366004612074565b610884565b6101d96102e7366004612149565b610941565b61021a60015481565b61019c610950565b6101d961030b36600461217e565b610973565b61021a610d9c565b61034861032483610da9565b6040516020016103349190612219565b604051602081830303815290604052610478565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103ed5760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204d564d5f467261756456657269666965722e000000000060648201526084015b60405180910390fd5b6103f6816107dc565b61046a576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016103e4565b6104748282610f06565b5050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906104cf9085906004016122a4565b60206040518083038186803b1580156104e757600080fd5b505afa1580156104fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051f91906122d9565b92915050565b6000610535600354858585610620565b949350505050565b60008061054983611158565b64ffffffffff16949350505050565b600080826080015180602001905181019061057391906122f6565b509050806105e95760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016103e4565b42600154826105f89190612355565b11949350505050565b600061060e6003546106ec565b905090565b600061060e60035461053d565b600061062c858461120a565b6106785760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016103e4565b6106958360200151858460000151856020015187604001516112cf565b6106e15760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016103e4565b506001949350505050565b6000806106f883611158565b5064ffffffffff169392505050565b6000610711610950565b73ffffffffffffffffffffffffffffffffffffffff1663576f2588836040518263ffffffff1660e01b815260040161074b91815260200190565b60206040518083038186803b15801561076357600080fd5b505afa158015610777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051f919061236d565b60006107a8600354610da9565b6040516020016107b89190612386565b60405160208183030381529060405290506107d7600354848484610973565b505050565b60008082608001518060200190518101906107f791906122f6565b5090508061086d5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016103e4565b426001548261087c9190612355565b119392505050565b6108c26040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610478565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461093c5760405162461bcd60e51b815260206004820152600b60248201527f6e6f7720616c6c6f77656400000000000000000000000000000000000000000060448201526064016103e4565b600155565b61094d60035482610318565b50565b600061060e6040518060600160405280602181526020016125be60219139610478565b61097c846106ec565b82146109f05760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016103e4565b60006109fb82610478565b9050610a3b6040518060400160405280600b81526020017f426f6e644d616e61676572000000000000000000000000000000000000000000815250610478565b6040517ff3b96f1c0000000000000000000000000000000000000000000000000000000081526004810187905233602482015273ffffffffffffffffffffffffffffffffffffffff8381166044830152919091169063f3b96f1c9060640160206040518083038186803b158015610ab157600080fd5b505afa158015610ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae991906123c7565b610b5b5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016103e4565b6000845111610bd25760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016103e4565b610c106040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610478565b73ffffffffffffffffffffffffffffffffffffffff16638a52e622866040518263ffffffff1660e01b8152600401610c4a91815260200190565b60206040518083038186803b158015610c6257600080fd5b505afa158015610c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9a919061236d565b8451610ca5876106ec565b610caf9190612355565b1115610d495760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016103e4565b610d9585854233604051602001610d8092919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528461153d565b5050505050565b600061060e600354610707565b606081610de957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610e135780610dfd816123e9565b9150610e0c9050600a83612451565b9150610ded565b60008167ffffffffffffffff811115610e2e57610e2e611ce7565b6040519080825280601f01601f191660200182016040528015610e58576020820181803683370190505b509050815b8515610efd57610e6e600182612465565b90506000610e7d600a88612451565b610e8890600a61247c565b610e929088612465565b610e9d9060306124b9565b905060008160f81b905080848481518110610eba57610eba6124de565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610ef4600a89612451565b97505050610e5d565b50949350505050565b610f0e610950565b73ffffffffffffffffffffffffffffffffffffffff1663576f2588836040518263ffffffff1660e01b8152600401610f4891815260200190565b60206040518083038186803b158015610f6057600080fd5b505afa158015610f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f98919061236d565b815110610fe75760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016103e4565b610ff1828261120a565b61103d5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016103e4565b611045610950565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163bc05257691859160281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b168152600481019390935260248301919091527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166044820152606401600060405180830381600087803b1580156110f157600080fd5b505af1158015611105573d6000803e3d6000fd5b5050505080600001517f6e9c082632d809680ee6227e58afd9a7c24ee8a43d61577b2e98f9e185fc630d83836020015160405161114c929190918252602082015260400190565b60405180910390a25050565b6000806000611165610950565b73ffffffffffffffffffffffffffffffffffffffff166324a49415856040518263ffffffff1660e01b815260040161119f91815260200190565b60206040518083038186803b1580156111b757600080fd5b505afa1580156111cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ef919061250d565b64ffffffffff602882901c169560509190911c945092505050565b6000611214610950565b82516040517f67d18b9b00000000000000000000000000000000000000000000000000000000815260048101869052602481019190915273ffffffffffffffffffffffffffffffffffffffff91909116906367d18b9b9060440160206040518083038186803b15801561128657600080fd5b505afa15801561129a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112be919061236d565b6112c7836116da565b149392505050565b60008082116113465760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016103e4565b8184106113ba5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016103e4565b6113c382611720565b83511461145e5760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016103e4565b8460005b84518110156115305785600116600114156114c957848181518110611489576114896124de565b6020026020010151826040516020016114ac929190918252602082015260400190565b604051602081830303815290604052805190602001209150611517565b818582815181106114dc576114dc6124de565b60200260200101516040516020016114fe929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480611528816123e9565b915050611462565b5090951495945050505050565b60008061154986611158565b9150915042905060006040518060a0016040528061156689610707565b815260200161157488611803565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517fbaa1d762384057169afd12b625998a5a7ed502c2e229acdbead30f3f6496399d8883602001518460400151856060015186608001516040516115df95949392919061254f565b60405180910390a26115ef610950565b73ffffffffffffffffffffffffffffffffffffffff1663e6e436c088611614846116da565b6116398560400151866060015161162b9190612355565b602888811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b168152600481019390935260248301919091527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166044820152606401600060405180830381600087803b1580156116b957600080fd5b505af11580156116cd573d6000803e3d6000fd5b5050505050505050505050565b60008160200151826040015183606001518460800151604051602001611703949392919061257a565b604051602081830303815290604052805190602001209050919050565b60008082116117975760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016103e4565b81600114156117a857506000919050565b81600060805b600181106117e657806117c4600180831b612465565b901b8316156117de576117d78183612355565b92811c9291505b60011c6117ae565b506001811b84146117fc57610535600182612355565b9392505050565b60008082511161187b5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016103e4565b8151600114156118a75781600081518110611898576118986124de565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b6001841115611cbd57611b58600285612451565b9150611b656002856125a9565b600114905060005b82811015611c11578a611b8182600261247c565b81518110611b9157611b916124de565b602002602001015196508a816002611ba9919061247c565b611bb4906001612355565b81518110611bc457611bc46124de565b6020026020010151955086602089015285604089015287805190602001208b8281518110611bf457611bf46124de565b602090810291909101015280611c09816123e9565b915050611b6d565b508015611c8d5789611c24600186612465565b81518110611c3457611c346124de565b60200260200101519550878360108110611c5057611c506124de565b602002015160001b945085602088015284604088015286805190602001208a8381518110611c8057611c806124de565b6020026020010181815250505b80611c99576000611c9c565b60015b611ca99060ff1683612355565b935082611cb5816123e9565b935050611b44565b89600081518110611cd057611cd06124de565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d5d57611d5d611ce7565b604052919050565b600067ffffffffffffffff831115611d7f57611d7f611ce7565b611db060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611d16565b9050828152838383011115611dc457600080fd5b828260208301376000602084830101529392505050565b600060a08284031215611ded57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611e1157611e11611ce7565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611e4e57600080fd5b508301601f81018513611e6057600080fd5b611e6f85823560208401611d65565b6080830152505092915050565b60008060408385031215611e8f57600080fd5b82359150602083013567ffffffffffffffff811115611ead57600080fd5b611eb985828601611ddb565b9150509250929050565b600082601f830112611ed457600080fd5b6117fc83833560208501611d65565b600060208284031215611ef557600080fd5b813567ffffffffffffffff811115611f0c57600080fd5b61053584828501611ec3565b600082601f830112611f2957600080fd5b8135602067ffffffffffffffff821115611f4557611f45611ce7565b8160051b611f54828201611d16565b9283528481018201928281019087851115611f6e57600080fd5b83870192505b84831015611f8d57823582529183019190830190611f74565b979650505050505050565b600060408284031215611faa57600080fd5b6040516040810167ffffffffffffffff8282108183111715611fce57611fce611ce7565b81604052829350843583526020850135915080821115611fed57600080fd5b50611ffa85828601611f18565b6020830152505092915050565b60008060006060848603121561201c57600080fd5b83359250602084013567ffffffffffffffff8082111561203b57600080fd5b61204787838801611ddb565b9350604086013591508082111561205d57600080fd5b5061206a86828701611f98565b9150509250925092565b60006020828403121561208657600080fd5b5035919050565b600080600080608085870312156120a357600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156120c957600080fd5b6120d588838901611ddb565b935060608701359150808211156120eb57600080fd5b506120f887828801611f98565b91505092959194509250565b6000806040838503121561211757600080fd5b823567ffffffffffffffff81111561212e57600080fd5b61213a85828601611f18565b95602094909401359450505050565b60006020828403121561215b57600080fd5b813567ffffffffffffffff81111561217257600080fd5b61053584828501611ddb565b6000806000806080858703121561219457600080fd5b84359350602085013567ffffffffffffffff808211156121b357600080fd5b6121bf88838901611f18565b94506040870135935060608701359150808211156121dc57600080fd5b506120f887828801611ec3565b60005b838110156122045781810151838201526020016121ec565b83811115612213576000848401525b50505050565b6000825161222b8184602087016121e9565b7f5f4d564d5f467261756456657269666965720000000000000000000000000000920191825250601201919050565b600081518084526122728160208601602086016121e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006117fc602083018461225a565b73ffffffffffffffffffffffffffffffffffffffff8116811461094d57600080fd5b6000602082840312156122eb57600080fd5b81516117fc816122b7565b6000806040838503121561230957600080fd5b82519150602083015161231b816122b7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561236857612368612326565b500190565b60006020828403121561237f57600080fd5b5051919050565b600082516123988184602087016121e9565b7f5f4d564d5f50726f706f73657200000000000000000000000000000000000000920191825250600d01919050565b6000602082840312156123d957600080fd5b815180151581146117fc57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561241b5761241b612326565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261246057612460612422565b500490565b60008282101561247757612477612326565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156124b4576124b4612326565b500290565b600060ff821660ff84168060ff038211156124d6576124d6612326565b019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561251f57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146117fc57600080fd5b85815284602082015283604082015282606082015260a060808201526000611f8d60a083018461225a565b84815283602082015282604082015260806060820152600061259f608083018461225a565b9695505050505050565b6000826125b8576125b8612422565b50069056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a2646970667358221220562730daaabdcdfbc52b040b3526c0205d57f2f27c1038e54ed8044a6989f25464736f6c63430008090033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c806381eb62ef116100d8578063ab59f7b81161008c578063cfdf677e11610066578063cfdf677e146102f5578063d710083f146102fd578063e561dddc1461031057600080fd5b8063ab59f7b8146102c6578063b8e189ac146102d9578063c17b291b146102ec57600080fd5b80638c7de742116100bd5780638c7de7421461028d5780638ca5cbb9146102a05780639418bddd146102b357600080fd5b806381eb62ef146102715780638a52e6221461027a57600080fd5b80635cb583741161012f5780637aa63a86116101145780637aa63a861461024e5780637ad168a01461025657806380931e371461025e57600080fd5b80635cb58374146102285780636d3454bf1461023b57600080fd5b8063461a447811610160578063461a4478146101db5780634d69ee57146101ee5780635bbbb7ed1461021157600080fd5b8063299ca4781461017c5780632ab65ec7146101c6575b600080fd5b60005461019c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101d96101d4366004611e7c565b610318565b005b61019c6101e9366004611ee3565b610478565b6102016101fc366004612007565b610525565b60405190151581526020016101bd565b61021a60035481565b6040519081526020016101bd565b61021a610236366004612074565b61053d565b610201610249366004611e7c565b610558565b61021a610601565b61021a610613565b61020161026c36600461208d565b610620565b61021a60025481565b61021a610288366004612074565b6106ec565b61021a61029b366004612074565b610707565b6101d96102ae366004612104565b61079b565b6102016102c1366004612149565b6107dc565b6101d96102d4366004612074565b610884565b6101d96102e7366004612149565b610941565b61021a60015481565b61019c610950565b6101d961030b36600461217e565b610973565b61021a610d9c565b61034861032483610da9565b6040516020016103349190612219565b604051602081830303815290604052610478565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103ed5760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204d564d5f467261756456657269666965722e000000000060648201526084015b60405180910390fd5b6103f6816107dc565b61046a576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016103e4565b6104748282610f06565b5050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906104cf9085906004016122a4565b60206040518083038186803b1580156104e757600080fd5b505afa1580156104fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051f91906122d9565b92915050565b6000610535600354858585610620565b949350505050565b60008061054983611158565b64ffffffffff16949350505050565b600080826080015180602001905181019061057391906122f6565b509050806105e95760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016103e4565b42600154826105f89190612355565b11949350505050565b600061060e6003546106ec565b905090565b600061060e60035461053d565b600061062c858461120a565b6106785760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016103e4565b6106958360200151858460000151856020015187604001516112cf565b6106e15760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016103e4565b506001949350505050565b6000806106f883611158565b5064ffffffffff169392505050565b6000610711610950565b73ffffffffffffffffffffffffffffffffffffffff1663576f2588836040518263ffffffff1660e01b815260040161074b91815260200190565b60206040518083038186803b15801561076357600080fd5b505afa158015610777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051f919061236d565b60006107a8600354610da9565b6040516020016107b89190612386565b60405160208183030381529060405290506107d7600354848484610973565b505050565b60008082608001518060200190518101906107f791906122f6565b5090508061086d5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016103e4565b426001548261087c9190612355565b119392505050565b6108c26040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610478565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461093c5760405162461bcd60e51b815260206004820152600b60248201527f6e6f7720616c6c6f77656400000000000000000000000000000000000000000060448201526064016103e4565b600155565b61094d60035482610318565b50565b600061060e6040518060600160405280602181526020016125be60219139610478565b61097c846106ec565b82146109f05760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016103e4565b60006109fb82610478565b9050610a3b6040518060400160405280600b81526020017f426f6e644d616e61676572000000000000000000000000000000000000000000815250610478565b6040517ff3b96f1c0000000000000000000000000000000000000000000000000000000081526004810187905233602482015273ffffffffffffffffffffffffffffffffffffffff8381166044830152919091169063f3b96f1c9060640160206040518083038186803b158015610ab157600080fd5b505afa158015610ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae991906123c7565b610b5b5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016103e4565b6000845111610bd25760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016103e4565b610c106040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610478565b73ffffffffffffffffffffffffffffffffffffffff16638a52e622866040518263ffffffff1660e01b8152600401610c4a91815260200190565b60206040518083038186803b158015610c6257600080fd5b505afa158015610c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9a919061236d565b8451610ca5876106ec565b610caf9190612355565b1115610d495760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016103e4565b610d9585854233604051602001610d8092919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528461153d565b5050505050565b600061060e600354610707565b606081610de957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610e135780610dfd816123e9565b9150610e0c9050600a83612451565b9150610ded565b60008167ffffffffffffffff811115610e2e57610e2e611ce7565b6040519080825280601f01601f191660200182016040528015610e58576020820181803683370190505b509050815b8515610efd57610e6e600182612465565b90506000610e7d600a88612451565b610e8890600a61247c565b610e929088612465565b610e9d9060306124b9565b905060008160f81b905080848481518110610eba57610eba6124de565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610ef4600a89612451565b97505050610e5d565b50949350505050565b610f0e610950565b73ffffffffffffffffffffffffffffffffffffffff1663576f2588836040518263ffffffff1660e01b8152600401610f4891815260200190565b60206040518083038186803b158015610f6057600080fd5b505afa158015610f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f98919061236d565b815110610fe75760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016103e4565b610ff1828261120a565b61103d5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016103e4565b611045610950565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163bc05257691859160281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b168152600481019390935260248301919091527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166044820152606401600060405180830381600087803b1580156110f157600080fd5b505af1158015611105573d6000803e3d6000fd5b5050505080600001517f6e9c082632d809680ee6227e58afd9a7c24ee8a43d61577b2e98f9e185fc630d83836020015160405161114c929190918252602082015260400190565b60405180910390a25050565b6000806000611165610950565b73ffffffffffffffffffffffffffffffffffffffff166324a49415856040518263ffffffff1660e01b815260040161119f91815260200190565b60206040518083038186803b1580156111b757600080fd5b505afa1580156111cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ef919061250d565b64ffffffffff602882901c169560509190911c945092505050565b6000611214610950565b82516040517f67d18b9b00000000000000000000000000000000000000000000000000000000815260048101869052602481019190915273ffffffffffffffffffffffffffffffffffffffff91909116906367d18b9b9060440160206040518083038186803b15801561128657600080fd5b505afa15801561129a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112be919061236d565b6112c7836116da565b149392505050565b60008082116113465760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016103e4565b8184106113ba5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016103e4565b6113c382611720565b83511461145e5760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016103e4565b8460005b84518110156115305785600116600114156114c957848181518110611489576114896124de565b6020026020010151826040516020016114ac929190918252602082015260400190565b604051602081830303815290604052805190602001209150611517565b818582815181106114dc576114dc6124de565b60200260200101516040516020016114fe929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480611528816123e9565b915050611462565b5090951495945050505050565b60008061154986611158565b9150915042905060006040518060a0016040528061156689610707565b815260200161157488611803565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517fbaa1d762384057169afd12b625998a5a7ed502c2e229acdbead30f3f6496399d8883602001518460400151856060015186608001516040516115df95949392919061254f565b60405180910390a26115ef610950565b73ffffffffffffffffffffffffffffffffffffffff1663e6e436c088611614846116da565b6116398560400151866060015161162b9190612355565b602888811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b168152600481019390935260248301919091527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166044820152606401600060405180830381600087803b1580156116b957600080fd5b505af11580156116cd573d6000803e3d6000fd5b5050505050505050505050565b60008160200151826040015183606001518460800151604051602001611703949392919061257a565b604051602081830303815290604052805190602001209050919050565b60008082116117975760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016103e4565b81600114156117a857506000919050565b81600060805b600181106117e657806117c4600180831b612465565b901b8316156117de576117d78183612355565b92811c9291505b60011c6117ae565b506001811b84146117fc57610535600182612355565b9392505050565b60008082511161187b5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016103e4565b8151600114156118a75781600081518110611898576118986124de565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b6001841115611cbd57611b58600285612451565b9150611b656002856125a9565b600114905060005b82811015611c11578a611b8182600261247c565b81518110611b9157611b916124de565b602002602001015196508a816002611ba9919061247c565b611bb4906001612355565b81518110611bc457611bc46124de565b6020026020010151955086602089015285604089015287805190602001208b8281518110611bf457611bf46124de565b602090810291909101015280611c09816123e9565b915050611b6d565b508015611c8d5789611c24600186612465565b81518110611c3457611c346124de565b60200260200101519550878360108110611c5057611c506124de565b602002015160001b945085602088015284604088015286805190602001208a8381518110611c8057611c806124de565b6020026020010181815250505b80611c99576000611c9c565b60015b611ca99060ff1683612355565b935082611cb5816123e9565b935050611b44565b89600081518110611cd057611cd06124de565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d5d57611d5d611ce7565b604052919050565b600067ffffffffffffffff831115611d7f57611d7f611ce7565b611db060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611d16565b9050828152838383011115611dc457600080fd5b828260208301376000602084830101529392505050565b600060a08284031215611ded57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611e1157611e11611ce7565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611e4e57600080fd5b508301601f81018513611e6057600080fd5b611e6f85823560208401611d65565b6080830152505092915050565b60008060408385031215611e8f57600080fd5b82359150602083013567ffffffffffffffff811115611ead57600080fd5b611eb985828601611ddb565b9150509250929050565b600082601f830112611ed457600080fd5b6117fc83833560208501611d65565b600060208284031215611ef557600080fd5b813567ffffffffffffffff811115611f0c57600080fd5b61053584828501611ec3565b600082601f830112611f2957600080fd5b8135602067ffffffffffffffff821115611f4557611f45611ce7565b8160051b611f54828201611d16565b9283528481018201928281019087851115611f6e57600080fd5b83870192505b84831015611f8d57823582529183019190830190611f74565b979650505050505050565b600060408284031215611faa57600080fd5b6040516040810167ffffffffffffffff8282108183111715611fce57611fce611ce7565b81604052829350843583526020850135915080821115611fed57600080fd5b50611ffa85828601611f18565b6020830152505092915050565b60008060006060848603121561201c57600080fd5b83359250602084013567ffffffffffffffff8082111561203b57600080fd5b61204787838801611ddb565b9350604086013591508082111561205d57600080fd5b5061206a86828701611f98565b9150509250925092565b60006020828403121561208657600080fd5b5035919050565b600080600080608085870312156120a357600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156120c957600080fd5b6120d588838901611ddb565b935060608701359150808211156120eb57600080fd5b506120f887828801611f98565b91505092959194509250565b6000806040838503121561211757600080fd5b823567ffffffffffffffff81111561212e57600080fd5b61213a85828601611f18565b95602094909401359450505050565b60006020828403121561215b57600080fd5b813567ffffffffffffffff81111561217257600080fd5b61053584828501611ddb565b6000806000806080858703121561219457600080fd5b84359350602085013567ffffffffffffffff808211156121b357600080fd5b6121bf88838901611f18565b94506040870135935060608701359150808211156121dc57600080fd5b506120f887828801611ec3565b60005b838110156122045781810151838201526020016121ec565b83811115612213576000848401525b50505050565b6000825161222b8184602087016121e9565b7f5f4d564d5f467261756456657269666965720000000000000000000000000000920191825250601201919050565b600081518084526122728160208601602086016121e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006117fc602083018461225a565b73ffffffffffffffffffffffffffffffffffffffff8116811461094d57600080fd5b6000602082840312156122eb57600080fd5b81516117fc816122b7565b6000806040838503121561230957600080fd5b82519150602083015161231b816122b7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561236857612368612326565b500190565b60006020828403121561237f57600080fd5b5051919050565b600082516123988184602087016121e9565b7f5f4d564d5f50726f706f73657200000000000000000000000000000000000000920191825250600d01919050565b6000602082840312156123d957600080fd5b815180151581146117fc57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561241b5761241b612326565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261246057612460612422565b500490565b60008282101561247757612477612326565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156124b4576124b4612326565b500290565b600060ff821660ff84168060ff038211156124d6576124d6612326565b019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561251f57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000811681146117fc57600080fd5b85815284602082015283604082015282606082015260a060808201526000611f8d60a083018461225a565b84815283602082015282604082015260806060820152600061259f608083018461225a565b9695505050505050565b6000826125b8576125b8612422565b50069056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a2646970667358221220562730daaabdcdfbc52b040b3526c0205d57f2f27c1038e54ed8044a6989f25464736f6c63430008090033",
  "devdoc": {
    "details": "The State Commitment Chain (SCC) contract contains a list of proposed state roots which Proposers assert to be a result of each transaction in the Canonical Transaction Chain (CTC). Elements here have a 1:1 correspondence with transactions in the CTC, and should be the unique state root calculated off-chain by applying the canonical transactions one by one. Runtime target: EVM",
    "kind": "dev",
    "methods": {
      "appendStateBatch(bytes32[],uint256)": {
        "params": {
          "_batch": "Batch of state roots.",
          "_shouldStartAtElement": "Index of the element at which this batch should start."
        }
      },
      "appendStateBatchByChainId(uint256,bytes32[],uint256,string)": {
        "params": {
          "_batch": "Batch of state roots.",
          "_chainId": "identity for the l2 chain.",
          "_shouldStartAtElement": "Index of the element at which this batch should start."
        }
      },
      "batches()": {
        "returns": {
          "_0": "Reference to the batch storage container."
        }
      },
      "constructor": {
        "params": {
          "_libAddressManager": "Address of the Address Manager."
        }
      },
      "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": {
        "params": {
          "_batchHeader": "Header of the batch to start deleting from."
        }
      },
      "deleteStateBatchByChainId(uint256,(uint256,bytes32,uint256,uint256,bytes))": {
        "params": {
          "_batchHeader": "Header of the batch to start deleting from.",
          "_chainId": "identity for the l2 chain."
        }
      },
      "getLastSequencerTimestamp()": {
        "returns": {
          "_lastSequencerTimestamp": "Last sequencer batch timestamp."
        }
      },
      "getLastSequencerTimestampByChainId(uint256)": {
        "params": {
          "_chainId": "identity for the l2 chain."
        },
        "returns": {
          "_lastSequencerTimestamp": "Last sequencer batch timestamp."
        }
      },
      "getTotalBatches()": {
        "returns": {
          "_totalBatches": "Total submitted batches."
        }
      },
      "getTotalBatchesByChainId(uint256)": {
        "params": {
          "_chainId": "identity for the l2 chain."
        },
        "returns": {
          "_totalBatches": "Total submitted batches."
        }
      },
      "getTotalElements()": {
        "returns": {
          "_totalElements": "Total submitted elements."
        }
      },
      "getTotalElementsByChainId(uint256)": {
        "params": {
          "_chainId": "identity for the l2 chain."
        },
        "returns": {
          "_totalElements": "Total submitted elements."
        }
      },
      "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": {
        "params": {
          "_batchHeader": "Header of the batch to check."
        },
        "returns": {
          "_inside": "Whether or not the batch is inside the fraud proof window."
        }
      },
      "insideFraudProofWindowByChainId(uint256,(uint256,bytes32,uint256,uint256,bytes))": {
        "params": {
          "_batchHeader": "Header of the batch to check.",
          "_chainId": "identity for the l2 chain."
        },
        "returns": {
          "_inside": "Whether or not the batch is inside the fraud proof window."
        }
      },
      "resolve(string)": {
        "params": {
          "_name": "Name to resolve an address for."
        },
        "returns": {
          "_0": "Address associated with the given name."
        }
      },
      "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": {
        "params": {
          "_batchHeader": "Header of the batch in which the element was included.",
          "_element": "Hash of the element to verify a proof for.",
          "_proof": "Merkle inclusion proof for the element."
        }
      },
      "verifyStateCommitmentByChainId(uint256,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": {
        "params": {
          "_batchHeader": "Header of the batch in which the element was included.",
          "_chainId": "identity for the l2 chain.",
          "_element": "Hash of the element to verify a proof for.",
          "_proof": "Merkle inclusion proof for the element."
        }
      }
    },
    "title": "StateCommitmentChain",
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "appendStateBatch(bytes32[],uint256)": {
        "notice": "Appends a batch of state roots to the chain."
      },
      "appendStateBatchByChainId(uint256,bytes32[],uint256,string)": {
        "notice": "Appends a batch of state roots to the chain."
      },
      "batches()": {
        "notice": "Accesses the batch storage container."
      },
      "deleteStateBatch((uint256,bytes32,uint256,uint256,bytes))": {
        "notice": "Deletes all state roots after (and including) a given batch."
      },
      "deleteStateBatchByChainId(uint256,(uint256,bytes32,uint256,uint256,bytes))": {
        "notice": "Deletes all state roots after (and including) a given batch."
      },
      "getLastSequencerTimestamp()": {
        "notice": "Retrieves the timestamp of the last batch submitted by the sequencer."
      },
      "getLastSequencerTimestampByChainId(uint256)": {
        "notice": "Retrieves the timestamp of the last batch submitted by the sequencer."
      },
      "getTotalBatches()": {
        "notice": "Retrieves the total number of batches submitted."
      },
      "getTotalBatchesByChainId(uint256)": {
        "notice": "Retrieves the total number of batches submitted."
      },
      "getTotalElements()": {
        "notice": "Retrieves the total number of elements submitted."
      },
      "getTotalElementsByChainId(uint256)": {
        "notice": "Retrieves the total number of elements submitted."
      },
      "insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes))": {
        "notice": "Checks whether a given batch is still inside its fraud proof window."
      },
      "insideFraudProofWindowByChainId(uint256,(uint256,bytes32,uint256,uint256,bytes))": {
        "notice": "Checks whether a given batch is still inside its fraud proof window."
      },
      "resolve(string)": {
        "notice": "Resolves the address associated with a given name."
      },
      "verifyStateCommitment(bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": {
        "notice": "Verifies a batch inclusion proof."
      },
      "verifyStateCommitmentByChainId(uint256,bytes32,(uint256,bytes32,uint256,uint256,bytes),(uint256,bytes32[]))": {
        "notice": "Verifies a batch inclusion proof."
      }
    },
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 16631,
        "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain",
        "label": "libAddressManager",
        "offset": 0,
        "slot": "0",
        "type": "t_contract(Lib_AddressManager)16623"
      },
      {
        "astId": 7591,
        "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain",
        "label": "FRAUD_PROOF_WINDOW",
        "offset": 0,
        "slot": "1",
        "type": "t_uint256"
      },
      {
        "astId": 7593,
        "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain",
        "label": "SEQUENCER_PUBLISH_WINDOW",
        "offset": 0,
        "slot": "2",
        "type": "t_uint256"
      },
      {
        "astId": 7596,
        "contract": "contracts/L1/rollup/StateCommitmentChain.sol:StateCommitmentChain",
        "label": "DEFAULT_CHAINID",
        "offset": 0,
        "slot": "3",
        "type": "t_uint256"
      }
    ],
    "types": {
      "t_contract(Lib_AddressManager)16623": {
        "encoding": "inplace",
        "label": "contract Lib_AddressManager",
        "numberOfBytes": "20"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}