{
  "address": "0x209BFdC6B7c66b63A8382196Ba3d06619d0F12c9",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_deposit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_epochPeriod",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_minChallengePeriod",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_timeoutEpochs",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_veaInboxArbToEth",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_bridge",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_maxMissingBlocks",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_challenger",
          "type": "address"
        }
      ],
      "name": "Challenged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_claimer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "_stateRoot",
          "type": "bytes32"
        }
      ],
      "name": "Claimed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "_msgId",
          "type": "uint64"
        }
      ],
      "name": "MessageRelayed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        }
      ],
      "name": "VerificationStarted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        }
      ],
      "name": "Verified",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_requestedSequencerDelayLimit",
          "type": "uint256"
        }
      ],
      "name": "sequencerDelayLimitDecreaseRequested",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_newSequencerDelayLimit",
          "type": "uint256"
        }
      ],
      "name": "sequencerDelayLimitUpdated",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "BURN_ADDRESS",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "bridge",
      "outputs": [
        {
          "internalType": "contract IBridge",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "burn",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "stateRoot",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "claimer",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "timestampClaimed",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "timestampVerification",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "blocknumberVerification",
              "type": "uint32"
            },
            {
              "internalType": "enum Party",
              "name": "honest",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "challenger",
              "type": "address"
            }
          ],
          "internalType": "struct Claim",
          "name": "_claim",
          "type": "tuple"
        }
      ],
      "name": "censorshipTestStatus",
      "outputs": [
        {
          "internalType": "enum VeaOutboxArbToEth.CensorshipTestStatus",
          "name": "status",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "stateRoot",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "claimer",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "timestampClaimed",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "timestampVerification",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "blocknumberVerification",
              "type": "uint32"
            },
            {
              "internalType": "enum Party",
              "name": "honest",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "challenger",
              "type": "address"
            }
          ],
          "internalType": "struct Claim",
          "name": "_claim",
          "type": "tuple"
        }
      ],
      "name": "challenge",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "stateRoot",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "claimer",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "timestampClaimed",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "timestampVerification",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "blocknumberVerification",
              "type": "uint32"
            },
            {
              "internalType": "enum Party",
              "name": "honest",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "challenger",
              "type": "address"
            }
          ],
          "internalType": "struct Claim",
          "name": "_claim",
          "type": "tuple"
        },
        {
          "internalType": "address",
          "name": "_withdrawalAddress",
          "type": "address"
        }
      ],
      "name": "challenge",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "_stateRoot",
          "type": "bytes32"
        }
      ],
      "name": "claim",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "epoch",
          "type": "uint256"
        }
      ],
      "name": "claimHashes",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "deposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "depositPlusReward",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        }
      ],
      "name": "epochAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "epoch",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "epochNow",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "epoch",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "epochPeriod",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "executeSequencerDelayLimitDecreaseRequest",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "stateRoot",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "claimer",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "timestampClaimed",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "timestampVerification",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "blocknumberVerification",
              "type": "uint32"
            },
            {
              "internalType": "enum Party",
              "name": "honest",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "challenger",
              "type": "address"
            }
          ],
          "internalType": "struct Claim",
          "name": "_claim",
          "type": "tuple"
        }
      ],
      "name": "hashClaim",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "hashedClaim",
          "type": "bytes32"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_msgId",
          "type": "uint256"
        }
      ],
      "name": "isMsgRelayed",
      "outputs": [
        {
          "internalType": "bool",
          "name": "isRelayed",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "latestVerifiedEpoch",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxMissingBlocks",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "minChallengePeriod",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "_stateRoot",
          "type": "bytes32"
        },
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "stateRoot",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "claimer",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "timestampClaimed",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "timestampVerification",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "blocknumberVerification",
              "type": "uint32"
            },
            {
              "internalType": "enum Party",
              "name": "honest",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "challenger",
              "type": "address"
            }
          ],
          "internalType": "struct Claim",
          "name": "_claim",
          "type": "tuple"
        }
      ],
      "name": "resolveDisputedClaim",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "_proof",
          "type": "bytes32[]"
        },
        {
          "internalType": "uint64",
          "name": "_msgId",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_message",
          "type": "bytes"
        }
      ],
      "name": "sendMessage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "sequencerDelayLimit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "sequencerDelayLimitDecreaseRequest",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "requestedsequencerDelayLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "stateRoot",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "claimer",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "timestampClaimed",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "timestampVerification",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "blocknumberVerification",
              "type": "uint32"
            },
            {
              "internalType": "enum Party",
              "name": "honest",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "challenger",
              "type": "address"
            }
          ],
          "internalType": "struct Claim",
          "name": "_claim",
          "type": "tuple"
        }
      ],
      "name": "startVerification",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stateRoot",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "timeoutEpochs",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "updateSequencerDelayLimit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "veaInboxArbToEth",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "stateRoot",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "claimer",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "timestampClaimed",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "timestampVerification",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "blocknumberVerification",
              "type": "uint32"
            },
            {
              "internalType": "enum Party",
              "name": "honest",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "challenger",
              "type": "address"
            }
          ],
          "internalType": "struct Claim",
          "name": "_claim",
          "type": "tuple"
        }
      ],
      "name": "verifySnapshot",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "stateRoot",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "claimer",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "timestampClaimed",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "timestampVerification",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "blocknumberVerification",
              "type": "uint32"
            },
            {
              "internalType": "enum Party",
              "name": "honest",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "challenger",
              "type": "address"
            }
          ],
          "internalType": "struct Claim",
          "name": "_claim",
          "type": "tuple"
        }
      ],
      "name": "withdrawChallengeDeposit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "stateRoot",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "claimer",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "timestampClaimed",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "timestampVerification",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "blocknumberVerification",
              "type": "uint32"
            },
            {
              "internalType": "enum Party",
              "name": "honest",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "challenger",
              "type": "address"
            }
          ],
          "internalType": "struct Claim",
          "name": "_claim",
          "type": "tuple"
        }
      ],
      "name": "withdrawChallengerEscapeHatch",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "stateRoot",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "claimer",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "timestampClaimed",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "timestampVerification",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "blocknumberVerification",
              "type": "uint32"
            },
            {
              "internalType": "enum Party",
              "name": "honest",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "challenger",
              "type": "address"
            }
          ],
          "internalType": "struct Claim",
          "name": "_claim",
          "type": "tuple"
        }
      ],
      "name": "withdrawClaimDeposit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "stateRoot",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "claimer",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "timestampClaimed",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "timestampVerification",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "blocknumberVerification",
              "type": "uint32"
            },
            {
              "internalType": "enum Party",
              "name": "honest",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "challenger",
              "type": "address"
            }
          ],
          "internalType": "struct Claim",
          "name": "_claim",
          "type": "tuple"
        }
      ],
      "name": "withdrawClaimerEscapeHatch",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x7d95d7544e7d675987599a7b8753e10d6789daa13082167c3d467c32003f1323",
  "receipt": {
    "to": null,
    "from": "0xFa00D29d378EDC57AA1006946F0fc6230a5E3288",
    "contractAddress": "0x209BFdC6B7c66b63A8382196Ba3d06619d0F12c9",
    "transactionIndex": 46,
    "gasUsed": "2274424",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000800000000000000000000000000000000000000001000000000000000000000200000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000",
    "blockHash": "0x5058fe0097d076cb3028b75fcb24414d3c9026bae3d25f95634596e442fb1c58",
    "transactionHash": "0x7d95d7544e7d675987599a7b8753e10d6789daa13082167c3d467c32003f1323",
    "logs": [
      {
        "transactionIndex": 46,
        "blockNumber": 6636625,
        "transactionHash": "0x7d95d7544e7d675987599a7b8753e10d6789daa13082167c3d467c32003f1323",
        "address": "0x209BFdC6B7c66b63A8382196Ba3d06619d0F12c9",
        "topics": [
          "0x611c2e4a78552f908fb0eb2cc503efc1f947cde8574277ab3b0f10fdd510258b"
        ],
        "data": "0x0000000000000000000000000000000000000000000000000000000000015180",
        "logIndex": 105,
        "blockHash": "0x5058fe0097d076cb3028b75fcb24414d3c9026bae3d25f95634596e442fb1c58"
      }
    ],
    "blockNumber": 6636625,
    "cumulativeGasUsed": "9590104",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "1000000000000000000",
    7200,
    10800,
    1000000,
    "0xE12daFE59Bc3A996362d54b37DFd2BA9279cAd06",
    "0x38f918D0E9F1b721EDaA41302E399fa1B79333a9",
    1000000
  ],
  "numDeployments": 1,
  "solcInputHash": "0d66bd5cfdf493ed8e081e9f7e1bf4fa",
  "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_deposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_epochPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minChallengePeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_timeoutEpochs\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_veaInboxArbToEth\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_bridge\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxMissingBlocks\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_challenger\",\"type\":\"address\"}],\"name\":\"Challenged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_claimer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_stateRoot\",\"type\":\"bytes32\"}],\"name\":\"Claimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"_msgId\",\"type\":\"uint64\"}],\"name\":\"MessageRelayed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"}],\"name\":\"VerificationStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"}],\"name\":\"Verified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_requestedSequencerDelayLimit\",\"type\":\"uint256\"}],\"name\":\"sequencerDelayLimitDecreaseRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newSequencerDelayLimit\",\"type\":\"uint256\"}],\"name\":\"sequencerDelayLimitUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BURN_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridge\",\"outputs\":[{\"internalType\":\"contract IBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"censorshipTestStatus\",\"outputs\":[{\"internalType\":\"enum VeaOutboxArbToEth.CensorshipTestStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"challenge\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_withdrawalAddress\",\"type\":\"address\"}],\"name\":\"challenge\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_stateRoot\",\"type\":\"bytes32\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"name\":\"claimHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositPlusReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"epochAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"epochNow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"epochPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executeSequencerDelayLimitDecreaseRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"hashClaim\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedClaim\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_msgId\",\"type\":\"uint256\"}],\"name\":\"isMsgRelayed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isRelayed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestVerifiedEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxMissingBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minChallengePeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"resolveDisputedClaim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_proof\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint64\",\"name\":\"_msgId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sequencerDelayLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sequencerDelayLimitDecreaseRequest\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestedsequencerDelayLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"startVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stateRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeoutEpochs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateSequencerDelayLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"veaInboxArbToEth\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"verifySnapshot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawChallengeDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawChallengerEscapeHatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawClaimDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawClaimerEscapeHatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Vea Outbox From Arbitrum to Ethereum. Note: This contract is deployed on Ethereum.\",\"events\":{\"Challenged(uint256,address)\":{\"details\":\"This event indicates that `sendSnapshot(epoch)` should be called in the inbox.\",\"params\":{\"_challenger\":\"The address of the challenger.\",\"_epoch\":\"The epoch associated with the challenged claim.\"}},\"Claimed(address,uint256,bytes32)\":{\"details\":\"Watchers check this event to challenge fraud.\",\"params\":{\"_claimer\":\"The address of the claimer.\",\"_epoch\":\"The epoch associated with the claim.\",\"_stateRoot\":\"The state root of the claim.\"}},\"MessageRelayed(uint64)\":{\"details\":\"This event indicates that a message has been relayed.\",\"params\":{\"_msgId\":\"The msgId of the message that was relayed.\"}},\"VerificationStarted(uint256)\":{\"details\":\"This event indicates that the censorship test started and all challengers are ready even in the worst case scenario of a malicious sequencer.\",\"params\":{\"_epoch\":\"The epoch that started verification.\"}},\"Verified(uint256)\":{\"details\":\"This events indicates that verification has succeeded. The messages are ready to be relayed.\",\"params\":{\"_epoch\":\"The epoch that was verified.\"}},\"sequencerDelayLimitDecreaseRequested(uint256)\":{\"details\":\"This event indicates that a request to decrease the sequencer limit has been made.\",\"params\":{\"_requestedSequencerDelayLimit\":\"The new sequencer delay limit requested.\"}},\"sequencerDelayLimitUpdated(uint256)\":{\"details\":\"This event indicates the sequencer limit updated.\",\"params\":{\"_newSequencerDelayLimit\":\"The new sequencer delay limit.\"}}},\"kind\":\"dev\",\"methods\":{\"censorshipTestStatus((bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Gets the status of the censorship test for claim.\",\"params\":{\"_claim\":\"The claim to test.\"},\"returns\":{\"status\":\"True if the claim passed the censorship test.\"}},\"challenge(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Submit a challenge for the claim of the inbox state root snapshot taken at 'epoch'.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch of the claim to challenge.\"}},\"challenge(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address),address)\":{\"details\":\"Submit a challenge for the claim of the inbox state root snapshot taken at 'epoch'.Allows proxy contracts to batch challenges.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch of the claim to challenge.\",\"_withdrawalAddress\":\"The address to withdraw the deposit + reward to.\"}},\"claim(uint256,bytes32)\":{\"details\":\"Submit a claim about the _stateRoot at _epoch and submit a deposit.\",\"params\":{\"_epoch\":\"The epoch for which the claim is made.\",\"_stateRoot\":\"The state root to claim.\"}},\"constructor\":{\"details\":\"Constructor. Note: epochPeriod must match the VeaInboxArbToEth contract deployment on Arbitrum, since it's on a different chain, we can't read it and trust the deployer to set a correct value\",\"params\":{\"_deposit\":\"The deposit amount to submit a claim in wei.\",\"_epochPeriod\":\"The duration of each epoch.\",\"_maxMissingBlocks\":\"The maximum number of blocks that can be missing in a challenge period.\",\"_minChallengePeriod\":\"The minimum time window to challenge a claim.\",\"_timeoutEpochs\":\"The epochs before the bridge is considered shutdown.\",\"_veaInboxArbToEth\":\"The address of the inbox contract on Arbitrum.\"}},\"epochAt(uint256)\":{\"details\":\"Get the current epoch from the outbox's point of view using the Ethereum L1 clock.\",\"returns\":{\"epoch\":\"The hash of the claim.\"}},\"epochNow()\":{\"details\":\"Get the current epoch from the outbox's point of view using the Ethereum L1 clock.\",\"returns\":{\"epoch\":\"The hash of the claim.\"}},\"executeSequencerDelayLimitDecreaseRequest()\":{\"details\":\"execute sequencerDelayLimitDecreaseRequest\"},\"hashClaim((bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Hashes the claim.\",\"params\":{\"_claim\":\"The claim to hash.\"},\"returns\":{\"hashedClaim\":\"The hash of the claim.\"}},\"isMsgRelayed(uint256)\":{\"details\":\"Get the msg relayed status.\",\"params\":{\"_msgId\":\"The msgId to check.\"},\"returns\":{\"isRelayed\":\"True if the msg was relayed.\"}},\"resolveDisputedClaim(uint256,bytes32,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Resolves any challenge of the optimistic claim for '_epoch'.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch to verify.\",\"_stateRoot\":\"The true state root for the epoch.\"}},\"sendMessage(bytes32[],uint64,address,bytes)\":{\"details\":\"Verifies and relays the message. UNTRUSTED.\",\"params\":{\"_message\":\"The message encoded in the vea inbox as abi.encodeWithSelector(fnSelector, msg.sender, param1, param2, ...)\",\"_msgId\":\"The zero based index of the message in the inbox.\",\"_proof\":\"The merkle proof to prove the message inclusion in the inbox state root.\",\"_to\":\"The address of the contract on Ethereum to call.\"}},\"startVerification(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Start verification for claim for 'epoch'.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch of the claim to challenge.\"}},\"updateSequencerDelayLimit()\":{\"details\":\"Request to decrease the sequencerDelayLimit.\"},\"verifySnapshot(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Resolves the optimistic claim for '_epoch'.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch of the optimistic claim.\"}},\"withdrawChallengeDeposit(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Sends the deposit back to the Challenger if successful. Includes a portion of the Bridger's deposit.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the challenge deposit to withraw.\"}},\"withdrawChallengerEscapeHatch(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"When bridge is shutdown, no claim disputes can be resolved. This allows the challenger to withdraw their deposit.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the claim deposit to withraw.\"}},\"withdrawClaimDeposit(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Sends the deposit back to the Claimer if successful. Includes a portion of the Challenger's deposit if unsuccessfully challenged.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the claim deposit to withraw.\"}},\"withdrawClaimerEscapeHatch(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"When bridge is shutdown, no claim disputes can be resolved. This allows the claimer to withdraw their deposit.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the claim deposit to withraw.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolveDisputedClaim(uint256,bytes32,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"notice\":\"Note: Access restricted to arbitrum  bridge.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/arbitrumToEth/VeaOutboxArbToEth.sol\":\"VeaOutboxArbToEth\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"src/arbitrumToEth/VeaOutboxArbToEth.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@jaybuidl, @shotaronowhere]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.24;\\n\\nimport \\\"../canonical/arbitrum/ISequencerInbox.sol\\\";\\nimport \\\"../canonical/arbitrum/IBridge.sol\\\";\\nimport \\\"../canonical/arbitrum/IOutbox.sol\\\";\\nimport \\\"../interfaces/outboxes/IVeaOutboxOnL1.sol\\\";\\n\\n/// @dev Vea Outbox From Arbitrum to Ethereum.\\n/// Note: This contract is deployed on Ethereum.\\ncontract VeaOutboxArbToEth is IVeaOutboxOnL1 {\\n    // ************************************* //\\n    // *             Storage               * //\\n    // ************************************* //\\n\\n    IBridge public immutable bridge; // The address of the Arbitrum bridge contract.\\n    address public immutable veaInboxArbToEth; // The address of the vea inbox on arbitrum.\\n\\n    uint256 public immutable deposit; // The deposit in wei required to submit a claim or challenge\\n    uint256 public immutable burn; // The amount of wei to burn. deposit / 2\\n    uint256 public immutable depositPlusReward; // 2 * deposit - burn\\n\\n    address public constant BURN_ADDRESS = address(0); // Address to send burned eth\\n    uint256 internal constant SLOT_TIME = 12; // Ethereum 12 second slot time\\n\\n    uint256 public immutable epochPeriod; // Epochs mark the period between potential snapshots.\\n    uint256 public immutable minChallengePeriod; // Minimum time window to challenge a claim, even with a malicious sequencer.\\n\\n    uint256 public immutable timeoutEpochs; // The number of epochs without forward progress before the bridge is considered shutdown.\\n    uint256 public immutable maxMissingBlocks; // The maximum number of blocks that can be missing in a challenge period.\\n\\n    bytes32 public stateRoot; // merkle root of the outbox state\\n    uint256 public latestVerifiedEpoch; // The latest epoch that has been verified.\\n\\n    mapping(uint256 epoch => bytes32) public claimHashes; // epoch => claim\\n    mapping(uint256 messageId => bytes32) internal relayed; // msgId/256 => packed replay bitmap, preferred over a simple boolean mapping to save 15k gas per message\\n\\n    uint256 public sequencerDelayLimit; // This is MaxTimeVariation.delaySeconds from the arbitrum sequencer inbox, it is the maximum seconds the sequencer can backdate L2 txns relative to the L1 clock.\\n    SequencerDelayLimitDecreaseRequest public sequencerDelayLimitDecreaseRequest; // Decreasing the sequencerDelayLimit requires a delay to avoid griefing by sequencer, so we keep track of the request here.\\n\\n    struct SequencerDelayLimitDecreaseRequest {\\n        uint256 requestedsequencerDelayLimit;\\n        uint256 timestamp;\\n    }\\n\\n    enum CensorshipTestStatus {\\n        Failed,\\n        Passed,\\n        NotStarted,\\n        InProgress\\n    }\\n\\n    // ************************************* //\\n    // *              Events               * //\\n    // ************************************* //\\n\\n    /// @dev Watchers check this event to challenge fraud.\\n    /// @param _claimer The address of the claimer.\\n    /// @param _epoch The epoch associated with the claim.\\n    /// @param _stateRoot The state root of the claim.\\n    event Claimed(address indexed _claimer, uint256 indexed _epoch, bytes32 _stateRoot);\\n\\n    /// @dev This event indicates that `sendSnapshot(epoch)` should be called in the inbox.\\n    /// @param _epoch The epoch associated with the challenged claim.\\n    /// @param _challenger The address of the challenger.\\n    event Challenged(uint256 indexed _epoch, address indexed _challenger);\\n\\n    /// @dev This event indicates that a message has been relayed.\\n    /// @param _msgId The msgId of the message that was relayed.\\n    event MessageRelayed(uint64 _msgId);\\n\\n    /// @dev This event indicates that the censorship test started and all challengers are ready even in the worst case scenario of a malicious sequencer.\\n    /// @param _epoch The epoch that started verification.\\n    event VerificationStarted(uint256 indexed _epoch);\\n\\n    /// @dev This events indicates that verification has succeeded. The messages are ready to be relayed.\\n    /// @param _epoch The epoch that was verified.\\n    event Verified(uint256 _epoch);\\n\\n    /// @dev This event indicates the sequencer limit updated.\\n    /// @param _newSequencerDelayLimit The new sequencer delay limit.\\n    event sequencerDelayLimitUpdated(uint256 _newSequencerDelayLimit);\\n\\n    /// @dev This event indicates that a request to decrease the sequencer limit has been made.\\n    /// @param _requestedSequencerDelayLimit The new sequencer delay limit requested.\\n    event sequencerDelayLimitDecreaseRequested(uint256 _requestedSequencerDelayLimit);\\n\\n    // ************************************* //\\n    // *        Function Modifiers         * //\\n    // ************************************* //\\n\\n    modifier OnlyBridgeRunning() {\\n        unchecked {\\n            require(block.timestamp / epochPeriod - latestVerifiedEpoch <= timeoutEpochs, \\\"Bridge Shutdown.\\\");\\n        }\\n        _;\\n    }\\n\\n    modifier OnlyBridgeShutdown() {\\n        unchecked {\\n            require(block.timestamp / epochPeriod - latestVerifiedEpoch > timeoutEpochs, \\\"Bridge Running.\\\");\\n        }\\n        _;\\n    }\\n\\n    /// @dev Constructor.\\n    /// Note: epochPeriod must match the VeaInboxArbToEth contract deployment on Arbitrum, since it's on a different chain, we can't read it and trust the deployer to set a correct value\\n    /// @param _deposit The deposit amount to submit a claim in wei.\\n    /// @param _epochPeriod The duration of each epoch.\\n    /// @param _minChallengePeriod The minimum time window to challenge a claim.\\n    /// @param _timeoutEpochs The epochs before the bridge is considered shutdown.\\n    /// @param _veaInboxArbToEth The address of the inbox contract on Arbitrum.\\n    /// @param _maxMissingBlocks The maximum number of blocks that can be missing in a challenge period.\\n    constructor(\\n        uint256 _deposit,\\n        uint256 _epochPeriod,\\n        uint256 _minChallengePeriod,\\n        uint256 _timeoutEpochs,\\n        address _veaInboxArbToEth,\\n        address _bridge,\\n        uint256 _maxMissingBlocks\\n    ) {\\n        deposit = _deposit;\\n        // epochPeriod must match the VeaInboxArbToEth contract deployment epochPeriod value.\\n        epochPeriod = _epochPeriod;\\n        minChallengePeriod = _minChallengePeriod;\\n        timeoutEpochs = _timeoutEpochs;\\n        veaInboxArbToEth = _veaInboxArbToEth;\\n        bridge = IBridge(_bridge);\\n        maxMissingBlocks = _maxMissingBlocks;\\n\\n        updateSequencerDelayLimit();\\n\\n        // claimant and challenger are not sybil resistant\\n        // must burn half deposit to prevent zero cost griefing\\n        burn = _deposit / 2;\\n        depositPlusReward = 2 * _deposit - burn;\\n\\n        latestVerifiedEpoch = block.timestamp / epochPeriod - 1;\\n    }\\n\\n    // ************************************* //\\n    // *        Parameter Updates          * //\\n    // ************************************* //\\n\\n    /// @dev Request to decrease the sequencerDelayLimit.\\n    function updateSequencerDelayLimit() public {\\n        // the maximum asynchronous lag between the L2 and L1 clocks\\n        (, , uint256 newSequencerDelayLimit, ) = ISequencerInbox(bridge.sequencerInbox()).maxTimeVariation();\\n\\n        if (newSequencerDelayLimit > sequencerDelayLimit) {\\n            // For sequencerDelayLimit / epochPeriod > timeoutEpochs, claims cannot be verified by the timeout period and the bridge will shutdown.\\n            sequencerDelayLimit = newSequencerDelayLimit;\\n            emit sequencerDelayLimitUpdated(newSequencerDelayLimit);\\n        } else if (newSequencerDelayLimit < sequencerDelayLimit) {\\n            require(\\n                sequencerDelayLimitDecreaseRequest.timestamp == 0,\\n                \\\"Sequencer limit decrease request already pending.\\\"\\n            );\\n\\n            sequencerDelayLimitDecreaseRequest = SequencerDelayLimitDecreaseRequest({\\n                requestedsequencerDelayLimit: newSequencerDelayLimit,\\n                timestamp: block.timestamp\\n            });\\n\\n            emit sequencerDelayLimitDecreaseRequested(newSequencerDelayLimit);\\n        }\\n    }\\n\\n    /// @dev execute sequencerDelayLimitDecreaseRequest\\n    function executeSequencerDelayLimitDecreaseRequest() external {\\n        require(sequencerDelayLimitDecreaseRequest.timestamp != 0, \\\"No pending sequencer limit decrease request.\\\");\\n        require(\\n            block.timestamp > sequencerDelayLimitDecreaseRequest.timestamp + sequencerDelayLimit,\\n            \\\"Sequencer limit decrease request is still pending.\\\"\\n        );\\n\\n        uint256 requestedsequencerDelayLimit = sequencerDelayLimitDecreaseRequest.requestedsequencerDelayLimit;\\n        delete sequencerDelayLimitDecreaseRequest;\\n\\n        (, , uint256 currentsequencerDelayLimit, ) = ISequencerInbox(bridge.sequencerInbox()).maxTimeVariation();\\n\\n        // check the request is still consistent with the arbiturm bridge\\n        if (currentsequencerDelayLimit == requestedsequencerDelayLimit) {\\n            sequencerDelayLimit = requestedsequencerDelayLimit;\\n            emit sequencerDelayLimitUpdated(requestedsequencerDelayLimit);\\n        }\\n    }\\n\\n    // ************************************* //\\n    // *         State Modifiers           * //\\n    // ************************************* //\\n\\n    /// @dev Submit a claim about the _stateRoot at _epoch and submit a deposit.\\n    /// @param _epoch The epoch for which the claim is made.\\n    /// @param _stateRoot The state root to claim.\\n    function claim(uint256 _epoch, bytes32 _stateRoot) external payable virtual {\\n        require(msg.value >= deposit, \\\"Insufficient claim deposit.\\\");\\n        unchecked {\\n            require(_epoch == block.timestamp / epochPeriod - 1, \\\"Invalid epoch.\\\");\\n        }\\n        require(_stateRoot != bytes32(0), \\\"Invalid claim.\\\");\\n        require(claimHashes[_epoch] == bytes32(0), \\\"Claim already made.\\\");\\n\\n        claimHashes[_epoch] = hashClaim(\\n            Claim({\\n                stateRoot: _stateRoot,\\n                claimer: msg.sender,\\n                timestampClaimed: uint32(block.timestamp),\\n                timestampVerification: uint32(0),\\n                blocknumberVerification: uint32(0),\\n                honest: Party.None,\\n                challenger: address(0)\\n            })\\n        );\\n\\n        emit Claimed(msg.sender, _epoch, _stateRoot);\\n\\n        // Refund overpayment.\\n        if (msg.value > deposit) {\\n            uint256 refund = msg.value - deposit;\\n            payable(msg.sender).send(refund); // User is responsible for accepting ETH.\\n        }\\n    }\\n\\n    /// @dev Submit a challenge for the claim of the inbox state root snapshot taken at 'epoch'.\\n    /// @param _epoch The epoch of the claim to challenge.\\n    /// @param _claim The claim associated with the epoch.\\n    function challenge(uint256 _epoch, Claim memory _claim) external payable {\\n        _challenge(_epoch, _claim, msg.sender);\\n    }\\n\\n    /// @dev Submit a challenge for the claim of the inbox state root snapshot taken at 'epoch'.\\n    /// @dev Allows proxy contracts to batch challenges.\\n    /// @param _epoch The epoch of the claim to challenge.\\n    /// @param _claim The claim associated with the epoch.\\n    /// @param _withdrawalAddress The address to withdraw the deposit + reward to.\\n    function challenge(uint256 _epoch, Claim memory _claim, address _withdrawalAddress) external payable {\\n        _challenge(_epoch, _claim, _withdrawalAddress);\\n    }\\n\\n    /// @dev Submit a challenge for the claim of the inbox state root snapshot taken at 'epoch'.\\n    /// @param _epoch The epoch of the claim to challenge.\\n    /// @param _claim The claim associated with the epoch.\\n    /// @param _withdrawAddress The address to withdraw the deposit + reward to.\\n    function _challenge(uint256 _epoch, Claim memory _claim, address _withdrawAddress) internal {\\n        require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n        require(msg.value >= deposit, \\\"Insufficient challenge deposit.\\\");\\n        require(_claim.challenger == address(0), \\\"Claim already challenged.\\\");\\n        require(_claim.honest == Party.None, \\\"Claim already verified.\\\");\\n\\n        _claim.challenger = _withdrawAddress;\\n        claimHashes[_epoch] = hashClaim(_claim);\\n\\n        emit Challenged(_epoch, _withdrawAddress);\\n\\n        // Refund overpayment.\\n        if (msg.value > deposit) {\\n            uint256 refund = msg.value - deposit;\\n            payable(msg.sender).send(refund); // User is responsible for accepting ETH.\\n        }\\n    }\\n\\n    /// @dev Start verification for claim for 'epoch'.\\n    /// @param _epoch The epoch of the claim to challenge.\\n    /// @param _claim The claim associated with the epoch.\\n    function startVerification(uint256 _epoch, Claim memory _claim) external virtual {\\n        require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n\\n        // sequencerDelayLimit + epochPeriod is the worst case time to sync the L2 state compared to L1 clock.\\n        // using checked arithmetic incase arbitrum governance sets sequencerDelayLimit to a large value\\n        require(\\n            block.timestamp - uint256(_claim.timestampClaimed) >= sequencerDelayLimit + epochPeriod,\\n            \\\"Claim must wait atleast maxL2StateSyncDelay.\\\"\\n        );\\n\\n        CensorshipTestStatus _censorshipTestStatus = censorshipTestStatus(_claim);\\n        require(\\n            _censorshipTestStatus == CensorshipTestStatus.NotStarted ||\\n                _censorshipTestStatus == CensorshipTestStatus.Failed,\\n            \\\"Claim verification in progress or already completed.\\\"\\n        );\\n\\n        _claim.timestampVerification = uint32(block.timestamp);\\n        _claim.blocknumberVerification = uint32(block.number);\\n\\n        claimHashes[_epoch] = hashClaim(_claim);\\n\\n        emit VerificationStarted(_epoch);\\n    }\\n\\n    /// @dev Resolves the optimistic claim for '_epoch'.\\n    /// @param _epoch The epoch of the optimistic claim.\\n    /// @param _claim The claim associated with the epoch.\\n    function verifySnapshot(uint256 _epoch, Claim memory _claim) external virtual OnlyBridgeRunning {\\n        require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n        require(_claim.challenger == address(0), \\\"Claim is challenged.\\\");\\n        require(censorshipTestStatus(_claim) == CensorshipTestStatus.Passed, \\\"Censorship test not passed.\\\");\\n\\n        if (_epoch > latestVerifiedEpoch) {\\n            latestVerifiedEpoch = _epoch;\\n            stateRoot = _claim.stateRoot;\\n            emit Verified(_epoch);\\n        }\\n\\n        _claim.honest = Party.Claimer;\\n        claimHashes[_epoch] = hashClaim(_claim);\\n    }\\n\\n    /// Note: Access restricted to arbitrum  bridge.\\n    /// @dev Resolves any challenge of the optimistic claim for '_epoch'.\\n    /// @param _epoch The epoch to verify.\\n    /// @param _stateRoot The true state root for the epoch.\\n    /// @param _claim The claim associated with the epoch.\\n    function resolveDisputedClaim(\\n        uint256 _epoch,\\n        bytes32 _stateRoot,\\n        Claim memory _claim\\n    ) external virtual OnlyBridgeRunning {\\n        // Arbitrum -> Ethereum message sender authentication\\n        // docs: https://developer.arbitrum.io/arbos/l2-to-l1-messaging/\\n        // example: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/dfef6a68ee18dbd2e1f5a099061a3b8a0e404485/contracts/crosschain/arbitrum/LibArbitrumL1.sol#L34\\n        // example: https://github.com/OffchainLabs/arbitrum-tutorials/blob/2c1b7d2db8f36efa496e35b561864c0f94123a5f/packages/greeter/contracts/ethereum/GreeterL1.sol#L50\\n        // note: we call the bridge for the activeOutbox address\\n\\n        require(msg.sender == address(bridge), \\\"Not from native arbitrum bridge.\\\");\\n        require(IOutbox(bridge.activeOutbox()).l2ToL1Sender() == veaInboxArbToEth, \\\"veaInboxArbToEth only.\\\");\\n\\n        if (_epoch > latestVerifiedEpoch && _stateRoot != bytes32(0)) {\\n            latestVerifiedEpoch = _epoch;\\n            stateRoot = _stateRoot;\\n            emit Verified(_epoch);\\n        }\\n\\n        if (claimHashes[_epoch] == hashClaim(_claim)) {\\n            if (_claim.stateRoot == _stateRoot) {\\n                _claim.honest = Party.Claimer;\\n            } else if (_claim.challenger != address(0)) {\\n                _claim.honest = Party.Challenger;\\n            }\\n            claimHashes[_epoch] = hashClaim(_claim);\\n        }\\n    }\\n\\n    /// @dev Verifies and relays the message. UNTRUSTED.\\n    /// @param _proof The merkle proof to prove the message inclusion in the inbox state root.\\n    /// @param _msgId The zero based index of the message in the inbox.\\n    /// @param _to The address of the contract on Ethereum to call.\\n    /// @param _message The message encoded in the vea inbox as abi.encodeWithSelector(fnSelector, msg.sender, param1, param2, ...)\\n    function sendMessage(bytes32[] calldata _proof, uint64 _msgId, address _to, bytes calldata _message) external {\\n        require(_proof.length < 64, \\\"Proof too long.\\\");\\n\\n        bytes32 nodeHash = keccak256(abi.encodePacked(_msgId, _to, _message));\\n\\n        // double hashed leaf\\n        // avoids second order preimage attacks\\n        // https://flawed.net.nz/2018/02/21/attacking-merkle-trees-with-a-second-preimage-attack/\\n        assembly {\\n            mstore(0x00, nodeHash)\\n            nodeHash := keccak256(0x00, 0x20)\\n        }\\n\\n        unchecked {\\n            for (uint256 i = 0; i < _proof.length; i++) {\\n                bytes32 proofElement = _proof[i];\\n                // sort sibling hashes as a convention for efficient proof validation\\n                if (proofElement > nodeHash)\\n                    assembly {\\n                        mstore(0x00, nodeHash)\\n                        mstore(0x20, proofElement)\\n                        nodeHash := keccak256(0x00, 0x40)\\n                    }\\n                else\\n                    assembly {\\n                        mstore(0x00, proofElement)\\n                        mstore(0x20, nodeHash)\\n                        nodeHash := keccak256(0x00, 0x40)\\n                    }\\n            }\\n        }\\n\\n        require(stateRoot == nodeHash, \\\"Invalid proof.\\\");\\n\\n        // msgId is the zero-based index of the message in the inbox.\\n        // msgId is also used as an index in the relayed bitmap to prevent replay.\\n        // Note: a bitmap is used instead of a simple boolean mapping to save 15k gas per message.\\n\\n        uint256 relayIndex = _msgId >> 8;\\n        uint256 offset;\\n\\n        unchecked {\\n            offset = _msgId % 256;\\n        }\\n\\n        bytes32 replay = relayed[relayIndex];\\n\\n        require(((replay >> offset) & bytes32(uint256(1))) == bytes32(0), \\\"Message already relayed\\\");\\n        relayed[relayIndex] = replay | bytes32(1 << offset);\\n\\n        // UNTRUSTED.\\n        (bool success, ) = _to.call(_message);\\n        require(success, \\\"Failed to call contract\\\");\\n\\n        emit MessageRelayed(_msgId);\\n    }\\n\\n    /// @dev Sends the deposit back to the Claimer if successful. Includes a portion of the Challenger's deposit if unsuccessfully challenged.\\n    /// @param _epoch The epoch associated with the claim deposit to withraw.\\n    /// @param _claim The claim associated with the epoch.\\n    function withdrawClaimDeposit(uint256 _epoch, Claim calldata _claim) external virtual {\\n        require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n        require(_claim.honest == Party.Claimer, \\\"Claim failed.\\\");\\n\\n        delete claimHashes[_epoch];\\n\\n        if (_claim.challenger != address(0)) {\\n            payable(BURN_ADDRESS).send(burn);\\n            payable(_claim.claimer).send(depositPlusReward); // User is responsible for accepting ETH.\\n        } else {\\n            payable(_claim.claimer).send(deposit); // User is responsible for accepting ETH.\\n        }\\n    }\\n\\n    /// @dev Sends the deposit back to the Challenger if successful. Includes a portion of the Bridger's deposit.\\n    /// @param _epoch The epoch associated with the challenge deposit to withraw.\\n    /// @param _claim The claim associated with the epoch.\\n    function withdrawChallengeDeposit(uint256 _epoch, Claim calldata _claim) external {\\n        require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n        require(_claim.honest == Party.Challenger, \\\"Challenge failed.\\\");\\n\\n        delete claimHashes[_epoch];\\n\\n        payable(BURN_ADDRESS).send(burn); // half burnt\\n        payable(_claim.challenger).send(depositPlusReward); // User is responsible for accepting ETH.\\n    }\\n\\n    /// @dev When bridge is shutdown, no claim disputes can be resolved. This allows the claimer to withdraw their deposit.\\n    /// @param _epoch The epoch associated with the claim deposit to withraw.\\n    /// @param _claim The claim associated with the epoch.\\n    function withdrawClaimerEscapeHatch(uint256 _epoch, Claim memory _claim) external OnlyBridgeShutdown {\\n        require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n        require(_claim.honest == Party.None, \\\"Claim resolved.\\\");\\n\\n        if (_claim.claimer != address(0)) {\\n            if (_claim.challenger == address(0)) {\\n                delete claimHashes[_epoch];\\n                payable(_claim.claimer).send(deposit); // User is responsible for accepting ETH.\\n            } else {\\n                address claimer = _claim.claimer;\\n                _claim.claimer = address(0);\\n                claimHashes[_epoch] = hashClaim(_claim);\\n                payable(claimer).send(deposit); // User is responsible for accepting ETH.\\n            }\\n        }\\n    }\\n\\n    /// @dev When bridge is shutdown, no claim disputes can be resolved. This allows the challenger to withdraw their deposit.\\n    /// @param _epoch The epoch associated with the claim deposit to withraw.\\n    /// @param _claim The claim associated with the epoch.\\n    function withdrawChallengerEscapeHatch(uint256 _epoch, Claim memory _claim) external OnlyBridgeShutdown {\\n        require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n        require(_claim.honest == Party.None, \\\"Claim resolved.\\\");\\n\\n        if (_claim.challenger != address(0)) {\\n            if (_claim.claimer == address(0)) {\\n                delete claimHashes[_epoch];\\n                payable(_claim.challenger).send(deposit); // User is responsible for accepting ETH.\\n            } else {\\n                address challenger = _claim.challenger;\\n                _claim.challenger = address(0);\\n                claimHashes[_epoch] == hashClaim(_claim);\\n                payable(challenger).send(deposit); // User is responsible for accepting ETH.\\n            }\\n        }\\n    }\\n\\n    // ************************************* //\\n    // *           Pure / Views            * //\\n    // ************************************* //\\n\\n    /// @dev Hashes the claim.\\n    /// @param _claim The claim to hash.\\n    /// @return hashedClaim The hash of the claim.\\n    function hashClaim(Claim memory _claim) public pure returns (bytes32 hashedClaim) {\\n        return\\n            hashedClaim = keccak256(\\n                abi.encodePacked(\\n                    _claim.stateRoot,\\n                    _claim.claimer,\\n                    _claim.timestampClaimed,\\n                    _claim.timestampVerification,\\n                    _claim.blocknumberVerification,\\n                    _claim.honest,\\n                    _claim.challenger\\n                )\\n            );\\n    }\\n\\n    /// @dev Gets the status of the censorship test for claim.\\n    /// @param _claim The claim to test.\\n    /// @return status True if the claim passed the censorship test.\\n    function censorshipTestStatus(Claim memory _claim) public view returns (CensorshipTestStatus status) {\\n        unchecked {\\n            if (uint256(_claim.timestampVerification) == 0) {\\n                status = CensorshipTestStatus.NotStarted;\\n            } else if (block.timestamp - uint256(_claim.timestampVerification) < minChallengePeriod) {\\n                status = CensorshipTestStatus.InProgress;\\n            } else {\\n                uint256 expectedBlocks = uint256(_claim.blocknumberVerification) +\\n                    (block.timestamp - uint256(_claim.timestampVerification)) /\\n                    SLOT_TIME;\\n                uint256 actualBlocks = block.number;\\n                if (expectedBlocks - actualBlocks <= maxMissingBlocks) {\\n                    status = CensorshipTestStatus.Passed;\\n                } else {\\n                    status = CensorshipTestStatus.Failed;\\n                }\\n            }\\n        }\\n    }\\n\\n    /// @dev Get the current epoch from the outbox's point of view using the Ethereum L1 clock.\\n    /// @return epoch The hash of the claim.\\n    function epochNow() external view returns (uint256 epoch) {\\n        epoch = block.timestamp / epochPeriod;\\n    }\\n\\n    /// @dev Get the current epoch from the outbox's point of view using the Ethereum L1 clock.\\n    /// @return epoch The hash of the claim.\\n    function epochAt(uint256 timestamp) external view returns (uint256 epoch) {\\n        epoch = timestamp / epochPeriod;\\n    }\\n\\n    /// @dev Get the msg relayed status.\\n    /// @param _msgId The msgId to check.\\n    /// @return isRelayed True if the msg was relayed.\\n    function isMsgRelayed(uint256 _msgId) external view returns (bool isRelayed) {\\n        uint256 relayIndex = _msgId >> 8;\\n        uint256 offset;\\n\\n        unchecked {\\n            offset = _msgId % 256;\\n        }\\n\\n        bytes32 replay = relayed[relayIndex];\\n\\n        isRelayed = (replay >> offset) & bytes32(uint256(1)) == bytes32(uint256(1));\\n    }\\n}\\n\",\"keccak256\":\"0xa6739700d8449f0432d0de255bc73dc6f2d9ef10e0a16b800519762a796bc7bc\",\"license\":\"MIT\"},\"src/canonical/arbitrum/IBridge.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n// https://github.com/OffchainLabs/nitro-contracts/blob/08ac127e966fa87a4d5ba3d23cd3132b57701132/src/bridge/IBridge.sol\\n// proxy: https://etherscan.io/address/0x8315177aB297bA92A06054cE80a67Ed4DBd7ed3a\\n// implementation: https://etherscan.io/address/0x1066cecc8880948fe55e427e94f1ff221d626591#code\\n// interface is pruned for relevant function stubs\\n\\npragma solidity 0.8.24;\\n\\ninterface IBridge {\\n    function activeOutbox() external view returns (address);\\n\\n    function sequencerInbox() external view returns (address);\\n\\n    function allowedDelayedInboxList(uint256) external returns (address);\\n}\\n\",\"keccak256\":\"0x0e7981b3e9b179caa0085d1ad900b19e88e29fec65923f41fde0315773fa9a3c\",\"license\":\"BUSL-1.1\"},\"src/canonical/arbitrum/IOutbox.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n// https://github.com/OffchainLabs/nitro-contracts/blob/08ac127e966fa87a4d5ba3d23cd3132b57701132/src/bridge/IBridge.sol\\n// proxy: https://etherscan.io/address/0x0B9857ae2D4A3DBe74ffE1d7DF045bb7F96E4840#code\\n// implementation: https://etherscan.io/address/0x0ea7372338a589e7f0b00e463a53aa464ef04e17#code\\n// interface is pruned for relevant function stubs\\n\\npragma solidity 0.8.24;\\n\\ninterface IOutbox {\\n    /// @notice When l2ToL1Sender returns a nonzero address, the message was originated by an L2 account\\n    ///         When the return value is zero, that means this is a system message\\n    /// @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentrancies\\n    function l2ToL1Sender() external view returns (address);\\n}\\n\",\"keccak256\":\"0x4d815542262727a2a3182332a7c16b0b1d33c031997de91c12e67e87e748b8ca\",\"license\":\"BUSL-1.1\"},\"src/canonical/arbitrum/ISequencerInbox.sol\":{\"content\":\"// Copyright 2021-2022, Offchain Labs, Inc.\\n// For license information, see https://github.com/nitro/blob/master/LICENSE\\n// SPDX-License-Identifier: BUSL-1.1\\n// https://github.com/OffchainLabs/nitro-contracts/blob/08ac127e966fa87a4d5ba3d23cd3132b57701132/src/bridge/ISequencerInbox.sol\\n// proxy: https://etherscan.io/address/0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6#code\\n// implementation: https://etherscan.io/address/0xD03bFe2CE83632F4E618a97299cc91B1335BB2d9#code\\n// interface is pruned for relevant function stubs\\n\\npragma solidity 0.8.24;\\n\\nimport \\\"./IBridge.sol\\\";\\n\\ninterface ISequencerInbox {\\n    struct MaxTimeVariation {\\n        uint256 delayBlocks;\\n        uint256 futureBlocks;\\n        uint256 delaySeconds;\\n        uint256 futureSeconds;\\n    }\\n\\n    function maxTimeVariation() external view returns (uint256, uint256, uint256, uint256);\\n}\\n\",\"keccak256\":\"0xf972282dbad5eae92a352e0de6b588000bf4c58f45d90a30ef8863d5878313bc\",\"license\":\"BUSL-1.1\"},\"src/interfaces/outboxes/IVeaOutboxOnL1.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@jaybuidl, @shotaronowhere]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.24;\\n\\nimport \\\"../types/VeaClaim.sol\\\";\\n\\n/// @dev Interface of the Vea Outbox on L1 chains like Ethereum, Gnosis, Polygon POS where storage is expensive.\\ninterface IVeaOutboxOnL1 {\\n    /// @dev Verifies and relays the message.\\n    /// Note: Gateways expect first argument of message call to be the arbitrum message sender, used for authentication.\\n    /// @param _proof The merkle proof to prove the message.\\n    /// @param _msgId The zero based index of the message in the inbox.\\n    /// @param _to The address to send the message to.\\n    /// @param _message The message to relay.\\n    function sendMessage(bytes32[] calldata _proof, uint64 _msgId, address _to, bytes calldata _message) external;\\n\\n    /// @dev Resolves any challenge of the optimistic claim for 'epoch' using the canonical bridge.\\n    /// Note: Access restricted to canonical bridge.\\n    /// @param _epoch The epoch to verify.\\n    /// @param _stateRoot The true state root for the epoch.\\n    /// @param _claim The claim associated with the epoch.\\n    function resolveDisputedClaim(uint256 _epoch, bytes32 _stateRoot, Claim memory _claim) external;\\n}\\n\",\"keccak256\":\"0xf1d52e289e790088502b7909f11f47bc33ddd3fc545636b7fb29c01ed00d3ff3\",\"license\":\"MIT\"},\"src/interfaces/types/VeaClaim.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@jaybuidl, @shotaronowhere]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.24;\\n\\nenum Party {\\n    None,\\n    Claimer,\\n    Challenger\\n}\\n\\nstruct Claim {\\n    bytes32 stateRoot;\\n    address claimer;\\n    uint32 timestampClaimed;\\n    uint32 timestampVerification;\\n    uint32 blocknumberVerification;\\n    Party honest;\\n    address challenger;\\n}\\n\",\"keccak256\":\"0xfef781e359c97aebbe8dbfcb75edb7cb962139fd9ea538b8b89a3f2e13a05bfe\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x6101a060405234801562000011575f80fd5b5060405162002bee38038062002bee8339810160408190526200003491620002c7565b60c08790526101208690526101408590526101608490526001600160a01b0380841660a05282166080526101808190526200006e620000cd565b6200007b6002886200033e565b60e08190526200008d8860026200035e565b6200009991906200037e565b6101005261012051600190620000b090426200033e565b620000bc91906200037e565b60015550620003eb95505050505050565b5f6080516001600160a01b031663ee35f3276040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200010d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000133919062000394565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa1580156200016f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001959190620003b7565b5092505050600454811115620001e05760048190556040518181527f611c2e4a78552f908fb0eb2cc503efc1f947cde8574277ab3b0f10fdd510258b9060200160405180910390a150565b600454811015620002a857600654156200025a5760405162461bcd60e51b815260206004820152603160248201527f53657175656e636572206c696d697420646563726561736520726571756573746044820152701030b63932b0b23c903832b73234b7339760791b606482015260840160405180910390fd5b604080518082018252828152426020918201819052600584905560065590518281527fa552b382e128c9d0732f01f09502c18999aec5dce0ed78c5af0ea2274ce9bd7d910160405180910390a15b50565b80516001600160a01b0381168114620002c2575f80fd5b919050565b5f805f805f805f60e0888a031215620002de575f80fd5b875196506020880151955060408801519450606088015193506200030560808901620002ab565b92506200031560a08901620002ab565b915060c0880151905092959891949750929550565b634e487b7160e01b5f52601160045260245ffd5b5f826200035957634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176200037857620003786200032a565b92915050565b818103818111156200037857620003786200032a565b5f60208284031215620003a5575f80fd5b620003b082620002ab565b9392505050565b5f805f8060808587031215620003cb575f80fd5b505082516020840151604085015160609095015191969095509092509050565b60805160a05160c05160e05161010051610120516101405161016051610180516126b6620005385f395f81816104fc0152611eae01525f818161052f015281816108e30152818161182201528181611a130152611c1a01525f81816105b40152611e4301525f81816105620152818161090701528181610c0801528181610ca601528181611400015281816115aa0152818161184601528181611a370152611c3e01525f8181610483015261121d01525f8181610375015281816111ca015261132b01525f81816105e701528181610c3401528181610e1101528181610e3d0152818161138e01528181611b7a01528181611bdf01528181611d8201528181611dee01528181611f20015281816120ac01526120d801525f818161043801526109f101525f8181610665015281816107cd0152818161098201528181610a1b015261162901526126b65ff3fe6080604052600436106101e6575f3560e01c80635f43a47f11610108578063b5b7a1841161009d578063da2b7bc41161006d578063da2b7bc414610609578063df19e6ff14610628578063e78cea9214610654578063e813a75514610687578063fccc28131461069c575f80fd5b8063b5b7a18414610551578063b633b94414610584578063c2114a16146105a3578063d0e30db0146105d6575f80fd5b8063930f28af116100d8578063930f28af146104b85780639588eca2146104d7578063aa22a1c6146104eb578063b044397e1461051e575f80fd5b80635f43a47f1461041357806369cd250d14610427578063836e344b146104725780638830dfbd146104a5575f80fd5b806331ddf7431161017e5780634788cb381161014e5780634788cb381461039757806349b4299e146103b65780634a439cfe146103d5578063541adcca146103f4575f80fd5b806331ddf743146102db5780633ce43cfd146102fa57806343b066d51461031957806344df8e7014610364575f80fd5b8063222ae786116101b9578063222ae786146102665780632639c0601461028857806327ee6bdd146102b357806331d14457146102c8575f80fd5b806301139b68146101ea578063051d1970146101ff5780630c63fa84146102335780630f0adca514610247575b5f80fd5b6101fd6101f8366004612217565b6106af565b005b34801561020a575f80fd5b50600554600654610219919082565b604080519283526020830191909152015b60405180910390f35b34801561023e575f80fd5b506101fd6106be565b348015610252575f80fd5b506101fd610261366004612243565b6108e1565b348015610271575f80fd5b5061027a610c02565b60405190815260200161022a565b348015610293575f80fd5b5061027a6102a2366004612277565b60026020525f908152604090205481565b3480156102be575f80fd5b5061027a60015481565b6101fd6102d636600461228e565b610c32565b3480156102e6575f80fd5b506101fd6102f536600461230a565b610e85565b348015610305575f80fd5b506101fd6103143660046123c3565b611115565b348015610324575f80fd5b50610354610333366004612277565b600881901c5f90815260036020526040902054600160ff9092161c81161490565b604051901515815260200161022a565b34801561036f575f80fd5b5061027a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103a2575f80fd5b506101fd6103b13660046123c3565b611259565b3480156103c1575f80fd5b506101fd6103d0366004612217565b6113ca565b3480156103e0575f80fd5b5061027a6103ef366004612277565b6115a4565b3480156103ff575f80fd5b5061027a61040e3660046123f9565b6115d5565b34801561041e575f80fd5b506101fd611626565b348015610432575f80fd5b5061045a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161022a565b34801561047d575f80fd5b5061027a7f000000000000000000000000000000000000000000000000000000000000000081565b6101fd6104b336600461241a565b611815565b3480156104c3575f80fd5b506101fd6104d2366004612217565b611820565b3480156104e2575f80fd5b5061027a5f5481565b3480156104f6575f80fd5b5061027a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610529575f80fd5b5061027a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561055c575f80fd5b5061027a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561058f575f80fd5b506101fd61059e366004612217565b611a11565b3480156105ae575f80fd5b5061027a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e1575f80fd5b5061027a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610614575f80fd5b506101fd610623366004612217565b611c18565b348015610633575f80fd5b506106476106423660046123f9565b611e27565b60405161022a919061246e565b34801561065f575f80fd5b5061045a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610692575f80fd5b5061027a60045481565b3480156106a7575f80fd5b5061045a5f81565b6106ba828233611eea565b5050565b6006545f036107295760405162461bcd60e51b815260206004820152602c60248201527f4e6f2070656e64696e672073657175656e636572206c696d697420646563726560448201526b30b9b2903932b8bab2b9ba1760a11b60648201526084015b60405180910390fd5b600454600654610739919061249c565b42116107a25760405162461bcd60e51b815260206004820152603260248201527f53657175656e636572206c696d697420646563726561736520726571756573746044820152711034b99039ba34b636103832b73234b7339760711b6064820152608401610720565b600580545f9182905560068290556040805163ee35f32760e01b815290519192916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163ee35f3279160048083019260209291908290030181865afa158015610816573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061083a91906124af565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa158015610875573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089991906124ca565b50925050508181036106ba5760048290556040518281527f611c2e4a78552f908fb0eb2cc503efc1f947cde8574277ab3b0f10fdd510258b9060200160405180910390a15050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281610934576109346124fd565b040311156109775760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b6044820152606401610720565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109ef5760405162461bcd60e51b815260206004820181905260248201527f4e6f742066726f6d206e617469766520617262697472756d206272696467652e6044820152606401610720565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ab5d89436040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9991906124af565b6001600160a01b03166380648b026040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af891906124af565b6001600160a01b031614610b475760405162461bcd60e51b81526020600482015260166024820152753b32b0a4b73137bc20b9312a37a2ba341037b7363c9760511b6044820152606401610720565b60015483118015610b5757508115155b15610b995760018390555f8290556040518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a15b610ba2816115d5565b5f8481526002602052604090205403610bfd578051829003610bca57600160a0820152610be5565b60c08101516001600160a01b031615610be557600260a08201525b610bee816115d5565b5f848152600260205260409020555b505050565b5f610c2d7f000000000000000000000000000000000000000000000000000000000000000042612511565b905090565b7f0000000000000000000000000000000000000000000000000000000000000000341015610ca25760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e7420636c61696d206465706f7369742e00000000006044820152606401610720565b60017f00000000000000000000000000000000000000000000000000000000000000004281610cd357610cd36124fd565b04038214610d145760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21032b837b1b41760911b6044820152606401610720565b80610d315760405162461bcd60e51b815260040161072090612530565b5f8281526002602052604090205415610d825760405162461bcd60e51b815260206004820152601360248201527221b630b4b69030b63932b0b23c9036b0b2329760691b6044820152606401610720565b6040805160e0810182528281523360208201524263ffffffff16918101919091525f606082018190526080820181905260a0820181905260c0820152610dc7906115d5565b5f838152600260209081526040918290209290925551828152839133917fd95107f4584744c6c893a04c43058aadd1ce8aac8ca5d64140eaf277de6c1d57910160405180910390a37f00000000000000000000000000000000000000000000000000000000000000003411156106ba575f610e627f000000000000000000000000000000000000000000000000000000000000000034612558565b604051909150339082156108fc029083905f818181858888f15050505050505050565b60408510610ec75760405162461bcd60e51b815260206004820152600f60248201526e283937b7b3103a37b7903637b7339760891b6044820152606401610720565b5f84848484604051602001610edf949392919061256b565b604051602081830303815290604052805190602001209050805f5260205f2090505f5b86811015610f57575f888883818110610f1d57610f1d6125ac565b90506020020135905082811115610f4057825f528060205260405f209250610f4e565b805f528260205260405f2092505b50600101610f02565b50805f5414610f995760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b6044820152606401610720565b600885901c66ffffffffffffff165f8181526003602052604090205460ff87169080821c6001161561100d5760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792072656c617965640000000000000000006044820152606401610720565b5f838152600360205260408082206001851b84179055516001600160a01b0389169061103c90899089906125c0565b5f604051808303815f865af19150503d805f8114611075576040519150601f19603f3d011682016040523d82523d5f602084013e61107a565b606091505b50509050806110cb5760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2063616c6c20636f6e74726163740000000000000000006044820152606401610720565b60405167ffffffffffffffff8a1681527f54303fab361bc52c2f1f56ace7351189582264f74ce47a6e7c3f478d64c429439060200160405180910390a15050505050505050505050565b61112761040e368390038301836123f9565b5f83815260026020526040902054146111525760405162461bcd60e51b815260040161072090612530565b600261116460c0830160a084016125cf565b60028111156111755761117561245a565b146111b65760405162461bcd60e51b815260206004820152601160248201527021b430b63632b733b2903330b4b632b21760791b6044820152606401610720565b5f82815260026020526040808220829055517f000000000000000000000000000000000000000000000000000000000000000080156108fc029183818181858288f15061120f93505060e0840191505060c083016125e8565b6001600160a01b03166108fc7f000000000000000000000000000000000000000000000000000000000000000090811502906040515f60405180830381858888f150505050505050565b61126b61040e368390038301836123f9565b5f83815260026020526040902054146112965760405162461bcd60e51b815260040161072090612530565b60016112a860c0830160a084016125cf565b60028111156112b9576112b961245a565b146112f65760405162461bcd60e51b815260206004820152600d60248201526c21b630b4b6903330b4b632b21760991b6044820152606401610720565b5f82815260026020526040812081905561131660e0830160c084016125e8565b6001600160a01b031614611370576040515f907f000000000000000000000000000000000000000000000000000000000000000080156108fc029183818181858288f15061120f93505060408401915050602083016125e8565b61138060408201602083016125e8565b6001600160a01b03166108fc7f000000000000000000000000000000000000000000000000000000000000000090811502906040515f60405180830381858888f150505050505050565b6113d3816115d5565b5f83815260026020526040902054146113fe5760405162461bcd60e51b815260040161072090612530565b7f000000000000000000000000000000000000000000000000000000000000000060045461142c919061249c565b60408201516114419063ffffffff1642612558565b10156114a45760405162461bcd60e51b815260206004820152602c60248201527f436c61696d206d75737420776169742061746c65617374206d61784c3253746160448201526b3a32a9bcb731a232b630bc9760a11b6064820152608401610720565b5f6114ae82611e27565b905060028160038111156114c4576114c461245a565b14806114e057505f8160038111156114de576114de61245a565b145b6115495760405162461bcd60e51b815260206004820152603460248201527f436c61696d20766572696669636174696f6e20696e2070726f6772657373206f604482015273391030b63932b0b23c9031b7b6b83632ba32b21760611b6064820152608401610720565b63ffffffff428116606084015243166080830152611566826115d5565b5f8481526002602052604080822092909255905184917f37b700b61b9b4710dddb0c3316b2be7ef6088ed4b1d7bfe0fb98be8f9a163e1691a2505050565b5f6115cf7f000000000000000000000000000000000000000000000000000000000000000083612511565b92915050565b80516020808301516040808501516060860151608087015160a088015160c089015194515f98611609989097969101612603565b604051602081830303815290604052805190602001209050919050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ee35f3276040518163ffffffff1660e01b8152600401602060405180830381865afa158015611683573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116a791906124af565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa1580156116e2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170691906124ca565b50925050506004548111156117505760048190556040518181527f611c2e4a78552f908fb0eb2cc503efc1f947cde8574277ab3b0f10fdd510258b9060200160405180910390a150565b60045481101561181257600654156117c45760405162461bcd60e51b815260206004820152603160248201527f53657175656e636572206c696d697420646563726561736520726571756573746044820152701030b63932b0b23c903832b73234b7339760791b6064820152608401610720565b604080518082018252828152426020918201819052600584905560065590518281527fa552b382e128c9d0732f01f09502c18999aec5dce0ed78c5af0ea2274ce9bd7d910160405180910390a15b50565b610bfd838383611eea565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611873576118736124fd565b040311156118b65760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b6044820152606401610720565b6118bf816115d5565b5f83815260026020526040902054146118ea5760405162461bcd60e51b815260040161072090612530565b60c08101516001600160a01b03161561193c5760405162461bcd60e51b815260206004820152601460248201527321b630b4b69034b99031b430b63632b733b2b21760611b6044820152606401610720565b600161194782611e27565b60038111156119585761195861245a565b146119a55760405162461bcd60e51b815260206004820152601b60248201527f43656e736f72736869702074657374206e6f74207061737365642e00000000006044820152606401610720565b6001548211156119ec57600182905580515f556040518281527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a15b600160a08201526119fc816115d5565b5f928352600260205260409092209190915550565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611a6457611a646124fd565b040311611aa55760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b6044820152606401610720565b611aae816115d5565b5f8381526002602052604090205414611ad95760405162461bcd60e51b815260040161072090612530565b5f8160a001516002811115611af057611af061245a565b14611b2f5760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b6044820152606401610720565b60c08101516001600160a01b0316156106ba5760208101516001600160a01b0316611bb2575f8281526002602052604080822082905560c083015190516001600160a01b03909116917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f150505050505050565b60c0810180515f909152611bc5826115d5565b505f83815260026020526040516001600160a01b038316917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f15050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611c6b57611c6b6124fd565b040311611cac5760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b6044820152606401610720565b611cb5816115d5565b5f8381526002602052604090205414611ce05760405162461bcd60e51b815260040161072090612530565b5f8160a001516002811115611cf757611cf761245a565b14611d365760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b6044820152606401610720565b60208101516001600160a01b0316156106ba5760c08101516001600160a01b0316611dba575f8281526002602090815260408083208390559083015190516001600160a01b03909116917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f150505050505050565b6020810180515f909152611dcd826115d5565b5f848152600260205260408082209290925590516001600160a01b038316917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f15050505050505050565b5f816060015163ffffffff165f03611e4157506002919050565b7f0000000000000000000000000000000000000000000000000000000000000000826060015163ffffffff1642031015611e7d57506003919050565b5f600c836060015163ffffffff16420381611e9a57611e9a6124fd565b608085015163ffffffff16919004019050437f000000000000000000000000000000000000000000000000000000000000000081830311611ede5760019250611ee2565b5f92505b50505b919050565b611ef3826115d5565b5f8481526002602052604090205414611f1e5760405162461bcd60e51b815260040161072090612530565b7f0000000000000000000000000000000000000000000000000000000000000000341015611f8e5760405162461bcd60e51b815260206004820152601f60248201527f496e73756666696369656e74206368616c6c656e6765206465706f7369742e006044820152606401610720565b60c08201516001600160a01b031615611fe95760405162461bcd60e51b815260206004820152601960248201527f436c61696d20616c7265616479206368616c6c656e6765642e000000000000006044820152606401610720565b5f8260a0015160028111156120005761200061245a565b1461204d5760405162461bcd60e51b815260206004820152601760248201527f436c61696d20616c72656164792076657269666965642e0000000000000000006044820152606401610720565b6001600160a01b03811660c0830152612065826115d5565b5f848152600260205260408082209290925590516001600160a01b0383169185917fcfe09ca25f55d949baba5e280f5750c9ba4b9048fca5532f916067d433afe4d79190a37f0000000000000000000000000000000000000000000000000000000000000000341115610bfd575f6120fd7f000000000000000000000000000000000000000000000000000000000000000034612558565b604051909150339082156108fc029083905f818181858888f1505050505050505050565b6001600160a01b0381168114611812575f80fd5b8035611ee581612121565b803563ffffffff81168114611ee5575f80fd5b803560038110611ee5575f80fd5b5f60e08284031215612171575f80fd5b60405160e0810181811067ffffffffffffffff821117156121a057634e487b7160e01b5f52604160045260245ffd5b604052823581529050806121b660208401612135565b60208201526121c760408401612140565b60408201526121d860608401612140565b60608201526121e960808401612140565b60808201526121fa60a08401612153565b60a082015261220b60c08401612135565b60c08201525092915050565b5f806101008385031215612229575f80fd5b8235915061223a8460208501612161565b90509250929050565b5f805f6101208486031215612256575f80fd5b833592506020840135915061226e8560408601612161565b90509250925092565b5f60208284031215612287575f80fd5b5035919050565b5f806040838503121561229f575f80fd5b50508035926020909101359150565b803567ffffffffffffffff81168114611ee5575f80fd5b5f8083601f8401126122d5575f80fd5b50813567ffffffffffffffff8111156122ec575f80fd5b602083019150836020828501011115612303575f80fd5b9250929050565b5f805f805f806080878903121561231f575f80fd5b863567ffffffffffffffff80821115612336575f80fd5b818901915089601f830112612349575f80fd5b813581811115612357575f80fd5b8a60208260051b850101111561236b575f80fd5b6020830198508097505061238160208a016122ae565b955061238f60408a01612135565b945060608901359150808211156123a4575f80fd5b506123b189828a016122c5565b979a9699509497509295939492505050565b5f808284036101008112156123d6575f80fd5b8335925060e0601f19820112156123eb575f80fd5b506020830190509250929050565b5f60e08284031215612409575f80fd5b6124138383612161565b9392505050565b5f805f610120848603121561242d575f80fd5b8335925061243e8560208601612161565b915061010084013561244f81612121565b809150509250925092565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106124825761248261245a565b91905290565b634e487b7160e01b5f52601160045260245ffd5b808201808211156115cf576115cf612488565b5f602082840312156124bf575f80fd5b815161241381612121565b5f805f80608085870312156124dd575f80fd5b505082516020840151604085015160609095015191969095509092509050565b634e487b7160e01b5f52601260045260245ffd5b5f8261252b57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252600e908201526d24b73b30b634b21031b630b4b69760911b604082015260600190565b818103818111156115cf576115cf612488565b60c085901b6001600160c01b0319168152606084901b6bffffffffffffffffffffffff191660088201528183601c8301375f9101601c019081529392505050565b634e487b7160e01b5f52603260045260245ffd5b818382375f9101908152919050565b5f602082840312156125df575f80fd5b61241382612153565b5f602082840312156125f8575f80fd5b813561241381612121565b8781525f6bffffffffffffffffffffffff19808960601b16602084015263ffffffff60e01b808960e01b166034850152808860e01b166038850152808760e01b16603c850152506003851061265a5761265a61245a565b60f89490941b60408301525060609190911b90911660418201526055019594505050505056fea2646970667358221220f30d444842e1028f8e0cd5b5c38c93b8d5e2f20a1e7a6bc4f691d60b1991308264736f6c63430008180033",
  "deployedBytecode": "0x6080604052600436106101e6575f3560e01c80635f43a47f11610108578063b5b7a1841161009d578063da2b7bc41161006d578063da2b7bc414610609578063df19e6ff14610628578063e78cea9214610654578063e813a75514610687578063fccc28131461069c575f80fd5b8063b5b7a18414610551578063b633b94414610584578063c2114a16146105a3578063d0e30db0146105d6575f80fd5b8063930f28af116100d8578063930f28af146104b85780639588eca2146104d7578063aa22a1c6146104eb578063b044397e1461051e575f80fd5b80635f43a47f1461041357806369cd250d14610427578063836e344b146104725780638830dfbd146104a5575f80fd5b806331ddf7431161017e5780634788cb381161014e5780634788cb381461039757806349b4299e146103b65780634a439cfe146103d5578063541adcca146103f4575f80fd5b806331ddf743146102db5780633ce43cfd146102fa57806343b066d51461031957806344df8e7014610364575f80fd5b8063222ae786116101b9578063222ae786146102665780632639c0601461028857806327ee6bdd146102b357806331d14457146102c8575f80fd5b806301139b68146101ea578063051d1970146101ff5780630c63fa84146102335780630f0adca514610247575b5f80fd5b6101fd6101f8366004612217565b6106af565b005b34801561020a575f80fd5b50600554600654610219919082565b604080519283526020830191909152015b60405180910390f35b34801561023e575f80fd5b506101fd6106be565b348015610252575f80fd5b506101fd610261366004612243565b6108e1565b348015610271575f80fd5b5061027a610c02565b60405190815260200161022a565b348015610293575f80fd5b5061027a6102a2366004612277565b60026020525f908152604090205481565b3480156102be575f80fd5b5061027a60015481565b6101fd6102d636600461228e565b610c32565b3480156102e6575f80fd5b506101fd6102f536600461230a565b610e85565b348015610305575f80fd5b506101fd6103143660046123c3565b611115565b348015610324575f80fd5b50610354610333366004612277565b600881901c5f90815260036020526040902054600160ff9092161c81161490565b604051901515815260200161022a565b34801561036f575f80fd5b5061027a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103a2575f80fd5b506101fd6103b13660046123c3565b611259565b3480156103c1575f80fd5b506101fd6103d0366004612217565b6113ca565b3480156103e0575f80fd5b5061027a6103ef366004612277565b6115a4565b3480156103ff575f80fd5b5061027a61040e3660046123f9565b6115d5565b34801561041e575f80fd5b506101fd611626565b348015610432575f80fd5b5061045a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161022a565b34801561047d575f80fd5b5061027a7f000000000000000000000000000000000000000000000000000000000000000081565b6101fd6104b336600461241a565b611815565b3480156104c3575f80fd5b506101fd6104d2366004612217565b611820565b3480156104e2575f80fd5b5061027a5f5481565b3480156104f6575f80fd5b5061027a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610529575f80fd5b5061027a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561055c575f80fd5b5061027a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561058f575f80fd5b506101fd61059e366004612217565b611a11565b3480156105ae575f80fd5b5061027a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e1575f80fd5b5061027a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610614575f80fd5b506101fd610623366004612217565b611c18565b348015610633575f80fd5b506106476106423660046123f9565b611e27565b60405161022a919061246e565b34801561065f575f80fd5b5061045a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610692575f80fd5b5061027a60045481565b3480156106a7575f80fd5b5061045a5f81565b6106ba828233611eea565b5050565b6006545f036107295760405162461bcd60e51b815260206004820152602c60248201527f4e6f2070656e64696e672073657175656e636572206c696d697420646563726560448201526b30b9b2903932b8bab2b9ba1760a11b60648201526084015b60405180910390fd5b600454600654610739919061249c565b42116107a25760405162461bcd60e51b815260206004820152603260248201527f53657175656e636572206c696d697420646563726561736520726571756573746044820152711034b99039ba34b636103832b73234b7339760711b6064820152608401610720565b600580545f9182905560068290556040805163ee35f32760e01b815290519192916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163ee35f3279160048083019260209291908290030181865afa158015610816573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061083a91906124af565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa158015610875573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089991906124ca565b50925050508181036106ba5760048290556040518281527f611c2e4a78552f908fb0eb2cc503efc1f947cde8574277ab3b0f10fdd510258b9060200160405180910390a15050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281610934576109346124fd565b040311156109775760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b6044820152606401610720565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109ef5760405162461bcd60e51b815260206004820181905260248201527f4e6f742066726f6d206e617469766520617262697472756d206272696467652e6044820152606401610720565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ab5d89436040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9991906124af565b6001600160a01b03166380648b026040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af891906124af565b6001600160a01b031614610b475760405162461bcd60e51b81526020600482015260166024820152753b32b0a4b73137bc20b9312a37a2ba341037b7363c9760511b6044820152606401610720565b60015483118015610b5757508115155b15610b995760018390555f8290556040518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a15b610ba2816115d5565b5f8481526002602052604090205403610bfd578051829003610bca57600160a0820152610be5565b60c08101516001600160a01b031615610be557600260a08201525b610bee816115d5565b5f848152600260205260409020555b505050565b5f610c2d7f000000000000000000000000000000000000000000000000000000000000000042612511565b905090565b7f0000000000000000000000000000000000000000000000000000000000000000341015610ca25760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e7420636c61696d206465706f7369742e00000000006044820152606401610720565b60017f00000000000000000000000000000000000000000000000000000000000000004281610cd357610cd36124fd565b04038214610d145760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21032b837b1b41760911b6044820152606401610720565b80610d315760405162461bcd60e51b815260040161072090612530565b5f8281526002602052604090205415610d825760405162461bcd60e51b815260206004820152601360248201527221b630b4b69030b63932b0b23c9036b0b2329760691b6044820152606401610720565b6040805160e0810182528281523360208201524263ffffffff16918101919091525f606082018190526080820181905260a0820181905260c0820152610dc7906115d5565b5f838152600260209081526040918290209290925551828152839133917fd95107f4584744c6c893a04c43058aadd1ce8aac8ca5d64140eaf277de6c1d57910160405180910390a37f00000000000000000000000000000000000000000000000000000000000000003411156106ba575f610e627f000000000000000000000000000000000000000000000000000000000000000034612558565b604051909150339082156108fc029083905f818181858888f15050505050505050565b60408510610ec75760405162461bcd60e51b815260206004820152600f60248201526e283937b7b3103a37b7903637b7339760891b6044820152606401610720565b5f84848484604051602001610edf949392919061256b565b604051602081830303815290604052805190602001209050805f5260205f2090505f5b86811015610f57575f888883818110610f1d57610f1d6125ac565b90506020020135905082811115610f4057825f528060205260405f209250610f4e565b805f528260205260405f2092505b50600101610f02565b50805f5414610f995760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b6044820152606401610720565b600885901c66ffffffffffffff165f8181526003602052604090205460ff87169080821c6001161561100d5760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792072656c617965640000000000000000006044820152606401610720565b5f838152600360205260408082206001851b84179055516001600160a01b0389169061103c90899089906125c0565b5f604051808303815f865af19150503d805f8114611075576040519150601f19603f3d011682016040523d82523d5f602084013e61107a565b606091505b50509050806110cb5760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2063616c6c20636f6e74726163740000000000000000006044820152606401610720565b60405167ffffffffffffffff8a1681527f54303fab361bc52c2f1f56ace7351189582264f74ce47a6e7c3f478d64c429439060200160405180910390a15050505050505050505050565b61112761040e368390038301836123f9565b5f83815260026020526040902054146111525760405162461bcd60e51b815260040161072090612530565b600261116460c0830160a084016125cf565b60028111156111755761117561245a565b146111b65760405162461bcd60e51b815260206004820152601160248201527021b430b63632b733b2903330b4b632b21760791b6044820152606401610720565b5f82815260026020526040808220829055517f000000000000000000000000000000000000000000000000000000000000000080156108fc029183818181858288f15061120f93505060e0840191505060c083016125e8565b6001600160a01b03166108fc7f000000000000000000000000000000000000000000000000000000000000000090811502906040515f60405180830381858888f150505050505050565b61126b61040e368390038301836123f9565b5f83815260026020526040902054146112965760405162461bcd60e51b815260040161072090612530565b60016112a860c0830160a084016125cf565b60028111156112b9576112b961245a565b146112f65760405162461bcd60e51b815260206004820152600d60248201526c21b630b4b6903330b4b632b21760991b6044820152606401610720565b5f82815260026020526040812081905561131660e0830160c084016125e8565b6001600160a01b031614611370576040515f907f000000000000000000000000000000000000000000000000000000000000000080156108fc029183818181858288f15061120f93505060408401915050602083016125e8565b61138060408201602083016125e8565b6001600160a01b03166108fc7f000000000000000000000000000000000000000000000000000000000000000090811502906040515f60405180830381858888f150505050505050565b6113d3816115d5565b5f83815260026020526040902054146113fe5760405162461bcd60e51b815260040161072090612530565b7f000000000000000000000000000000000000000000000000000000000000000060045461142c919061249c565b60408201516114419063ffffffff1642612558565b10156114a45760405162461bcd60e51b815260206004820152602c60248201527f436c61696d206d75737420776169742061746c65617374206d61784c3253746160448201526b3a32a9bcb731a232b630bc9760a11b6064820152608401610720565b5f6114ae82611e27565b905060028160038111156114c4576114c461245a565b14806114e057505f8160038111156114de576114de61245a565b145b6115495760405162461bcd60e51b815260206004820152603460248201527f436c61696d20766572696669636174696f6e20696e2070726f6772657373206f604482015273391030b63932b0b23c9031b7b6b83632ba32b21760611b6064820152608401610720565b63ffffffff428116606084015243166080830152611566826115d5565b5f8481526002602052604080822092909255905184917f37b700b61b9b4710dddb0c3316b2be7ef6088ed4b1d7bfe0fb98be8f9a163e1691a2505050565b5f6115cf7f000000000000000000000000000000000000000000000000000000000000000083612511565b92915050565b80516020808301516040808501516060860151608087015160a088015160c089015194515f98611609989097969101612603565b604051602081830303815290604052805190602001209050919050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ee35f3276040518163ffffffff1660e01b8152600401602060405180830381865afa158015611683573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116a791906124af565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa1580156116e2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170691906124ca565b50925050506004548111156117505760048190556040518181527f611c2e4a78552f908fb0eb2cc503efc1f947cde8574277ab3b0f10fdd510258b9060200160405180910390a150565b60045481101561181257600654156117c45760405162461bcd60e51b815260206004820152603160248201527f53657175656e636572206c696d697420646563726561736520726571756573746044820152701030b63932b0b23c903832b73234b7339760791b6064820152608401610720565b604080518082018252828152426020918201819052600584905560065590518281527fa552b382e128c9d0732f01f09502c18999aec5dce0ed78c5af0ea2274ce9bd7d910160405180910390a15b50565b610bfd838383611eea565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611873576118736124fd565b040311156118b65760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b6044820152606401610720565b6118bf816115d5565b5f83815260026020526040902054146118ea5760405162461bcd60e51b815260040161072090612530565b60c08101516001600160a01b03161561193c5760405162461bcd60e51b815260206004820152601460248201527321b630b4b69034b99031b430b63632b733b2b21760611b6044820152606401610720565b600161194782611e27565b60038111156119585761195861245a565b146119a55760405162461bcd60e51b815260206004820152601b60248201527f43656e736f72736869702074657374206e6f74207061737365642e00000000006044820152606401610720565b6001548211156119ec57600182905580515f556040518281527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a15b600160a08201526119fc816115d5565b5f928352600260205260409092209190915550565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611a6457611a646124fd565b040311611aa55760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b6044820152606401610720565b611aae816115d5565b5f8381526002602052604090205414611ad95760405162461bcd60e51b815260040161072090612530565b5f8160a001516002811115611af057611af061245a565b14611b2f5760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b6044820152606401610720565b60c08101516001600160a01b0316156106ba5760208101516001600160a01b0316611bb2575f8281526002602052604080822082905560c083015190516001600160a01b03909116917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f150505050505050565b60c0810180515f909152611bc5826115d5565b505f83815260026020526040516001600160a01b038316917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f15050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611c6b57611c6b6124fd565b040311611cac5760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b6044820152606401610720565b611cb5816115d5565b5f8381526002602052604090205414611ce05760405162461bcd60e51b815260040161072090612530565b5f8160a001516002811115611cf757611cf761245a565b14611d365760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b6044820152606401610720565b60208101516001600160a01b0316156106ba5760c08101516001600160a01b0316611dba575f8281526002602090815260408083208390559083015190516001600160a01b03909116917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f150505050505050565b6020810180515f909152611dcd826115d5565b5f848152600260205260408082209290925590516001600160a01b038316917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f15050505050505050565b5f816060015163ffffffff165f03611e4157506002919050565b7f0000000000000000000000000000000000000000000000000000000000000000826060015163ffffffff1642031015611e7d57506003919050565b5f600c836060015163ffffffff16420381611e9a57611e9a6124fd565b608085015163ffffffff16919004019050437f000000000000000000000000000000000000000000000000000000000000000081830311611ede5760019250611ee2565b5f92505b50505b919050565b611ef3826115d5565b5f8481526002602052604090205414611f1e5760405162461bcd60e51b815260040161072090612530565b7f0000000000000000000000000000000000000000000000000000000000000000341015611f8e5760405162461bcd60e51b815260206004820152601f60248201527f496e73756666696369656e74206368616c6c656e6765206465706f7369742e006044820152606401610720565b60c08201516001600160a01b031615611fe95760405162461bcd60e51b815260206004820152601960248201527f436c61696d20616c7265616479206368616c6c656e6765642e000000000000006044820152606401610720565b5f8260a0015160028111156120005761200061245a565b1461204d5760405162461bcd60e51b815260206004820152601760248201527f436c61696d20616c72656164792076657269666965642e0000000000000000006044820152606401610720565b6001600160a01b03811660c0830152612065826115d5565b5f848152600260205260408082209290925590516001600160a01b0383169185917fcfe09ca25f55d949baba5e280f5750c9ba4b9048fca5532f916067d433afe4d79190a37f0000000000000000000000000000000000000000000000000000000000000000341115610bfd575f6120fd7f000000000000000000000000000000000000000000000000000000000000000034612558565b604051909150339082156108fc029083905f818181858888f1505050505050505050565b6001600160a01b0381168114611812575f80fd5b8035611ee581612121565b803563ffffffff81168114611ee5575f80fd5b803560038110611ee5575f80fd5b5f60e08284031215612171575f80fd5b60405160e0810181811067ffffffffffffffff821117156121a057634e487b7160e01b5f52604160045260245ffd5b604052823581529050806121b660208401612135565b60208201526121c760408401612140565b60408201526121d860608401612140565b60608201526121e960808401612140565b60808201526121fa60a08401612153565b60a082015261220b60c08401612135565b60c08201525092915050565b5f806101008385031215612229575f80fd5b8235915061223a8460208501612161565b90509250929050565b5f805f6101208486031215612256575f80fd5b833592506020840135915061226e8560408601612161565b90509250925092565b5f60208284031215612287575f80fd5b5035919050565b5f806040838503121561229f575f80fd5b50508035926020909101359150565b803567ffffffffffffffff81168114611ee5575f80fd5b5f8083601f8401126122d5575f80fd5b50813567ffffffffffffffff8111156122ec575f80fd5b602083019150836020828501011115612303575f80fd5b9250929050565b5f805f805f806080878903121561231f575f80fd5b863567ffffffffffffffff80821115612336575f80fd5b818901915089601f830112612349575f80fd5b813581811115612357575f80fd5b8a60208260051b850101111561236b575f80fd5b6020830198508097505061238160208a016122ae565b955061238f60408a01612135565b945060608901359150808211156123a4575f80fd5b506123b189828a016122c5565b979a9699509497509295939492505050565b5f808284036101008112156123d6575f80fd5b8335925060e0601f19820112156123eb575f80fd5b506020830190509250929050565b5f60e08284031215612409575f80fd5b6124138383612161565b9392505050565b5f805f610120848603121561242d575f80fd5b8335925061243e8560208601612161565b915061010084013561244f81612121565b809150509250925092565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106124825761248261245a565b91905290565b634e487b7160e01b5f52601160045260245ffd5b808201808211156115cf576115cf612488565b5f602082840312156124bf575f80fd5b815161241381612121565b5f805f80608085870312156124dd575f80fd5b505082516020840151604085015160609095015191969095509092509050565b634e487b7160e01b5f52601260045260245ffd5b5f8261252b57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252600e908201526d24b73b30b634b21031b630b4b69760911b604082015260600190565b818103818111156115cf576115cf612488565b60c085901b6001600160c01b0319168152606084901b6bffffffffffffffffffffffff191660088201528183601c8301375f9101601c019081529392505050565b634e487b7160e01b5f52603260045260245ffd5b818382375f9101908152919050565b5f602082840312156125df575f80fd5b61241382612153565b5f602082840312156125f8575f80fd5b813561241381612121565b8781525f6bffffffffffffffffffffffff19808960601b16602084015263ffffffff60e01b808960e01b166034850152808860e01b166038850152808760e01b16603c850152506003851061265a5761265a61245a565b60f89490941b60408301525060609190911b90911660418201526055019594505050505056fea2646970667358221220f30d444842e1028f8e0cd5b5c38c93b8d5e2f20a1e7a6bc4f691d60b1991308264736f6c63430008180033",
  "devdoc": {
    "details": "Vea Outbox From Arbitrum to Ethereum. Note: This contract is deployed on Ethereum.",
    "events": {
      "Challenged(uint256,address)": {
        "details": "This event indicates that `sendSnapshot(epoch)` should be called in the inbox.",
        "params": {
          "_challenger": "The address of the challenger.",
          "_epoch": "The epoch associated with the challenged claim."
        }
      },
      "Claimed(address,uint256,bytes32)": {
        "details": "Watchers check this event to challenge fraud.",
        "params": {
          "_claimer": "The address of the claimer.",
          "_epoch": "The epoch associated with the claim.",
          "_stateRoot": "The state root of the claim."
        }
      },
      "MessageRelayed(uint64)": {
        "details": "This event indicates that a message has been relayed.",
        "params": {
          "_msgId": "The msgId of the message that was relayed."
        }
      },
      "VerificationStarted(uint256)": {
        "details": "This event indicates that the censorship test started and all challengers are ready even in the worst case scenario of a malicious sequencer.",
        "params": {
          "_epoch": "The epoch that started verification."
        }
      },
      "Verified(uint256)": {
        "details": "This events indicates that verification has succeeded. The messages are ready to be relayed.",
        "params": {
          "_epoch": "The epoch that was verified."
        }
      },
      "sequencerDelayLimitDecreaseRequested(uint256)": {
        "details": "This event indicates that a request to decrease the sequencer limit has been made.",
        "params": {
          "_requestedSequencerDelayLimit": "The new sequencer delay limit requested."
        }
      },
      "sequencerDelayLimitUpdated(uint256)": {
        "details": "This event indicates the sequencer limit updated.",
        "params": {
          "_newSequencerDelayLimit": "The new sequencer delay limit."
        }
      }
    },
    "kind": "dev",
    "methods": {
      "censorshipTestStatus((bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "Gets the status of the censorship test for claim.",
        "params": {
          "_claim": "The claim to test."
        },
        "returns": {
          "status": "True if the claim passed the censorship test."
        }
      },
      "challenge(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "Submit a challenge for the claim of the inbox state root snapshot taken at 'epoch'.",
        "params": {
          "_claim": "The claim associated with the epoch.",
          "_epoch": "The epoch of the claim to challenge."
        }
      },
      "challenge(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address),address)": {
        "details": "Submit a challenge for the claim of the inbox state root snapshot taken at 'epoch'.Allows proxy contracts to batch challenges.",
        "params": {
          "_claim": "The claim associated with the epoch.",
          "_epoch": "The epoch of the claim to challenge.",
          "_withdrawalAddress": "The address to withdraw the deposit + reward to."
        }
      },
      "claim(uint256,bytes32)": {
        "details": "Submit a claim about the _stateRoot at _epoch and submit a deposit.",
        "params": {
          "_epoch": "The epoch for which the claim is made.",
          "_stateRoot": "The state root to claim."
        }
      },
      "constructor": {
        "details": "Constructor. Note: epochPeriod must match the VeaInboxArbToEth contract deployment on Arbitrum, since it's on a different chain, we can't read it and trust the deployer to set a correct value",
        "params": {
          "_deposit": "The deposit amount to submit a claim in wei.",
          "_epochPeriod": "The duration of each epoch.",
          "_maxMissingBlocks": "The maximum number of blocks that can be missing in a challenge period.",
          "_minChallengePeriod": "The minimum time window to challenge a claim.",
          "_timeoutEpochs": "The epochs before the bridge is considered shutdown.",
          "_veaInboxArbToEth": "The address of the inbox contract on Arbitrum."
        }
      },
      "epochAt(uint256)": {
        "details": "Get the current epoch from the outbox's point of view using the Ethereum L1 clock.",
        "returns": {
          "epoch": "The hash of the claim."
        }
      },
      "epochNow()": {
        "details": "Get the current epoch from the outbox's point of view using the Ethereum L1 clock.",
        "returns": {
          "epoch": "The hash of the claim."
        }
      },
      "executeSequencerDelayLimitDecreaseRequest()": {
        "details": "execute sequencerDelayLimitDecreaseRequest"
      },
      "hashClaim((bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "Hashes the claim.",
        "params": {
          "_claim": "The claim to hash."
        },
        "returns": {
          "hashedClaim": "The hash of the claim."
        }
      },
      "isMsgRelayed(uint256)": {
        "details": "Get the msg relayed status.",
        "params": {
          "_msgId": "The msgId to check."
        },
        "returns": {
          "isRelayed": "True if the msg was relayed."
        }
      },
      "resolveDisputedClaim(uint256,bytes32,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "Resolves any challenge of the optimistic claim for '_epoch'.",
        "params": {
          "_claim": "The claim associated with the epoch.",
          "_epoch": "The epoch to verify.",
          "_stateRoot": "The true state root for the epoch."
        }
      },
      "sendMessage(bytes32[],uint64,address,bytes)": {
        "details": "Verifies and relays the message. UNTRUSTED.",
        "params": {
          "_message": "The message encoded in the vea inbox as abi.encodeWithSelector(fnSelector, msg.sender, param1, param2, ...)",
          "_msgId": "The zero based index of the message in the inbox.",
          "_proof": "The merkle proof to prove the message inclusion in the inbox state root.",
          "_to": "The address of the contract on Ethereum to call."
        }
      },
      "startVerification(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "Start verification for claim for 'epoch'.",
        "params": {
          "_claim": "The claim associated with the epoch.",
          "_epoch": "The epoch of the claim to challenge."
        }
      },
      "updateSequencerDelayLimit()": {
        "details": "Request to decrease the sequencerDelayLimit."
      },
      "verifySnapshot(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "Resolves the optimistic claim for '_epoch'.",
        "params": {
          "_claim": "The claim associated with the epoch.",
          "_epoch": "The epoch of the optimistic claim."
        }
      },
      "withdrawChallengeDeposit(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "Sends the deposit back to the Challenger if successful. Includes a portion of the Bridger's deposit.",
        "params": {
          "_claim": "The claim associated with the epoch.",
          "_epoch": "The epoch associated with the challenge deposit to withraw."
        }
      },
      "withdrawChallengerEscapeHatch(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "When bridge is shutdown, no claim disputes can be resolved. This allows the challenger to withdraw their deposit.",
        "params": {
          "_claim": "The claim associated with the epoch.",
          "_epoch": "The epoch associated with the claim deposit to withraw."
        }
      },
      "withdrawClaimDeposit(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "Sends the deposit back to the Claimer if successful. Includes a portion of the Challenger's deposit if unsuccessfully challenged.",
        "params": {
          "_claim": "The claim associated with the epoch.",
          "_epoch": "The epoch associated with the claim deposit to withraw."
        }
      },
      "withdrawClaimerEscapeHatch(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "When bridge is shutdown, no claim disputes can be resolved. This allows the claimer to withdraw their deposit.",
        "params": {
          "_claim": "The claim associated with the epoch.",
          "_epoch": "The epoch associated with the claim deposit to withraw."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "resolveDisputedClaim(uint256,bytes32,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "notice": "Note: Access restricted to arbitrum  bridge."
      }
    },
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 446,
        "contract": "src/arbitrumToEth/VeaOutboxArbToEth.sol:VeaOutboxArbToEth",
        "label": "stateRoot",
        "offset": 0,
        "slot": "0",
        "type": "t_bytes32"
      },
      {
        "astId": 448,
        "contract": "src/arbitrumToEth/VeaOutboxArbToEth.sol:VeaOutboxArbToEth",
        "label": "latestVerifiedEpoch",
        "offset": 0,
        "slot": "1",
        "type": "t_uint256"
      },
      {
        "astId": 452,
        "contract": "src/arbitrumToEth/VeaOutboxArbToEth.sol:VeaOutboxArbToEth",
        "label": "claimHashes",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_uint256,t_bytes32)"
      },
      {
        "astId": 456,
        "contract": "src/arbitrumToEth/VeaOutboxArbToEth.sol:VeaOutboxArbToEth",
        "label": "relayed",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_uint256,t_bytes32)"
      },
      {
        "astId": 458,
        "contract": "src/arbitrumToEth/VeaOutboxArbToEth.sol:VeaOutboxArbToEth",
        "label": "sequencerDelayLimit",
        "offset": 0,
        "slot": "4",
        "type": "t_uint256"
      },
      {
        "astId": 461,
        "contract": "src/arbitrumToEth/VeaOutboxArbToEth.sol:VeaOutboxArbToEth",
        "label": "sequencerDelayLimitDecreaseRequest",
        "offset": 0,
        "slot": "5",
        "type": "t_struct(SequencerDelayLimitDecreaseRequest)466_storage"
      }
    ],
    "types": {
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_mapping(t_uint256,t_bytes32)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => bytes32)",
        "numberOfBytes": "32",
        "value": "t_bytes32"
      },
      "t_struct(SequencerDelayLimitDecreaseRequest)466_storage": {
        "encoding": "inplace",
        "label": "struct VeaOutboxArbToEth.SequencerDelayLimitDecreaseRequest",
        "members": [
          {
            "astId": 463,
            "contract": "src/arbitrumToEth/VeaOutboxArbToEth.sol:VeaOutboxArbToEth",
            "label": "requestedsequencerDelayLimit",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 465,
            "contract": "src/arbitrumToEth/VeaOutboxArbToEth.sol:VeaOutboxArbToEth",
            "label": "timestamp",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}
