{
  "address": "0xb1f5125b52CE23D3763AC1C9ACEf0668825A66c0",
  "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": "_veaInboxArbToEthDevnet",
          "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": 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"
    },
    {
      "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"
    },
    {
      "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": "address",
          "name": "_devnetOperator",
          "type": "address"
        }
      ],
      "name": "changeDevnetOperator",
      "outputs": [],
      "stateMutability": "nonpayable",
      "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": "_epoch",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "_stateroot",
          "type": "bytes32"
        }
      ],
      "name": "devnetAdvanceState",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "devnetOperator",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "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": "0x669126daa957cf567430de4482e98bc7341f2ff2d20c385dd365a3dd7af2a768",
  "receipt": {
    "to": null,
    "from": "0xFa00D29d378EDC57AA1006946F0fc6230a5E3288",
    "contractAddress": "0xb1f5125b52CE23D3763AC1C9ACEf0668825A66c0",
    "transactionIndex": 117,
    "gasUsed": "2311907",
    "logsBloom": "0x00000000000000000000000000000008000000000000000000000000000000000000000000000000100080000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0xc6bd2cc9de617dd127e8f6fc0ffcbcf0edfe7529c391b1f55228ef11eafbb7f0",
    "transactionHash": "0x669126daa957cf567430de4482e98bc7341f2ff2d20c385dd365a3dd7af2a768",
    "logs": [
      {
        "transactionIndex": 117,
        "blockNumber": 7825233,
        "transactionHash": "0x669126daa957cf567430de4482e98bc7341f2ff2d20c385dd365a3dd7af2a768",
        "address": "0xb1f5125b52CE23D3763AC1C9ACEf0668825A66c0",
        "topics": [
          "0x823e4a64a225e5e0cfa0d1aae07413331b43ea819eecd97f2cb0293ea048140d"
        ],
        "data": "0x0000000000000000000000000000000000000000000000000000000000015180",
        "logIndex": 188,
        "blockHash": "0xc6bd2cc9de617dd127e8f6fc0ffcbcf0edfe7529c391b1f55228ef11eafbb7f0"
      }
    ],
    "blockNumber": 7825233,
    "cumulativeGasUsed": "12365707",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "1000000000000000",
    1800,
    0,
    10000000000000,
    "0xF6C5640de593fEf76129F1F1A863F7ddc65776C9",
    "0x38f918D0E9F1b721EDaA41302E399fa1B79333a9",
    10000000000000
  ],
  "numDeployments": 4,
  "solcInputHash": "51b873e2d80b78ffb160c3bb515132de",
  "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\":\"_veaInboxArbToEthDevnet\",\"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\":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\"},{\"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\"},{\"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\":\"address\",\"name\":\"_devnetOperator\",\"type\":\"address\"}],\"name\":\"changeDevnetOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"_epoch\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_stateroot\",\"type\":\"bytes32\"}],\"name\":\"devnetAdvanceState\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"devnetOperator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"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 arbitrumSepolia to Sepolia. Note: This contract is deployed on Sepolia. Note: This contract is permissioned for developer testing (devnet).\",\"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.\"}},\"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.\"}},\"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.\"}}},\"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.\"}},\"changeDevnetOperator(address)\":{\"details\":\"Changes the devnet operator.\",\"params\":{\"_devnetOperator\":\"The new testnet operator.\"}},\"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.\",\"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.\",\"_veaInboxArbToEthDevnet\":\"The address of the inbox contract on Arbitrum.\"}},\"devnetAdvanceState(uint256,bytes32)\":{\"details\":\"Testnet operator utility function to claim, validate and withdraw.\",\"params\":{\"_epoch\":\"The epoch for which the claim is made.\",\"_stateroot\":\"The state root to claim.\"}},\"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 Bridger if their claim is not successfully challenged. 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/devnets/arbitrumToEth/VeaOutboxArbToEthDevnet.sol\":\"VeaOutboxArbToEthDevnet\"},\"evmVersion\":\"paris\",\"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        }\\n\\n        _claim.honest = Party.Claimer;\\n        claimHashes[_epoch] = hashClaim(_claim);\\n\\n        emit Verified(_epoch);\\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        }\\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        emit Verified(_epoch);\\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\":\"0x6383e84fd3d531b95493fe35f3158aaaa7361f1c378cf6e0fe473d049f19d1d2\",\"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/devnets/arbitrumToEth/VeaOutboxArbToEthDevnet.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 \\\"../../arbitrumToEth/VeaOutboxArbToEth.sol\\\";\\n\\n/// @dev Vea Outbox From arbitrumSepolia to Sepolia.\\n/// Note: This contract is deployed on Sepolia.\\n/// Note: This contract is permissioned for developer testing (devnet).\\ncontract VeaOutboxArbToEthDevnet is VeaOutboxArbToEth {\\n    address public devnetOperator; // permissioned devnet operator\\n\\n    /// @dev Requires that the sender is the devnet operator.\\n    modifier onlyByDevnetOperator() {\\n        require(devnetOperator == msg.sender);\\n        _;\\n    }\\n\\n    /// @dev Changes the devnet operator.\\n    /// @param _devnetOperator The new testnet operator.\\n    function changeDevnetOperator(address _devnetOperator) external onlyByDevnetOperator {\\n        require(msg.sender == devnetOperator, \\\"Invalid Testnet Operator\\\");\\n        devnetOperator = _devnetOperator;\\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) public payable override onlyByDevnetOperator {\\n        require(msg.value >= deposit, \\\"Insufficient claim deposit.\\\");\\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 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) public override onlyByDevnetOperator {\\n        require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\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 Sends the deposit back to the Bridger if their claim is not successfully challenged. Includes a portion of the Challenger's deposit if unsuccessfully challenged.\\n    /// @param _claim The claim associated with the epoch.\\n    /// @param _epoch The epoch associated with the claim deposit to withraw.\\n    function withdrawClaimDeposit(uint256 _epoch, Claim memory _claim) public override {\\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 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) public override OnlyBridgeRunning {\\n        require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n        require(_claim.challenger == address(0), \\\"Claim is challenged.\\\");\\n\\n        if (_epoch > latestVerifiedEpoch) {\\n            latestVerifiedEpoch = _epoch;\\n            stateRoot = _claim.stateRoot;\\n        }\\n\\n        _claim.honest = Party.Claimer;\\n        claimHashes[_epoch] = hashClaim(_claim);\\n\\n        emit Verified(_epoch);\\n    }\\n\\n    /// @dev Testnet operator utility function to claim, validate and withdraw.\\n    /// @param _epoch The epoch for which the claim is made.\\n    /// @param _stateroot The state root to claim.\\n    function devnetAdvanceState(uint256 _epoch, bytes32 _stateroot) external payable {\\n        claim(_epoch, _stateroot);\\n        Claim memory claim = 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        claim.timestampClaimed = uint32(block.timestamp);\\n        startVerification(_epoch, claim);\\n        claim.timestampVerification = uint32(block.timestamp);\\n        claim.blocknumberVerification = uint32(block.number);\\n        verifySnapshot(_epoch, claim);\\n        claim.honest = Party.Claimer;\\n        withdrawClaimDeposit(_epoch, claim);\\n    }\\n\\n    /// @dev Constructor.\\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 _veaInboxArbToEthDevnet 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 _veaInboxArbToEthDevnet,\\n        address _bridge,\\n        uint256 _maxMissingBlocks\\n    )\\n        VeaOutboxArbToEth(\\n            _deposit,\\n            _epochPeriod,\\n            _minChallengePeriod,\\n            _timeoutEpochs,\\n            _veaInboxArbToEthDevnet,\\n            _bridge,\\n            _maxMissingBlocks\\n        )\\n    {\\n        devnetOperator = msg.sender;\\n    }\\n}\\n\",\"keccak256\":\"0xa3a373420a43cd2fcea7cfdbf4cf87d1d61921bcdb71ed2f214a3b73ac6def7f\",\"license\":\"MIT\"},\"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": "0x6101a06040523480156200001257600080fd5b5060405162002c7538038062002c758339810160408190526200003591620002ee565b60c08790526101208690526101408590526101608490526001600160a01b0380841660a05282166080526101808190528686868686868662000076620000ee565b620000836002886200036c565b60e0819052620000958860026200038f565b620000a19190620003af565b6101005261012051600190620000b890426200036c565b620000c49190620003af565b6001555050600780546001600160a01b0319163317905550620004219a5050505050505050505050565b60006080516001600160a01b031663ee35f3276040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000131573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001579190620003c5565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa15801562000195573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001bb9190620003ea565b5092505050600454811115620002065760048190556040518181527f823e4a64a225e5e0cfa0d1aae07413331b43ea819eecd97f2cb0293ea048140d9060200160405180910390a150565b600454811015620002ce5760065415620002805760405162461bcd60e51b815260206004820152603160248201527f53657175656e636572206c696d697420646563726561736520726571756573746044820152701030b63932b0b23c903832b73234b7339760791b606482015260840160405180910390fd5b604080518082018252828152426020918201819052600584905560065590518281527f3b2dbb1656f3f4d178ea9682fda1179201413bca521502ceb89db37fcf4fa3b8910160405180910390a15b50565b80516001600160a01b0381168114620002e957600080fd5b919050565b600080600080600080600060e0888a0312156200030a57600080fd5b875196506020880151955060408801519450606088015193506200033160808901620002d1565b92506200034160a08901620002d1565b915060c0880151905092959891949750929550565b634e487b7160e01b600052601160045260246000fd5b6000826200038a57634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417620003a957620003a962000356565b92915050565b81810381811115620003a957620003a962000356565b600060208284031215620003d857600080fd5b620003e382620002d1565b9392505050565b600080600080608085870312156200040157600080fd5b505082516020840151604085015160609095015191969095509092509050565b60805160a05160c05160e0516101005161012051610140516101605161018051612703620005726000396000818161057d0152611e380152600081816105b1015281816109890152818161180c015281816119900152611b9c0152600081816106390152611dcc0152600081816105e5015281816109ad01528181610cb6015281816114f601528181611830015281816119b40152611bc00152600081816104c00152818161128701526113c00152600081816103ab01528181611234015261137801526000818161066d01528181610cf901528181610e6701528181610e940152818161141001528181611afa01528181611b6101528181611d0701528181611d7501528181611f2c015281816120ba01526120e70152600081816104740152610a970152600081816106ee0152818161086e01528181610a2801528181610ac1015261157701526127036000f3fe60806040526004361061020f5760003560e01c8063836e344b11610118578063b633b944116100a0578063df19e6ff1161006f578063df19e6ff146106af578063e78cea92146106dc578063e813a75514610710578063eedcf2a914610726578063fccc28131461073957600080fd5b8063b633b94414610607578063c2114a1614610627578063d0e30db01461065b578063da2b7bc41461068f57600080fd5b8063930f28af116100e7578063930f28af146105355780639588eca214610555578063aa22a1c61461056b578063b044397e1461059f578063b5b7a184146105d357600080fd5b8063836e344b146104ae5780638830dfbd146104e25780638a619a71146104f55780638ad3a8f71461051557600080fd5b80633ce43cfd1161019b57806349b4299e1161016a57806349b4299e146103ed5780634a439cfe1461040d578063541adcca1461042d5780635f43a47f1461044d57806369cd250d1461046257600080fd5b80633ce43cfd1461032c57806343b066d51461034c57806344df8e70146103995780634788cb38146103cd57600080fd5b8063222ae786116101e2578063222ae786146102935780632639c060146102b657806327ee6bdd146102e357806331d14457146102f957806331ddf7431461030c57600080fd5b806301139b6814610214578063051d1970146102295780630c63fa841461025e5780630f0adca514610273575b600080fd5b61022761022236600461222e565b61074e565b005b34801561023557600080fd5b50600554600654610244919082565b604080519283526020830191909152015b60405180910390f35b34801561026a57600080fd5b5061022761075d565b34801561027f57600080fd5b5061022761028e36600461225c565b610987565b34801561029f57600080fd5b506102a8610caf565b604051908152602001610255565b3480156102c257600080fd5b506102a86102d1366004612293565b60026020526000908152604090205481565b3480156102ef57600080fd5b506102a860015481565b6102276103073660046122ac565b610ce0565b34801561031857600080fd5b5061022761032736600461232f565b610edd565b34801561033857600080fd5b506102276103473660046123f1565b61117d565b34801561035857600080fd5b50610389610367366004612293565b600881901c600090815260036020526040902054600160ff9092161c81161490565b6040519015158152602001610255565b3480156103a557600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b3480156103d957600080fd5b506102276103e836600461222e565b6112c4565b3480156103f957600080fd5b5061022761040836600461222e565b611448565b34801561041957600080fd5b506102a8610428366004612293565b6114ef565b34801561043957600080fd5b506102a861044836600461242a565b611521565b34801561045957600080fd5b50610227611573565b34801561046e57600080fd5b506104967f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610255565b3480156104ba57600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b6102276104f036600461244d565b611767565b34801561050157600080fd5b50610227610510366004612490565b611777565b34801561052157600080fd5b50600754610496906001600160a01b031681565b34801561054157600080fd5b5061022761055036600461222e565b61180a565b34801561056157600080fd5b506102a860005481565b34801561057757600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b3480156105ab57600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b3480156105df57600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b34801561061357600080fd5b5061022761062236600461222e565b61198e565b34801561063357600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b34801561066757600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b34801561069b57600080fd5b506102276106aa36600461222e565b611b9a565b3480156106bb57600080fd5b506106cf6106ca36600461242a565b611dae565b60405161025591906124c3565b3480156106e857600080fd5b506104967f000000000000000000000000000000000000000000000000000000000000000081565b34801561071c57600080fd5b506102a860045481565b6102276107343660046122ac565b611e75565b34801561074557600080fd5b50610496600081565b610759828233611ef5565b5050565b6006546000036107c95760405162461bcd60e51b815260206004820152602c60248201527f4e6f2070656e64696e672073657175656e636572206c696d697420646563726560448201526b30b9b2903932b8bab2b9ba1760a11b60648201526084015b60405180910390fd5b6004546006546107d991906124f3565b42116108425760405162461bcd60e51b815260206004820152603260248201527f53657175656e636572206c696d697420646563726561736520726571756573746044820152711034b99039ba34b636103832b73234b7339760711b60648201526084016107c0565b6005805460009182905560068290556040805163ee35f32760e01b815290519192916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163ee35f3279160048083019260209291908290030181865afa1580156108b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dd9190612506565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa15801561091a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093e9190612523565b50925050508181036107595760048290556040518281527f823e4a64a225e5e0cfa0d1aae07413331b43ea819eecd97f2cb0293ea048140d906020015b60405180910390a15050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f000000000000000000000000000000000000000000000000000000000000000042816109da576109da612559565b04031115610a1d5760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b60448201526064016107c0565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a955760405162461bcd60e51b815260206004820181905260248201527f4e6f742066726f6d206e617469766520617262697472756d206272696467652e60448201526064016107c0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ab5d89436040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b419190612506565b6001600160a01b03166380648b026040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba29190612506565b6001600160a01b031614610bf15760405162461bcd60e51b81526020600482015260166024820152753b32b0a4b73137bc20b9312a37a2ba341037b7363c9760511b60448201526064016107c0565b60015483118015610c0157508115155b15610c1157600183905560008290555b610c1a81611521565b60008481526002602052604090205403610c77578051829003610c4357600160a0820152610c5e565b60c08101516001600160a01b031615610c5e57600260a08201525b610c6781611521565b6000848152600260205260409020555b6040518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a1505050565b6000610cdb7f00000000000000000000000000000000000000000000000000000000000000004261256f565b905090565b6007546001600160a01b03163314610cf757600080fd5b7f0000000000000000000000000000000000000000000000000000000000000000341015610d675760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e7420636c61696d206465706f7369742e000000000060448201526064016107c0565b80610d845760405162461bcd60e51b81526004016107c090612591565b60008281526002602052604090205415610dd65760405162461bcd60e51b815260206004820152601360248201527221b630b4b69030b63932b0b23c9036b0b2329760691b60448201526064016107c0565b6040805160e0810182528281523360208201524263ffffffff16918101919091526000606082018190526080820181905260a0820181905260c0820152610e1c90611521565b6000838152600260209081526040918290209290925551828152839133917fd95107f4584744c6c893a04c43058aadd1ce8aac8ca5d64140eaf277de6c1d57910160405180910390a37f0000000000000000000000000000000000000000000000000000000000000000341115610759576000610eb97f0000000000000000000000000000000000000000000000000000000000000000346125b9565b604051909150339082156108fc029083906000818181858888f15050505050505050565b60408510610f1f5760405162461bcd60e51b815260206004820152600f60248201526e283937b7b3103a37b7903637b7339760891b60448201526064016107c0565b600084848484604051602001610f3894939291906125cc565b604051602081830303815290604052805190602001209050806000526020600020905060005b86811015610fb8576000888883818110610f7a57610f7a61260e565b90506020020135905082811115610f9f57826000528060205260406000209250610faf565b8060005282602052604060002092505b50600101610f5e565b508060005414610ffb5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b60448201526064016107c0565b600885901c66ffffffffffffff1660008181526003602052604090205460ff87169080821c600116156110705760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792072656c6179656400000000000000000060448201526064016107c0565b6000838152600360205260408082206001851b84179055516001600160a01b038916906110a09089908990612624565b6000604051808303816000865af19150503d80600081146110dd576040519150601f19603f3d011682016040523d82523d6000602084013e6110e2565b606091505b50509050806111335760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2063616c6c20636f6e747261637400000000000000000060448201526064016107c0565b60405167ffffffffffffffff8a1681527f54303fab361bc52c2f1f56ace7351189582264f74ce47a6e7c3f478d64c429439060200160405180910390a15050505050505050505050565b61118f6104483683900383018361242a565b600083815260026020526040902054146111bb5760405162461bcd60e51b81526004016107c090612591565b60026111cd60c0830160a08401612634565b60028111156111de576111de6124ad565b1461121f5760405162461bcd60e51b815260206004820152601160248201527021b430b63632b733b2903330b4b632b21760791b60448201526064016107c0565b600082815260026020526040808220829055517f000000000000000000000000000000000000000000000000000000000000000080156108fc029183818181858288f15061127993505060e0840191505060c08301612490565b6001600160a01b03166108fc7f00000000000000000000000000000000000000000000000000000000000000009081150290604051600060405180830381858888f150505050505050565b6112cd81611521565b600083815260026020526040902054146112f95760405162461bcd60e51b81526004016107c090612591565b60018160a001516002811115611311576113116124ad565b1461134e5760405162461bcd60e51b815260206004820152600d60248201526c21b630b4b6903330b4b632b21760991b60448201526064016107c0565b60008281526002602052604081205560c08101516001600160a01b0316156113fa576040516000907f000000000000000000000000000000000000000000000000000000000000000080156108fc029183818181858288f150505060208301516040516001600160a01b0390911692507f000000000000000000000000000000000000000000000000000000000000000080156108fc029250906000818181858888f150505050505050565b60208101516040516001600160a01b03909116907f000000000000000000000000000000000000000000000000000000000000000080156108fc02916000818181858888f150505050505050565b6007546001600160a01b0316331461145f57600080fd5b61146881611521565b600083815260026020526040902054146114945760405162461bcd60e51b81526004016107c090612591565b63ffffffff4281166060830152431660808201526114b181611521565b60008381526002602052604080822092909255905183917f37b700b61b9b4710dddb0c3316b2be7ef6088ed4b1d7bfe0fb98be8f9a163e1691a25050565b600061151b7f00000000000000000000000000000000000000000000000000000000000000008361256f565b92915050565b80516020808301516040808501516060860151608087015160a088015160c0890151945160009861155698909796910161264f565b604051602081830303815290604052805190602001209050919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ee35f3276040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f79190612506565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa158015611634573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116589190612523565b50925050506004548111156116a25760048190556040518181527f823e4a64a225e5e0cfa0d1aae07413331b43ea819eecd97f2cb0293ea048140d9060200160405180910390a150565b60045481101561176457600654156117165760405162461bcd60e51b815260206004820152603160248201527f53657175656e636572206c696d697420646563726561736520726571756573746044820152701030b63932b0b23c903832b73234b7339760791b60648201526084016107c0565b604080518082018252828152426020918201819052600584905560065590518281527f3b2dbb1656f3f4d178ea9682fda1179201413bca521502ceb89db37fcf4fa3b8910160405180910390a15b50565b611772838383611ef5565b505050565b6007546001600160a01b0316331461178e57600080fd5b6007546001600160a01b031633146117e85760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420546573746e6574204f70657261746f72000000000000000060448201526064016107c0565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b7f00000000000000000000000000000000000000000000000000000000000000006001547f0000000000000000000000000000000000000000000000000000000000000000428161185d5761185d612559565b040311156118a05760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b60448201526064016107c0565b6118a981611521565b600083815260026020526040902054146118d55760405162461bcd60e51b81526004016107c090612591565b60c08101516001600160a01b0316156119275760405162461bcd60e51b815260206004820152601460248201527321b630b4b69034b99031b430b63632b733b2b21760611b60448201526064016107c0565b60015482111561193c57600182905580516000555b600160a082015261194c81611521565b60008381526002602090815260409182902092909255518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f7910161097b565b7f00000000000000000000000000000000000000000000000000000000000000006001547f000000000000000000000000000000000000000000000000000000000000000042816119e1576119e1612559565b040311611a225760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b60448201526064016107c0565b611a2b81611521565b60008381526002602052604090205414611a575760405162461bcd60e51b81526004016107c090612591565b60008160a001516002811115611a6f57611a6f6124ad565b14611aae5760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b60448201526064016107c0565b60c08101516001600160a01b0316156107595760208101516001600160a01b0316611b325760008281526002602052604080822082905560c083015190516001600160a01b03909116917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f150505050505050565b60c0810180516000909152611b4682611521565b50600083815260026020526040516001600160a01b038316917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f15050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611bed57611bed612559565b040311611c2e5760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b60448201526064016107c0565b611c3781611521565b60008381526002602052604090205414611c635760405162461bcd60e51b81526004016107c090612591565b60008160a001516002811115611c7b57611c7b6124ad565b14611cba5760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b60448201526064016107c0565b60208101516001600160a01b0316156107595760c08101516001600160a01b0316611d3f5760008281526002602090815260408083208390559083015190516001600160a01b03909116917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f150505050505050565b6020810180516000909152611d5382611521565b6000848152600260205260408082209290925590516001600160a01b038316917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f15050505050505050565b6000816060015163ffffffff16600003611dca57506002919050565b7f0000000000000000000000000000000000000000000000000000000000000000826060015163ffffffff1642031015611e0657506003919050565b6000600c836060015163ffffffff16420381611e2457611e24612559565b608085015163ffffffff16919004019050437f000000000000000000000000000000000000000000000000000000000000000081830311611e685760019250611e6d565b600092505b50505b919050565b611e7f8282610ce0565b6040805160e0810182528281523360208201524263ffffffff16918101919091526000606082018190526080820181905260a0820181905260c0820152611ec68382611448565b63ffffffff428116606083015243166080820152611ee4838261180a565b600160a082015261177283826112c4565b611efe82611521565b60008481526002602052604090205414611f2a5760405162461bcd60e51b81526004016107c090612591565b7f0000000000000000000000000000000000000000000000000000000000000000341015611f9a5760405162461bcd60e51b815260206004820152601f60248201527f496e73756666696369656e74206368616c6c656e6765206465706f7369742e0060448201526064016107c0565b60c08201516001600160a01b031615611ff55760405162461bcd60e51b815260206004820152601960248201527f436c61696d20616c7265616479206368616c6c656e6765642e0000000000000060448201526064016107c0565b60008260a00151600281111561200d5761200d6124ad565b1461205a5760405162461bcd60e51b815260206004820152601760248201527f436c61696d20616c72656164792076657269666965642e00000000000000000060448201526064016107c0565b6001600160a01b03811660c083015261207282611521565b6000848152600260205260408082209290925590516001600160a01b0383169185917fcfe09ca25f55d949baba5e280f5750c9ba4b9048fca5532f916067d433afe4d79190a37f000000000000000000000000000000000000000000000000000000000000000034111561177257600061210c7f0000000000000000000000000000000000000000000000000000000000000000346125b9565b604051909150339082156108fc029083906000818181858888f1505050505050505050565b6001600160a01b038116811461176457600080fd5b8035611e7081612131565b803563ffffffff81168114611e7057600080fd5b803560038110611e7057600080fd5b600060e0828403121561218657600080fd5b60405160e0810181811067ffffffffffffffff821117156121b757634e487b7160e01b600052604160045260246000fd5b604052823581529050806121cd60208401612146565b60208201526121de60408401612151565b60408201526121ef60608401612151565b606082015261220060808401612151565b608082015261221160a08401612165565b60a082015261222260c08401612146565b60c08201525092915050565b600080610100838503121561224257600080fd5b823591506122538460208501612174565b90509250929050565b6000806000610120848603121561227257600080fd5b833592506020840135915061228a8560408601612174565b90509250925092565b6000602082840312156122a557600080fd5b5035919050565b600080604083850312156122bf57600080fd5b50508035926020909101359150565b803567ffffffffffffffff81168114611e7057600080fd5b60008083601f8401126122f857600080fd5b50813567ffffffffffffffff81111561231057600080fd5b60208301915083602082850101111561232857600080fd5b9250929050565b6000806000806000806080878903121561234857600080fd5b863567ffffffffffffffff8082111561236057600080fd5b818901915089601f83011261237457600080fd5b81358181111561238357600080fd5b8a60208260051b850101111561239857600080fd5b602083019850809750506123ae60208a016122ce565b95506123bc60408a01612146565b945060608901359150808211156123d257600080fd5b506123df89828a016122e6565b979a9699509497509295939492505050565b60008082840361010081121561240657600080fd5b8335925060e0601f198201121561241c57600080fd5b506020830190509250929050565b600060e0828403121561243c57600080fd5b6124468383612174565b9392505050565b6000806000610120848603121561246357600080fd5b833592506124748560208601612174565b915061010084013561248581612131565b809150509250925092565b6000602082840312156124a257600080fd5b813561244681612131565b634e487b7160e01b600052602160045260246000fd5b60208101600483106124d7576124d76124ad565b91905290565b634e487b7160e01b600052601160045260246000fd5b8082018082111561151b5761151b6124dd565b60006020828403121561251857600080fd5b815161244681612131565b6000806000806080858703121561253957600080fd5b505082516020840151604085015160609095015191969095509092509050565b634e487b7160e01b600052601260045260246000fd5b60008261258c57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252600e908201526d24b73b30b634b21031b630b4b69760911b604082015260600190565b8181038181111561151b5761151b6124dd565b60c085901b6001600160c01b0319168152606084901b6bffffffffffffffffffffffff191660088201528183601c83013760009101601c019081529392505050565b634e487b7160e01b600052603260045260246000fd5b8183823760009101908152919050565b60006020828403121561264657600080fd5b61244682612165565b87815260006bffffffffffffffffffffffff19808960601b16602084015263ffffffff60e01b808960e01b166034850152808860e01b166038850152808760e01b16603c85015250600385106126a7576126a76124ad565b60f89490941b60408301525060609190911b90911660418201526055019594505050505056fea2646970667358221220c25a1686dbd415c1e7906703db39bd91d6cb555b1f09730ef3eec48bb3978c8964736f6c63430008180033",
  "deployedBytecode": "0x60806040526004361061020f5760003560e01c8063836e344b11610118578063b633b944116100a0578063df19e6ff1161006f578063df19e6ff146106af578063e78cea92146106dc578063e813a75514610710578063eedcf2a914610726578063fccc28131461073957600080fd5b8063b633b94414610607578063c2114a1614610627578063d0e30db01461065b578063da2b7bc41461068f57600080fd5b8063930f28af116100e7578063930f28af146105355780639588eca214610555578063aa22a1c61461056b578063b044397e1461059f578063b5b7a184146105d357600080fd5b8063836e344b146104ae5780638830dfbd146104e25780638a619a71146104f55780638ad3a8f71461051557600080fd5b80633ce43cfd1161019b57806349b4299e1161016a57806349b4299e146103ed5780634a439cfe1461040d578063541adcca1461042d5780635f43a47f1461044d57806369cd250d1461046257600080fd5b80633ce43cfd1461032c57806343b066d51461034c57806344df8e70146103995780634788cb38146103cd57600080fd5b8063222ae786116101e2578063222ae786146102935780632639c060146102b657806327ee6bdd146102e357806331d14457146102f957806331ddf7431461030c57600080fd5b806301139b6814610214578063051d1970146102295780630c63fa841461025e5780630f0adca514610273575b600080fd5b61022761022236600461222e565b61074e565b005b34801561023557600080fd5b50600554600654610244919082565b604080519283526020830191909152015b60405180910390f35b34801561026a57600080fd5b5061022761075d565b34801561027f57600080fd5b5061022761028e36600461225c565b610987565b34801561029f57600080fd5b506102a8610caf565b604051908152602001610255565b3480156102c257600080fd5b506102a86102d1366004612293565b60026020526000908152604090205481565b3480156102ef57600080fd5b506102a860015481565b6102276103073660046122ac565b610ce0565b34801561031857600080fd5b5061022761032736600461232f565b610edd565b34801561033857600080fd5b506102276103473660046123f1565b61117d565b34801561035857600080fd5b50610389610367366004612293565b600881901c600090815260036020526040902054600160ff9092161c81161490565b6040519015158152602001610255565b3480156103a557600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b3480156103d957600080fd5b506102276103e836600461222e565b6112c4565b3480156103f957600080fd5b5061022761040836600461222e565b611448565b34801561041957600080fd5b506102a8610428366004612293565b6114ef565b34801561043957600080fd5b506102a861044836600461242a565b611521565b34801561045957600080fd5b50610227611573565b34801561046e57600080fd5b506104967f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610255565b3480156104ba57600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b6102276104f036600461244d565b611767565b34801561050157600080fd5b50610227610510366004612490565b611777565b34801561052157600080fd5b50600754610496906001600160a01b031681565b34801561054157600080fd5b5061022761055036600461222e565b61180a565b34801561056157600080fd5b506102a860005481565b34801561057757600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b3480156105ab57600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b3480156105df57600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b34801561061357600080fd5b5061022761062236600461222e565b61198e565b34801561063357600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b34801561066757600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b34801561069b57600080fd5b506102276106aa36600461222e565b611b9a565b3480156106bb57600080fd5b506106cf6106ca36600461242a565b611dae565b60405161025591906124c3565b3480156106e857600080fd5b506104967f000000000000000000000000000000000000000000000000000000000000000081565b34801561071c57600080fd5b506102a860045481565b6102276107343660046122ac565b611e75565b34801561074557600080fd5b50610496600081565b610759828233611ef5565b5050565b6006546000036107c95760405162461bcd60e51b815260206004820152602c60248201527f4e6f2070656e64696e672073657175656e636572206c696d697420646563726560448201526b30b9b2903932b8bab2b9ba1760a11b60648201526084015b60405180910390fd5b6004546006546107d991906124f3565b42116108425760405162461bcd60e51b815260206004820152603260248201527f53657175656e636572206c696d697420646563726561736520726571756573746044820152711034b99039ba34b636103832b73234b7339760711b60648201526084016107c0565b6005805460009182905560068290556040805163ee35f32760e01b815290519192916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163ee35f3279160048083019260209291908290030181865afa1580156108b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dd9190612506565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa15801561091a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093e9190612523565b50925050508181036107595760048290556040518281527f823e4a64a225e5e0cfa0d1aae07413331b43ea819eecd97f2cb0293ea048140d906020015b60405180910390a15050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f000000000000000000000000000000000000000000000000000000000000000042816109da576109da612559565b04031115610a1d5760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b60448201526064016107c0565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a955760405162461bcd60e51b815260206004820181905260248201527f4e6f742066726f6d206e617469766520617262697472756d206272696467652e60448201526064016107c0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ab5d89436040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b419190612506565b6001600160a01b03166380648b026040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba29190612506565b6001600160a01b031614610bf15760405162461bcd60e51b81526020600482015260166024820152753b32b0a4b73137bc20b9312a37a2ba341037b7363c9760511b60448201526064016107c0565b60015483118015610c0157508115155b15610c1157600183905560008290555b610c1a81611521565b60008481526002602052604090205403610c77578051829003610c4357600160a0820152610c5e565b60c08101516001600160a01b031615610c5e57600260a08201525b610c6781611521565b6000848152600260205260409020555b6040518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a1505050565b6000610cdb7f00000000000000000000000000000000000000000000000000000000000000004261256f565b905090565b6007546001600160a01b03163314610cf757600080fd5b7f0000000000000000000000000000000000000000000000000000000000000000341015610d675760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e7420636c61696d206465706f7369742e000000000060448201526064016107c0565b80610d845760405162461bcd60e51b81526004016107c090612591565b60008281526002602052604090205415610dd65760405162461bcd60e51b815260206004820152601360248201527221b630b4b69030b63932b0b23c9036b0b2329760691b60448201526064016107c0565b6040805160e0810182528281523360208201524263ffffffff16918101919091526000606082018190526080820181905260a0820181905260c0820152610e1c90611521565b6000838152600260209081526040918290209290925551828152839133917fd95107f4584744c6c893a04c43058aadd1ce8aac8ca5d64140eaf277de6c1d57910160405180910390a37f0000000000000000000000000000000000000000000000000000000000000000341115610759576000610eb97f0000000000000000000000000000000000000000000000000000000000000000346125b9565b604051909150339082156108fc029083906000818181858888f15050505050505050565b60408510610f1f5760405162461bcd60e51b815260206004820152600f60248201526e283937b7b3103a37b7903637b7339760891b60448201526064016107c0565b600084848484604051602001610f3894939291906125cc565b604051602081830303815290604052805190602001209050806000526020600020905060005b86811015610fb8576000888883818110610f7a57610f7a61260e565b90506020020135905082811115610f9f57826000528060205260406000209250610faf565b8060005282602052604060002092505b50600101610f5e565b508060005414610ffb5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b60448201526064016107c0565b600885901c66ffffffffffffff1660008181526003602052604090205460ff87169080821c600116156110705760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792072656c6179656400000000000000000060448201526064016107c0565b6000838152600360205260408082206001851b84179055516001600160a01b038916906110a09089908990612624565b6000604051808303816000865af19150503d80600081146110dd576040519150601f19603f3d011682016040523d82523d6000602084013e6110e2565b606091505b50509050806111335760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2063616c6c20636f6e747261637400000000000000000060448201526064016107c0565b60405167ffffffffffffffff8a1681527f54303fab361bc52c2f1f56ace7351189582264f74ce47a6e7c3f478d64c429439060200160405180910390a15050505050505050505050565b61118f6104483683900383018361242a565b600083815260026020526040902054146111bb5760405162461bcd60e51b81526004016107c090612591565b60026111cd60c0830160a08401612634565b60028111156111de576111de6124ad565b1461121f5760405162461bcd60e51b815260206004820152601160248201527021b430b63632b733b2903330b4b632b21760791b60448201526064016107c0565b600082815260026020526040808220829055517f000000000000000000000000000000000000000000000000000000000000000080156108fc029183818181858288f15061127993505060e0840191505060c08301612490565b6001600160a01b03166108fc7f00000000000000000000000000000000000000000000000000000000000000009081150290604051600060405180830381858888f150505050505050565b6112cd81611521565b600083815260026020526040902054146112f95760405162461bcd60e51b81526004016107c090612591565b60018160a001516002811115611311576113116124ad565b1461134e5760405162461bcd60e51b815260206004820152600d60248201526c21b630b4b6903330b4b632b21760991b60448201526064016107c0565b60008281526002602052604081205560c08101516001600160a01b0316156113fa576040516000907f000000000000000000000000000000000000000000000000000000000000000080156108fc029183818181858288f150505060208301516040516001600160a01b0390911692507f000000000000000000000000000000000000000000000000000000000000000080156108fc029250906000818181858888f150505050505050565b60208101516040516001600160a01b03909116907f000000000000000000000000000000000000000000000000000000000000000080156108fc02916000818181858888f150505050505050565b6007546001600160a01b0316331461145f57600080fd5b61146881611521565b600083815260026020526040902054146114945760405162461bcd60e51b81526004016107c090612591565b63ffffffff4281166060830152431660808201526114b181611521565b60008381526002602052604080822092909255905183917f37b700b61b9b4710dddb0c3316b2be7ef6088ed4b1d7bfe0fb98be8f9a163e1691a25050565b600061151b7f00000000000000000000000000000000000000000000000000000000000000008361256f565b92915050565b80516020808301516040808501516060860151608087015160a088015160c0890151945160009861155698909796910161264f565b604051602081830303815290604052805190602001209050919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ee35f3276040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f79190612506565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa158015611634573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116589190612523565b50925050506004548111156116a25760048190556040518181527f823e4a64a225e5e0cfa0d1aae07413331b43ea819eecd97f2cb0293ea048140d9060200160405180910390a150565b60045481101561176457600654156117165760405162461bcd60e51b815260206004820152603160248201527f53657175656e636572206c696d697420646563726561736520726571756573746044820152701030b63932b0b23c903832b73234b7339760791b60648201526084016107c0565b604080518082018252828152426020918201819052600584905560065590518281527f3b2dbb1656f3f4d178ea9682fda1179201413bca521502ceb89db37fcf4fa3b8910160405180910390a15b50565b611772838383611ef5565b505050565b6007546001600160a01b0316331461178e57600080fd5b6007546001600160a01b031633146117e85760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420546573746e6574204f70657261746f72000000000000000060448201526064016107c0565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b7f00000000000000000000000000000000000000000000000000000000000000006001547f0000000000000000000000000000000000000000000000000000000000000000428161185d5761185d612559565b040311156118a05760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b60448201526064016107c0565b6118a981611521565b600083815260026020526040902054146118d55760405162461bcd60e51b81526004016107c090612591565b60c08101516001600160a01b0316156119275760405162461bcd60e51b815260206004820152601460248201527321b630b4b69034b99031b430b63632b733b2b21760611b60448201526064016107c0565b60015482111561193c57600182905580516000555b600160a082015261194c81611521565b60008381526002602090815260409182902092909255518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f7910161097b565b7f00000000000000000000000000000000000000000000000000000000000000006001547f000000000000000000000000000000000000000000000000000000000000000042816119e1576119e1612559565b040311611a225760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b60448201526064016107c0565b611a2b81611521565b60008381526002602052604090205414611a575760405162461bcd60e51b81526004016107c090612591565b60008160a001516002811115611a6f57611a6f6124ad565b14611aae5760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b60448201526064016107c0565b60c08101516001600160a01b0316156107595760208101516001600160a01b0316611b325760008281526002602052604080822082905560c083015190516001600160a01b03909116917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f150505050505050565b60c0810180516000909152611b4682611521565b50600083815260026020526040516001600160a01b038316917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f15050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611bed57611bed612559565b040311611c2e5760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b60448201526064016107c0565b611c3781611521565b60008381526002602052604090205414611c635760405162461bcd60e51b81526004016107c090612591565b60008160a001516002811115611c7b57611c7b6124ad565b14611cba5760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b60448201526064016107c0565b60208101516001600160a01b0316156107595760c08101516001600160a01b0316611d3f5760008281526002602090815260408083208390559083015190516001600160a01b03909116917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f150505050505050565b6020810180516000909152611d5382611521565b6000848152600260205260408082209290925590516001600160a01b038316917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f15050505050505050565b6000816060015163ffffffff16600003611dca57506002919050565b7f0000000000000000000000000000000000000000000000000000000000000000826060015163ffffffff1642031015611e0657506003919050565b6000600c836060015163ffffffff16420381611e2457611e24612559565b608085015163ffffffff16919004019050437f000000000000000000000000000000000000000000000000000000000000000081830311611e685760019250611e6d565b600092505b50505b919050565b611e7f8282610ce0565b6040805160e0810182528281523360208201524263ffffffff16918101919091526000606082018190526080820181905260a0820181905260c0820152611ec68382611448565b63ffffffff428116606083015243166080820152611ee4838261180a565b600160a082015261177283826112c4565b611efe82611521565b60008481526002602052604090205414611f2a5760405162461bcd60e51b81526004016107c090612591565b7f0000000000000000000000000000000000000000000000000000000000000000341015611f9a5760405162461bcd60e51b815260206004820152601f60248201527f496e73756666696369656e74206368616c6c656e6765206465706f7369742e0060448201526064016107c0565b60c08201516001600160a01b031615611ff55760405162461bcd60e51b815260206004820152601960248201527f436c61696d20616c7265616479206368616c6c656e6765642e0000000000000060448201526064016107c0565b60008260a00151600281111561200d5761200d6124ad565b1461205a5760405162461bcd60e51b815260206004820152601760248201527f436c61696d20616c72656164792076657269666965642e00000000000000000060448201526064016107c0565b6001600160a01b03811660c083015261207282611521565b6000848152600260205260408082209290925590516001600160a01b0383169185917fcfe09ca25f55d949baba5e280f5750c9ba4b9048fca5532f916067d433afe4d79190a37f000000000000000000000000000000000000000000000000000000000000000034111561177257600061210c7f0000000000000000000000000000000000000000000000000000000000000000346125b9565b604051909150339082156108fc029083906000818181858888f1505050505050505050565b6001600160a01b038116811461176457600080fd5b8035611e7081612131565b803563ffffffff81168114611e7057600080fd5b803560038110611e7057600080fd5b600060e0828403121561218657600080fd5b60405160e0810181811067ffffffffffffffff821117156121b757634e487b7160e01b600052604160045260246000fd5b604052823581529050806121cd60208401612146565b60208201526121de60408401612151565b60408201526121ef60608401612151565b606082015261220060808401612151565b608082015261221160a08401612165565b60a082015261222260c08401612146565b60c08201525092915050565b600080610100838503121561224257600080fd5b823591506122538460208501612174565b90509250929050565b6000806000610120848603121561227257600080fd5b833592506020840135915061228a8560408601612174565b90509250925092565b6000602082840312156122a557600080fd5b5035919050565b600080604083850312156122bf57600080fd5b50508035926020909101359150565b803567ffffffffffffffff81168114611e7057600080fd5b60008083601f8401126122f857600080fd5b50813567ffffffffffffffff81111561231057600080fd5b60208301915083602082850101111561232857600080fd5b9250929050565b6000806000806000806080878903121561234857600080fd5b863567ffffffffffffffff8082111561236057600080fd5b818901915089601f83011261237457600080fd5b81358181111561238357600080fd5b8a60208260051b850101111561239857600080fd5b602083019850809750506123ae60208a016122ce565b95506123bc60408a01612146565b945060608901359150808211156123d257600080fd5b506123df89828a016122e6565b979a9699509497509295939492505050565b60008082840361010081121561240657600080fd5b8335925060e0601f198201121561241c57600080fd5b506020830190509250929050565b600060e0828403121561243c57600080fd5b6124468383612174565b9392505050565b6000806000610120848603121561246357600080fd5b833592506124748560208601612174565b915061010084013561248581612131565b809150509250925092565b6000602082840312156124a257600080fd5b813561244681612131565b634e487b7160e01b600052602160045260246000fd5b60208101600483106124d7576124d76124ad565b91905290565b634e487b7160e01b600052601160045260246000fd5b8082018082111561151b5761151b6124dd565b60006020828403121561251857600080fd5b815161244681612131565b6000806000806080858703121561253957600080fd5b505082516020840151604085015160609095015191969095509092509050565b634e487b7160e01b600052601260045260246000fd5b60008261258c57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252600e908201526d24b73b30b634b21031b630b4b69760911b604082015260600190565b8181038181111561151b5761151b6124dd565b60c085901b6001600160c01b0319168152606084901b6bffffffffffffffffffffffff191660088201528183601c83013760009101601c019081529392505050565b634e487b7160e01b600052603260045260246000fd5b8183823760009101908152919050565b60006020828403121561264657600080fd5b61244682612165565b87815260006bffffffffffffffffffffffff19808960601b16602084015263ffffffff60e01b808960e01b166034850152808860e01b166038850152808760e01b16603c85015250600385106126a7576126a76124ad565b60f89490941b60408301525060609190911b90911660418201526055019594505050505056fea2646970667358221220c25a1686dbd415c1e7906703db39bd91d6cb555b1f09730ef3eec48bb3978c8964736f6c63430008180033",
  "devdoc": {
    "details": "Vea Outbox From arbitrumSepolia to Sepolia. Note: This contract is deployed on Sepolia. Note: This contract is permissioned for developer testing (devnet).",
    "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."
        }
      },
      "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."
        }
      },
      "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."
        }
      }
    },
    "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."
        }
      },
      "changeDevnetOperator(address)": {
        "details": "Changes the devnet operator.",
        "params": {
          "_devnetOperator": "The new testnet operator."
        }
      },
      "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.",
        "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.",
          "_veaInboxArbToEthDevnet": "The address of the inbox contract on Arbitrum."
        }
      },
      "devnetAdvanceState(uint256,bytes32)": {
        "details": "Testnet operator utility function to claim, validate and withdraw.",
        "params": {
          "_epoch": "The epoch for which the claim is made.",
          "_stateroot": "The state root to claim."
        }
      },
      "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 Bridger if their claim is not successfully challenged. 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": 38,
        "contract": "src/devnets/arbitrumToEth/VeaOutboxArbToEthDevnet.sol:VeaOutboxArbToEthDevnet",
        "label": "stateRoot",
        "offset": 0,
        "slot": "0",
        "type": "t_bytes32"
      },
      {
        "astId": 40,
        "contract": "src/devnets/arbitrumToEth/VeaOutboxArbToEthDevnet.sol:VeaOutboxArbToEthDevnet",
        "label": "latestVerifiedEpoch",
        "offset": 0,
        "slot": "1",
        "type": "t_uint256"
      },
      {
        "astId": 44,
        "contract": "src/devnets/arbitrumToEth/VeaOutboxArbToEthDevnet.sol:VeaOutboxArbToEthDevnet",
        "label": "claimHashes",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_uint256,t_bytes32)"
      },
      {
        "astId": 48,
        "contract": "src/devnets/arbitrumToEth/VeaOutboxArbToEthDevnet.sol:VeaOutboxArbToEthDevnet",
        "label": "relayed",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_uint256,t_bytes32)"
      },
      {
        "astId": 50,
        "contract": "src/devnets/arbitrumToEth/VeaOutboxArbToEthDevnet.sol:VeaOutboxArbToEthDevnet",
        "label": "sequencerDelayLimit",
        "offset": 0,
        "slot": "4",
        "type": "t_uint256"
      },
      {
        "astId": 53,
        "contract": "src/devnets/arbitrumToEth/VeaOutboxArbToEthDevnet.sol:VeaOutboxArbToEthDevnet",
        "label": "sequencerDelayLimitDecreaseRequest",
        "offset": 0,
        "slot": "5",
        "type": "t_struct(SequencerDelayLimitDecreaseRequest)58_storage"
      },
      {
        "astId": 3040,
        "contract": "src/devnets/arbitrumToEth/VeaOutboxArbToEthDevnet.sol:VeaOutboxArbToEthDevnet",
        "label": "devnetOperator",
        "offset": 0,
        "slot": "7",
        "type": "t_address"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "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)58_storage": {
        "encoding": "inplace",
        "label": "struct VeaOutboxArbToEth.SequencerDelayLimitDecreaseRequest",
        "members": [
          {
            "astId": 55,
            "contract": "src/devnets/arbitrumToEth/VeaOutboxArbToEthDevnet.sol:VeaOutboxArbToEthDevnet",
            "label": "requestedsequencerDelayLimit",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 57,
            "contract": "src/devnets/arbitrumToEth/VeaOutboxArbToEthDevnet.sol:VeaOutboxArbToEthDevnet",
            "label": "timestamp",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}
