{
  "address": "0xb78afF106DcB5fD0768a348a804bbc4DCacB3233",
  "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": "contract IAMB",
          "name": "_amb",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_routerArbToGnosis",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_sequencerDelayLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_maxMissingBlocks",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_routerChainId",
          "type": "uint256"
        },
        {
          "internalType": "contract IWETH",
          "name": "_weth",
          "type": "address"
        }
      ],
      "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": "_newSequencerDelayLimit",
          "type": "uint256"
        }
      ],
      "name": "SequencerDelayLimitUpdateReceived",
      "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": "amb",
      "outputs": [
        {
          "internalType": "contract IAMB",
          "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 VeaOutboxArbToGnosis.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": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "_stateRoot",
          "type": "bytes32"
        }
      ],
      "name": "claim",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "epoch",
          "type": "uint256"
        }
      ],
      "name": "claimHashes",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "deposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "depositPlusReward",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        }
      ],
      "name": "epochAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "epoch",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "epochNow",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "epoch",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "epochPeriod",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "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": [],
      "name": "routerArbToGnosis",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "routerChainId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "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": [
        {
          "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": "timestampDelayUpdated",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_newSequencerDelayLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_timestamp",
          "type": "uint256"
        }
      ],
      "name": "updateSequencerDelayLimit",
      "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": "verifySnapshot",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "weth",
      "outputs": [
        {
          "internalType": "contract IWETH",
          "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": "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": "0x1fcfabdb92e9d503ce196cb87042ab89ee66c39a95daaf08f1c561f59664778f",
  "receipt": {
    "to": null,
    "from": "0xFa00D29d378EDC57AA1006946F0fc6230a5E3288",
    "contractAddress": "0xb78afF106DcB5fD0768a348a804bbc4DCacB3233",
    "transactionIndex": 0,
    "gasUsed": "2292542",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x5d8db501d3be216b5c7f12129694d66e6b704cefaf0497939bcd4b87285910b6",
    "transactionHash": "0x1fcfabdb92e9d503ce196cb87042ab89ee66c39a95daaf08f1c561f59664778f",
    "logs": [],
    "blockNumber": 14598558,
    "cumulativeGasUsed": "2292542",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "200000000000000000",
    3600,
    10800,
    1000000,
    "0x8448E15d0e706C0298dECA99F0b4744030e59d7d",
    "0x66C85D0375b0CbD1bBeB4F7D5E73c181BAf8454e",
    86400,
    1000000,
    11155111,
    "0x8d74e5e4DA11629537C4575cB0f33b4F0Dfa42EB"
  ],
  "numDeployments": 2,
  "solcInputHash": "c9b5f40be4cc59cdaa11ec8b822d1bfe",
  "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\":\"contract IAMB\",\"name\":\"_amb\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_routerArbToGnosis\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerDelayLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxMissingBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_routerChainId\",\"type\":\"uint256\"},{\"internalType\":\"contract IWETH\",\"name\":\"_weth\",\"type\":\"address\"}],\"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\":\"_newSequencerDelayLimit\",\"type\":\"uint256\"}],\"name\":\"SequencerDelayLimitUpdateReceived\",\"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\":\"amb\",\"outputs\":[{\"internalType\":\"contract IAMB\",\"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 VeaOutboxArbToGnosis.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\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_stateRoot\",\"type\":\"bytes32\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"name\":\"claimHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositPlusReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"epochAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"epochNow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"epochPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"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\":[],\"name\":\"routerArbToGnosis\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"routerChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"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\":[{\"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\":\"timestampDelayUpdated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newSequencerDelayLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"updateSequencerDelayLimit\",\"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\":\"verifySnapshot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weth\",\"outputs\":[{\"internalType\":\"contract IWETH\",\"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\":\"withdrawChallengeDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawChallengerEscapeHatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawClaimDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawClaimerEscapeHatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Vea Outbox From Arbitrum to Gnosis. Note: This contract is deployed on Gnosis.\",\"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.\"}},\"SequencerDelayLimitUpdateReceived(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.\"}},\"claim(uint256,bytes32)\":{\"details\":\"Submit a claim about the _stateRoot at _epoch and submit a deposit.\",\"params\":{\"_epoch\":\"The epoch for which the claim is made.\",\"_stateRoot\":\"The state root to claim.\"}},\"constructor\":{\"details\":\"Constructor. Note: epochPeriod must match the VeaInboxArbToGnosis contract deployment on Arbitrum, since it's on a different chain, we can't read it and trust the deployer to set a correct value\",\"params\":{\"_amb\":\"The address of the AMB contract on Gnosis.\",\"_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.\",\"_routerArbToGnosis\":\"The address of the router on Ethereum that routes from Arbitrum to Gnosis.\",\"_routerChainId\":\"The chain id of the routerArbToGnosis.\",\"_sequencerDelayLimit\":\"The maximum delay in seconds that the Arbitrum sequencer can backdate transactions.\",\"_timeoutEpochs\":\"The epochs before the bridge is considered shutdown.\",\"_weth\":\"The address of the WETH contract on Gnosis.\"}},\"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.\"}},\"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 Gnosis 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(uint256,uint256)\":{\"details\":\"Set the sequencerDelayLimit by receiving a message from the AMB.\",\"params\":{\"_newSequencerDelayLimit\":\"The delaySeconds from the MaxTimeVariation struct in the Arbitrum Sequencer contract.\",\"_timestamp\":\"The timestamp of the message.\"}},\"verifySnapshot(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Resolves the optimistic claim for '_epoch'.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch of the optimistic claim.\"}},\"withdrawChallengeDeposit(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Sends the deposit back to the Challenger if successful. Includes a portion of the Bridger's deposit.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the challenge deposit to withraw.\"}},\"withdrawChallengerEscapeHatch(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"When bridge is shutdown, no claim disputes can be resolved. This allows the challenger to withdraw their deposit.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the claim deposit to withraw.\"}},\"withdrawClaimDeposit(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Sends the deposit back to the Claimer if successful. Includes a portion of the Challenger's deposit if unsuccessfully challenged.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the claim deposit to withraw.\"}},\"withdrawClaimerEscapeHatch(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"When bridge is shutdown, no claim disputes can be resolved. This allows the claimer to withdraw their deposit.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the claim deposit to withraw.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolveDisputedClaim(uint256,bytes32,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"notice\":\"Note: Access restricted to AMB.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/arbitrumToGnosis/VeaOutboxArbToGnosis.sol\":\"VeaOutboxArbToGnosis\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"src/arbitrumToGnosis/VeaOutboxArbToGnosis.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/gnosis-chain/IAMB.sol\\\";\\nimport \\\"../interfaces/outboxes/IVeaOutboxOnL1.sol\\\";\\nimport \\\"../interfaces/updaters/ISequencerDelayUpdatable.sol\\\";\\nimport \\\"../interfaces/tokens/gnosis/IWETH.sol\\\";\\n\\n/// @dev Vea Outbox From Arbitrum to Gnosis.\\n/// Note: This contract is deployed on Gnosis.\\ncontract VeaOutboxArbToGnosis is IVeaOutboxOnL1, ISequencerDelayUpdatable {\\n    // ************************************* //\\n    // *             Storage               * //\\n    // ************************************* //\\n\\n    IAMB public immutable amb; // The address of the AMB contract on Gnosis.\\n    address public immutable routerArbToGnosis; // The address of the router from Arbitrum to Gnosis on ethereum.\\n\\n    IWETH public immutable weth; // The address of the WETH contract on Gnosis.\\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    uint256 internal constant SLOT_TIME = 5; // Gnosis 5 second slot time\\n\\n    uint256 public immutable routerChainId; // Router chain id for authentication of messages from the AMB.\\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    uint256 public timestampDelayUpdated; // The timestamp of the last sequencer delay update.\\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 SequencerDelayLimitUpdateReceived(uint256 _newSequencerDelayLimit);\\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 VeaInboxArbToGnosis 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 _amb The address of the AMB contract on Gnosis.\\n    /// @param _routerArbToGnosis The address of the router on Ethereum that routes from Arbitrum to Gnosis.\\n    /// @param _sequencerDelayLimit The maximum delay in seconds that the Arbitrum sequencer can backdate transactions.\\n    /// @param _maxMissingBlocks The maximum number of blocks that can be missing in a challenge period.\\n    /// @param _routerChainId The chain id of the routerArbToGnosis.\\n    /// @param _weth The address of the WETH contract on Gnosis.\\n    constructor(\\n        uint256 _deposit,\\n        uint256 _epochPeriod,\\n        uint256 _minChallengePeriod,\\n        uint256 _timeoutEpochs,\\n        IAMB _amb,\\n        address _routerArbToGnosis,\\n        uint256 _sequencerDelayLimit,\\n        uint256 _maxMissingBlocks,\\n        uint256 _routerChainId,\\n        IWETH _weth\\n    ) {\\n        deposit = _deposit;\\n        // epochPeriod must match the VeaInboxArbToGnosis contract deployment epochPeriod value.\\n        epochPeriod = _epochPeriod;\\n        timeoutEpochs = _timeoutEpochs;\\n        minChallengePeriod = _minChallengePeriod;\\n        amb = _amb;\\n        routerArbToGnosis = _routerArbToGnosis;\\n        // This value is on another chain, so we can't read it, we trust the deployer to set a correct value.\\n        sequencerDelayLimit = _sequencerDelayLimit; // MaxTimeVariation.delaySeconds from the arbitrum sequencer inbox\\n        maxMissingBlocks = _maxMissingBlocks;\\n        routerChainId = _routerChainId;\\n        weth = _weth;\\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 Set the sequencerDelayLimit by receiving a message from the AMB.\\n    /// @param _newSequencerDelayLimit The delaySeconds from the MaxTimeVariation struct in the Arbitrum Sequencer contract.\\n    /// @param _timestamp The timestamp of the message.\\n    function updateSequencerDelayLimit(uint256 _newSequencerDelayLimit, uint256 _timestamp) external {\\n        require(msg.sender == address(amb), \\\"Not from bridge.\\\");\\n        require(bytes32(routerChainId) == amb.messageSourceChainId(), \\\"Invalid chain id.\\\");\\n        require(routerArbToGnosis == amb.messageSender(), \\\"Not from router.\\\");\\n        require(timestampDelayUpdated < _timestamp, \\\"Message is outdated.\\\");\\n\\n        if (sequencerDelayLimit != _newSequencerDelayLimit) {\\n            // If _newSequencerDelayLimit > timeout * epochPeriod, then the bridge will shutdown.\\n            sequencerDelayLimit = _newSequencerDelayLimit;\\n            timestampDelayUpdated = _timestamp;\\n            emit SequencerDelayLimitUpdateReceived(_newSequencerDelayLimit);\\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 virtual {\\n        require(weth.transferFrom(msg.sender, address(this), deposit), \\\"Failed WETH transfer.\\\");\\n        unchecked {\\n            require(_epoch == block.timestamp / epochPeriod - 1, \\\"Epoch has not yet passed.\\\");\\n        }\\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\\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 {\\n        require(weth.transferFrom(msg.sender, address(this), deposit), \\\"Failed WETH transfer.\\\");\\n        require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n        require(_claim.challenger == address(0), \\\"Claim already challenged.\\\");\\n        require(_claim.honest == Party.None, \\\"Claim already verified.\\\");\\n\\n        _claim.challenger = msg.sender;\\n        claimHashes[_epoch] = hashClaim(_claim);\\n\\n        emit Challenged(_epoch, msg.sender);\\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 AMB.\\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        // Ethereum -> Gnosis message authentication with the AMB, the canonical Ethereum <-> Gnosis bridge.\\n        // https://docs.tokenbridge.net/amb-bridge/development-of-a-cross-chain-application/how-to-develop-xchain-apps-by-amb#receive-a-method-call-from-the-amb-bridge\\n\\n        require(msg.sender == address(amb), \\\"Not from native Gnosis AMB bridge.\\\");\\n        require(bytes32(routerChainId) == amb.messageSourceChainId(), \\\"Invalid chain id.\\\");\\n        require(routerArbToGnosis == amb.messageSender(), \\\"Not from router.\\\");\\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 Gnosis 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            weth.burn(burn); // no return value to check\\n            require(weth.transfer(_claim.claimer, depositPlusReward), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n        } else {\\n            require(weth.transfer(_claim.claimer, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\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        weth.burn(burn); // no return value to check\\n        require(weth.transfer(_claim.challenger, depositPlusReward), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\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                require(weth.transfer(_claim.claimer, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n            } else {\\n                address claimer = _claim.claimer;\\n                _claim.claimer = address(0);\\n                claimHashes[_epoch] = hashClaim(_claim);\\n                require(weth.transfer(claimer, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\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                require(weth.transfer(_claim.challenger, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n            } else {\\n                address challenger = _claim.challenger;\\n                _claim.challenger = address(0);\\n                claimHashes[_epoch] == hashClaim(_claim);\\n                require(weth.transfer(challenger, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\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\":\"0x783cb745dcd07b3576146a1649dfe93f3fdba1a9d80b5ee36f331141bd1e12f4\",\"license\":\"MIT\"},\"src/canonical/gnosis-chain/IAMB.sol\":{\"content\":\"// https://docs.gnosischain.com/bridges/tokenbridge/amb-bridge#gnosis\\n// https://github.com/omni/tokenbridge-contracts/blob/908a48107919d4ab127f9af07d44d47eac91547e/contracts/interfaces/IAMB.sol\\n// interface is pruned for relevant function stubs\\n\\npragma solidity 0.8.24;\\n\\ninterface IAMB {\\n    function requireToPassMessage(address _contract, bytes memory _data, uint256 _gas) external returns (bytes32);\\n\\n    function maxGasPerTx() external view returns (uint256);\\n\\n    function messageSender() external view returns (address);\\n\\n    function messageSourceChainId() external view returns (bytes32);\\n\\n    event AffirmationCompleted(\\n        address indexed sender,\\n        address indexed executor,\\n        bytes32 indexed messageId,\\n        bool status\\n    );\\n}\\n\",\"keccak256\":\"0x2639860b13972492cc59610e95b54e7d3e75cacb2dcdacf07bb2d52c2b183d67\"},\"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/tokens/gnosis/IWETH.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/5daaf60d11ee2075260d0f3adfb22b1c536db983/contracts/token/ERC20/StandardBurnableToken.sol\\n// implementation: https://gnosisscan.io/address/0xf8d1677c8a0c961938bf2f9adc3f3cfda759a9d9#code\\n// proxy: https://gnosisscan.io/token/0x6a023ccd1ff6f2045c3309768ead9e68f978f6e1#readProxyContract\\n\\n/**\\n * @title Standard Burnable Token\\n * @dev Token that can be irreversibly burned (destroyed).\\n */\\ninterface IWETH {\\n    /**\\n     * @dev Burns a specific amount of tokens.\\n     * @param _value The amount of token to be burned.\\n     */\\n    function burn(uint256 _value) external;\\n\\n    /**\\n     * @dev Gets the balance of the specified address.\\n     * @param _owner The address to query the the balance of.\\n     * @return An uint256 representing the amount owned by the passed address.\\n     */\\n    function balanceOf(address _owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Transfer tokens from one address to another\\n     * @param _from address The address which you want to send tokens from\\n     * @param _to address The address which you want to transfer to\\n     * @param _value uint256 the amount of tokens to be transferred\\n     */\\n    function transferFrom(address _from, address _to, uint256 _value) external returns (bool);\\n\\n    /**\\n     * @dev Transfer token for a specified address\\n     * @param _to The address to transfer to.\\n     * @param _value The amount to be transferred.\\n     */\\n    function transfer(address _to, uint256 _value) external returns (bool);\\n\\n    /**\\n     * @dev Function to check the amount of tokens that an owner allowed to a spender.\\n     * @param _owner address The address which owns the funds.\\n     * @param _spender address The address which will spend the funds.\\n     * @return A uint256 specifying the amount of tokens still available for the spender.\\n     */\\n    function allowance(address _owner, address _spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.\\n     * Beware that changing an allowance with this method brings the risk that someone may use both the old\\n     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this\\n     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     * @param _spender The address which will spend the funds.\\n     * @param _value The amount of tokens to be spent.\\n     */\\n    function approve(address _spender, uint256 _value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xbdda7697ab9595ad33056b937c120f23ab64bd2aac8c2f7e54bf3afd2cdd7a31\",\"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\"},\"src/interfaces/updaters/ISequencerDelayUpdatable.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\\n/// @dev Interface of a contract which is updatable, receiving parameter updates from an L1 contract through a cross-chain call.\\n/// @dev eg. Arbitrum (L2) -> Ethereum (L1) -> Gnosis (L1), the veaOutbox on Gnosis will be an ISequencerDelayUpdatable contract which receives updates from the router on Ethereum.\\ninterface ISequencerDelayUpdatable {\\n    /// @dev Updates the sequencer limit.\\n    /// Note: Access restricted to ensure the argument is passed from the Sequencer contract.\\n    /// @param _newSequencerDelayLimit The delaySeconds from the MaxTimeVariation struct in the Arbitrum Sequencer contract.\\n    /// @param _timestamp The timestamp of the message.\\n    function updateSequencerDelayLimit(uint256 _newSequencerDelayLimit, uint256 _timestamp) external;\\n}\\n\",\"keccak256\":\"0x95ca3cc0dfaddee5c94a7e6b68bb9a90ce6d1b9cdd3b59241f5b1b5831ed89ec\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x6101e06040523480156200001257600080fd5b5060405162002b7d38038062002b7d8339810160408190526200003591620000f2565b60e08a90526101608990526101a08790526101808890526001600160a01b0380871660805285811660a05260048590556101c0849052610140839052811660c0526200008360028b620001a3565b610100819052620000968b6002620001c6565b620000a29190620001e6565b6101205261016051600190620000b99042620001a3565b620000c59190620001e6565b60015550620001fc98505050505050505050565b6001600160a01b0381168114620000ef57600080fd5b50565b6000806000806000806000806000806101408b8d0312156200011357600080fd5b8a51995060208b0151985060408b0151975060608b0151965060808b01516200013c81620000d9565b60a08c01519096506200014f81620000d9565b8095505060c08b0151935060e08b015192506101008b015191506101208b01516200017a81620000d9565b809150509295989b9194979a5092959850565b634e487b7160e01b600052601160045260246000fd5b600082620001c157634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417620001e057620001e06200018d565b92915050565b81810381811115620001e057620001e06200018d565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516127bf620003be6000396000818161043e01526121bc0152600081816104650152818161079401528181611a1601528181611c030152611ec80152600081816104c6015261215001526000818161048c015281816107b801528181610b4901528181610f21015281816117e90152818161199701528181611a3a01528181611c270152611eec0152600081816103fb0152818161092f0152610c620152600081816103d401526114f30152600081816103580152818161140201526116560152600081816104ed0152818161058d01528181610e660152818161178601528181611d7c01528181611e110152818161204101526120dd0152600081816102f1015281816105b301528181610e8c01528181611428015281816114940152818161167c015281816116e80152818161172b01528181611da201528181611e3701528181612067015261210301526000818161051401528181610a1c0152610d4f01526000818161022201528181610833015281816108ad0152818161099101528181610b7e01528181610be00152610cc401526127bf6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063541adcca1161010f578063b5b7a184116100a2578063d5e6a9df11610071578063d5e6a9df1461050f578063da2b7bc414610536578063df19e6ff14610549578063e813a7551461056957600080fd5b8063b5b7a18414610487578063b633b944146104ae578063c2114a16146104c1578063d0e30db0146104e857600080fd5b8063930f28af116100de578063930f28af1461041d5780639588eca214610430578063aa22a1c614610439578063b044397e1461046057600080fd5b8063541adcca146103b35780637ffc2a6e146103c6578063836e344b146103cf5780638d96fdea146103f657600080fd5b806331ddf7431161018757806344df8e701161015657806344df8e70146103535780634788cb381461037a57806349b4299e1461038d5780634a439cfe146103a057600080fd5b806331ddf743146102c65780633ce43cfd146102d95780633fc8cef3146102ec57806343b066d51461031357600080fd5b80632639c060116101c35780632639c0601461027757806327ee6bdd146102975780632c192519146102a057806331d14457146102b357600080fd5b806301139b68146101f55780630f0adca51461020a5780631062b39a1461021d578063222ae78614610261575b600080fd5b6102086102033660046122f9565b610572565b005b610208610218366004612327565b610792565b6102447f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610269610b42565b604051908152602001610258565b61026961028536600461235e565b60026020526000908152604090205481565b61026960015481565b6102086102ae366004612377565b610b73565b6102086102c1366004612377565b610e4b565b6102086102d43660046123fa565b6110a0565b6102086102e73660046124bc565b611340565b6102447f000000000000000000000000000000000000000000000000000000000000000081565b61034361032136600461235e565b600881901c600090815260036020526040902054600160ff9092161c81161490565b6040519015158152602001610258565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b6102086103883660046124bc565b61157a565b61020861039b3660046122f9565b6117b2565b6102696103ae36600461235e565b611990565b6102696103c13660046124f5565b6119c2565b61026960055481565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b61020861042b3660046122f9565b611a14565b61026960005481565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b6102086104bc3660046122f9565b611c01565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b6102447f000000000000000000000000000000000000000000000000000000000000000081565b6102086105443660046122f9565b611ec6565b61055c6105573660046124f5565b612132565b604051610258919061252e565b61026960045481565b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af1158015610604573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106289190612548565b61064d5760405162461bcd60e51b81526004016106449061256a565b60405180910390fd5b610656816119c2565b600083815260026020526040902054146106825760405162461bcd60e51b815260040161064490612599565b60c08101516001600160a01b0316156106dd5760405162461bcd60e51b815260206004820152601960248201527f436c61696d20616c7265616479206368616c6c656e6765642e000000000000006044820152606401610644565b60008160a0015160028111156106f5576106f5612518565b146107425760405162461bcd60e51b815260206004820152601760248201527f436c61696d20616c72656164792076657269666965642e0000000000000000006044820152606401610644565b3360c0820152610751816119c2565b600083815260026020526040808220929092559051339184917fcfe09ca25f55d949baba5e280f5750c9ba4b9048fca5532f916067d433afe4d79190a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f000000000000000000000000000000000000000000000000000000000000000042816107e5576107e56125c1565b040311156108285760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b6044820152606401610644565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ab5760405162461bcd60e51b815260206004820152602260248201527f4e6f742066726f6d206e617469766520476e6f73697320414d42206272696467604482015261329760f11b6064820152608401610644565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092d91906125d7565b7f00000000000000000000000000000000000000000000000000000000000000001461098f5760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b6044820152606401610644565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1191906125f0565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610a845760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b6044820152606401610644565b60015483118015610a9457508115155b15610aa457600183905560008290555b610aad816119c2565b60008481526002602052604090205403610b0a578051829003610ad657600160a0820152610af1565b60c08101516001600160a01b031615610af157600260a08201525b610afa816119c2565b6000848152600260205260409020555b6040518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a1505050565b6000610b6e7f000000000000000000000000000000000000000000000000000000000000000042612623565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bde5760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b690313934b233b29760811b6044820152606401610644565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6091906125d7565b7f000000000000000000000000000000000000000000000000000000000000000014610cc25760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b6044820152606401610644565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4491906125f0565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610db75760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b6044820152606401610644565b8060055410610dff5760405162461bcd60e51b815260206004820152601460248201527326b2b9b9b0b3b29034b99037baba3230ba32b21760611b6044820152606401610644565b8160045414610e4757600482905560058190556040518281527f9c5113f22fcac086268c71488477822578ad93bd46c1993c9ce908d65e6fb2fe906020015b60405180910390a15b5050565b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af1158015610edd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f019190612548565b610f1d5760405162461bcd60e51b81526004016106449061256a565b60017f00000000000000000000000000000000000000000000000000000000000000004281610f4e57610f4e6125c1565b04038214610f9e5760405162461bcd60e51b815260206004820152601960248201527f45706f636820686173206e6f7420796574207061737365642e000000000000006044820152606401610644565b80610fbb5760405162461bcd60e51b815260040161064490612599565b6000828152600260205260409020541561100d5760405162461bcd60e51b815260206004820152601360248201527221b630b4b69030b63932b0b23c9036b0b2329760691b6044820152606401610644565b6040805160e0810182528281523360208201524263ffffffff16918101919091526000606082018190526080820181905260a0820181905260c0820152611053906119c2565b6000838152600260209081526040918290209290925551828152839133917fd95107f4584744c6c893a04c43058aadd1ce8aac8ca5d64140eaf277de6c1d57910160405180910390a35050565b604085106110e25760405162461bcd60e51b815260206004820152600f60248201526e283937b7b3103a37b7903637b7339760891b6044820152606401610644565b6000848484846040516020016110fb9493929190612645565b604051602081830303815290604052805190602001209050806000526020600020905060005b8681101561117b57600088888381811061113d5761113d612687565b9050602002013590508281111561116257826000528060205260406000209250611172565b8060005282602052604060002092505b50600101611121565b5080600054146111be5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b6044820152606401610644565b600885901c66ffffffffffffff1660008181526003602052604090205460ff87169080821c600116156112335760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792072656c617965640000000000000000006044820152606401610644565b6000838152600360205260408082206001851b84179055516001600160a01b03891690611263908990899061269d565b6000604051808303816000865af19150503d80600081146112a0576040519150601f19603f3d011682016040523d82523d6000602084013e6112a5565b606091505b50509050806112f65760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2063616c6c20636f6e74726163740000000000000000006044820152606401610644565b60405167ffffffffffffffff8a1681527f54303fab361bc52c2f1f56ace7351189582264f74ce47a6e7c3f478d64c429439060200160405180910390a15050505050505050505050565b6113526103c1368390038301836124f5565b6000838152600260205260409020541461137e5760405162461bcd60e51b815260040161064490612599565b600261139060c0830160a084016126ad565b60028111156113a1576113a1612518565b146113e25760405162461bcd60e51b815260206004820152601160248201527021b430b63632b733b2903330b4b632b21760791b6044820152606401610644565b6000828152600260205260408082209190915551630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b15801561147457600080fd5b505af1158015611488573d6000803e3d6000fd5b50506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063a9059cbb90506114cd60e0840160c085016126c8565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201527f000000000000000000000000000000000000000000000000000000000000000060248201526044015b6020604051808303816000875af115801561153a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155e9190612548565b610e475760405162461bcd60e51b81526004016106449061256a565b61158c6103c1368390038301836124f5565b600083815260026020526040902054146115b85760405162461bcd60e51b815260040161064490612599565b60016115ca60c0830160a084016126ad565b60028111156115db576115db612518565b146116185760405162461bcd60e51b815260206004820152600d60248201526c21b630b4b6903330b4b632b21760991b6044820152606401610644565b600082815260026020526040812081905561163960e0830160c084016126c8565b6001600160a01b03161461172157604051630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b1580156116c857600080fd5b505af11580156116dc573d6000803e3d6000fd5b50506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063a9059cbb90506114cd60408401602085016126c8565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a9059cbb61176060408401602085016126c8565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201527f0000000000000000000000000000000000000000000000000000000000000000602482015260440161151b565b6117bb816119c2565b600083815260026020526040902054146117e75760405162461bcd60e51b815260040161064490612599565b7f000000000000000000000000000000000000000000000000000000000000000060045461181591906126e5565b604082015161182a9063ffffffff16426126f8565b101561188d5760405162461bcd60e51b815260206004820152602c60248201527f436c61696d206d75737420776169742061746c65617374206d61784c3253746160448201526b3a32a9bcb731a232b630bc9760a11b6064820152608401610644565b600061189882612132565b905060028160038111156118ae576118ae612518565b14806118cb575060008160038111156118c9576118c9612518565b145b6119345760405162461bcd60e51b815260206004820152603460248201527f436c61696d20766572696669636174696f6e20696e2070726f6772657373206f604482015273391030b63932b0b23c9031b7b6b83632ba32b21760611b6064820152608401610644565b63ffffffff428116606084015243166080830152611951826119c2565b60008481526002602052604080822092909255905184917f37b700b61b9b4710dddb0c3316b2be7ef6088ed4b1d7bfe0fb98be8f9a163e1691a2505050565b60006119bc7f000000000000000000000000000000000000000000000000000000000000000083612623565b92915050565b80516020808301516040808501516060860151608087015160a088015160c089015194516000986119f798909796910161270b565b604051602081830303815290604052805190602001209050919050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611a6757611a676125c1565b04031115611aaa5760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b6044820152606401610644565b611ab3816119c2565b60008381526002602052604090205414611adf5760405162461bcd60e51b815260040161064490612599565b60c08101516001600160a01b031615611b315760405162461bcd60e51b815260206004820152601460248201527321b630b4b69034b99031b430b63632b733b2b21760611b6044820152606401610644565b6001611b3c82612132565b6003811115611b4d57611b4d612518565b14611b9a5760405162461bcd60e51b815260206004820152601b60248201527f43656e736f72736869702074657374206e6f74207061737365642e00000000006044820152606401610644565b600154821115611baf57600182905580516000555b600160a0820152611bbf816119c2565b60008381526002602090815260409182902092909255518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79101610e3e565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611c5457611c546125c1565b040311611c955760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b6044820152606401610644565b611c9e816119c2565b60008381526002602052604090205414611cca5760405162461bcd60e51b815260040161064490612599565b60008160a001516002811115611ce257611ce2612518565b14611d215760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b6044820152606401610644565b60c08101516001600160a01b031615610e475760208101516001600160a01b0316611dd3576000828152600260205260408082209190915560c0820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb9060440161151b565b60c0810180516000909152611de7826119c2565b506000839052600260205260405163a9059cbb60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044015b6020604051808303816000875af1158015611e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea59190612548565b611ec15760405162461bcd60e51b81526004016106449061256a565b505050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611f1957611f196125c1565b040311611f5a5760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b6044820152606401610644565b611f63816119c2565b60008381526002602052604090205414611f8f5760405162461bcd60e51b815260040161064490612599565b60008160a001516002811115611fa757611fa7612518565b14611fe65760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b6044820152606401610644565b60208101516001600160a01b031615610e475760c08101516001600160a01b031661209857600082815260026020908152604080832092909255820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb9060440161151b565b60208101805160009091526120ac826119c2565b60008481526002602052604090819020919091555163a9059cbb60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401611e62565b6000816060015163ffffffff1660000361214e57506002919050565b7f0000000000000000000000000000000000000000000000000000000000000000826060015163ffffffff164203101561218a57506003919050565b60006005836060015163ffffffff164203816121a8576121a86125c1565b608085015163ffffffff16919004019050437f0000000000000000000000000000000000000000000000000000000000000000818303116121ec57600192506121f1565b600092505b50505b919050565b6001600160a01b038116811461220e57600080fd5b50565b80356121f4816121f9565b803563ffffffff811681146121f457600080fd5b8035600381106121f457600080fd5b600060e0828403121561225157600080fd5b60405160e0810181811067ffffffffffffffff8211171561228257634e487b7160e01b600052604160045260246000fd5b6040528235815290508061229860208401612211565b60208201526122a96040840161221c565b60408201526122ba6060840161221c565b60608201526122cb6080840161221c565b60808201526122dc60a08401612230565b60a08201526122ed60c08401612211565b60c08201525092915050565b600080610100838503121561230d57600080fd5b8235915061231e846020850161223f565b90509250929050565b6000806000610120848603121561233d57600080fd5b8335925060208401359150612355856040860161223f565b90509250925092565b60006020828403121561237057600080fd5b5035919050565b6000806040838503121561238a57600080fd5b50508035926020909101359150565b803567ffffffffffffffff811681146121f457600080fd5b60008083601f8401126123c357600080fd5b50813567ffffffffffffffff8111156123db57600080fd5b6020830191508360208285010111156123f357600080fd5b9250929050565b6000806000806000806080878903121561241357600080fd5b863567ffffffffffffffff8082111561242b57600080fd5b818901915089601f83011261243f57600080fd5b81358181111561244e57600080fd5b8a60208260051b850101111561246357600080fd5b6020830198508097505061247960208a01612399565b955061248760408a01612211565b9450606089013591508082111561249d57600080fd5b506124aa89828a016123b1565b979a9699509497509295939492505050565b6000808284036101008112156124d157600080fd5b8335925060e0601f19820112156124e757600080fd5b506020830190509250929050565b600060e0828403121561250757600080fd5b612511838361223f565b9392505050565b634e487b7160e01b600052602160045260246000fd5b602081016004831061254257612542612518565b91905290565b60006020828403121561255a57600080fd5b8151801515811461251157600080fd5b6020808252601590820152742330b4b632b2102ba2aa24103a3930b739b332b91760591b604082015260600190565b6020808252600e908201526d24b73b30b634b21031b630b4b69760911b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b6000602082840312156125e957600080fd5b5051919050565b60006020828403121561260257600080fd5b8151612511816121f9565b634e487b7160e01b600052601160045260246000fd5b60008261264057634e487b7160e01b600052601260045260246000fd5b500490565b60c085901b6001600160c01b0319168152606084901b6bffffffffffffffffffffffff191660088201528183601c83013760009101601c019081529392505050565b634e487b7160e01b600052603260045260246000fd5b8183823760009101908152919050565b6000602082840312156126bf57600080fd5b61251182612230565b6000602082840312156126da57600080fd5b8135612511816121f9565b808201808211156119bc576119bc61260d565b818103818111156119bc576119bc61260d565b87815260006bffffffffffffffffffffffff19808960601b16602084015263ffffffff60e01b808960e01b166034850152808860e01b166038850152808760e01b16603c850152506003851061276357612763612518565b60f89490941b60408301525060609190911b90911660418201526055019594505050505056fea26469706673582212209b11a25fb4974c5d0ee8cd0f9f676d4ca630a99a1ca8dc205e52447c79afef4b64736f6c63430008180033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c8063541adcca1161010f578063b5b7a184116100a2578063d5e6a9df11610071578063d5e6a9df1461050f578063da2b7bc414610536578063df19e6ff14610549578063e813a7551461056957600080fd5b8063b5b7a18414610487578063b633b944146104ae578063c2114a16146104c1578063d0e30db0146104e857600080fd5b8063930f28af116100de578063930f28af1461041d5780639588eca214610430578063aa22a1c614610439578063b044397e1461046057600080fd5b8063541adcca146103b35780637ffc2a6e146103c6578063836e344b146103cf5780638d96fdea146103f657600080fd5b806331ddf7431161018757806344df8e701161015657806344df8e70146103535780634788cb381461037a57806349b4299e1461038d5780634a439cfe146103a057600080fd5b806331ddf743146102c65780633ce43cfd146102d95780633fc8cef3146102ec57806343b066d51461031357600080fd5b80632639c060116101c35780632639c0601461027757806327ee6bdd146102975780632c192519146102a057806331d14457146102b357600080fd5b806301139b68146101f55780630f0adca51461020a5780631062b39a1461021d578063222ae78614610261575b600080fd5b6102086102033660046122f9565b610572565b005b610208610218366004612327565b610792565b6102447f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610269610b42565b604051908152602001610258565b61026961028536600461235e565b60026020526000908152604090205481565b61026960015481565b6102086102ae366004612377565b610b73565b6102086102c1366004612377565b610e4b565b6102086102d43660046123fa565b6110a0565b6102086102e73660046124bc565b611340565b6102447f000000000000000000000000000000000000000000000000000000000000000081565b61034361032136600461235e565b600881901c600090815260036020526040902054600160ff9092161c81161490565b6040519015158152602001610258565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b6102086103883660046124bc565b61157a565b61020861039b3660046122f9565b6117b2565b6102696103ae36600461235e565b611990565b6102696103c13660046124f5565b6119c2565b61026960055481565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b61020861042b3660046122f9565b611a14565b61026960005481565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b6102086104bc3660046122f9565b611c01565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b6102697f000000000000000000000000000000000000000000000000000000000000000081565b6102447f000000000000000000000000000000000000000000000000000000000000000081565b6102086105443660046122f9565b611ec6565b61055c6105573660046124f5565b612132565b604051610258919061252e565b61026960045481565b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af1158015610604573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106289190612548565b61064d5760405162461bcd60e51b81526004016106449061256a565b60405180910390fd5b610656816119c2565b600083815260026020526040902054146106825760405162461bcd60e51b815260040161064490612599565b60c08101516001600160a01b0316156106dd5760405162461bcd60e51b815260206004820152601960248201527f436c61696d20616c7265616479206368616c6c656e6765642e000000000000006044820152606401610644565b60008160a0015160028111156106f5576106f5612518565b146107425760405162461bcd60e51b815260206004820152601760248201527f436c61696d20616c72656164792076657269666965642e0000000000000000006044820152606401610644565b3360c0820152610751816119c2565b600083815260026020526040808220929092559051339184917fcfe09ca25f55d949baba5e280f5750c9ba4b9048fca5532f916067d433afe4d79190a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f000000000000000000000000000000000000000000000000000000000000000042816107e5576107e56125c1565b040311156108285760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b6044820152606401610644565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ab5760405162461bcd60e51b815260206004820152602260248201527f4e6f742066726f6d206e617469766520476e6f73697320414d42206272696467604482015261329760f11b6064820152608401610644565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092d91906125d7565b7f00000000000000000000000000000000000000000000000000000000000000001461098f5760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b6044820152606401610644565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1191906125f0565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610a845760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b6044820152606401610644565b60015483118015610a9457508115155b15610aa457600183905560008290555b610aad816119c2565b60008481526002602052604090205403610b0a578051829003610ad657600160a0820152610af1565b60c08101516001600160a01b031615610af157600260a08201525b610afa816119c2565b6000848152600260205260409020555b6040518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a1505050565b6000610b6e7f000000000000000000000000000000000000000000000000000000000000000042612623565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bde5760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b690313934b233b29760811b6044820152606401610644565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6091906125d7565b7f000000000000000000000000000000000000000000000000000000000000000014610cc25760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b6044820152606401610644565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4491906125f0565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610db75760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b6044820152606401610644565b8060055410610dff5760405162461bcd60e51b815260206004820152601460248201527326b2b9b9b0b3b29034b99037baba3230ba32b21760611b6044820152606401610644565b8160045414610e4757600482905560058190556040518281527f9c5113f22fcac086268c71488477822578ad93bd46c1993c9ce908d65e6fb2fe906020015b60405180910390a15b5050565b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af1158015610edd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f019190612548565b610f1d5760405162461bcd60e51b81526004016106449061256a565b60017f00000000000000000000000000000000000000000000000000000000000000004281610f4e57610f4e6125c1565b04038214610f9e5760405162461bcd60e51b815260206004820152601960248201527f45706f636820686173206e6f7420796574207061737365642e000000000000006044820152606401610644565b80610fbb5760405162461bcd60e51b815260040161064490612599565b6000828152600260205260409020541561100d5760405162461bcd60e51b815260206004820152601360248201527221b630b4b69030b63932b0b23c9036b0b2329760691b6044820152606401610644565b6040805160e0810182528281523360208201524263ffffffff16918101919091526000606082018190526080820181905260a0820181905260c0820152611053906119c2565b6000838152600260209081526040918290209290925551828152839133917fd95107f4584744c6c893a04c43058aadd1ce8aac8ca5d64140eaf277de6c1d57910160405180910390a35050565b604085106110e25760405162461bcd60e51b815260206004820152600f60248201526e283937b7b3103a37b7903637b7339760891b6044820152606401610644565b6000848484846040516020016110fb9493929190612645565b604051602081830303815290604052805190602001209050806000526020600020905060005b8681101561117b57600088888381811061113d5761113d612687565b9050602002013590508281111561116257826000528060205260406000209250611172565b8060005282602052604060002092505b50600101611121565b5080600054146111be5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b6044820152606401610644565b600885901c66ffffffffffffff1660008181526003602052604090205460ff87169080821c600116156112335760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792072656c617965640000000000000000006044820152606401610644565b6000838152600360205260408082206001851b84179055516001600160a01b03891690611263908990899061269d565b6000604051808303816000865af19150503d80600081146112a0576040519150601f19603f3d011682016040523d82523d6000602084013e6112a5565b606091505b50509050806112f65760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2063616c6c20636f6e74726163740000000000000000006044820152606401610644565b60405167ffffffffffffffff8a1681527f54303fab361bc52c2f1f56ace7351189582264f74ce47a6e7c3f478d64c429439060200160405180910390a15050505050505050505050565b6113526103c1368390038301836124f5565b6000838152600260205260409020541461137e5760405162461bcd60e51b815260040161064490612599565b600261139060c0830160a084016126ad565b60028111156113a1576113a1612518565b146113e25760405162461bcd60e51b815260206004820152601160248201527021b430b63632b733b2903330b4b632b21760791b6044820152606401610644565b6000828152600260205260408082209190915551630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b15801561147457600080fd5b505af1158015611488573d6000803e3d6000fd5b50506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063a9059cbb90506114cd60e0840160c085016126c8565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201527f000000000000000000000000000000000000000000000000000000000000000060248201526044015b6020604051808303816000875af115801561153a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155e9190612548565b610e475760405162461bcd60e51b81526004016106449061256a565b61158c6103c1368390038301836124f5565b600083815260026020526040902054146115b85760405162461bcd60e51b815260040161064490612599565b60016115ca60c0830160a084016126ad565b60028111156115db576115db612518565b146116185760405162461bcd60e51b815260206004820152600d60248201526c21b630b4b6903330b4b632b21760991b6044820152606401610644565b600082815260026020526040812081905561163960e0830160c084016126c8565b6001600160a01b03161461172157604051630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b1580156116c857600080fd5b505af11580156116dc573d6000803e3d6000fd5b50506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063a9059cbb90506114cd60408401602085016126c8565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a9059cbb61176060408401602085016126c8565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201527f0000000000000000000000000000000000000000000000000000000000000000602482015260440161151b565b6117bb816119c2565b600083815260026020526040902054146117e75760405162461bcd60e51b815260040161064490612599565b7f000000000000000000000000000000000000000000000000000000000000000060045461181591906126e5565b604082015161182a9063ffffffff16426126f8565b101561188d5760405162461bcd60e51b815260206004820152602c60248201527f436c61696d206d75737420776169742061746c65617374206d61784c3253746160448201526b3a32a9bcb731a232b630bc9760a11b6064820152608401610644565b600061189882612132565b905060028160038111156118ae576118ae612518565b14806118cb575060008160038111156118c9576118c9612518565b145b6119345760405162461bcd60e51b815260206004820152603460248201527f436c61696d20766572696669636174696f6e20696e2070726f6772657373206f604482015273391030b63932b0b23c9031b7b6b83632ba32b21760611b6064820152608401610644565b63ffffffff428116606084015243166080830152611951826119c2565b60008481526002602052604080822092909255905184917f37b700b61b9b4710dddb0c3316b2be7ef6088ed4b1d7bfe0fb98be8f9a163e1691a2505050565b60006119bc7f000000000000000000000000000000000000000000000000000000000000000083612623565b92915050565b80516020808301516040808501516060860151608087015160a088015160c089015194516000986119f798909796910161270b565b604051602081830303815290604052805190602001209050919050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611a6757611a676125c1565b04031115611aaa5760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b6044820152606401610644565b611ab3816119c2565b60008381526002602052604090205414611adf5760405162461bcd60e51b815260040161064490612599565b60c08101516001600160a01b031615611b315760405162461bcd60e51b815260206004820152601460248201527321b630b4b69034b99031b430b63632b733b2b21760611b6044820152606401610644565b6001611b3c82612132565b6003811115611b4d57611b4d612518565b14611b9a5760405162461bcd60e51b815260206004820152601b60248201527f43656e736f72736869702074657374206e6f74207061737365642e00000000006044820152606401610644565b600154821115611baf57600182905580516000555b600160a0820152611bbf816119c2565b60008381526002602090815260409182902092909255518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79101610e3e565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611c5457611c546125c1565b040311611c955760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b6044820152606401610644565b611c9e816119c2565b60008381526002602052604090205414611cca5760405162461bcd60e51b815260040161064490612599565b60008160a001516002811115611ce257611ce2612518565b14611d215760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b6044820152606401610644565b60c08101516001600160a01b031615610e475760208101516001600160a01b0316611dd3576000828152600260205260408082209190915560c0820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb9060440161151b565b60c0810180516000909152611de7826119c2565b506000839052600260205260405163a9059cbb60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044015b6020604051808303816000875af1158015611e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea59190612548565b611ec15760405162461bcd60e51b81526004016106449061256a565b505050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611f1957611f196125c1565b040311611f5a5760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b6044820152606401610644565b611f63816119c2565b60008381526002602052604090205414611f8f5760405162461bcd60e51b815260040161064490612599565b60008160a001516002811115611fa757611fa7612518565b14611fe65760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b6044820152606401610644565b60208101516001600160a01b031615610e475760c08101516001600160a01b031661209857600082815260026020908152604080832092909255820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb9060440161151b565b60208101805160009091526120ac826119c2565b60008481526002602052604090819020919091555163a9059cbb60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401611e62565b6000816060015163ffffffff1660000361214e57506002919050565b7f0000000000000000000000000000000000000000000000000000000000000000826060015163ffffffff164203101561218a57506003919050565b60006005836060015163ffffffff164203816121a8576121a86125c1565b608085015163ffffffff16919004019050437f0000000000000000000000000000000000000000000000000000000000000000818303116121ec57600192506121f1565b600092505b50505b919050565b6001600160a01b038116811461220e57600080fd5b50565b80356121f4816121f9565b803563ffffffff811681146121f457600080fd5b8035600381106121f457600080fd5b600060e0828403121561225157600080fd5b60405160e0810181811067ffffffffffffffff8211171561228257634e487b7160e01b600052604160045260246000fd5b6040528235815290508061229860208401612211565b60208201526122a96040840161221c565b60408201526122ba6060840161221c565b60608201526122cb6080840161221c565b60808201526122dc60a08401612230565b60a08201526122ed60c08401612211565b60c08201525092915050565b600080610100838503121561230d57600080fd5b8235915061231e846020850161223f565b90509250929050565b6000806000610120848603121561233d57600080fd5b8335925060208401359150612355856040860161223f565b90509250925092565b60006020828403121561237057600080fd5b5035919050565b6000806040838503121561238a57600080fd5b50508035926020909101359150565b803567ffffffffffffffff811681146121f457600080fd5b60008083601f8401126123c357600080fd5b50813567ffffffffffffffff8111156123db57600080fd5b6020830191508360208285010111156123f357600080fd5b9250929050565b6000806000806000806080878903121561241357600080fd5b863567ffffffffffffffff8082111561242b57600080fd5b818901915089601f83011261243f57600080fd5b81358181111561244e57600080fd5b8a60208260051b850101111561246357600080fd5b6020830198508097505061247960208a01612399565b955061248760408a01612211565b9450606089013591508082111561249d57600080fd5b506124aa89828a016123b1565b979a9699509497509295939492505050565b6000808284036101008112156124d157600080fd5b8335925060e0601f19820112156124e757600080fd5b506020830190509250929050565b600060e0828403121561250757600080fd5b612511838361223f565b9392505050565b634e487b7160e01b600052602160045260246000fd5b602081016004831061254257612542612518565b91905290565b60006020828403121561255a57600080fd5b8151801515811461251157600080fd5b6020808252601590820152742330b4b632b2102ba2aa24103a3930b739b332b91760591b604082015260600190565b6020808252600e908201526d24b73b30b634b21031b630b4b69760911b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b6000602082840312156125e957600080fd5b5051919050565b60006020828403121561260257600080fd5b8151612511816121f9565b634e487b7160e01b600052601160045260246000fd5b60008261264057634e487b7160e01b600052601260045260246000fd5b500490565b60c085901b6001600160c01b0319168152606084901b6bffffffffffffffffffffffff191660088201528183601c83013760009101601c019081529392505050565b634e487b7160e01b600052603260045260246000fd5b8183823760009101908152919050565b6000602082840312156126bf57600080fd5b61251182612230565b6000602082840312156126da57600080fd5b8135612511816121f9565b808201808211156119bc576119bc61260d565b818103818111156119bc576119bc61260d565b87815260006bffffffffffffffffffffffff19808960601b16602084015263ffffffff60e01b808960e01b166034850152808860e01b166038850152808760e01b16603c850152506003851061276357612763612518565b60f89490941b60408301525060609190911b90911660418201526055019594505050505056fea26469706673582212209b11a25fb4974c5d0ee8cd0f9f676d4ca630a99a1ca8dc205e52447c79afef4b64736f6c63430008180033",
  "devdoc": {
    "details": "Vea Outbox From Arbitrum to Gnosis. Note: This contract is deployed on Gnosis.",
    "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."
        }
      },
      "SequencerDelayLimitUpdateReceived(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."
        }
      },
      "claim(uint256,bytes32)": {
        "details": "Submit a claim about the _stateRoot at _epoch and submit a deposit.",
        "params": {
          "_epoch": "The epoch for which the claim is made.",
          "_stateRoot": "The state root to claim."
        }
      },
      "constructor": {
        "details": "Constructor. Note: epochPeriod must match the VeaInboxArbToGnosis contract deployment on Arbitrum, since it's on a different chain, we can't read it and trust the deployer to set a correct value",
        "params": {
          "_amb": "The address of the AMB contract on Gnosis.",
          "_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.",
          "_routerArbToGnosis": "The address of the router on Ethereum that routes from Arbitrum to Gnosis.",
          "_routerChainId": "The chain id of the routerArbToGnosis.",
          "_sequencerDelayLimit": "The maximum delay in seconds that the Arbitrum sequencer can backdate transactions.",
          "_timeoutEpochs": "The epochs before the bridge is considered shutdown.",
          "_weth": "The address of the WETH contract on Gnosis."
        }
      },
      "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."
        }
      },
      "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 Gnosis 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(uint256,uint256)": {
        "details": "Set the sequencerDelayLimit by receiving a message from the AMB.",
        "params": {
          "_newSequencerDelayLimit": "The delaySeconds from the MaxTimeVariation struct in the Arbitrum Sequencer contract.",
          "_timestamp": "The timestamp of the message."
        }
      },
      "verifySnapshot(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "Resolves the optimistic claim for '_epoch'.",
        "params": {
          "_claim": "The claim associated with the epoch.",
          "_epoch": "The epoch of the optimistic claim."
        }
      },
      "withdrawChallengeDeposit(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "Sends the deposit back to the Challenger if successful. Includes a portion of the Bridger's deposit.",
        "params": {
          "_claim": "The claim associated with the epoch.",
          "_epoch": "The epoch associated with the challenge deposit to withraw."
        }
      },
      "withdrawChallengerEscapeHatch(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "When bridge is shutdown, no claim disputes can be resolved. This allows the challenger to withdraw their deposit.",
        "params": {
          "_claim": "The claim associated with the epoch.",
          "_epoch": "The epoch associated with the claim deposit to withraw."
        }
      },
      "withdrawClaimDeposit(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "Sends the deposit back to the Claimer if successful. Includes a portion of the Challenger's deposit if unsuccessfully challenged.",
        "params": {
          "_claim": "The claim associated with the epoch.",
          "_epoch": "The epoch associated with the claim deposit to withraw."
        }
      },
      "withdrawClaimerEscapeHatch(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "details": "When bridge is shutdown, no claim disputes can be resolved. This allows the claimer to withdraw their deposit.",
        "params": {
          "_claim": "The claim associated with the epoch.",
          "_epoch": "The epoch associated with the claim deposit to withraw."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "resolveDisputedClaim(uint256,bytes32,(bytes32,address,uint32,uint32,uint32,uint8,address))": {
        "notice": "Note: Access restricted to AMB."
      }
    },
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 2671,
        "contract": "src/arbitrumToGnosis/VeaOutboxArbToGnosis.sol:VeaOutboxArbToGnosis",
        "label": "stateRoot",
        "offset": 0,
        "slot": "0",
        "type": "t_bytes32"
      },
      {
        "astId": 2673,
        "contract": "src/arbitrumToGnosis/VeaOutboxArbToGnosis.sol:VeaOutboxArbToGnosis",
        "label": "latestVerifiedEpoch",
        "offset": 0,
        "slot": "1",
        "type": "t_uint256"
      },
      {
        "astId": 2677,
        "contract": "src/arbitrumToGnosis/VeaOutboxArbToGnosis.sol:VeaOutboxArbToGnosis",
        "label": "claimHashes",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_uint256,t_bytes32)"
      },
      {
        "astId": 2681,
        "contract": "src/arbitrumToGnosis/VeaOutboxArbToGnosis.sol:VeaOutboxArbToGnosis",
        "label": "relayed",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_uint256,t_bytes32)"
      },
      {
        "astId": 2683,
        "contract": "src/arbitrumToGnosis/VeaOutboxArbToGnosis.sol:VeaOutboxArbToGnosis",
        "label": "sequencerDelayLimit",
        "offset": 0,
        "slot": "4",
        "type": "t_uint256"
      },
      {
        "astId": 2685,
        "contract": "src/arbitrumToGnosis/VeaOutboxArbToGnosis.sol:VeaOutboxArbToGnosis",
        "label": "timestampDelayUpdated",
        "offset": 0,
        "slot": "5",
        "type": "t_uint256"
      }
    ],
    "types": {
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_mapping(t_uint256,t_bytes32)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => bytes32)",
        "numberOfBytes": "32",
        "value": "t_bytes32"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}
