{
  "address": "0x431e877E216714647a4DCcEFFC03d7B4Fd4B825E",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint40",
          "name": "_shouldStartAtElement",
          "type": "uint40"
        },
        {
          "indexed": false,
          "internalType": "uint24",
          "name": "_totalElementsToAppend",
          "type": "uint24"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_txBatchSize",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_txBatchTime",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "_root",
          "type": "bytes32"
        }
      ],
      "name": "AppendBatchElement",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_blockNumber",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_stakeAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "_verified",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "_sequencer",
          "type": "bool"
        }
      ],
      "name": "SetBatchTxData",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_blockNumber",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "VerifierStake",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "CONFIG_OWNER_KEY",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "TXDATA_SUBMIT_TIMEOUT",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "appendSequencerBatchByChainId",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_blockNumber",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "checkBatchTxHash",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "txHash",
          "type": "bytes32"
        },
        {
          "internalType": "bool",
          "name": "verified",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "disableWhiteList",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_blockNumber",
          "type": "uint256"
        }
      ],
      "name": "getBatchTxData",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "txData",
          "type": "bytes"
        },
        {
          "internalType": "bool",
          "name": "verified",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getStakeBaseCost",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        }
      ],
      "name": "getStakeCostByBatch",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getStakeSeqSeconds",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getStakeUnitCost",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTxBatchSize",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTxDataSliceCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTxDataSliceSize",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_verifier",
          "type": "address"
        }
      ],
      "name": "isWhiteListed",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "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": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_blockNumber",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        },
        {
          "internalType": "uint256",
          "name": "_leafIndex",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_totalLeaves",
          "type": "uint256"
        },
        {
          "internalType": "bytes32[]",
          "name": "_proof",
          "type": "bytes32[]"
        }
      ],
      "name": "setBatchTxDataForStake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_blockNumber",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "setBatchTxDataForVerifier",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_blockNumber",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "_verified",
          "type": "bool"
        }
      ],
      "name": "setBatchTxDataVerified",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_stakeBaseCost",
          "type": "uint256"
        }
      ],
      "name": "setStakeBaseCost",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_seconds",
          "type": "uint256"
        }
      ],
      "name": "setStakeSeqSeconds",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_stakeUnitCost",
          "type": "uint256"
        }
      ],
      "name": "setStakeUnitCost",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_size",
          "type": "uint256"
        }
      ],
      "name": "setTxBatchSize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_count",
          "type": "uint256"
        }
      ],
      "name": "setTxDataSliceCount",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_size",
          "type": "uint256"
        }
      ],
      "name": "setTxDataSliceSize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_verifier",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "_allowed",
          "type": "bool"
        }
      ],
      "name": "setWhiteList",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stakeBaseCost",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stakeSeqSeconds",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stakeUnitCost",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "txBatchSize",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "txDataSliceCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "txDataSliceSize",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_blockNumber",
          "type": "uint256"
        }
      ],
      "name": "verifierStake",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "whitelist",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_blockNumber",
          "type": "uint256"
        }
      ],
      "name": "withdrawStake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0xdd80550557de1bef6543a0f8ac13871f4e403690e4ec43e5ba050fcf65d83c52",
  "receipt": {
    "to": null,
    "from": "0xDD6FFC7D9a4Fb420b637747edc6456340d12d377",
    "contractAddress": "0x431e877E216714647a4DCcEFFC03d7B4Fd4B825E",
    "transactionIndex": 4,
    "gasUsed": "3953118",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0xdda691cc212ff607964c48a12f537bfa8cb157b16c586e9b66e325c488e44236",
    "transactionHash": "0xdd80550557de1bef6543a0f8ac13871f4e403690e4ec43e5ba050fcf65d83c52",
    "logs": [],
    "blockNumber": 14567781,
    "cumulativeGasUsed": "4325029",
    "status": 1,
    "byzantium": true
  },
  "args": [],
  "solcInputHash": "afb251d135b51a655a0ec250ea0760e3",
  "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint40\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint40\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"_totalElementsToAppend\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_txBatchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_txBatchTime\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_root\",\"type\":\"bytes32\"}],\"name\":\"AppendBatchElement\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_stakeAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_verified\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_sequencer\",\"type\":\"bool\"}],\"name\":\"SetBatchTxData\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"VerifierStake\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CONFIG_OWNER_KEY\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TXDATA_SUBMIT_TIMEOUT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatchByChainId\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"checkBatchTxHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableWhiteList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"getBatchTxData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"txData\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStakeBaseCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"getStakeCostByBatch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStakeSeqSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStakeUnitCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTxBatchSize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTxDataSliceCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTxDataSliceSize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"}],\"name\":\"isWhiteListed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"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\":\"_chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_leafIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_totalLeaves\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"_proof\",\"type\":\"bytes32[]\"}],\"name\":\"setBatchTxDataForStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"setBatchTxDataForVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_verified\",\"type\":\"bool\"}],\"name\":\"setBatchTxDataVerified\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_stakeBaseCost\",\"type\":\"uint256\"}],\"name\":\"setStakeBaseCost\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_seconds\",\"type\":\"uint256\"}],\"name\":\"setStakeSeqSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_stakeUnitCost\",\"type\":\"uint256\"}],\"name\":\"setStakeUnitCost\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_size\",\"type\":\"uint256\"}],\"name\":\"setTxBatchSize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"setTxDataSliceCount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_size\",\"type\":\"uint256\"}],\"name\":\"setTxDataSliceSize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_allowed\",\"type\":\"bool\"}],\"name\":\"setWhiteList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakeBaseCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakeSeqSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakeUnitCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"txBatchSize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"txDataSliceCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"txDataSliceSize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"verifierStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"whitelist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"appendSequencerBatchByChainId()\":{\"details\":\"This function uses a custom encoding scheme for efficiency reasons.\"},\"getBatchTxData(uint256,uint256,uint256)\":{\"params\":{\"_batchIndex\":\"batch index of CTC.\",\"_blockNumber\":\"block number.\",\"_chainId\":\"chain id.\"},\"returns\":{\"txData\":\"txData\",\"verified\":\"verified\"}},\"getStakeSeqSeconds()\":{\"returns\":{\"_0\":\"Seconds the Sequencer can sumbit transaction data after verifier staking.\"}},\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"setBatchTxDataForStake(uint256,uint256,uint256,bytes,uint256,uint256,bytes32[])\":{\"params\":{\"_batchIndex\":\"batch index of CTC.\",\"_blockNumber\":\"slice index.\",\"_chainId\":\"chain id.\",\"_data\":\"tx data hex.\"}},\"setBatchTxDataForVerifier(uint256,uint256,uint256,bytes)\":{\"params\":{\"_batchIndex\":\"batch index of CTC.\",\"_blockNumber\":\"slice index.\",\"_chainId\":\"chain id.\",\"_data\":\"tx data hex.\"}},\"setStakeSeqSeconds(uint256)\":{\"params\":{\"_seconds\":\"Seconds the Sequencer can sumbit transaction data after verifier staking.\"}},\"setStakeUnitCost(uint256)\":{\"params\":{\"_stakeUnitCost\":\"Stake cost for verifier.\"}},\"setTxBatchSize(uint256)\":{\"params\":{\"_size\":\"Batch size of batch.\"}},\"setTxDataSliceCount(uint256)\":{\"params\":{\"_count\":\"Slice count per batch transaction data.\"}},\"setTxDataSliceSize(uint256)\":{\"params\":{\"_size\":\"Slice size of batch transaction data.\"}},\"verifierStake(uint256,uint256,uint256)\":{\"params\":{\"_batchIndex\":\"batch index of CTC.\",\"_blockNumber\":\"block number.\",\"_chainId\":\"chain id.\"}},\"withdrawStake(uint256,uint256,uint256)\":{\"params\":{\"_batchIndex\":\"batch index of CTC.\",\"_blockNumber\":\"block number.\",\"_chainId\":\"chain id.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"appendSequencerBatchByChainId()\":{\"notice\":\"Allows the sequencer to append a batch of transactions.\"},\"getBatchTxData(uint256,uint256,uint256)\":{\"notice\":\"Gets batch tx data.\"},\"getStakeBaseCost()\":{\"notice\":\"Gets the verifier stake base cost of ETH.\"},\"getStakeCostByBatch(uint256,uint256)\":{\"notice\":\"Gets the verifier stake cost of ETH by batch index.\"},\"getStakeSeqSeconds()\":{\"notice\":\"Gets seconds can submit transaction data after staking.\"},\"getStakeUnitCost()\":{\"notice\":\"Gets the verifier stake unit cost of ETH for per storage unit.\"},\"getTxBatchSize()\":{\"notice\":\"Gets batch size per batch.\"},\"getTxDataSliceCount()\":{\"notice\":\"Gets slice count per batch transaction data.\"},\"getTxDataSliceSize()\":{\"notice\":\"Gets batch transaction data slice size per submit.\"},\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"},\"setBatchTxDataForStake(uint256,uint256,uint256,bytes,uint256,uint256,bytes32[])\":{\"notice\":\"Sets batch tx data for stake.\"},\"setBatchTxDataForVerifier(uint256,uint256,uint256,bytes)\":{\"notice\":\"Sets batch tx data for verifier.\"},\"setStakeBaseCost(uint256)\":{\"notice\":\"receive() external payable { // msg.sender if (msg.sender == resolve('MVM_DiscountOracle')) { uint256 _chainId = getAddressChainId(msg.sender); if (_chainId > 0) { address _to = resolve(string(abi.encodePacked(uint2str(_chainId),\\\"_MVM_Sequencer_Wrapper\\\"))); if (_to != address(0) && _to != address(this)) { _to.call{value: msg.value}(\\\"\\\"); } } } } function setAddressChainId(address _address, uint256 _chainId)  override public onlyManager { require(_address != address(0), \\\"address not available\\\"); require(_chainId > 0, \\\"chainId not available\\\"); require(addressChains[_address] != _chainId, \\\"no change\\\"); addressChains[_address] = _chainId; } function getAddressChainId(address _address) override public view returns (uint256) { return addressChains[_address]; }\"},\"setStakeSeqSeconds(uint256)\":{\"notice\":\"Sets seconds can submit transaction data after staking.\"},\"setStakeUnitCost(uint256)\":{\"notice\":\"Sets the verifier stake unit cost of ETH.\"},\"setTxBatchSize(uint256)\":{\"notice\":\"Sets batch size per batch.\"},\"setTxDataSliceCount(uint256)\":{\"notice\":\"Sets slice count per batch transaction data.\"},\"setTxDataSliceSize(uint256)\":{\"notice\":\"Sets batch transaction data slice size per submit.\"},\"verifierStake(uint256,uint256,uint256)\":{\"notice\":\"Stake by verifier.\"},\"withdrawStake(uint256,uint256,uint256)\":{\"notice\":\"Withdraw stake by verifier.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/MVM/MVM_CanonicalTransaction.sol\":\"MVM_CanonicalTransaction\"},\"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(\\n        address _sender,\\n        uint256 _chainId,\\n        bytes27 _globalMetadata\\n    );\\n    \\n    event QueuePushed(\\n        address _sender,\\n        uint256 _chainId,\\n        Lib_OVMCodec.QueueElement _object\\n    );\\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(\\n        address _sender,\\n        uint256 _chainId,\\n        bytes27 _globalMetadata\\n    );\\n    \\n    event BatchPushed(\\n        address _sender,\\n        uint256 _chainId,\\n        bytes32 _object,\\n        bytes27 _globalMetadata\\n    );\\n\\n    event BatchSetted(\\n        address _sender,\\n        uint256 _chainId,\\n        uint256 _index,\\n        bytes32 _object\\n    );\\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     * Accesses the queue storage container.\\n     * @return Reference to the queue storage container.\\n     */\\n    function queue() 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    )\\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(\\n        uint256 _chainId\\n        )\\n        external\\n        view\\n        returns (\\n            uint256 _totalElements\\n        );\\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(\\n        uint256 _chainId\\n        )\\n        external\\n        view\\n        returns (\\n            uint256 _totalBatches\\n        );\\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(\\n        uint256 _chainId\\n        )\\n        external\\n        view\\n        returns (\\n            uint40\\n        );\\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(\\n        uint256 _chainId,\\n        uint256 _index\\n    )\\n        external\\n        view\\n        returns (\\n            Lib_OVMCodec.QueueElement memory _element\\n        );\\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(\\n        uint256 _chainId\\n        )\\n        external\\n        view\\n        returns (\\n            uint40\\n        );\\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(\\n        uint256 _chainId\\n        )\\n        external\\n        view\\n        returns (\\n            uint40\\n        );\\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(\\n        uint256 _chainId\\n        )\\n        external\\n        view\\n        returns (\\n            uint40\\n        );\\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(\\n        uint256 _chainId\\n        )\\n        external\\n        view\\n        returns (\\n            uint40\\n        );\\n\\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    )\\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    )\\n        external;\\n    \\n    function pushQueueByChainId(\\n        uint256 _chainId,\\n        Lib_OVMCodec.QueueElement calldata _object\\n    )\\n        external;\\n\\n    function setQueueByChainId(\\n        uint256 _chainId,\\n        uint256 _index,\\n        Lib_OVMCodec.QueueElement calldata _object\\n    )\\n        external;\\n\\n    function setBatchGlobalMetadataByChainId(\\n        uint256 _chainId,\\n        bytes27 _globalMetadata\\n    )\\n        external;\\n    \\n    function getBatchGlobalMetadataByChainId(uint256 _chainId)\\n        external\\n        view\\n        returns (\\n            bytes27\\n        );\\n        \\n    function lengthBatchByChainId(uint256 _chainId)\\n        external\\n        view\\n        returns (\\n            uint256\\n        );\\n        \\n    function pushBatchByChainId(\\n        uint256 _chainId,\\n        bytes32 _object,\\n        bytes27 _globalMetadata\\n    )\\n        external;\\n    \\n    function setBatchByChainId(\\n        uint256 _chainId,\\n        uint256 _index,\\n        bytes32 _object\\n    )\\n        external;\\n        \\n    function getBatchByChainId(\\n        uint256 _chainId,\\n        uint256 _index\\n    )\\n        external\\n        view\\n        returns (\\n            bytes32\\n        );\\n        \\n    function deleteBatchElementsAfterInclusiveByChainId(\\n        uint256 _chainId,\\n        uint256 _index,\\n        bytes27 _globalMetadata\\n    )\\n        external;\\n}\\n\",\"keccak256\":\"0x24b43d8121131df792e0e4b167383a2128a3c2c9c14d2c4fc2fee6a3ee129e64\",\"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    )\\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(\\n        uint256 _chainId,\\n        bytes27 _globalMetadata\\n    )\\n        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(\\n        uint256 _chainId\\n        )\\n        external\\n        view\\n        returns (\\n            bytes27\\n        );\\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(\\n        uint256 _chainId\\n        )\\n        external\\n        view\\n        returns (\\n            uint256\\n        );\\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(\\n        uint256 _chainId,\\n        bytes32 _object\\n    )\\n        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    )\\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(\\n        uint256 _chainId,\\n        uint256 _index\\n    )\\n        external\\n        view\\n        returns (\\n            bytes32\\n        );\\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(\\n        uint256 _chainId,\\n        uint256 _index\\n    )\\n        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    )\\n        external;\\n        \\n}\\n\",\"keccak256\":\"0x51ac539391aa0073ef1b710697471b6c0298d8599d36bf7bb3208ddc7f5cef67\",\"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(\\n        uint256 _chainId,\\n        uint256 indexed _batchIndex,\\n        bytes32 _batchRoot\\n    );\\n\\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 (\\n            bool _inside\\n        );\\n        \\n        \\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 (\\n            uint256 _totalElements\\n        );\\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 (\\n            uint256 _totalBatches\\n        );\\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 (\\n            uint256 _lastSequencerTimestamp\\n        );\\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    )\\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    )\\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    )\\n        external\\n        view\\n        returns (\\n            bool _verified\\n        );\\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    )\\n        external\\n        view\\n        returns (\\n            bool _inside\\n        );\\n}\\n\",\"keccak256\":\"0x9148aec4ba238c96f6a738773726be9ce942dbc5e51d97d6f9555bdeae70ff73\",\"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\\\";\\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    /*************\\n     * Constants *\\n     *************/\\n\\n    uint256 public FRAUD_PROOF_WINDOW;\\n    uint256 public SEQUENCER_PUBLISH_WINDOW;\\n    \\n    \\n    uint256 public DEFAULT_CHAINID = 1088;\\n\\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    )\\n        Lib_AddressResolver(_libAddressManager)\\n    {\\n        FRAUD_PROOF_WINDOW = _fraudProofWindow;\\n        SEQUENCER_PUBLISH_WINDOW = _sequencerPublishWindow;\\n    }\\n    \\n    function setFraudProofWindow (uint256 window) public {\\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() public view returns (uint256 _totalElements) {\\n        return getTotalElementsByChainId(DEFAULT_CHAINID);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function getTotalBatches() public view returns (uint256 _totalBatches) {\\n        return getTotalBatchesByChainId(DEFAULT_CHAINID);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function getLastSequencerTimestamp() public view returns (uint256 _lastSequencerTimestamp) {\\n        return getLastSequencerTimestampByChainId(DEFAULT_CHAINID);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function appendStateBatch(bytes32[] memory _batch, uint256 _shouldStartAtElement) public {\\n        require (1==0, \\\"don't use\\\");\\n        //appendStateBatchByChainId(DEFAULT_CHAINID, _batch, _shouldStartAtElement, \\\"1088_MVM_Proposer\\\");\\n    }\\n    \\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) public {\\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    ) public 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\\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(\\n        uint256 _chainId\\n        )\\n        override\\n        public\\n        view\\n        returns (\\n            uint256 _totalElements\\n        )\\n    {\\n        (uint40 totalElements, ) = _getBatchExtraDataByChainId(_chainId);\\n        return uint256(totalElements);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function getTotalBatchesByChainId(\\n        uint256 _chainId\\n        )\\n        override\\n        public\\n        view\\n        returns (\\n            uint256 _totalBatches\\n        )\\n    {\\n        return batches().lengthByChainId(_chainId);\\n    }\\n\\n    /**\\n     * @inheritdoc IStateCommitmentChain\\n     */\\n    function getLastSequencerTimestampByChainId(\\n        uint256 _chainId\\n        )\\n        override\\n        public\\n        view\\n        returns (\\n            uint256 _lastSequencerTimestamp\\n        )\\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[] calldata _batch,\\n        uint256 _shouldStartAtElement,\\n        string calldata proposer\\n    )\\n        override\\n        public\\n    {\\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(_chainId,msg.sender,proposerAddr),\\n            \\\"Proposer does not have enough collateral posted\\\"\\n        );\\n\\n        require(\\n            _batch.length > 0,\\n            \\\"Cannot submit an empty state batch.\\\"\\n        );\\n\\n        require(\\n            getTotalElementsByChainId(_chainId) + _batch.length <= ICanonicalTransactionChain(resolve(\\\"CanonicalTransactionChain\\\")).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    )\\n        override\\n        public\\n    {\\n        require(\\n            msg.sender == resolve(\\n              string(abi.encodePacked(uint2str(_chainId),\\\"_MVM_FraudVerifier\\\"))),\\n            \\\"State batches can only be deleted by the MVM_FraudVerifier.\\\"\\n        );\\n\\n        require(\\n            _isValidBatchHeaderByChainId(_chainId,_batchHeader),\\n            \\\"Invalid batch header.\\\"\\n        );\\n\\n        require(\\n            insideFraudProofWindowByChainId(_chainId,_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    )\\n        override\\n        public\\n        view\\n        returns (\\n            bool\\n        )\\n    {\\n        require(\\n            _isValidBatchHeaderByChainId(_chainId,_batchHeader),\\n            \\\"Invalid batch header.\\\"\\n        );\\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 _chainId,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n    )\\n        override\\n        public\\n        view\\n        returns (\\n            bool _inside\\n        )\\n    {\\n        (uint256 timestamp,) = abi.decode(\\n            _batchHeader.extraData,\\n            (uint256, address)\\n        );\\n\\n        require(\\n            timestamp != 0,\\n            \\\"Batch header timestamp cannot be zero\\\"\\n        );\\n        return timestamp + FRAUD_PROOF_WINDOW > block.timestamp;\\n    }\\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(\\n        uint256 _chainId\\n        )\\n        internal\\n        view\\n        returns (\\n            uint40,\\n            uint40\\n        )\\n    {\\n        bytes27 extraData = batches().getGlobalMetadataByChainId(_chainId);\\n\\n        uint40 totalElements;\\n        uint40 lastSequencerTimestamp;\\n        assembly {\\n            extraData              := shr(40, extraData)\\n            totalElements          :=         and(extraData, 0x000000000000000000000000000000000000000000000000000000FFFFFFFFFF)\\n            lastSequencerTimestamp := shr(40, and(extraData, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000))\\n        }\\n\\n        return (\\n            totalElements,\\n            lastSequencerTimestamp\\n        );\\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(\\n        uint256 _chainId,\\n        uint40 _totalElements,\\n        uint40 _lastSequencerTimestamp\\n    )\\n        internal\\n        pure\\n        returns (\\n            bytes27\\n        )\\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 proposer\\n    )\\n        internal\\n    {\\n        (uint40 totalElements, uint40 lastSequencerTimestamp) = _getBatchExtraDataByChainId(_chainId);\\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                _chainId,\\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    )\\n        internal\\n    {\\n        require(\\n            _batchHeader.batchIndex < batches().lengthByChainId(_chainId),\\n            \\\"Invalid batch index.\\\"\\n        );\\n\\n        require(\\n            _isValidBatchHeaderByChainId(_chainId,_batchHeader),\\n            \\\"Invalid batch header.\\\"\\n        );\\n\\n        batches().deleteElementsAfterInclusiveByChainId(\\n            _chainId,\\n            _batchHeader.batchIndex,\\n            _makeBatchExtraDataByChainId(\\n                _chainId,\\n                uint40(_batchHeader.prevTotalElements),\\n                0\\n            )\\n        );\\n\\n        emit StateBatchDeleted(\\n            _chainId,\\n            _batchHeader.batchIndex,\\n            _batchHeader.batchRoot\\n        );\\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    )\\n        internal\\n        view\\n        returns (\\n            bool\\n        )\\n    {\\n        return Lib_OVMCodec.hashBatchHeader(_batchHeader) == batches().getByChainId(_chainId,_batchHeader.batchIndex);\\n    }\\n    \\n    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {\\n        if (_i == 0) {\\n            return \\\"0\\\";\\n        }\\n        uint j = _i;\\n        uint len;\\n        while (j != 0) {\\n            len++;\\n            j /= 10;\\n        }\\n        bytes memory bstr = new bytes(len);\\n        uint 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\":\"0x489266f79af1f848b242dfa9ccf082d27b989847dd7cd2d05c3006927e3b4728\",\"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    function isCollateralizedByChainId(\\n        uint256 _chainId,\\n        address _who,\\n        address _prop\\n    ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xdd9d90e4f84e2926865513f67a62462db9c1667287559ccccaa26a7eaabff0b6\",\"license\":\"MIT\"},\"contracts/MVM/MVM_CanonicalTransaction.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressResolver } from \\\"../libraries/resolver/Lib_AddressResolver.sol\\\";\\n\\n\\n/* Interface Imports */\\nimport { iMVM_CanonicalTransaction } from \\\"./iMVM_CanonicalTransaction.sol\\\";\\nimport { ICanonicalTransactionChain } from \\\"../L1/rollup/ICanonicalTransactionChain.sol\\\";\\nimport { IChainStorageContainer } from \\\"../L1/rollup/IChainStorageContainer.sol\\\";\\nimport { StateCommitmentChain } from \\\"../L1/rollup/StateCommitmentChain.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../libraries/utils/Lib_MerkleTree.sol\\\";\\n\\ncontract MVM_CanonicalTransaction is iMVM_CanonicalTransaction, Lib_AddressResolver{\\n    /*************\\n     * Constants *\\n     *************/\\n\\n    string constant public CONFIG_OWNER_KEY = \\\"METIS_MANAGER\\\";\\n\\n    // lock seconds when begin to submit batch tx data slice\\n    uint256 constant public TXDATA_SUBMIT_TIMEOUT = 1800;\\n\\n    /*************\\n     * Variables *\\n     *************/\\n\\n    // submit tx data slice size (in bytes)\\n    uint256 public txDataSliceSize;\\n    // stake duration seconds for sequencer submit batch tx data\\n    uint256 public stakeSeqSeconds;\\n    // verifier stake base cost for a batch tx data requirement (in ETH)\\n    uint256 public stakeBaseCost;\\n    // submit tx data slice count (a whole tx batch)\\n    uint256 public txDataSliceCount;\\n    // submit tx batch size (in bytes)\\n    uint256 public txBatchSize;\\n    // verifier stake unit cost for a batch tx data requirement (in ETH)\\n    uint256 public stakeUnitCost;\\n\\n    bool useWhiteList;\\n\\n    /***************\\n     * Queue State *\\n     ***************/\\n\\n    // white list\\n    mapping (address => bool) public whitelist;\\n\\n    // mapping(address => uint256) private addressChains;\\n\\n    // verifier stakes statistic\\n    mapping(address => uint256) private verifierStakes;\\n\\n    // batch element information for validation queue\\n    mapping(uint256 => mapping(uint256 => BatchElement)) queueBatchElement;\\n\\n    // tx data request stake queue\\n    mapping(uint256 => mapping(uint256 => TxDataRequestStake)) queueTxDataRequestStake;\\n\\n    // tx data for verification queue\\n    mapping(uint256 => mapping(uint256 => TxDataSlice)) queueTxData;\\n\\n    /***************\\n     * Constructor *\\n     ***************/\\n\\n    constructor() Lib_AddressResolver(address(0)) {}\\n\\n    /**********************\\n     * Function Modifiers *\\n     **********************/\\n\\n    modifier onlyManager {\\n        require(\\n            msg.sender == resolve(CONFIG_OWNER_KEY),\\n            \\\"MVM_CanonicalTransaction: Function can only be called by the METIS_MANAGER.\\\"\\n        );\\n        _;\\n    }\\n\\n    modifier onlyWhitelisted {\\n        require(isWhiteListed(msg.sender), \\\"only whitelisted verifiers can call\\\");\\n        _;\\n    }\\n\\n    /********************\\n     * Public Functions *\\n     ********************/\\n    /**\\n    receive() external payable {\\n        // msg.sender\\n        if (msg.sender == resolve('MVM_DiscountOracle')) {\\n            uint256 _chainId = getAddressChainId(msg.sender);\\n            if (_chainId > 0) {\\n                address _to = resolve(string(abi.encodePacked(uint2str(_chainId),\\\"_MVM_Sequencer_Wrapper\\\")));\\n                if (_to != address(0) && _to != address(this)) {\\n                    _to.call{value: msg.value}(\\\"\\\");\\n                }\\n            }\\n        }\\n    }\\n\\n    function setAddressChainId(address _address, uint256 _chainId)  override public onlyManager {\\n        require(_address != address(0), \\\"address not available\\\");\\n        require(_chainId > 0, \\\"chainId not available\\\");\\n        require(addressChains[_address] != _chainId, \\\"no change\\\");\\n        addressChains[_address] = _chainId;\\n    }\\n\\n    function getAddressChainId(address _address) override public view returns (uint256) {\\n        return addressChains[_address];\\n    }\\n    */\\n\\n    function setStakeBaseCost(uint256 _stakeBaseCost) override public onlyManager {\\n        // 1e16 = 0.01 ether\\n        // require(_stakeBaseCost >= 1e16, \\\"stake base cost should gte 1e16\\\");\\n        stakeBaseCost = _stakeBaseCost;\\n    }\\n\\n    function getStakeBaseCost() override public view returns (uint256) {\\n        return stakeBaseCost;\\n    }\\n\\n    function setStakeUnitCost(uint256 _stakeUnitCost) override public onlyManager {\\n        // 1e16 = 0.01 ether\\n        stakeUnitCost = _stakeUnitCost;\\n    }\\n\\n    function getStakeUnitCost() override public view returns (uint256) {\\n        return stakeUnitCost;\\n    }\\n\\n    function getStakeCostByBatch(uint256 _chainId, uint256 _batchIndex) override public view returns (uint256) {\\n        require(stakeBaseCost > 0, \\\"stake base cost not config yet\\\");\\n        require(queueBatchElement[_chainId][_batchIndex].txBatchTime > 0, \\\"batch element does not exist\\\");\\n        return stakeBaseCost + queueBatchElement[_chainId][_batchIndex].txBatchSize * stakeUnitCost;\\n    }\\n\\n    function setTxDataSliceSize(uint256 _size) override public onlyManager {\\n        require(_size > 0, \\\"slice size should gt 0\\\");\\n        require(_size != txDataSliceSize, \\\"slice size has not changed\\\");\\n        txDataSliceSize = _size;\\n    }\\n\\n    function getTxDataSliceSize() override public view returns (uint256) {\\n        return txDataSliceSize;\\n    }\\n\\n    function setTxDataSliceCount(uint256 _count) override public onlyManager {\\n        require(_count > 0, \\\"slice count should gt 0\\\");\\n        require(_count != txDataSliceCount, \\\"slice count has not changed\\\");\\n        txDataSliceCount = _count;\\n    }\\n\\n    function getTxDataSliceCount() override public view returns (uint256) {\\n        return txDataSliceCount;\\n    }\\n\\n    function setTxBatchSize(uint256 _size) override public onlyManager {\\n        require(_size > 0, \\\"batch size should gt 0\\\");\\n        require(_size != txBatchSize, \\\"batch size has not changed\\\");\\n        txBatchSize = _size;\\n    }\\n\\n    function getTxBatchSize() override public view returns (uint256) {\\n        return txBatchSize;\\n    }\\n\\n    function setStakeSeqSeconds(uint256 _seconds) override public onlyManager {\\n        require(_seconds > 0, \\\"seconds should gt 0\\\");\\n        require(_seconds != stakeSeqSeconds, \\\"seconds has not changed\\\");\\n        stakeSeqSeconds = _seconds;\\n    }\\n\\n    function getStakeSeqSeconds() override public view returns (uint256) {\\n        return stakeSeqSeconds;\\n    }\\n\\n    function isWhiteListed(address _verifier) override public view returns(bool){\\n        return !useWhiteList || whitelist[_verifier];\\n    }\\n\\n    function setWhiteList(address _verifier, bool _allowed) override public onlyManager {\\n        whitelist[_verifier] = _allowed;\\n        useWhiteList = true;\\n    }\\n\\n    function disableWhiteList() override public onlyManager {\\n        useWhiteList = false;\\n    }\\n\\n    function appendSequencerBatchByChainId() override public {\\n        uint256 _chainId;\\n        uint40 shouldStartAtElement;\\n        uint24 totalElementsToAppend;\\n        uint24 numContexts;\\n        uint256 batchTime;\\n        uint256 _dataSize;\\n        uint256 txSize;\\n        bytes32 root;\\n        assembly {\\n            _dataSize             := calldatasize()\\n            _chainId              := calldataload(4)\\n            shouldStartAtElement  := shr(216, calldataload(36))\\n            totalElementsToAppend := shr(232, calldataload(41))\\n            numContexts           := shr(232, calldataload(44))\\n        }\\n        require(\\n            msg.sender == resolve(string(abi.encodePacked(uint2str(_chainId),\\\"_MVM_Sequencer_Wrapper\\\"))),\\n            \\\"Function can only be called by the Sequencer.\\\"\\n        );\\n        uint256 posTs =  47 + 16 * numContexts;\\n        if (_dataSize > posTs) {\\n            // when tx count = 0, there is no hash!\\n            // string len: [13]{milliseconds}-[1]{0}-[8]{sizeOfData}-[64]{hash}-[64]{root}\\n            uint256 posTxSize = 7 + posTs;\\n            uint256 posRoot =  11 + posTs;\\n            assembly {\\n                batchTime := shr(204, calldataload(posTs))\\n                txSize := shr(224, calldataload(posTxSize))\\n                root := calldataload(posRoot)\\n            }\\n\\n            // check batch size\\n            require(txSize / 2 <= txBatchSize, \\\"size of tx data is too large\\\");\\n        }\\n\\n        address ctc = resolve(\\\"CanonicalTransactionChain\\\");\\n        IChainStorageContainer batchesRef = ICanonicalTransactionChain(ctc).batches();\\n        uint256 batchIndex = batchesRef.lengthByChainId(_chainId);\\n        {\\n            // ctc call\\n            (bool success, bytes memory result) = ctc.call(msg.data);\\n            if (success == false) {\\n                assembly {\\n                    let ptr := mload(0x40)\\n                    let size := returndatasize()\\n                    returndatacopy(ptr, 0, size)\\n                    revert(ptr, size)\\n                }\\n            }\\n        }\\n\\n        // save\\n        queueBatchElement[_chainId][batchIndex] = BatchElement({\\n            shouldStartAtElement:  shouldStartAtElement,\\n            totalElementsToAppend: totalElementsToAppend,\\n            txBatchSize:           txSize,\\n            txBatchTime:           batchTime,\\n            root:                  root,\\n            timestamp:             block.timestamp\\n        });\\n\\n        emit AppendBatchElement(\\n            _chainId,\\n            batchIndex,\\n            shouldStartAtElement,\\n            totalElementsToAppend,\\n            txSize,\\n            batchTime,\\n            root\\n        );\\n    }\\n\\n    function setBatchTxDataForStake(\\n        uint256 _chainId,\\n        uint256 _batchIndex,\\n        uint256 _blockNumber,\\n        bytes memory _data,\\n        uint256 _leafIndex,\\n        uint256 _totalLeaves,\\n        bytes32[] memory _proof\\n    )\\n        override\\n        public\\n    {\\n        require(\\n            msg.sender == resolve(string(abi.encodePacked(uint2str(_chainId),\\\"_MVM_Sequencer_Wrapper\\\"))),\\n            \\\"Function can only be called by the Sequencer.\\\"\\n        );\\n        // check stake\\n        require(queueTxDataRequestStake[_chainId][_blockNumber].timestamp > 0, \\\"there is no stake for this block number\\\");\\n        require(queueTxDataRequestStake[_chainId][_blockNumber].batchIndex == _batchIndex, \\\"incorrect batch index\\\");\\n        require(queueTxDataRequestStake[_chainId][_blockNumber].status == STAKESTATUS.INIT, \\\"not allowed to submit\\\");\\n        // sequencer can submit at any time\\n        // require(queueTxDataRequestStake[_chainId][_blockNumber].endtime >= block.timestamp, \\\"can not submit out of sequencer submit protection\\\");\\n\\n        _setBatchTxData(_chainId, _batchIndex, _blockNumber, _data, _leafIndex, _totalLeaves,  _proof,  true);\\n\\n        if (queueTxDataRequestStake[_chainId][_blockNumber].status == STAKESTATUS.INIT) {\\n            require(\\n                queueTxDataRequestStake[_chainId][_blockNumber].amount <= verifierStakes[queueTxDataRequestStake[_chainId][_blockNumber].sender],\\n                \\\"insufficient stake\\\"\\n            );\\n            require(\\n                queueTxDataRequestStake[_chainId][_blockNumber].amount <= address(this).balance,\\n                \\\"insufficient balance\\\"\\n            );\\n            queueTxDataRequestStake[_chainId][_blockNumber].status = STAKESTATUS.SEQ_SET;\\n            if (queueTxDataRequestStake[_chainId][_blockNumber].amount > 0){\\n                verifierStakes[queueTxDataRequestStake[_chainId][_blockNumber].sender] -= queueTxDataRequestStake[_chainId][_blockNumber].amount;\\n                // transfer from contract to sender ETHER and record\\n                (bool success, ) = payable(msg.sender).call{value: queueTxDataRequestStake[_chainId][_blockNumber].amount}(\\\"\\\");\\n                require(success, \\\"insufficient balance\\\");\\n                queueTxDataRequestStake[_chainId][_blockNumber].amount = 0;\\n            }\\n        }\\n\\n        emit SetBatchTxData(\\n            msg.sender,\\n            _chainId,\\n            _batchIndex,\\n            _blockNumber,\\n            queueTxDataRequestStake[_chainId][_blockNumber].amount,\\n            true,\\n            true\\n        );\\n    }\\n\\n    function setBatchTxDataForVerifier(\\n        uint256 _chainId,\\n        uint256 _batchIndex,\\n        uint256 _blockNumber,\\n        bytes memory _data\\n    )\\n        override\\n        public\\n    {\\n         require(\\n            msg.sender != resolve(string(abi.encodePacked(uint2str(_chainId),\\\"_MVM_Sequencer_Wrapper\\\"))),\\n            \\\"Function can not be called by the Sequencer.\\\"\\n        );\\n        // check stake\\n        require(queueTxDataRequestStake[_chainId][_blockNumber].timestamp > 0, \\\"there is no stake for this block number\\\");\\n        require(queueTxDataRequestStake[_chainId][_blockNumber].batchIndex == _batchIndex, \\\"incorrect batch index\\\");\\n        // require(queueTxDataRequestStake[_chainId][_blockNumber].status == STAKESTATUS.INIT, \\\"not allowed to submit\\\");\\n        // require(queueTxDataRequestStake[_chainId][_blockNumber].sender == msg.sender, \\\"can not submit with other's stake\\\");\\n        require(queueTxDataRequestStake[_chainId][_blockNumber].endtime < block.timestamp, \\\"can not submit during sequencer submit protection\\\");\\n        if (queueTxDataRequestStake[_chainId][_blockNumber].sender != msg.sender) {\\n            // other verifier can submit in double window times\\n            require(queueTxDataRequestStake[_chainId][_blockNumber].endtime + stakeSeqSeconds < block.timestamp, \\\"can not submit during staker submit protection\\\");\\n        }\\n\\n        _setBatchTxData(_chainId, _batchIndex, _blockNumber, _data, 0, 0, new bytes32[](0), false);\\n\\n        if (queueTxDataRequestStake[_chainId][_blockNumber].status == STAKESTATUS.INIT) {\\n            queueTxDataRequestStake[_chainId][_blockNumber].status = STAKESTATUS.VERIFIER_SET;\\n\\n            address claimer = queueTxDataRequestStake[_chainId][_blockNumber].sender;\\n            if (queueTxDataRequestStake[_chainId][_blockNumber].amount <= verifierStakes[claimer] && queueTxDataRequestStake[_chainId][_blockNumber].amount > 0) {\\n                require(\\n                    queueTxDataRequestStake[_chainId][_blockNumber].amount <= address(this).balance,\\n                    \\\"insufficient balance\\\"\\n                );\\n                verifierStakes[claimer] -= queueTxDataRequestStake[_chainId][_blockNumber].amount;\\n                // transfer from contract to sender ETHER and record\\n                (bool success, ) = payable(claimer).call{value: queueTxDataRequestStake[_chainId][_blockNumber].amount}(\\\"\\\");\\n                require(success, \\\"insufficient balance\\\");\\n                queueTxDataRequestStake[_chainId][_blockNumber].amount = 0;\\n            }\\n        }\\n\\n        emit SetBatchTxData(\\n            msg.sender,\\n            _chainId,\\n            _batchIndex,\\n            _blockNumber,\\n            queueTxDataRequestStake[_chainId][_blockNumber].amount,\\n            false,\\n            false\\n        );\\n    }\\n\\n    function _setBatchTxData(\\n        uint256 _chainId,\\n        uint256 _batchIndex,\\n        uint256 _blockNumber,\\n        bytes memory _data,\\n        uint256 _leafIndex,\\n        uint256 _totalLeaves,\\n        bytes32[] memory _proof,\\n        bool _requireVerify\\n    )\\n        internal\\n    {\\n        require(_data.length > 0, \\\"empty data\\\");\\n        // check queue BatchElement\\n        require(queueBatchElement[_chainId][_batchIndex].txBatchTime > 0, \\\"batch element does not exist\\\");\\n        require(queueBatchElement[_chainId][_batchIndex].totalElementsToAppend > 0, \\\"batch total element to append should not be zero\\\");\\n       \\n        // sequencer protect\\n        if (queueTxData[_chainId][_blockNumber].timestamp > 0) {\\n            require(queueTxData[_chainId][_blockNumber].verified == false, \\\"tx data verified\\\");\\n            if (queueTxData[_chainId][_blockNumber].sender != msg.sender) {\\n                require(queueTxData[_chainId][_blockNumber].timestamp + TXDATA_SUBMIT_TIMEOUT > block.timestamp, \\\"in submitting\\\");\\n\\n                // change sumbitter\\n                queueTxData[_chainId][_blockNumber].sender = msg.sender;\\n                queueTxData[_chainId][_blockNumber].blockNumber = _blockNumber;\\n                queueTxData[_chainId][_blockNumber].batchIndex = _batchIndex;\\n                queueTxData[_chainId][_blockNumber].timestamp = block.timestamp;\\n                queueTxData[_chainId][_blockNumber].txData = _data;\\n                queueTxData[_chainId][_blockNumber].verified = false;\\n            }\\n            else {\\n                queueTxData[_chainId][_blockNumber].txData = _data;\\n                // verified restore to false\\n                queueTxData[_chainId][_blockNumber].verified = false;\\n            }\\n        }\\n        else {\\n            queueTxData[_chainId][_blockNumber] = TxDataSlice({\\n                sender:         msg.sender,\\n                blockNumber:    _blockNumber,\\n                batchIndex:    _batchIndex,\\n                timestamp:      block.timestamp,\\n                txData:         _data,\\n                verified:       false\\n            });\\n        }\\n        if (_requireVerify) {\\n            bytes32 currLeaf = keccak256(abi.encodePacked(_blockNumber, _data));\\n            bool verified = Lib_MerkleTree.verify(queueBatchElement[_chainId][_batchIndex].root, currLeaf, _leafIndex, _proof, _totalLeaves);\\n            require(verified == true, \\\"tx data verify failed\\\");\\n\\n            // save verified status\\n            queueTxData[_chainId][_blockNumber].verified = true;\\n        }\\n    }\\n\\n    function getBatchTxData(\\n        uint256 _chainId,\\n        uint256 _batchIndex,\\n        uint256 _blockNumber\\n    )\\n        override\\n        external\\n        view\\n        returns (\\n            bytes memory txData,\\n            bool verified\\n        )\\n    {\\n        require(queueTxData[_chainId][_blockNumber].timestamp != 0, \\\"tx data does not exist\\\");\\n        require(queueTxData[_chainId][_blockNumber].batchIndex == _batchIndex, \\\"incorrect batch index\\\");\\n        return (\\n            queueTxData[_chainId][_blockNumber].txData,\\n            queueTxData[_chainId][_blockNumber].verified\\n        );\\n    }\\n\\n    function checkBatchTxHash(\\n        uint256 _chainId,\\n        uint256 _batchIndex,\\n        uint256 _blockNumber,\\n        bytes memory _data\\n    )\\n        override\\n        external\\n        view\\n        returns (\\n            bytes32 txHash,\\n            bool verified\\n        )\\n    {\\n        require(queueTxData[_chainId][_blockNumber].timestamp != 0, \\\"tx data does not exist\\\");\\n        require(queueTxData[_chainId][_blockNumber].batchIndex == _batchIndex, \\\"incorrect batch index\\\");\\n        return (\\n            keccak256(abi.encodePacked(_blockNumber, _data)),\\n            queueTxData[_chainId][_blockNumber].verified\\n        );\\n    }\\n\\n    function setBatchTxDataVerified(\\n        uint256 _chainId,\\n        uint256 _batchIndex,\\n        uint256 _blockNumber,\\n        bool _verified\\n    )\\n        override\\n        public\\n        onlyManager\\n    {\\n        require(queueTxData[_chainId][_blockNumber].timestamp != 0, \\\"tx data does not exist\\\");\\n        require(queueTxData[_chainId][_blockNumber].batchIndex == _batchIndex, \\\"incorrect batch index\\\");\\n        require(queueTxData[_chainId][_blockNumber].verified != _verified, \\\"verified status not change\\\");\\n\\n        queueTxData[_chainId][_blockNumber].verified = _verified;\\n    }\\n\\n    function verifierStake(\\n        uint256 _chainId,\\n        uint256 _batchIndex,\\n        uint256 _blockNumber\\n    )\\n        override\\n        public\\n        payable\\n        onlyWhitelisted\\n    {\\n        uint256 _amount = msg.value;\\n        uint256 stakeCost = getStakeCostByBatch(_chainId, _batchIndex);\\n        require(stakeBaseCost > 0, \\\"stake base cost not config yet\\\");\\n        require(stakeCost == _amount, \\\"stake cost incorrect\\\");\\n        require(stakeSeqSeconds > 0, \\\"sequencer submit seconds not config yet\\\");\\n        // check queue BatchElement\\n        require(queueBatchElement[_chainId][_batchIndex].txBatchTime > 0, \\\"batch element does not exist\\\");\\n        // check block number in batch range, block number = index + 1\\n        require(queueBatchElement[_chainId][_batchIndex].totalElementsToAppend + queueBatchElement[_chainId][_batchIndex].shouldStartAtElement >= _blockNumber && queueBatchElement[_chainId][_batchIndex].shouldStartAtElement < _blockNumber, \\\"block number is not in this batch\\\");\\n        if (queueTxDataRequestStake[_chainId][_blockNumber].timestamp > 0) {\\n            require(queueTxDataRequestStake[_chainId][_blockNumber].status == STAKESTATUS.PAYBACK, \\\"there is a stake for this batch index\\\");\\n        }\\n\\n        //check window\\n        StateCommitmentChain stateChain = StateCommitmentChain(resolve(\\\"StateCommitmentChain\\\"));\\n        require(queueBatchElement[_chainId][_batchIndex].timestamp + stateChain.FRAUD_PROOF_WINDOW() > block.timestamp, \\\"the batch is outside of the fraud proof window\\\");\\n\\n        queueTxDataRequestStake[_chainId][_blockNumber] = TxDataRequestStake({\\n            sender:      msg.sender,\\n            blockNumber: _blockNumber,\\n            batchIndex:  _batchIndex,\\n            timestamp:   block.timestamp,\\n            endtime:     block.timestamp + stakeSeqSeconds,\\n            amount:      _amount,\\n            status:      STAKESTATUS.INIT\\n        });\\n        verifierStakes[msg.sender] += _amount;\\n\\n        emit VerifierStake(msg.sender, _chainId, _batchIndex, _blockNumber, _amount);\\n    }\\n\\n    function withdrawStake(\\n        uint256 _chainId,\\n        uint256 _batchIndex,\\n        uint256 _blockNumber\\n    )\\n        override\\n        public\\n    {\\n        require(queueTxDataRequestStake[_chainId][_blockNumber].timestamp > 0, \\\"there is no stake for this batch index\\\");\\n        require(queueTxDataRequestStake[_chainId][_blockNumber].amount > 0, \\\"stake amount is zero\\\");\\n        require(queueTxDataRequestStake[_chainId][_blockNumber].status == STAKESTATUS.INIT, \\\"withdrawals are not allowed\\\");\\n        require(queueTxDataRequestStake[_chainId][_blockNumber].sender == msg.sender, \\\"can not withdraw other's stake\\\");\\n        require(queueTxDataRequestStake[_chainId][_blockNumber].endtime < block.timestamp, \\\"can not withdraw during submit protection\\\");\\n        require(queueTxDataRequestStake[_chainId][_blockNumber].amount <= verifierStakes[msg.sender], \\\"insufficient stake\\\");\\n\\n        require(\\n            queueTxDataRequestStake[_chainId][_blockNumber].amount <= address(this).balance,\\n            \\\"insufficient balance\\\"\\n        );\\n        queueTxDataRequestStake[_chainId][_blockNumber].status = STAKESTATUS.PAYBACK;\\n        verifierStakes[msg.sender] -= queueTxDataRequestStake[_chainId][_blockNumber].amount;\\n        // transfer from contract to sender ETHER and record\\n        (bool success, ) = payable(msg.sender).call{value: queueTxDataRequestStake[_chainId][_blockNumber].amount}(\\\"\\\");\\n        require(success, \\\"insufficient balance\\\");\\n        queueTxDataRequestStake[_chainId][_blockNumber].amount = 0;\\n    }\\n\\n    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {\\n        if (_i == 0) {\\n            return \\\"0\\\";\\n        }\\n        uint j = _i;\\n        uint len;\\n        while (j != 0) {\\n            len++;\\n            j /= 10;\\n        }\\n        bytes memory bstr = new bytes(len);\\n        uint 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\":\"0x9f95d51dae40121fbe3ee27b14ad96eefb8cc2586fef50e9e26e5b8d400ef358\",\"license\":\"MIT\"},\"contracts/MVM/iMVM_CanonicalTransaction.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Contract Imports */\\n\\n/* External Imports */\\n\\n/**\\n * @title ICanonicalTransactionChain\\n */\\ninterface iMVM_CanonicalTransaction {\\n    /*********\\n     * Enums *\\n     *********/\\n\\n    enum STAKESTATUS {\\n        INIT,\\n        SEQ_SET,\\n        VERIFIER_SET,\\n        PAYBACK\\n    }\\n\\n    /**********\\n     * Events *\\n     **********/\\n\\n    event VerifierStake(\\n        address _sender,\\n        uint256 _chainId,\\n        uint256 _batchIndex,\\n        uint256 _blockNumber,\\n        uint256 _amount\\n    );\\n\\n    // default : stakeAmount=0, verified=true, sequencer=true\\n    // sequencer response for stake: stakeAmount>0, verified=true, sequencer=true\\n    // verifier response for stake timeout: stakeAmount>0, verified=false, sequencer=false\\n    event SetBatchTxData(\\n        address _sender,\\n        uint256 _chainId,\\n        uint256 _batchIndex,\\n        uint256 _blockNumber,\\n        uint256 _stakeAmount,\\n        bool _verified,\\n        bool _sequencer\\n    );\\n\\n    event AppendBatchElement (\\n        uint256 _chainId,\\n        uint256 _batchIndex,\\n        uint40 _shouldStartAtElement,\\n        uint24 _totalElementsToAppend,\\n        uint256 _txBatchSize,\\n        uint256 _txBatchTime,\\n        bytes32 _root\\n    );\\n\\n    /***********\\n     * Structs *\\n     ***********/\\n\\n    // locker the same sender for 30 min\\n    struct TxDataSlice {\\n        address sender;\\n        uint256 blockNumber;\\n        uint256 batchIndex;\\n        uint256 timestamp;\\n        bytes txData;\\n        bool verified;\\n    }\\n\\n    struct TxDataRequestStake {\\n        address sender;\\n        uint256 blockNumber;\\n        uint256 batchIndex;\\n        uint256 timestamp;\\n        uint256 endtime;\\n        uint256 amount;\\n        STAKESTATUS status;\\n    }\\n\\n    struct BatchElement {\\n        uint40 shouldStartAtElement;\\n        uint24 totalElementsToAppend;\\n        uint256 txBatchSize;\\n        uint256 txBatchTime; // sequencer client encode timestamp(ms)\\n        bytes32 root; // merkle hash root with [hash(txDataBytes + blockNumber)]\\n        uint256 timestamp; // block timestamp\\n    }\\n\\n    /*******************************\\n     * Authorized Setter Functions *\\n     *******************************/\\n\\n    /**\\n     * Sets address's chain id.\\n     * @param _address contract address.\\n     * @param _chainId chain id.\\n     */\\n    // function setAddressChainId(address _address, uint256 _chainId) external;\\n\\n    /**\\n     * Gets address's chain id.\\n     */\\n    // function getAddressChainId(address _address) external view returns (uint256);\\n\\n    /**\\n     * Sets the verifier stake base cost of ETH.\\n     * @param _stakeBaseCost Stake base cost for verifier.\\n     */\\n    function setStakeBaseCost(uint256 _stakeBaseCost) external;\\n\\n    /**\\n     * Gets the verifier stake base cost of ETH.\\n     */\\n    function getStakeBaseCost() external view returns (uint256);\\n\\n    /**\\n     * Sets the verifier stake unit cost of ETH.\\n     * @param _stakeUnitCost Stake cost for verifier.\\n     */\\n    function setStakeUnitCost(uint256 _stakeUnitCost) external;\\n\\n    /**\\n     * Gets the verifier stake unit cost of ETH for per storage unit.\\n     */\\n    function getStakeUnitCost() external view returns (uint256);\\n\\n    /**\\n     * Gets the verifier stake cost of ETH by batch index.\\n     */\\n    function getStakeCostByBatch(uint256 _chainId, uint256 _batchIndex) external view returns (uint256);\\n\\n    /**\\n     * Sets batch transaction data slice size per submit.\\n     * @param _size Slice size of batch transaction data.\\n     */\\n    function setTxDataSliceSize(uint256 _size) external;\\n\\n    /**\\n     * Gets batch transaction data slice size per submit.\\n     */\\n    function getTxDataSliceSize() external view returns (uint256);\\n\\n    /**\\n     * Sets batch size per batch.\\n     * @param _size Batch size of batch.\\n     */\\n    function setTxBatchSize(uint256 _size) external;\\n\\n    /**\\n     * Gets batch size per batch.\\n     */\\n    function getTxBatchSize() external view returns (uint256);\\n\\n    /**\\n     * Sets slice count per batch transaction data.\\n     * @param _count Slice count per batch transaction data.\\n     */\\n    function setTxDataSliceCount(uint256 _count) external;\\n\\n    /**\\n     * Gets slice count per batch transaction data.\\n     */\\n    function getTxDataSliceCount() external view returns (uint256);\\n\\n    /**\\n     * Sets seconds can submit transaction data after staking.\\n     * @param _seconds Seconds the Sequencer can sumbit transaction data after verifier staking.\\n     */\\n    function setStakeSeqSeconds(uint256 _seconds) external;\\n\\n    /**\\n     * Gets seconds can submit transaction data after staking.\\n     * @return Seconds the Sequencer can sumbit transaction data after verifier staking.\\n     */\\n    function getStakeSeqSeconds() external view returns (uint256);\\n\\n    function isWhiteListed(address _verifier) external view returns(bool);\\n\\n    // add the verifier to the whitelist\\n    function setWhiteList(address _verifier, bool _allowed) external;\\n\\n    // allow everyone to be the verifier\\n    function disableWhiteList() 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     */\\n    function appendSequencerBatchByChainId() external;\\n\\n    /**\\n     * Sets batch tx data for stake.\\n     * @param _chainId chain id.\\n     * @param _batchIndex batch index of CTC.\\n     * @param _blockNumber slice index.\\n     * @param _data tx data hex.\\n    */\\n    function setBatchTxDataForStake(uint256 _chainId, uint256 _batchIndex, uint256 _blockNumber, bytes memory _data, uint256 _leafIndex, uint256 _totalLeaves, bytes32[] memory _proof) external;\\n\\n    /**\\n     * Sets batch tx data for verifier.\\n     * @param _chainId chain id.\\n     * @param _batchIndex batch index of CTC.\\n     * @param _blockNumber slice index.\\n     * @param _data tx data hex.\\n    */\\n    function setBatchTxDataForVerifier(uint256 _chainId, uint256 _batchIndex, uint256 _blockNumber, bytes memory _data) external;\\n\\n    /**\\n     * Gets batch tx data.\\n     * @param _chainId chain id.\\n     * @param _batchIndex batch index of CTC.\\n     * @param _blockNumber block number.\\n     * @return txData\\n     * @return verified\\n    */\\n    function getBatchTxData(uint256 _chainId, uint256 _batchIndex, uint256 _blockNumber) external view returns (bytes memory txData, bool verified);\\n\\n    function checkBatchTxHash(uint256 _chainId, uint256 _batchIndex, uint256 _blockNumber, bytes memory _data) external view returns (bytes32 txHash, bool verified);\\n\\n    function setBatchTxDataVerified(uint256 _chainId, uint256 _batchIndex, uint256 _blockNumber, bool _verified) external;\\n\\n    /**\\n     * Stake by verifier.\\n     * @param _chainId chain id.\\n     * @param _batchIndex batch index of CTC.\\n     * @param _blockNumber block number.\\n    */\\n    function verifierStake(uint256 _chainId, uint256 _batchIndex, uint256 _blockNumber) external payable;\\n\\n    /**\\n     * Withdraw stake by verifier.\\n     * @param _chainId chain id.\\n     * @param _batchIndex batch index of CTC.\\n     * @param _blockNumber block number.\\n    */\\n    function withdrawStake(uint256 _chainId, uint256 _batchIndex, uint256 _blockNumber) external;\\n\\n}\\n\",\"keccak256\":\"0xa35f6f6fe595a715ed65a020092a93570cdfc23c4b53fedf74f6e504217ebefb\",\"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\\\";\\nimport { Lib_RLPWriter } from \\\"../rlp/Lib_RLPWriter.sol\\\";\\nimport { Lib_BytesUtils } from \\\"../utils/Lib_BytesUtils.sol\\\";\\nimport { Lib_Bytes32Utils } from \\\"../utils/Lib_Bytes32Utils.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\":\"0xb5009ac1e0617e0b3b2fb917f08f8e8a7ae706034cc3a675258bc3d91978525e\",\"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/rlp/Lib_RLPWriter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPWriter\\n * @author Bakaoh (with modifications)\\n */\\nlibrary Lib_RLPWriter {\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * RLP encodes a byte string.\\n     * @param _in The byte string to encode.\\n     * @return The RLP encoded string in bytes.\\n     */\\n    function writeBytes(bytes memory _in) internal pure returns (bytes memory) {\\n        bytes memory encoded;\\n\\n        if (_in.length == 1 && uint8(_in[0]) < 128) {\\n            encoded = _in;\\n        } else {\\n            encoded = abi.encodePacked(_writeLength(_in.length, 128), _in);\\n        }\\n\\n        return encoded;\\n    }\\n\\n    /**\\n     * RLP encodes a list of RLP encoded byte byte strings.\\n     * @param _in The list of RLP encoded byte strings.\\n     * @return The RLP encoded list of items in bytes.\\n     */\\n    function writeList(bytes[] memory _in) internal pure returns (bytes memory) {\\n        bytes memory list = _flatten(_in);\\n        return abi.encodePacked(_writeLength(list.length, 192), list);\\n    }\\n\\n    /**\\n     * RLP encodes a string.\\n     * @param _in The string to encode.\\n     * @return The RLP encoded string in bytes.\\n     */\\n    function writeString(string memory _in) internal pure returns (bytes memory) {\\n        return writeBytes(bytes(_in));\\n    }\\n\\n    /**\\n     * RLP encodes an address.\\n     * @param _in The address to encode.\\n     * @return The RLP encoded address in bytes.\\n     */\\n    function writeAddress(address _in) internal pure returns (bytes memory) {\\n        return writeBytes(abi.encodePacked(_in));\\n    }\\n\\n    /**\\n     * RLP encodes a uint.\\n     * @param _in The uint256 to encode.\\n     * @return The RLP encoded uint256 in bytes.\\n     */\\n    function writeUint(uint256 _in) internal pure returns (bytes memory) {\\n        return writeBytes(_toBinary(_in));\\n    }\\n\\n    /**\\n     * RLP encodes a bool.\\n     * @param _in The bool to encode.\\n     * @return The RLP encoded bool in bytes.\\n     */\\n    function writeBool(bool _in) internal pure returns (bytes memory) {\\n        bytes memory encoded = new bytes(1);\\n        encoded[0] = (_in ? bytes1(0x01) : bytes1(0x80));\\n        return encoded;\\n    }\\n\\n    /*********************\\n     * Private Functions *\\n     *********************/\\n\\n    /**\\n     * Encode the first byte, followed by the `len` in binary form if `length` is more than 55.\\n     * @param _len The length of the string or the payload.\\n     * @param _offset 128 if item is string, 192 if item is list.\\n     * @return RLP encoded bytes.\\n     */\\n    function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory) {\\n        bytes memory encoded;\\n\\n        if (_len < 56) {\\n            encoded = new bytes(1);\\n            encoded[0] = bytes1(uint8(_len) + uint8(_offset));\\n        } else {\\n            uint256 lenLen;\\n            uint256 i = 1;\\n            while (_len / i != 0) {\\n                lenLen++;\\n                i *= 256;\\n            }\\n\\n            encoded = new bytes(lenLen + 1);\\n            encoded[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55);\\n            for (i = 1; i <= lenLen; i++) {\\n                encoded[i] = bytes1(uint8((_len / (256**(lenLen - i))) % 256));\\n            }\\n        }\\n\\n        return encoded;\\n    }\\n\\n    /**\\n     * Encode integer in big endian binary form with no leading zeroes.\\n     * @notice TODO: This should be optimized with assembly to save gas costs.\\n     * @param _x The integer to encode.\\n     * @return RLP encoded bytes.\\n     */\\n    function _toBinary(uint256 _x) private pure returns (bytes memory) {\\n        bytes memory b = abi.encodePacked(_x);\\n\\n        uint256 i = 0;\\n        for (; i < 32; i++) {\\n            if (b[i] != 0) {\\n                break;\\n            }\\n        }\\n\\n        bytes memory res = new bytes(32 - i);\\n        for (uint256 j = 0; j < res.length; j++) {\\n            res[j] = b[i++];\\n        }\\n\\n        return res;\\n    }\\n\\n    /**\\n     * Copies a piece of memory to another location.\\n     * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol.\\n     * @param _dest Destination location.\\n     * @param _src Source location.\\n     * @param _len Length of memory to copy.\\n     */\\n    function _memcpy(\\n        uint256 _dest,\\n        uint256 _src,\\n        uint256 _len\\n    ) private pure {\\n        uint256 dest = _dest;\\n        uint256 src = _src;\\n        uint256 len = _len;\\n\\n        for (; len >= 32; len -= 32) {\\n            assembly {\\n                mstore(dest, mload(src))\\n            }\\n            dest += 32;\\n            src += 32;\\n        }\\n\\n        uint256 mask;\\n        unchecked {\\n            mask = 256**(32 - len) - 1;\\n        }\\n        assembly {\\n            let srcpart := and(mload(src), not(mask))\\n            let destpart := and(mload(dest), mask)\\n            mstore(dest, or(destpart, srcpart))\\n        }\\n    }\\n\\n    /**\\n     * Flattens a list of byte strings into one byte string.\\n     * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol.\\n     * @param _list List of byte strings to flatten.\\n     * @return The flattened byte string.\\n     */\\n    function _flatten(bytes[] memory _list) private pure returns (bytes memory) {\\n        if (_list.length == 0) {\\n            return new bytes(0);\\n        }\\n\\n        uint256 len;\\n        uint256 i = 0;\\n        for (; i < _list.length; i++) {\\n            len += _list[i].length;\\n        }\\n\\n        bytes memory flattened = new bytes(len);\\n        uint256 flattenedPtr;\\n        assembly {\\n            flattenedPtr := add(flattened, 0x20)\\n        }\\n\\n        for (i = 0; i < _list.length; i++) {\\n            bytes memory item = _list[i];\\n\\n            uint256 listPtr;\\n            assembly {\\n                listPtr := add(item, 0x20)\\n            }\\n\\n            _memcpy(flattenedPtr, listPtr, item.length);\\n            flattenedPtr += _list[i].length;\\n        }\\n\\n        return flattened;\\n    }\\n}\\n\",\"keccak256\":\"0x215b90672ce126effc3f2df61ca0cdf52d2b1cc9be602877e637829b0bf229fd\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_Bytes32Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_Byte32Utils\\n */\\nlibrary Lib_Bytes32Utils {\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Converts a bytes32 value to a boolean. Anything non-zero will be converted to \\\"true.\\\"\\n     * @param _in Input bytes32 value.\\n     * @return Bytes32 as a boolean.\\n     */\\n    function toBool(bytes32 _in) internal pure returns (bool) {\\n        return _in != 0;\\n    }\\n\\n    /**\\n     * Converts a boolean to a bytes32 value.\\n     * @param _in Input boolean value.\\n     * @return Boolean as a bytes32.\\n     */\\n    function fromBool(bool _in) internal pure returns (bytes32) {\\n        return bytes32(uint256(_in ? 1 : 0));\\n    }\\n\\n    /**\\n     * Converts a bytes32 value to an address. Takes the *last* 20 bytes.\\n     * @param _in Input bytes32 value.\\n     * @return Bytes32 as an address.\\n     */\\n    function toAddress(bytes32 _in) internal pure returns (address) {\\n        return address(uint160(uint256(_in)));\\n    }\\n\\n    /**\\n     * Converts an address to a bytes32.\\n     * @param _in Input address value.\\n     * @return Address as a bytes32.\\n     */\\n    function fromAddress(address _in) internal pure returns (bytes32) {\\n        return bytes32(uint256(uint160(_in)));\\n    }\\n}\\n\",\"keccak256\":\"0xf2d1a526f2529e51fc2fffccf093c1691e291cbbb6de8a3da7d7f80024a9a234\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_BytesUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_BytesUtils\\n */\\nlibrary Lib_BytesUtils {\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    function slice(\\n        bytes memory _bytes,\\n        uint256 _start,\\n        uint256 _length\\n    ) internal pure returns (bytes memory) {\\n        require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n        require(_start + _length >= _start, \\\"slice_overflow\\\");\\n        require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n        bytes memory tempBytes;\\n\\n        assembly {\\n            switch iszero(_length)\\n            case 0 {\\n                // Get a location of some free memory and store it in tempBytes as\\n                // Solidity does for memory variables.\\n                tempBytes := mload(0x40)\\n\\n                // The first word of the slice result is potentially a partial\\n                // word read from the original array. To read it, we calculate\\n                // the length of that partial word and start copying that many\\n                // bytes into the array. The first word we copy will start with\\n                // data we don't care about, but the last `lengthmod` bytes will\\n                // land at the beginning of the contents of the new array. When\\n                // we're done copying, we overwrite the full first word with\\n                // the actual length of the slice.\\n                let lengthmod := and(_length, 31)\\n\\n                // The multiplication in the next line is necessary\\n                // because when slicing multiples of 32 bytes (lengthmod == 0)\\n                // the following copy loop was copying the origin's length\\n                // and then ending prematurely not copying everything it should.\\n                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n                let end := add(mc, _length)\\n\\n                for {\\n                    // The multiplication in the next line has the same exact purpose\\n                    // as the one above.\\n                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n                } lt(mc, end) {\\n                    mc := add(mc, 0x20)\\n                    cc := add(cc, 0x20)\\n                } {\\n                    mstore(mc, mload(cc))\\n                }\\n\\n                mstore(tempBytes, _length)\\n\\n                //update free-memory pointer\\n                //allocating the array padded to 32 bytes like the compiler does now\\n                mstore(0x40, and(add(mc, 31), not(31)))\\n            }\\n            //if we want a zero-length slice let's just return a zero-length array\\n            default {\\n                tempBytes := mload(0x40)\\n\\n                //zero out the 32 bytes slice we are about to return\\n                //we need to do it because Solidity does not garbage collect\\n                mstore(tempBytes, 0)\\n\\n                mstore(0x40, add(tempBytes, 0x20))\\n            }\\n        }\\n\\n        return tempBytes;\\n    }\\n\\n    function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) {\\n        if (_start >= _bytes.length) {\\n            return bytes(\\\"\\\");\\n        }\\n\\n        return slice(_bytes, _start, _bytes.length - _start);\\n    }\\n\\n    function toBytes32(bytes memory _bytes) internal pure returns (bytes32) {\\n        if (_bytes.length < 32) {\\n            bytes32 ret;\\n            assembly {\\n                ret := mload(add(_bytes, 32))\\n            }\\n            return ret;\\n        }\\n\\n        return abi.decode(_bytes, (bytes32)); // will truncate if input length > 32 bytes\\n    }\\n\\n    function toUint256(bytes memory _bytes) internal pure returns (uint256) {\\n        return uint256(toBytes32(_bytes));\\n    }\\n\\n    function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n        bytes memory nibbles = new bytes(_bytes.length * 2);\\n\\n        for (uint256 i = 0; i < _bytes.length; i++) {\\n            nibbles[i * 2] = _bytes[i] >> 4;\\n            nibbles[i * 2 + 1] = bytes1(uint8(_bytes[i]) % 16);\\n        }\\n\\n        return nibbles;\\n    }\\n\\n    function fromNibbles(bytes memory _bytes) internal pure returns (bytes memory) {\\n        bytes memory ret = new bytes(_bytes.length / 2);\\n\\n        for (uint256 i = 0; i < ret.length; i++) {\\n            ret[i] = (_bytes[i * 2] << 4) | (_bytes[i * 2 + 1]);\\n        }\\n\\n        return ret;\\n    }\\n\\n    function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) {\\n        return keccak256(_bytes) == keccak256(_other);\\n    }\\n}\\n\",\"keccak256\":\"0xc39ee13f97e4ccfbc72a5aac571deb3c1aff882fca2dd18be794d43ac5de0a30\",\"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\"}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b03191690556146cc806100306000396000f3fe6080604052600436106102335760003560e01c80637600fa1211610138578063a6a56da5116100b0578063d6a97a341161007f578063f137391611610064578063f137391614610653578063f1e7746114610673578063f6f24f671461069357600080fd5b8063d6a97a3414610629578063dcd836161461063e57600080fd5b8063a6a56da5146105b6578063a8cda37b146105c9578063b357ab92146105de578063d5fb60d9146105f457600080fd5b806386e4206e116101075780639447fe88116100ec5780639447fe88146105505780639b19251a14610566578063a5f5e7191461059657600080fd5b806386e4206e146105105780638d14e1271461053057600080fd5b80637600fa121461049a5780637f9c9777146104ba57806381147877146104da57806383cbbb6d146104f057600080fd5b80633ac19597116101cb5780634e74b1551161019a57806361f4edea1161017f57806361f4edea146103e6578063669fdeb5146104145780636f9170f61461046a57600080fd5b80634e74b155146103bc5780635e7ce13a146103d157600080fd5b80633ac1959714610351578063461a44781461037157806348406b861461039157806348f24165146103a757600080fd5b8063279f9b1111610207578063279f9b11146102a9578063299ca478146102c957806335005ffb1461031b57806338897fdd1461033b57600080fd5b806213c63d1461023857806302adf2d61461025c578063167c705014610271578063172e218d14610287575b600080fd5b34801561024457600080fd5b506002545b6040519081526020015b60405180910390f35b34801561026857600080fd5b50600454610249565b34801561027d57600080fd5b5061024960045481565b34801561029357600080fd5b506102a76102a2366004613f0f565b6106a9565b005b3480156102b557600080fd5b506102a76102c4366004613f4e565b610928565b3480156102d557600080fd5b506000546102f69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610253565b34801561032757600080fd5b506102a7610336366004613f7a565b610db2565b34801561034757600080fd5b5061024960015481565b34801561035d57600080fd5b506102a761036c366004613f7a565b610f5d565b34801561037d57600080fd5b506102f661038c366004614087565b611066565b34801561039d57600080fd5b5061024960065481565b3480156103b357600080fd5b50600654610249565b3480156103c857600080fd5b50600354610249565b3480156103dd57600080fd5b50600554610249565b3480156103f257600080fd5b50610406610401366004613f4e565b611113565b60405161025392919061414a565b34801561042057600080fd5b5061045d6040518060400160405280600d81526020017f4d455449535f4d414e414745520000000000000000000000000000000000000081525081565b604051610253919061416e565b34801561047657600080fd5b5061048a6104853660046141a6565b6112ad565b6040519015158152602001610253565b3480156104a657600080fd5b506102496104b53660046141c3565b6112e9565b3480156104c657600080fd5b506102a76104d5366004613f7a565b6113e3565b3480156104e657600080fd5b5061024960055481565b3480156104fc57600080fd5b506102a761050b366004614205565b61158e565b34801561051c57600080fd5b506102a761052b366004613f7a565b611af3565b34801561053c57600080fd5b506102a761054b366004614302565b611c9e565b34801561055c57600080fd5b5061024960025481565b34801561057257600080fd5b5061048a6105813660046141a6565b60086020526000908152604090205460ff1681565b3480156105a257600080fd5b506102a76105b1366004613f7a565b611de4565b6102a76105c4366004613f4e565b611eed565b3480156105d557600080fd5b506102a7612596565b3480156105ea57600080fd5b5061024960035481565b34801561060057600080fd5b5061061461060f366004614337565b612a62565b60408051928352901515602083015201610253565b34801561063557600080fd5b50600154610249565b34801561064a57600080fd5b506102a7612baa565b34801561065f57600080fd5b506102a761066e366004613f7a565b612cba565b34801561067f57600080fd5b506102a761068e366004614337565b612e65565b34801561069f57600080fd5b5061024961070881565b6106e76040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107b25760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6000848152600c6020908152604080832085845290915290206003015461081b5760405162461bcd60e51b815260206004820152601660248201527f7478206461746120646f6573206e6f742065786973740000000000000000000060448201526064016107a9565b6000848152600c6020908152604080832085845290915290206002015483146108865760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e646578000000000000000000000060448201526064016107a9565b6000848152600c6020908152604080832085845290915290206005015460ff16151581151514156108f95760405162461bcd60e51b815260206004820152601a60248201527f766572696669656420737461747573206e6f74206368616e676500000000000060448201526064016107a9565b6000938452600c602090815260408086209386529290529220600501805460ff19169215159290921790915550565b6000838152600b602090815260408083208484529091529020600301546109b75760405162461bcd60e51b815260206004820152602660248201527f7468657265206973206e6f207374616b6520666f72207468697320626174636860448201527f20696e646578000000000000000000000000000000000000000000000000000060648201526084016107a9565b6000838152600b60209081526040808320848452909152902060050154610a205760405162461bcd60e51b815260206004820152601460248201527f7374616b6520616d6f756e74206973207a65726f00000000000000000000000060448201526064016107a9565b6000838152600b6020908152604080832084845290915281206006015460ff166003811115610a5157610a51614391565b14610a9e5760405162461bcd60e51b815260206004820152601b60248201527f7769746864726177616c7320617265206e6f7420616c6c6f776564000000000060448201526064016107a9565b6000838152600b6020908152604080832084845290915290205473ffffffffffffffffffffffffffffffffffffffff163314610b1c5760405162461bcd60e51b815260206004820152601e60248201527f63616e206e6f74207769746864726177206f746865722773207374616b65000060448201526064016107a9565b6000838152600b602090815260408083208484529091529020600401544211610bad5760405162461bcd60e51b815260206004820152602960248201527f63616e206e6f7420776974686472617720647572696e67207375626d6974207060448201527f726f74656374696f6e000000000000000000000000000000000000000000000060648201526084016107a9565b33600090815260096020908152604080832054868452600b8352818420858552909252909120600501541115610c255760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b65000000000000000000000000000060448201526064016107a9565b6000838152600b60209081526040808320848452909152902060050154471015610c915760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e636500000000000000000000000060448201526064016107a9565b6000838152600b60209081526040808320848452825280832060068101805460ff191660031790556005015433845260099092528220805491929091610cd89084906143ef565b90915550506000838152600b602090815260408083208484529091528082206005015490513391908381818185875af1925050503d8060008114610d38576040519150601f19603f3d011682016040523d82523d6000602084013e610d3d565b606091505b5050905080610d8e5760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e636500000000000000000000000060448201526064016107a9565b506000928352600b6020908152604080852092855291905282206005019190915550565b610df06040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eb65760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b60008111610f065760405162461bcd60e51b815260206004820152601660248201527f736c6963652073697a652073686f756c6420677420300000000000000000000060448201526064016107a9565b600154811415610f585760405162461bcd60e51b815260206004820152601a60248201527f736c6963652073697a6520686173206e6f74206368616e67656400000000000060448201526064016107a9565b600155565b610f9b6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110615760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b600655565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906110bd90859060040161416e565b60206040518083038186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110d9190614406565b92915050565b6000838152600c60209081526040808320848452909152812060030154606091906111805760405162461bcd60e51b815260206004820152601660248201527f7478206461746120646f6573206e6f742065786973740000000000000000000060448201526064016107a9565b6000858152600c6020908152604080832086845290915290206002015484146111eb5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e646578000000000000000000000060448201526064016107a9565b6000858152600c602090815260408083208684529091529020600581015460049091018054909160ff1690829061122190614423565b80601f016020809104026020016040519081016040528092919081815260200182805461124d90614423565b801561129a5780601f1061126f5761010080835404028352916020019161129a565b820191906000526020600020905b81548152906001019060200180831161127d57829003601f168201915b5050505050915091509150935093915050565b60075460009060ff16158061110d57505073ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205460ff1690565b6000806003541161133c5760405162461bcd60e51b815260206004820152601e60248201527f7374616b65206261736520636f7374206e6f7420636f6e66696720796574000060448201526064016107a9565b6000838152600a602090815260408083208584529091529020600201546113a55760405162461bcd60e51b815260206004820152601c60248201527f626174636820656c656d656e7420646f6573206e6f742065786973740000000060448201526064016107a9565b6006546000848152600a602090815260408083208684529091529020600101546113cf9190614477565b6003546113dc91906144b4565b9392505050565b6114216040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114e75760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b600081116115375760405162461bcd60e51b815260206004820152601760248201527f736c69636520636f756e742073686f756c64206774203000000000000000000060448201526064016107a9565b6004548114156115895760405162461bcd60e51b815260206004820152601b60248201527f736c69636520636f756e7420686173206e6f74206368616e676564000000000060448201526064016107a9565b600455565b6115be61159a8861348f565b6040516020016115aa91906144cc565b604051602081830303815290604052611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461165e5760405162461bcd60e51b815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016107a9565b6000878152600b602090815260408083208884529091529020600301546116ed5760405162461bcd60e51b815260206004820152602760248201527f7468657265206973206e6f207374616b6520666f72207468697320626c6f636b60448201527f206e756d6265720000000000000000000000000000000000000000000000000060648201526084016107a9565b6000878152600b6020908152604080832088845290915290206002015486146117585760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e646578000000000000000000000060448201526064016107a9565b6000878152600b6020908152604080832088845290915281206006015460ff16600381111561178957611789614391565b146117d65760405162461bcd60e51b815260206004820152601560248201527f6e6f7420616c6c6f77656420746f207375626d6974000000000000000000000060448201526064016107a9565b6117e78787878787878760016135ec565b6000878152600b6020908152604080832088845290915281206006015460ff16600381111561181857611818614391565b1415611a75576000878152600b60209081526040808320888452808352818420805473ffffffffffffffffffffffffffffffffffffffff1685526009845291842054938990529091526005015411156118b35760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b65000000000000000000000000000060448201526064016107a9565b6000878152600b6020908152604080832088845290915290206005015447101561191f5760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e636500000000000000000000000060448201526064016107a9565b6000878152600b60209081526040808320888452909152902060068101805460ff191660011790556005015415611a75576000878152600b6020908152604080832088845282528083206005810154905473ffffffffffffffffffffffffffffffffffffffff168452600990925282208054919290916119a09084906143ef565b90915550506000878152600b602090815260408083208884529091528082206005015490513391908381818185875af1925050503d8060008114611a00576040519150601f19603f3d011682016040523d82523d6000602084013e611a05565b606091505b5050905080611a565760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e636500000000000000000000000060448201526064016107a9565b506000878152600b602090815260408083208884529091528120600501555b6000878152600b602090815260408083208884528252918290206005015482513381529182018a9052818301899052606082018890526080820152600160a0820181905260c082015290517ffa136ae724a018470beba9749c1fdfb83177d6bd6aaaab35d6dbfde739e509109181900360e00190a150505050505050565b611b316040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bf75760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b60008111611c475760405162461bcd60e51b815260206004820152601660248201527f62617463682073697a652073686f756c6420677420300000000000000000000060448201526064016107a9565b600554811415611c995760405162461bcd60e51b815260206004820152601a60248201527f62617463682073697a6520686173206e6f74206368616e67656400000000000060448201526064016107a9565b600555565b611cdc6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611da25760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152600860205260409020805491151560ff19928316179055600780549091166001179055565b611e226040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ee85760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b600355565b611ef6336112ad565b611f685760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c000000000000000000000000000000000000000000000000000000000060648201526084016107a9565b346000611f7585856112e9565b9050600060035411611fc95760405162461bcd60e51b815260206004820152601e60248201527f7374616b65206261736520636f7374206e6f7420636f6e66696720796574000060448201526064016107a9565b8181146120185760405162461bcd60e51b815260206004820152601460248201527f7374616b6520636f737420696e636f727265637400000000000000000000000060448201526064016107a9565b6000600254116120905760405162461bcd60e51b815260206004820152602760248201527f73657175656e636572207375626d6974207365636f6e6473206e6f7420636f6e60448201527f666967207965740000000000000000000000000000000000000000000000000060648201526084016107a9565b6000858152600a602090815260408083208784529091529020600201546120f95760405162461bcd60e51b815260206004820152601c60248201527f626174636820656c656d656e7420646f6573206e6f742065786973740000000060448201526064016107a9565b6000858152600a6020908152604080832087845290915290205483906121359064ffffffffff81169065010000000000900462ffffff1661450d565b64ffffffffff161015801561216957506000858152600a6020908152604080832087845290915290205464ffffffffff1683115b6121db5760405162461bcd60e51b815260206004820152602160248201527f626c6f636b206e756d626572206973206e6f7420696e2074686973206261746360448201527f680000000000000000000000000000000000000000000000000000000000000060648201526084016107a9565b6000858152600b60209081526040808320868452909152902060030154156122a35760036000868152600b6020908152604080832087845290915290206006015460ff16600381111561223057612230614391565b146122a35760405162461bcd60e51b815260206004820152602560248201527f74686572652069732061207374616b6520666f7220746869732062617463682060448201527f696e64657800000000000000000000000000000000000000000000000000000060648201526084016107a9565b60006122e36040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250611066565b9050428173ffffffffffffffffffffffffffffffffffffffff1663c17b291b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561232c57600080fd5b505afa158015612340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123649190614536565b6000888152600a602090815260408083208a845290915290206004015461238b91906144b4565b116123fe5760405162461bcd60e51b815260206004820152602e60248201527f746865206261746368206973206f757473696465206f6620746865206672617560448201527f642070726f6f662077696e646f7700000000000000000000000000000000000060648201526084016107a9565b6040518060e001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018681526020014281526020016002544261244591906144b4565b815260208101859052604001600090526000878152600b60209081526040808320888452825291829020835181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161781559083015160018083019190915591830151600282015560608301516003808301919091556080840151600483015560a0840151600583015560c084015160068301805493949193909260ff199091169190849081111561251257612512614391565b021790555050336000908152600960205260408120805486935090919061253a9084906144b4565b9091555050604080513381526020810188905290810186905260608101859052608081018490527f918b3eda1688b2f6d3e6d173db1ec863e43f4d1c369d647b1912b0df8be5f12f9060a00160405180910390a1505050505050565b60043560243560d81c60293560e890811c90602c35901c60003681806125be61159a8961348f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461265e5760405162461bcd60e51b815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016107a9565b600061266b86601061454f565b61267690602f61457a565b62ffffff169050808411156127155760006126928260076144b4565b905060006126a183600b6144b4565b600554843560cc1c9850833560e01c9650813595509091506126c4600287614598565b11156127125760405162461bcd60e51b815260206004820152601c60248201527f73697a65206f66207478206461746120697320746f6f206c617267650000000060448201526064016107a9565b50505b60006127556040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250611066565b905060008173ffffffffffffffffffffffffffffffffffffffff1663cfdf677e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561279f57600080fd5b505afa1580156127b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d79190614406565b6040517f576f2588000000000000000000000000000000000000000000000000000000008152600481018d905290915060009073ffffffffffffffffffffffffffffffffffffffff83169063576f25889060240160206040518083038186803b15801561284357600080fd5b505afa158015612857573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287b9190614536565b90506000808473ffffffffffffffffffffffffffffffffffffffff166000366040516128a89291906145d3565b6000604051808303816000865af19150503d80600081146128e5576040519150601f19603f3d011682016040523d82523d6000602084013e6128ea565b606091505b50909250905081612902576040513d806000833e8082fd5b50506040518060c001604052808c64ffffffffff1681526020018b62ffffff16815260200187815260200189815260200186815260200142815250600a60008e8152602001908152602001600020600083815260200190815260200160002060008201518160000160006101000a81548164ffffffffff021916908364ffffffffff16021790555060208201518160000160056101000a81548162ffffff021916908362ffffff16021790555060408201518160010155606082015181600201556080820151816003015560a082015181600401559050507f77e48e0d46be115d5fe8dd03f4dbf8eb309c5fdc8ffdcbe6f8eaa5bd6c65aed98c828d8d8a8d8b604051612a4c9796959493929190968752602087019590955264ffffffffff93909316604086015262ffffff919091166060850152608084015260a083015260c082015260e00190565b60405180910390a1505050505050505050505050565b6000848152600c602090815260408083208584529091528120600301548190612acd5760405162461bcd60e51b815260206004820152601660248201527f7478206461746120646f6573206e6f742065786973740000000000000000000060448201526064016107a9565b6000868152600c602090815260408083208784529091529020600201548514612b385760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e646578000000000000000000000060448201526064016107a9565b8383604051602001612b4b9291906145e3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000898152600c845282812088825290935291206005015490925060ff16905094509492505050565b612be86040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cae5760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b6007805460ff19169055565b612cf86040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612dbe5760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b60008111612e0e5760405162461bcd60e51b815260206004820152601360248201527f7365636f6e64732073686f756c6420677420300000000000000000000000000060448201526064016107a9565b600254811415612e605760405162461bcd60e51b815260206004820152601760248201527f7365636f6e647320686173206e6f74206368616e67656400000000000000000060448201526064016107a9565b600255565b612e7161159a8561348f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415612f125760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e2063616e206e6f742062652063616c6c656420627920746860448201527f652053657175656e6365722e000000000000000000000000000000000000000060648201526084016107a9565b6000848152600b60209081526040808320858452909152902060030154612fa15760405162461bcd60e51b815260206004820152602760248201527f7468657265206973206e6f207374616b6520666f72207468697320626c6f636b60448201527f206e756d6265720000000000000000000000000000000000000000000000000060648201526084016107a9565b6000848152600b60209081526040808320858452909152902060020154831461300c5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e646578000000000000000000000060448201526064016107a9565b6000848152600b60209081526040808320858452909152902060040154421161309d5760405162461bcd60e51b815260206004820152603160248201527f63616e206e6f74207375626d697420647572696e672073657175656e6365722060448201527f7375626d69742070726f74656374696f6e00000000000000000000000000000060648201526084016107a9565b6000848152600b6020908152604080832085845290915290205473ffffffffffffffffffffffffffffffffffffffff163314613171576002546000858152600b6020908152604080832086845290915290206004015442916130fe916144b4565b106131715760405162461bcd60e51b815260206004820152602e60248201527f63616e206e6f74207375626d697420647572696e67207374616b65722073756260448201527f6d69742070726f74656374696f6e00000000000000000000000000000000000060648201526084016107a9565b6131ad84848484600080806040519080825280602002602001820160405280156131a5578160200160208202803683370190505b5060006135ec565b6000848152600b6020908152604080832085845290915281206006015460ff1660038111156131de576131de614391565b1415613413576000848152600b6020908152604080832085845280835281842060068101805460ff19166002179055805473ffffffffffffffffffffffffffffffffffffffff16808652600985529285205494879052925260059091015490911080159061326757506000858152600b6020908152604080832086845290915290206005015415155b15613411576000858152600b602090815260408083208684529091529020600501544710156132d85760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e636500000000000000000000000060448201526064016107a9565b6000858152600b6020908152604080832086845282528083206005015473ffffffffffffffffffffffffffffffffffffffff85168452600990925282208054919290916133269084906143ef565b90915550506000858152600b6020908152604080832086845290915280822060050154905173ffffffffffffffffffffffffffffffffffffffff841691908381818185875af1925050503d806000811461339c576040519150601f19603f3d011682016040523d82523d6000602084013e6133a1565b606091505b50509050806133f25760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e636500000000000000000000000060448201526064016107a9565b506000858152600b602090815260408083208684529091528120600501555b505b6000848152600b60209081526040808320858452825280832060050154815133815292830188905290820186905260608201859052608082015260a0810182905260c08101919091527ffa136ae724a018470beba9749c1fdfb83177d6bd6aaaab35d6dbfde739e509109060e00160405180910390a150505050565b6060816134cf57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156134f957806134e381614609565b91506134f29050600a83614598565b91506134d3565b60008167ffffffffffffffff81111561351457613514613f93565b6040519080825280601f01601f19166020018201604052801561353e576020820181803683370190505b509050815b85156135e3576135546001826143ef565b90506000613563600a88614598565b61356e90600a614477565b61357890886143ef565b613583906030614642565b905060008160f81b9050808484815181106135a0576135a0614667565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135da600a89614598565b97505050613543565b50949350505050565b600085511161363d5760405162461bcd60e51b815260206004820152600a60248201527f656d70747920646174610000000000000000000000000000000000000000000060448201526064016107a9565b6000888152600a602090815260408083208a84529091529020600201546136a65760405162461bcd60e51b815260206004820152601c60248201527f626174636820656c656d656e7420646f6573206e6f742065786973740000000060448201526064016107a9565b6000888152600a602090815260408083208a845290915290205465010000000000900462ffffff166137405760405162461bcd60e51b815260206004820152603060248201527f626174636820746f74616c20656c656d656e7420746f20617070656e6420736860448201527f6f756c64206e6f74206265207a65726f0000000000000000000000000000000060648201526084016107a9565b6000888152600c602090815260408083208984529091529020600301541561393e576000888152600c6020908152604080832089845290915290206005015460ff16156137cf5760405162461bcd60e51b815260206004820152601060248201527f747820646174612076657269666965640000000000000000000000000000000060448201526064016107a9565b6000888152600c6020908152604080832089845290915290205473ffffffffffffffffffffffffffffffffffffffff163314613911576000888152600c60209081526040808320898452909152902060030154429061383190610708906144b4565b1161387e5760405162461bcd60e51b815260206004820152600d60248201527f696e207375626d697474696e670000000000000000000000000000000000000060448201526064016107a9565b6000888152600c60209081526040808320898452825290912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633178155600181018890556002810189905542600382015586516138e792600490920191880190613e61565b506000888152600c602090815260408083208984529091529020600501805460ff19169055613a0d565b6000888152600c60209081526040808320898452825290912086516138e792600490920191880190613e61565b6040805160c08101825233815260208082018981528284018b81524260608501908152608085018b8152600060a087018190528f8152600c86528781208e8252865296909620855181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161781559251600184015590516002830155516003820155925180519293926139f09260048501920190613e61565b5060a091909101516005909101805460ff19169115159190911790555b8015613b055760008686604051602001613a289291906145e3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008c8152600a84528281208c825290935290822060030154909250613a879083888789613b0f565b9050600181151514613adb5760405162461bcd60e51b815260206004820152601560248201527f7478206461746120766572696679206661696c6564000000000000000000000060448201526064016107a9565b50506000888152600c602090815260408083208984529091529020600501805460ff191660011790555b5050505050505050565b6000808211613b865760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016107a9565b818410613bfa5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016107a9565b613c0382613d7d565b835114613c9e5760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016107a9565b8460005b8451811015613d70578560011660011415613d0957848181518110613cc957613cc9614667565b602002602001015182604051602001613cec929190918252602082015260400190565b604051602081830303815290604052805190602001209150613d57565b81858281518110613d1c57613d1c614667565b6020026020010151604051602001613d3e929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480613d6881614609565b915050613ca2565b5090951495945050505050565b6000808211613df45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016107a9565b8160011415613e0557506000919050565b81600060805b60018110613e435780613e21600180831b6143ef565b901b831615613e3b57613e3481836144b4565b92811c9291505b60011c613e0b565b506001811b84146113dc57613e596001826144b4565b949350505050565b828054613e6d90614423565b90600052602060002090601f016020900481019282613e8f5760008555613ed5565b82601f10613ea857805160ff1916838001178555613ed5565b82800160010185558215613ed5579182015b82811115613ed5578251825591602001919060010190613eba565b50613ee1929150613ee5565b5090565b5b80821115613ee15760008155600101613ee6565b80358015158114613f0a57600080fd5b919050565b60008060008060808587031215613f2557600080fd5b843593506020850135925060408501359150613f4360608601613efa565b905092959194509250565b600080600060608486031215613f6357600080fd5b505081359360208301359350604090920135919050565b600060208284031215613f8c57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561400957614009613f93565b604052919050565b600067ffffffffffffffff83111561402b5761402b613f93565b61405c60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613fc2565b905082815283838301111561407057600080fd5b828260208301376000602084830101529392505050565b60006020828403121561409957600080fd5b813567ffffffffffffffff8111156140b057600080fd5b8201601f810184136140c157600080fd5b613e5984823560208401614011565b60005b838110156140eb5781810151838201526020016140d3565b838111156140fa576000848401525b50505050565b600081518084526141188160208601602086016140d0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061415d6040830185614100565b905082151560208301529392505050565b6020815260006113dc6020830184614100565b73ffffffffffffffffffffffffffffffffffffffff811681146141a357600080fd5b50565b6000602082840312156141b857600080fd5b81356113dc81614181565b600080604083850312156141d657600080fd5b50508035926020909101359150565b600082601f8301126141f657600080fd5b6113dc83833560208501614011565b600080600080600080600060e0888a03121561422057600080fd5b87359650602080890135965060408901359550606089013567ffffffffffffffff8082111561424e57600080fd5b61425a8c838d016141e5565b965060808b0135955060a08b0135945060c08b013591508082111561427e57600080fd5b818b0191508b601f83011261429257600080fd5b8135818111156142a4576142a4613f93565b8060051b91506142b5848301613fc2565b818152918301840191848101908e8411156142cf57600080fd5b938501935b838510156142ed578435825293850193908501906142d4565b80965050505050505092959891949750929550565b6000806040838503121561431557600080fd5b823561432081614181565b915061432e60208401613efa565b90509250929050565b6000806000806080858703121561434d57600080fd5b843593506020850135925060408501359150606085013567ffffffffffffffff81111561437957600080fd5b614385878288016141e5565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614401576144016143c0565b500390565b60006020828403121561441857600080fd5b81516113dc81614181565b600181811c9082168061443757607f821691505b60208210811415614471577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144af576144af6143c0565b500290565b600082198211156144c7576144c76143c0565b500190565b600082516144de8184602087016140d0565b7f5f4d564d5f53657175656e6365725f5772617070657200000000000000000000920191825250601601919050565b600064ffffffffff80831681851680830382111561452d5761452d6143c0565b01949350505050565b60006020828403121561454857600080fd5b5051919050565b600062ffffff80831681851681830481118215151615614571576145716143c0565b02949350505050565b600062ffffff80831681851680830382111561452d5761452d6143c0565b6000826145ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8183823760009101908152919050565b828152600082516145fb8160208501602087016140d0565b919091016020019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561463b5761463b6143c0565b5060010190565b600060ff821660ff84168060ff0382111561465f5761465f6143c0565b019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220b865b1352f49fb7dbbf6ba69c7849a98a4245ea8715f098bfa725a02c522205364736f6c63430008090033",
  "deployedBytecode": "0x6080604052600436106102335760003560e01c80637600fa1211610138578063a6a56da5116100b0578063d6a97a341161007f578063f137391611610064578063f137391614610653578063f1e7746114610673578063f6f24f671461069357600080fd5b8063d6a97a3414610629578063dcd836161461063e57600080fd5b8063a6a56da5146105b6578063a8cda37b146105c9578063b357ab92146105de578063d5fb60d9146105f457600080fd5b806386e4206e116101075780639447fe88116100ec5780639447fe88146105505780639b19251a14610566578063a5f5e7191461059657600080fd5b806386e4206e146105105780638d14e1271461053057600080fd5b80637600fa121461049a5780637f9c9777146104ba57806381147877146104da57806383cbbb6d146104f057600080fd5b80633ac19597116101cb5780634e74b1551161019a57806361f4edea1161017f57806361f4edea146103e6578063669fdeb5146104145780636f9170f61461046a57600080fd5b80634e74b155146103bc5780635e7ce13a146103d157600080fd5b80633ac1959714610351578063461a44781461037157806348406b861461039157806348f24165146103a757600080fd5b8063279f9b1111610207578063279f9b11146102a9578063299ca478146102c957806335005ffb1461031b57806338897fdd1461033b57600080fd5b806213c63d1461023857806302adf2d61461025c578063167c705014610271578063172e218d14610287575b600080fd5b34801561024457600080fd5b506002545b6040519081526020015b60405180910390f35b34801561026857600080fd5b50600454610249565b34801561027d57600080fd5b5061024960045481565b34801561029357600080fd5b506102a76102a2366004613f0f565b6106a9565b005b3480156102b557600080fd5b506102a76102c4366004613f4e565b610928565b3480156102d557600080fd5b506000546102f69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610253565b34801561032757600080fd5b506102a7610336366004613f7a565b610db2565b34801561034757600080fd5b5061024960015481565b34801561035d57600080fd5b506102a761036c366004613f7a565b610f5d565b34801561037d57600080fd5b506102f661038c366004614087565b611066565b34801561039d57600080fd5b5061024960065481565b3480156103b357600080fd5b50600654610249565b3480156103c857600080fd5b50600354610249565b3480156103dd57600080fd5b50600554610249565b3480156103f257600080fd5b50610406610401366004613f4e565b611113565b60405161025392919061414a565b34801561042057600080fd5b5061045d6040518060400160405280600d81526020017f4d455449535f4d414e414745520000000000000000000000000000000000000081525081565b604051610253919061416e565b34801561047657600080fd5b5061048a6104853660046141a6565b6112ad565b6040519015158152602001610253565b3480156104a657600080fd5b506102496104b53660046141c3565b6112e9565b3480156104c657600080fd5b506102a76104d5366004613f7a565b6113e3565b3480156104e657600080fd5b5061024960055481565b3480156104fc57600080fd5b506102a761050b366004614205565b61158e565b34801561051c57600080fd5b506102a761052b366004613f7a565b611af3565b34801561053c57600080fd5b506102a761054b366004614302565b611c9e565b34801561055c57600080fd5b5061024960025481565b34801561057257600080fd5b5061048a6105813660046141a6565b60086020526000908152604090205460ff1681565b3480156105a257600080fd5b506102a76105b1366004613f7a565b611de4565b6102a76105c4366004613f4e565b611eed565b3480156105d557600080fd5b506102a7612596565b3480156105ea57600080fd5b5061024960035481565b34801561060057600080fd5b5061061461060f366004614337565b612a62565b60408051928352901515602083015201610253565b34801561063557600080fd5b50600154610249565b34801561064a57600080fd5b506102a7612baa565b34801561065f57600080fd5b506102a761066e366004613f7a565b612cba565b34801561067f57600080fd5b506102a761068e366004614337565b612e65565b34801561069f57600080fd5b5061024961070881565b6106e76040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107b25760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6000848152600c6020908152604080832085845290915290206003015461081b5760405162461bcd60e51b815260206004820152601660248201527f7478206461746120646f6573206e6f742065786973740000000000000000000060448201526064016107a9565b6000848152600c6020908152604080832085845290915290206002015483146108865760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e646578000000000000000000000060448201526064016107a9565b6000848152600c6020908152604080832085845290915290206005015460ff16151581151514156108f95760405162461bcd60e51b815260206004820152601a60248201527f766572696669656420737461747573206e6f74206368616e676500000000000060448201526064016107a9565b6000938452600c602090815260408086209386529290529220600501805460ff19169215159290921790915550565b6000838152600b602090815260408083208484529091529020600301546109b75760405162461bcd60e51b815260206004820152602660248201527f7468657265206973206e6f207374616b6520666f72207468697320626174636860448201527f20696e646578000000000000000000000000000000000000000000000000000060648201526084016107a9565b6000838152600b60209081526040808320848452909152902060050154610a205760405162461bcd60e51b815260206004820152601460248201527f7374616b6520616d6f756e74206973207a65726f00000000000000000000000060448201526064016107a9565b6000838152600b6020908152604080832084845290915281206006015460ff166003811115610a5157610a51614391565b14610a9e5760405162461bcd60e51b815260206004820152601b60248201527f7769746864726177616c7320617265206e6f7420616c6c6f776564000000000060448201526064016107a9565b6000838152600b6020908152604080832084845290915290205473ffffffffffffffffffffffffffffffffffffffff163314610b1c5760405162461bcd60e51b815260206004820152601e60248201527f63616e206e6f74207769746864726177206f746865722773207374616b65000060448201526064016107a9565b6000838152600b602090815260408083208484529091529020600401544211610bad5760405162461bcd60e51b815260206004820152602960248201527f63616e206e6f7420776974686472617720647572696e67207375626d6974207060448201527f726f74656374696f6e000000000000000000000000000000000000000000000060648201526084016107a9565b33600090815260096020908152604080832054868452600b8352818420858552909252909120600501541115610c255760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b65000000000000000000000000000060448201526064016107a9565b6000838152600b60209081526040808320848452909152902060050154471015610c915760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e636500000000000000000000000060448201526064016107a9565b6000838152600b60209081526040808320848452825280832060068101805460ff191660031790556005015433845260099092528220805491929091610cd89084906143ef565b90915550506000838152600b602090815260408083208484529091528082206005015490513391908381818185875af1925050503d8060008114610d38576040519150601f19603f3d011682016040523d82523d6000602084013e610d3d565b606091505b5050905080610d8e5760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e636500000000000000000000000060448201526064016107a9565b506000928352600b6020908152604080852092855291905282206005019190915550565b610df06040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eb65760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b60008111610f065760405162461bcd60e51b815260206004820152601660248201527f736c6963652073697a652073686f756c6420677420300000000000000000000060448201526064016107a9565b600154811415610f585760405162461bcd60e51b815260206004820152601a60248201527f736c6963652073697a6520686173206e6f74206368616e67656400000000000060448201526064016107a9565b600155565b610f9b6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110615760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b600655565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906110bd90859060040161416e565b60206040518083038186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110d9190614406565b92915050565b6000838152600c60209081526040808320848452909152812060030154606091906111805760405162461bcd60e51b815260206004820152601660248201527f7478206461746120646f6573206e6f742065786973740000000000000000000060448201526064016107a9565b6000858152600c6020908152604080832086845290915290206002015484146111eb5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e646578000000000000000000000060448201526064016107a9565b6000858152600c602090815260408083208684529091529020600581015460049091018054909160ff1690829061122190614423565b80601f016020809104026020016040519081016040528092919081815260200182805461124d90614423565b801561129a5780601f1061126f5761010080835404028352916020019161129a565b820191906000526020600020905b81548152906001019060200180831161127d57829003601f168201915b5050505050915091509150935093915050565b60075460009060ff16158061110d57505073ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205460ff1690565b6000806003541161133c5760405162461bcd60e51b815260206004820152601e60248201527f7374616b65206261736520636f7374206e6f7420636f6e66696720796574000060448201526064016107a9565b6000838152600a602090815260408083208584529091529020600201546113a55760405162461bcd60e51b815260206004820152601c60248201527f626174636820656c656d656e7420646f6573206e6f742065786973740000000060448201526064016107a9565b6006546000848152600a602090815260408083208684529091529020600101546113cf9190614477565b6003546113dc91906144b4565b9392505050565b6114216040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114e75760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b600081116115375760405162461bcd60e51b815260206004820152601760248201527f736c69636520636f756e742073686f756c64206774203000000000000000000060448201526064016107a9565b6004548114156115895760405162461bcd60e51b815260206004820152601b60248201527f736c69636520636f756e7420686173206e6f74206368616e676564000000000060448201526064016107a9565b600455565b6115be61159a8861348f565b6040516020016115aa91906144cc565b604051602081830303815290604052611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461165e5760405162461bcd60e51b815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016107a9565b6000878152600b602090815260408083208884529091529020600301546116ed5760405162461bcd60e51b815260206004820152602760248201527f7468657265206973206e6f207374616b6520666f72207468697320626c6f636b60448201527f206e756d6265720000000000000000000000000000000000000000000000000060648201526084016107a9565b6000878152600b6020908152604080832088845290915290206002015486146117585760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e646578000000000000000000000060448201526064016107a9565b6000878152600b6020908152604080832088845290915281206006015460ff16600381111561178957611789614391565b146117d65760405162461bcd60e51b815260206004820152601560248201527f6e6f7420616c6c6f77656420746f207375626d6974000000000000000000000060448201526064016107a9565b6117e78787878787878760016135ec565b6000878152600b6020908152604080832088845290915281206006015460ff16600381111561181857611818614391565b1415611a75576000878152600b60209081526040808320888452808352818420805473ffffffffffffffffffffffffffffffffffffffff1685526009845291842054938990529091526005015411156118b35760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b65000000000000000000000000000060448201526064016107a9565b6000878152600b6020908152604080832088845290915290206005015447101561191f5760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e636500000000000000000000000060448201526064016107a9565b6000878152600b60209081526040808320888452909152902060068101805460ff191660011790556005015415611a75576000878152600b6020908152604080832088845282528083206005810154905473ffffffffffffffffffffffffffffffffffffffff168452600990925282208054919290916119a09084906143ef565b90915550506000878152600b602090815260408083208884529091528082206005015490513391908381818185875af1925050503d8060008114611a00576040519150601f19603f3d011682016040523d82523d6000602084013e611a05565b606091505b5050905080611a565760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e636500000000000000000000000060448201526064016107a9565b506000878152600b602090815260408083208884529091528120600501555b6000878152600b602090815260408083208884528252918290206005015482513381529182018a9052818301899052606082018890526080820152600160a0820181905260c082015290517ffa136ae724a018470beba9749c1fdfb83177d6bd6aaaab35d6dbfde739e509109181900360e00190a150505050505050565b611b316040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bf75760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b60008111611c475760405162461bcd60e51b815260206004820152601660248201527f62617463682073697a652073686f756c6420677420300000000000000000000060448201526064016107a9565b600554811415611c995760405162461bcd60e51b815260206004820152601a60248201527f62617463682073697a6520686173206e6f74206368616e67656400000000000060448201526064016107a9565b600555565b611cdc6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611da25760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152600860205260409020805491151560ff19928316179055600780549091166001179055565b611e226040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ee85760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b600355565b611ef6336112ad565b611f685760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c000000000000000000000000000000000000000000000000000000000060648201526084016107a9565b346000611f7585856112e9565b9050600060035411611fc95760405162461bcd60e51b815260206004820152601e60248201527f7374616b65206261736520636f7374206e6f7420636f6e66696720796574000060448201526064016107a9565b8181146120185760405162461bcd60e51b815260206004820152601460248201527f7374616b6520636f737420696e636f727265637400000000000000000000000060448201526064016107a9565b6000600254116120905760405162461bcd60e51b815260206004820152602760248201527f73657175656e636572207375626d6974207365636f6e6473206e6f7420636f6e60448201527f666967207965740000000000000000000000000000000000000000000000000060648201526084016107a9565b6000858152600a602090815260408083208784529091529020600201546120f95760405162461bcd60e51b815260206004820152601c60248201527f626174636820656c656d656e7420646f6573206e6f742065786973740000000060448201526064016107a9565b6000858152600a6020908152604080832087845290915290205483906121359064ffffffffff81169065010000000000900462ffffff1661450d565b64ffffffffff161015801561216957506000858152600a6020908152604080832087845290915290205464ffffffffff1683115b6121db5760405162461bcd60e51b815260206004820152602160248201527f626c6f636b206e756d626572206973206e6f7420696e2074686973206261746360448201527f680000000000000000000000000000000000000000000000000000000000000060648201526084016107a9565b6000858152600b60209081526040808320868452909152902060030154156122a35760036000868152600b6020908152604080832087845290915290206006015460ff16600381111561223057612230614391565b146122a35760405162461bcd60e51b815260206004820152602560248201527f74686572652069732061207374616b6520666f7220746869732062617463682060448201527f696e64657800000000000000000000000000000000000000000000000000000060648201526084016107a9565b60006122e36040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250611066565b9050428173ffffffffffffffffffffffffffffffffffffffff1663c17b291b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561232c57600080fd5b505afa158015612340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123649190614536565b6000888152600a602090815260408083208a845290915290206004015461238b91906144b4565b116123fe5760405162461bcd60e51b815260206004820152602e60248201527f746865206261746368206973206f757473696465206f6620746865206672617560448201527f642070726f6f662077696e646f7700000000000000000000000000000000000060648201526084016107a9565b6040518060e001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018681526020014281526020016002544261244591906144b4565b815260208101859052604001600090526000878152600b60209081526040808320888452825291829020835181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161781559083015160018083019190915591830151600282015560608301516003808301919091556080840151600483015560a0840151600583015560c084015160068301805493949193909260ff199091169190849081111561251257612512614391565b021790555050336000908152600960205260408120805486935090919061253a9084906144b4565b9091555050604080513381526020810188905290810186905260608101859052608081018490527f918b3eda1688b2f6d3e6d173db1ec863e43f4d1c369d647b1912b0df8be5f12f9060a00160405180910390a1505050505050565b60043560243560d81c60293560e890811c90602c35901c60003681806125be61159a8961348f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461265e5760405162461bcd60e51b815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016107a9565b600061266b86601061454f565b61267690602f61457a565b62ffffff169050808411156127155760006126928260076144b4565b905060006126a183600b6144b4565b600554843560cc1c9850833560e01c9650813595509091506126c4600287614598565b11156127125760405162461bcd60e51b815260206004820152601c60248201527f73697a65206f66207478206461746120697320746f6f206c617267650000000060448201526064016107a9565b50505b60006127556040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250611066565b905060008173ffffffffffffffffffffffffffffffffffffffff1663cfdf677e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561279f57600080fd5b505afa1580156127b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d79190614406565b6040517f576f2588000000000000000000000000000000000000000000000000000000008152600481018d905290915060009073ffffffffffffffffffffffffffffffffffffffff83169063576f25889060240160206040518083038186803b15801561284357600080fd5b505afa158015612857573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287b9190614536565b90506000808473ffffffffffffffffffffffffffffffffffffffff166000366040516128a89291906145d3565b6000604051808303816000865af19150503d80600081146128e5576040519150601f19603f3d011682016040523d82523d6000602084013e6128ea565b606091505b50909250905081612902576040513d806000833e8082fd5b50506040518060c001604052808c64ffffffffff1681526020018b62ffffff16815260200187815260200189815260200186815260200142815250600a60008e8152602001908152602001600020600083815260200190815260200160002060008201518160000160006101000a81548164ffffffffff021916908364ffffffffff16021790555060208201518160000160056101000a81548162ffffff021916908362ffffff16021790555060408201518160010155606082015181600201556080820151816003015560a082015181600401559050507f77e48e0d46be115d5fe8dd03f4dbf8eb309c5fdc8ffdcbe6f8eaa5bd6c65aed98c828d8d8a8d8b604051612a4c9796959493929190968752602087019590955264ffffffffff93909316604086015262ffffff919091166060850152608084015260a083015260c082015260e00190565b60405180910390a1505050505050505050505050565b6000848152600c602090815260408083208584529091528120600301548190612acd5760405162461bcd60e51b815260206004820152601660248201527f7478206461746120646f6573206e6f742065786973740000000000000000000060448201526064016107a9565b6000868152600c602090815260408083208784529091529020600201548514612b385760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e646578000000000000000000000060448201526064016107a9565b8383604051602001612b4b9291906145e3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000898152600c845282812088825290935291206005015490925060ff16905094509492505050565b612be86040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cae5760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b6007805460ff19169055565b612cf86040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250611066565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612dbe5760405162461bcd60e51b815260206004820152604b60248201527f4d564d5f43616e6f6e6963616c5472616e73616374696f6e3a2046756e63746960448201527f6f6e2063616e206f6e6c792062652063616c6c656420627920746865204d455460648201527f49535f4d414e414745522e000000000000000000000000000000000000000000608482015260a4016107a9565b60008111612e0e5760405162461bcd60e51b815260206004820152601360248201527f7365636f6e64732073686f756c6420677420300000000000000000000000000060448201526064016107a9565b600254811415612e605760405162461bcd60e51b815260206004820152601760248201527f7365636f6e647320686173206e6f74206368616e67656400000000000000000060448201526064016107a9565b600255565b612e7161159a8561348f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415612f125760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e2063616e206e6f742062652063616c6c656420627920746860448201527f652053657175656e6365722e000000000000000000000000000000000000000060648201526084016107a9565b6000848152600b60209081526040808320858452909152902060030154612fa15760405162461bcd60e51b815260206004820152602760248201527f7468657265206973206e6f207374616b6520666f72207468697320626c6f636b60448201527f206e756d6265720000000000000000000000000000000000000000000000000060648201526084016107a9565b6000848152600b60209081526040808320858452909152902060020154831461300c5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e646578000000000000000000000060448201526064016107a9565b6000848152600b60209081526040808320858452909152902060040154421161309d5760405162461bcd60e51b815260206004820152603160248201527f63616e206e6f74207375626d697420647572696e672073657175656e6365722060448201527f7375626d69742070726f74656374696f6e00000000000000000000000000000060648201526084016107a9565b6000848152600b6020908152604080832085845290915290205473ffffffffffffffffffffffffffffffffffffffff163314613171576002546000858152600b6020908152604080832086845290915290206004015442916130fe916144b4565b106131715760405162461bcd60e51b815260206004820152602e60248201527f63616e206e6f74207375626d697420647572696e67207374616b65722073756260448201527f6d69742070726f74656374696f6e00000000000000000000000000000000000060648201526084016107a9565b6131ad84848484600080806040519080825280602002602001820160405280156131a5578160200160208202803683370190505b5060006135ec565b6000848152600b6020908152604080832085845290915281206006015460ff1660038111156131de576131de614391565b1415613413576000848152600b6020908152604080832085845280835281842060068101805460ff19166002179055805473ffffffffffffffffffffffffffffffffffffffff16808652600985529285205494879052925260059091015490911080159061326757506000858152600b6020908152604080832086845290915290206005015415155b15613411576000858152600b602090815260408083208684529091529020600501544710156132d85760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e636500000000000000000000000060448201526064016107a9565b6000858152600b6020908152604080832086845282528083206005015473ffffffffffffffffffffffffffffffffffffffff85168452600990925282208054919290916133269084906143ef565b90915550506000858152600b6020908152604080832086845290915280822060050154905173ffffffffffffffffffffffffffffffffffffffff841691908381818185875af1925050503d806000811461339c576040519150601f19603f3d011682016040523d82523d6000602084013e6133a1565b606091505b50509050806133f25760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e636500000000000000000000000060448201526064016107a9565b506000858152600b602090815260408083208684529091528120600501555b505b6000848152600b60209081526040808320858452825280832060050154815133815292830188905290820186905260608201859052608082015260a0810182905260c08101919091527ffa136ae724a018470beba9749c1fdfb83177d6bd6aaaab35d6dbfde739e509109060e00160405180910390a150505050565b6060816134cf57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156134f957806134e381614609565b91506134f29050600a83614598565b91506134d3565b60008167ffffffffffffffff81111561351457613514613f93565b6040519080825280601f01601f19166020018201604052801561353e576020820181803683370190505b509050815b85156135e3576135546001826143ef565b90506000613563600a88614598565b61356e90600a614477565b61357890886143ef565b613583906030614642565b905060008160f81b9050808484815181106135a0576135a0614667565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135da600a89614598565b97505050613543565b50949350505050565b600085511161363d5760405162461bcd60e51b815260206004820152600a60248201527f656d70747920646174610000000000000000000000000000000000000000000060448201526064016107a9565b6000888152600a602090815260408083208a84529091529020600201546136a65760405162461bcd60e51b815260206004820152601c60248201527f626174636820656c656d656e7420646f6573206e6f742065786973740000000060448201526064016107a9565b6000888152600a602090815260408083208a845290915290205465010000000000900462ffffff166137405760405162461bcd60e51b815260206004820152603060248201527f626174636820746f74616c20656c656d656e7420746f20617070656e6420736860448201527f6f756c64206e6f74206265207a65726f0000000000000000000000000000000060648201526084016107a9565b6000888152600c602090815260408083208984529091529020600301541561393e576000888152600c6020908152604080832089845290915290206005015460ff16156137cf5760405162461bcd60e51b815260206004820152601060248201527f747820646174612076657269666965640000000000000000000000000000000060448201526064016107a9565b6000888152600c6020908152604080832089845290915290205473ffffffffffffffffffffffffffffffffffffffff163314613911576000888152600c60209081526040808320898452909152902060030154429061383190610708906144b4565b1161387e5760405162461bcd60e51b815260206004820152600d60248201527f696e207375626d697474696e670000000000000000000000000000000000000060448201526064016107a9565b6000888152600c60209081526040808320898452825290912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633178155600181018890556002810189905542600382015586516138e792600490920191880190613e61565b506000888152600c602090815260408083208984529091529020600501805460ff19169055613a0d565b6000888152600c60209081526040808320898452825290912086516138e792600490920191880190613e61565b6040805160c08101825233815260208082018981528284018b81524260608501908152608085018b8152600060a087018190528f8152600c86528781208e8252865296909620855181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161781559251600184015590516002830155516003820155925180519293926139f09260048501920190613e61565b5060a091909101516005909101805460ff19169115159190911790555b8015613b055760008686604051602001613a289291906145e3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008c8152600a84528281208c825290935290822060030154909250613a879083888789613b0f565b9050600181151514613adb5760405162461bcd60e51b815260206004820152601560248201527f7478206461746120766572696679206661696c6564000000000000000000000060448201526064016107a9565b50506000888152600c602090815260408083208984529091529020600501805460ff191660011790555b5050505050505050565b6000808211613b865760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016107a9565b818410613bfa5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016107a9565b613c0382613d7d565b835114613c9e5760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016107a9565b8460005b8451811015613d70578560011660011415613d0957848181518110613cc957613cc9614667565b602002602001015182604051602001613cec929190918252602082015260400190565b604051602081830303815290604052805190602001209150613d57565b81858281518110613d1c57613d1c614667565b6020026020010151604051602001613d3e929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480613d6881614609565b915050613ca2565b5090951495945050505050565b6000808211613df45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016107a9565b8160011415613e0557506000919050565b81600060805b60018110613e435780613e21600180831b6143ef565b901b831615613e3b57613e3481836144b4565b92811c9291505b60011c613e0b565b506001811b84146113dc57613e596001826144b4565b949350505050565b828054613e6d90614423565b90600052602060002090601f016020900481019282613e8f5760008555613ed5565b82601f10613ea857805160ff1916838001178555613ed5565b82800160010185558215613ed5579182015b82811115613ed5578251825591602001919060010190613eba565b50613ee1929150613ee5565b5090565b5b80821115613ee15760008155600101613ee6565b80358015158114613f0a57600080fd5b919050565b60008060008060808587031215613f2557600080fd5b843593506020850135925060408501359150613f4360608601613efa565b905092959194509250565b600080600060608486031215613f6357600080fd5b505081359360208301359350604090920135919050565b600060208284031215613f8c57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561400957614009613f93565b604052919050565b600067ffffffffffffffff83111561402b5761402b613f93565b61405c60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613fc2565b905082815283838301111561407057600080fd5b828260208301376000602084830101529392505050565b60006020828403121561409957600080fd5b813567ffffffffffffffff8111156140b057600080fd5b8201601f810184136140c157600080fd5b613e5984823560208401614011565b60005b838110156140eb5781810151838201526020016140d3565b838111156140fa576000848401525b50505050565b600081518084526141188160208601602086016140d0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061415d6040830185614100565b905082151560208301529392505050565b6020815260006113dc6020830184614100565b73ffffffffffffffffffffffffffffffffffffffff811681146141a357600080fd5b50565b6000602082840312156141b857600080fd5b81356113dc81614181565b600080604083850312156141d657600080fd5b50508035926020909101359150565b600082601f8301126141f657600080fd5b6113dc83833560208501614011565b600080600080600080600060e0888a03121561422057600080fd5b87359650602080890135965060408901359550606089013567ffffffffffffffff8082111561424e57600080fd5b61425a8c838d016141e5565b965060808b0135955060a08b0135945060c08b013591508082111561427e57600080fd5b818b0191508b601f83011261429257600080fd5b8135818111156142a4576142a4613f93565b8060051b91506142b5848301613fc2565b818152918301840191848101908e8411156142cf57600080fd5b938501935b838510156142ed578435825293850193908501906142d4565b80965050505050505092959891949750929550565b6000806040838503121561431557600080fd5b823561432081614181565b915061432e60208401613efa565b90509250929050565b6000806000806080858703121561434d57600080fd5b843593506020850135925060408501359150606085013567ffffffffffffffff81111561437957600080fd5b614385878288016141e5565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614401576144016143c0565b500390565b60006020828403121561441857600080fd5b81516113dc81614181565b600181811c9082168061443757607f821691505b60208210811415614471577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144af576144af6143c0565b500290565b600082198211156144c7576144c76143c0565b500190565b600082516144de8184602087016140d0565b7f5f4d564d5f53657175656e6365725f5772617070657200000000000000000000920191825250601601919050565b600064ffffffffff80831681851680830382111561452d5761452d6143c0565b01949350505050565b60006020828403121561454857600080fd5b5051919050565b600062ffffff80831681851681830481118215151615614571576145716143c0565b02949350505050565b600062ffffff80831681851680830382111561452d5761452d6143c0565b6000826145ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8183823760009101908152919050565b828152600082516145fb8160208501602087016140d0565b919091016020019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561463b5761463b6143c0565b5060010190565b600060ff821660ff84168060ff0382111561465f5761465f6143c0565b019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220b865b1352f49fb7dbbf6ba69c7849a98a4245ea8715f098bfa725a02c522205364736f6c63430008090033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "appendSequencerBatchByChainId()": {
        "details": "This function uses a custom encoding scheme for efficiency reasons."
      },
      "getBatchTxData(uint256,uint256,uint256)": {
        "params": {
          "_batchIndex": "batch index of CTC.",
          "_blockNumber": "block number.",
          "_chainId": "chain id."
        },
        "returns": {
          "txData": "txData",
          "verified": "verified"
        }
      },
      "getStakeSeqSeconds()": {
        "returns": {
          "_0": "Seconds the Sequencer can sumbit transaction data after verifier staking."
        }
      },
      "resolve(string)": {
        "params": {
          "_name": "Name to resolve an address for."
        },
        "returns": {
          "_0": "Address associated with the given name."
        }
      },
      "setBatchTxDataForStake(uint256,uint256,uint256,bytes,uint256,uint256,bytes32[])": {
        "params": {
          "_batchIndex": "batch index of CTC.",
          "_blockNumber": "slice index.",
          "_chainId": "chain id.",
          "_data": "tx data hex."
        }
      },
      "setBatchTxDataForVerifier(uint256,uint256,uint256,bytes)": {
        "params": {
          "_batchIndex": "batch index of CTC.",
          "_blockNumber": "slice index.",
          "_chainId": "chain id.",
          "_data": "tx data hex."
        }
      },
      "setStakeSeqSeconds(uint256)": {
        "params": {
          "_seconds": "Seconds the Sequencer can sumbit transaction data after verifier staking."
        }
      },
      "setStakeUnitCost(uint256)": {
        "params": {
          "_stakeUnitCost": "Stake cost for verifier."
        }
      },
      "setTxBatchSize(uint256)": {
        "params": {
          "_size": "Batch size of batch."
        }
      },
      "setTxDataSliceCount(uint256)": {
        "params": {
          "_count": "Slice count per batch transaction data."
        }
      },
      "setTxDataSliceSize(uint256)": {
        "params": {
          "_size": "Slice size of batch transaction data."
        }
      },
      "verifierStake(uint256,uint256,uint256)": {
        "params": {
          "_batchIndex": "batch index of CTC.",
          "_blockNumber": "block number.",
          "_chainId": "chain id."
        }
      },
      "withdrawStake(uint256,uint256,uint256)": {
        "params": {
          "_batchIndex": "batch index of CTC.",
          "_blockNumber": "block number.",
          "_chainId": "chain id."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "appendSequencerBatchByChainId()": {
        "notice": "Allows the sequencer to append a batch of transactions."
      },
      "getBatchTxData(uint256,uint256,uint256)": {
        "notice": "Gets batch tx data."
      },
      "getStakeBaseCost()": {
        "notice": "Gets the verifier stake base cost of ETH."
      },
      "getStakeCostByBatch(uint256,uint256)": {
        "notice": "Gets the verifier stake cost of ETH by batch index."
      },
      "getStakeSeqSeconds()": {
        "notice": "Gets seconds can submit transaction data after staking."
      },
      "getStakeUnitCost()": {
        "notice": "Gets the verifier stake unit cost of ETH for per storage unit."
      },
      "getTxBatchSize()": {
        "notice": "Gets batch size per batch."
      },
      "getTxDataSliceCount()": {
        "notice": "Gets slice count per batch transaction data."
      },
      "getTxDataSliceSize()": {
        "notice": "Gets batch transaction data slice size per submit."
      },
      "resolve(string)": {
        "notice": "Resolves the address associated with a given name."
      },
      "setBatchTxDataForStake(uint256,uint256,uint256,bytes,uint256,uint256,bytes32[])": {
        "notice": "Sets batch tx data for stake."
      },
      "setBatchTxDataForVerifier(uint256,uint256,uint256,bytes)": {
        "notice": "Sets batch tx data for verifier."
      },
      "setStakeBaseCost(uint256)": {
        "notice": "receive() external payable { // msg.sender if (msg.sender == resolve('MVM_DiscountOracle')) { uint256 _chainId = getAddressChainId(msg.sender); if (_chainId > 0) { address _to = resolve(string(abi.encodePacked(uint2str(_chainId),\"_MVM_Sequencer_Wrapper\"))); if (_to != address(0) && _to != address(this)) { _to.call{value: msg.value}(\"\"); } } } } function setAddressChainId(address _address, uint256 _chainId)  override public onlyManager { require(_address != address(0), \"address not available\"); require(_chainId > 0, \"chainId not available\"); require(addressChains[_address] != _chainId, \"no change\"); addressChains[_address] = _chainId; } function getAddressChainId(address _address) override public view returns (uint256) { return addressChains[_address]; }"
      },
      "setStakeSeqSeconds(uint256)": {
        "notice": "Sets seconds can submit transaction data after staking."
      },
      "setStakeUnitCost(uint256)": {
        "notice": "Sets the verifier stake unit cost of ETH."
      },
      "setTxBatchSize(uint256)": {
        "notice": "Sets batch size per batch."
      },
      "setTxDataSliceCount(uint256)": {
        "notice": "Sets slice count per batch transaction data."
      },
      "setTxDataSliceSize(uint256)": {
        "notice": "Sets batch transaction data slice size per submit."
      },
      "verifierStake(uint256,uint256,uint256)": {
        "notice": "Stake by verifier."
      },
      "withdrawStake(uint256,uint256,uint256)": {
        "notice": "Withdraw stake by verifier."
      }
    },
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 16165,
        "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
        "label": "libAddressManager",
        "offset": 0,
        "slot": "0",
        "type": "t_contract(Lib_AddressManager)16157"
      },
      {
        "astId": 10752,
        "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
        "label": "txDataSliceSize",
        "offset": 0,
        "slot": "1",
        "type": "t_uint256"
      },
      {
        "astId": 10754,
        "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
        "label": "stakeSeqSeconds",
        "offset": 0,
        "slot": "2",
        "type": "t_uint256"
      },
      {
        "astId": 10756,
        "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
        "label": "stakeBaseCost",
        "offset": 0,
        "slot": "3",
        "type": "t_uint256"
      },
      {
        "astId": 10758,
        "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
        "label": "txDataSliceCount",
        "offset": 0,
        "slot": "4",
        "type": "t_uint256"
      },
      {
        "astId": 10760,
        "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
        "label": "txBatchSize",
        "offset": 0,
        "slot": "5",
        "type": "t_uint256"
      },
      {
        "astId": 10762,
        "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
        "label": "stakeUnitCost",
        "offset": 0,
        "slot": "6",
        "type": "t_uint256"
      },
      {
        "astId": 10764,
        "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
        "label": "useWhiteList",
        "offset": 0,
        "slot": "7",
        "type": "t_bool"
      },
      {
        "astId": 10768,
        "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
        "label": "whitelist",
        "offset": 0,
        "slot": "8",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 10772,
        "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
        "label": "verifierStakes",
        "offset": 0,
        "slot": "9",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 10779,
        "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
        "label": "queueBatchElement",
        "offset": 0,
        "slot": "10",
        "type": "t_mapping(t_uint256,t_mapping(t_uint256,t_struct(BatchElement)15283_storage))"
      },
      {
        "astId": 10786,
        "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
        "label": "queueTxDataRequestStake",
        "offset": 0,
        "slot": "11",
        "type": "t_mapping(t_uint256,t_mapping(t_uint256,t_struct(TxDataRequestStake)15270_storage))"
      },
      {
        "astId": 10793,
        "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
        "label": "queueTxData",
        "offset": 0,
        "slot": "12",
        "type": "t_mapping(t_uint256,t_mapping(t_uint256,t_struct(TxDataSlice)15254_storage))"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_bytes_storage": {
        "encoding": "bytes",
        "label": "bytes",
        "numberOfBytes": "32"
      },
      "t_contract(Lib_AddressManager)16157": {
        "encoding": "inplace",
        "label": "contract Lib_AddressManager",
        "numberOfBytes": "20"
      },
      "t_enum(STAKESTATUS)15197": {
        "encoding": "inplace",
        "label": "enum iMVM_CanonicalTransaction.STAKESTATUS",
        "numberOfBytes": "1"
      },
      "t_mapping(t_address,t_bool)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_mapping(t_address,t_uint256)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_mapping(t_uint256,t_mapping(t_uint256,t_struct(BatchElement)15283_storage))": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => mapping(uint256 => struct iMVM_CanonicalTransaction.BatchElement))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_uint256,t_struct(BatchElement)15283_storage)"
      },
      "t_mapping(t_uint256,t_mapping(t_uint256,t_struct(TxDataRequestStake)15270_storage))": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => mapping(uint256 => struct iMVM_CanonicalTransaction.TxDataRequestStake))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_uint256,t_struct(TxDataRequestStake)15270_storage)"
      },
      "t_mapping(t_uint256,t_mapping(t_uint256,t_struct(TxDataSlice)15254_storage))": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => mapping(uint256 => struct iMVM_CanonicalTransaction.TxDataSlice))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_uint256,t_struct(TxDataSlice)15254_storage)"
      },
      "t_mapping(t_uint256,t_struct(BatchElement)15283_storage)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => struct iMVM_CanonicalTransaction.BatchElement)",
        "numberOfBytes": "32",
        "value": "t_struct(BatchElement)15283_storage"
      },
      "t_mapping(t_uint256,t_struct(TxDataRequestStake)15270_storage)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => struct iMVM_CanonicalTransaction.TxDataRequestStake)",
        "numberOfBytes": "32",
        "value": "t_struct(TxDataRequestStake)15270_storage"
      },
      "t_mapping(t_uint256,t_struct(TxDataSlice)15254_storage)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => struct iMVM_CanonicalTransaction.TxDataSlice)",
        "numberOfBytes": "32",
        "value": "t_struct(TxDataSlice)15254_storage"
      },
      "t_struct(BatchElement)15283_storage": {
        "encoding": "inplace",
        "label": "struct iMVM_CanonicalTransaction.BatchElement",
        "members": [
          {
            "astId": 15272,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "shouldStartAtElement",
            "offset": 0,
            "slot": "0",
            "type": "t_uint40"
          },
          {
            "astId": 15274,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "totalElementsToAppend",
            "offset": 5,
            "slot": "0",
            "type": "t_uint24"
          },
          {
            "astId": 15276,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "txBatchSize",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 15278,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "txBatchTime",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          },
          {
            "astId": 15280,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "root",
            "offset": 0,
            "slot": "3",
            "type": "t_bytes32"
          },
          {
            "astId": 15282,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "timestamp",
            "offset": 0,
            "slot": "4",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "160"
      },
      "t_struct(TxDataRequestStake)15270_storage": {
        "encoding": "inplace",
        "label": "struct iMVM_CanonicalTransaction.TxDataRequestStake",
        "members": [
          {
            "astId": 15256,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "sender",
            "offset": 0,
            "slot": "0",
            "type": "t_address"
          },
          {
            "astId": 15258,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "blockNumber",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 15260,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "batchIndex",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          },
          {
            "astId": 15262,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "timestamp",
            "offset": 0,
            "slot": "3",
            "type": "t_uint256"
          },
          {
            "astId": 15264,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "endtime",
            "offset": 0,
            "slot": "4",
            "type": "t_uint256"
          },
          {
            "astId": 15266,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "amount",
            "offset": 0,
            "slot": "5",
            "type": "t_uint256"
          },
          {
            "astId": 15269,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "status",
            "offset": 0,
            "slot": "6",
            "type": "t_enum(STAKESTATUS)15197"
          }
        ],
        "numberOfBytes": "224"
      },
      "t_struct(TxDataSlice)15254_storage": {
        "encoding": "inplace",
        "label": "struct iMVM_CanonicalTransaction.TxDataSlice",
        "members": [
          {
            "astId": 15243,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "sender",
            "offset": 0,
            "slot": "0",
            "type": "t_address"
          },
          {
            "astId": 15245,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "blockNumber",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 15247,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "batchIndex",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          },
          {
            "astId": 15249,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "timestamp",
            "offset": 0,
            "slot": "3",
            "type": "t_uint256"
          },
          {
            "astId": 15251,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "txData",
            "offset": 0,
            "slot": "4",
            "type": "t_bytes_storage"
          },
          {
            "astId": 15253,
            "contract": "contracts/MVM/MVM_CanonicalTransaction.sol:MVM_CanonicalTransaction",
            "label": "verified",
            "offset": 0,
            "slot": "5",
            "type": "t_bool"
          }
        ],
        "numberOfBytes": "192"
      },
      "t_uint24": {
        "encoding": "inplace",
        "label": "uint24",
        "numberOfBytes": "3"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint40": {
        "encoding": "inplace",
        "label": "uint40",
        "numberOfBytes": "5"
      }
    }
  }
}