{
  "address": "0xE24B2838962207F585F4fa5C5bE3e1AcA43a1a1B",
  "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": "address",
          "name": "_devnetOperator",
          "type": "address"
        }
      ],
      "name": "changeDevnetOperator",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_epoch",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "_stateRoot",
          "type": "bytes32"
        }
      ],
      "name": "claim",
      "outputs": [],
      "stateMutability": "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": "_epoch",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "_stateroot",
          "type": "bytes32"
        }
      ],
      "name": "devnetAdvanceState",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "devnetOperator",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        }
      ],
      "name": "epochAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "epoch",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "epochNow",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "epoch",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "epochPeriod",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "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": "0x1d0c62b69fff64da78d1cd5352dc3084b861a22ce630af07c4d5376d0905f817",
  "receipt": {
    "to": null,
    "from": "0xFa00D29d378EDC57AA1006946F0fc6230a5E3288",
    "contractAddress": "0xE24B2838962207F585F4fa5C5bE3e1AcA43a1a1B",
    "transactionIndex": 1,
    "gasUsed": "2362205",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0xd65228a44d3dfaedd894ff646874b8a12274d350a47f80b5f08dbe9b4a1fb6db",
    "transactionHash": "0x1d0c62b69fff64da78d1cd5352dc3084b861a22ce630af07c4d5376d0905f817",
    "logs": [],
    "blockNumber": 14598540,
    "cumulativeGasUsed": "2391494",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "100000000000000000",
    1800,
    0,
    10000000000000,
    "0x8448E15d0e706C0298dECA99F0b4744030e59d7d",
    "0xbD6c557295cBDd57e0efC408b20096f3fe55C8a6",
    86400,
    10000000000000,
    11155111,
    "0x8d74e5e4DA11629537C4575cB0f33b4F0Dfa42EB"
  ],
  "numDeployments": 11,
  "solcInputHash": "51b873e2d80b78ffb160c3bb515132de",
  "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_deposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_epochPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minChallengePeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_timeoutEpochs\",\"type\":\"uint256\"},{\"internalType\":\"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\":\"address\",\"name\":\"_devnetOperator\",\"type\":\"address\"}],\"name\":\"changeDevnetOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_stateRoot\",\"type\":\"bytes32\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"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\":\"_epoch\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_stateroot\",\"type\":\"bytes32\"}],\"name\":\"devnetAdvanceState\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"devnetOperator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"epochAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"epochNow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"epochPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"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 Chiado. Note: This contract is deployed on Chiado. Note: This contract is permissioned for developer testing (devnet).\",\"events\":{\"Challenged(uint256,address)\":{\"details\":\"This event indicates that `sendSnapshot(epoch)` should be called in the inbox.\",\"params\":{\"_challenger\":\"The address of the challenger.\",\"_epoch\":\"The epoch associated with the challenged claim.\"}},\"Claimed(address,uint256,bytes32)\":{\"details\":\"Watchers check this event to challenge fraud.\",\"params\":{\"_claimer\":\"The address of the claimer.\",\"_epoch\":\"The epoch associated with the claim.\",\"_stateRoot\":\"The state root of the claim.\"}},\"MessageRelayed(uint64)\":{\"details\":\"This event indicates that a message has been relayed.\",\"params\":{\"_msgId\":\"The msgId of the message that was relayed.\"}},\"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.\"}},\"changeDevnetOperator(address)\":{\"details\":\"Changes the devnet operator.\",\"params\":{\"_devnetOperator\":\"The new testnet operator.\"}},\"claim(uint256,bytes32)\":{\"details\":\"Submit a claim about the _stateRoot at _epoch and submit a deposit.\",\"params\":{\"_epoch\":\"The epoch for which the claim is made.\",\"_stateRoot\":\"The state root to claim.\"}},\"constructor\":{\"details\":\"Constructor. 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.\"}},\"devnetAdvanceState(uint256,bytes32)\":{\"details\":\"Testnet operator utility function to claim, validate and withdraw.\",\"params\":{\"_epoch\":\"The epoch for which the claim is made.\",\"_stateroot\":\"The state root to claim.\"}},\"epochAt(uint256)\":{\"details\":\"Get the current epoch from the outbox's point of view using the Ethereum L1 clock.\",\"returns\":{\"epoch\":\"The hash of the claim.\"}},\"epochNow()\":{\"details\":\"Get the current epoch from the outbox's point of view using the Ethereum L1 clock.\",\"returns\":{\"epoch\":\"The hash of the claim.\"}},\"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/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol\":\"VeaOutboxArbToGnosisDevnet\"},\"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/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.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 \\\"../../arbitrumToGnosis/VeaOutboxArbToGnosis.sol\\\";\\n\\n/// @dev Vea Outbox From Arbitrum to Chiado.\\n/// Note: This contract is deployed on Chiado.\\n/// Note: This contract is permissioned for developer testing (devnet).\\ncontract VeaOutboxArbToGnosisDevnet is VeaOutboxArbToGnosis {\\n    address public devnetOperator; // permissioned devnet operator\\n\\n    /// @dev Requires that the sender is the devnet operator.\\n    modifier onlyByDevnetOperator() {\\n        require(devnetOperator == msg.sender);\\n        _;\\n    }\\n\\n    /// @dev Changes the devnet operator.\\n    /// @param _devnetOperator The new testnet operator.\\n    function changeDevnetOperator(address _devnetOperator) external onlyByDevnetOperator {\\n        require(msg.sender == devnetOperator, \\\"Invalid Testnet Operator\\\");\\n        devnetOperator = _devnetOperator;\\n    }\\n\\n    /// @dev Submit a claim about the _stateRoot at _epoch and submit a deposit.\\n    /// @param _epoch The epoch for which the claim is made.\\n    /// @param _stateRoot The state root to claim.\\n    function claim(uint256 _epoch, bytes32 _stateRoot) public override onlyByDevnetOperator {\\n        require(weth.transferFrom(msg.sender, address(this), deposit), \\\"Failed WETH transfer.\\\");\\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 Start verification for claim for 'epoch'.\\n    /// @param _epoch The epoch of the claim to challenge.\\n    /// @param _claim The claim associated with the epoch.\\n    function startVerification(uint256 _epoch, Claim memory _claim) public override onlyByDevnetOperator {\\n        require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n\\n        _claim.timestampVerification = uint32(block.timestamp);\\n        _claim.blocknumberVerification = uint32(block.number);\\n\\n        claimHashes[_epoch] = hashClaim(_claim);\\n\\n        emit VerificationStarted(_epoch);\\n    }\\n\\n    /// @dev Sends the deposit back to the 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 memory _claim) public override {\\n        require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n        require(_claim.honest == Party.Claimer, \\\"Claim failed.\\\");\\n\\n        delete claimHashes[_epoch];\\n\\n        if (_claim.challenger != address(0)) {\\n            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 Resolves the optimistic claim for '_epoch'.\\n    /// @param _epoch The epoch of the optimistic claim.\\n    /// @param _claim The claim associated with the epoch.\\n    function verifySnapshot(uint256 _epoch, Claim memory _claim) public override OnlyBridgeRunning {\\n        require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n        require(_claim.challenger == address(0), \\\"Claim is challenged.\\\");\\n\\n        if (_epoch > latestVerifiedEpoch) {\\n            latestVerifiedEpoch = _epoch;\\n            stateRoot = _claim.stateRoot;\\n        }\\n\\n        _claim.honest = Party.Claimer;\\n        claimHashes[_epoch] = hashClaim(_claim);\\n\\n        emit Verified(_epoch);\\n    }\\n\\n    /// @dev Testnet operator utility function to claim, validate and withdraw.\\n    /// @param _epoch The epoch for which the claim is made.\\n    /// @param _stateroot The state root to claim.\\n    function devnetAdvanceState(uint256 _epoch, bytes32 _stateroot) external payable {\\n        claim(_epoch, _stateroot);\\n        Claim memory claim = Claim({\\n            stateRoot: _stateroot,\\n            claimer: msg.sender,\\n            timestampClaimed: uint32(block.timestamp),\\n            timestampVerification: uint32(0),\\n            blocknumberVerification: uint32(0),\\n            honest: Party.None,\\n            challenger: address(0)\\n        });\\n        claim.timestampClaimed = uint32(block.timestamp);\\n        startVerification(_epoch, claim);\\n        claim.timestampVerification = uint32(block.timestamp);\\n        claim.blocknumberVerification = uint32(block.number);\\n        verifySnapshot(_epoch, claim);\\n        claim.honest = Party.Claimer;\\n        withdrawClaimDeposit(_epoch, claim);\\n    }\\n\\n    /// @dev Constructor.\\n    /// 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        VeaOutboxArbToGnosis(\\n            _deposit,\\n            _epochPeriod,\\n            _minChallengePeriod,\\n            _timeoutEpochs,\\n            _amb,\\n            _routerArbToGnosis,\\n            _sequencerDelayLimit,\\n            _maxMissingBlocks,\\n            _routerChainId,\\n            _weth\\n        )\\n    {\\n        devnetOperator = msg.sender;\\n    }\\n}\\n\",\"keccak256\":\"0xa6d51475aa68c65ae30436feac0586511d9b71300cde0ff0b6db156416545512\",\"license\":\"MIT\"},\"src/interfaces/outboxes/IVeaOutboxOnL1.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@jaybuidl, @shotaronowhere]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.24;\\n\\nimport \\\"../types/VeaClaim.sol\\\";\\n\\n/// @dev Interface of the Vea Outbox on L1 chains like Ethereum, Gnosis, Polygon POS where storage is expensive.\\ninterface IVeaOutboxOnL1 {\\n    /// @dev Verifies and relays the message.\\n    /// Note: Gateways expect first argument of message call to be the arbitrum message sender, used for authentication.\\n    /// @param _proof The merkle proof to prove the message.\\n    /// @param _msgId The zero based index of the message in the inbox.\\n    /// @param _to The address to send the message to.\\n    /// @param _message The message to relay.\\n    function sendMessage(bytes32[] calldata _proof, uint64 _msgId, address _to, bytes calldata _message) external;\\n\\n    /// @dev Resolves any challenge of the optimistic claim for 'epoch' using the canonical bridge.\\n    /// Note: Access restricted to canonical bridge.\\n    /// @param _epoch The epoch to verify.\\n    /// @param _stateRoot The true state root for the epoch.\\n    /// @param _claim The claim associated with the epoch.\\n    function resolveDisputedClaim(uint256 _epoch, bytes32 _stateRoot, Claim memory _claim) external;\\n}\\n\",\"keccak256\":\"0xf1d52e289e790088502b7909f11f47bc33ddd3fc545636b7fb29c01ed00d3ff3\",\"license\":\"MIT\"},\"src/interfaces/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": "0x6101e06040523480156200001257600080fd5b5060405162002c8a38038062002c8a83398101604081905262000035916200012f565b60e08a90526101608990526101a08790526101808890526001600160a01b0380871660805280861660a05260048590556101c0849052610140839052811660c052898989898989898989896200008d60028b620001e0565b610100819052620000a08b600262000203565b620000ac919062000223565b6101205261016051600190620000c39042620001e0565b620000cf919062000223565b6001819055505050505050505050505033600660006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050505050505050505062000239565b6001600160a01b03811681146200012c57600080fd5b50565b6000806000806000806000806000806101408b8d0312156200015057600080fd5b8a51995060208b0151985060408b0151975060608b0151965060808b0151620001798162000116565b60a08c01519096506200018c8162000116565b8095505060c08b0151935060e08b015192506101008b015191506101208b0151620001b78162000116565b809150509295989b9194979a5092959850565b634e487b7160e01b600052601160045260246000fd5b600082620001fe57634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176200021d576200021d620001ca565b92915050565b818103818111156200021d576200021d620001ca565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051612896620003f4600039600081816105bd015261224f0152600081816105f10152818161099b01528181611b1201528181611c960152611f5b01526000818161067901526121e3015260008181610625015281816109bf01528181610d5001528181611a0001528181611b3601528181611cba0152611f7f01526000818161055301528181610b360152610e690152600081816104df0152818161169001526118800152600081816104150152818161159f01526117d20152600081816106ad0152818161079401528181611084015281816118fb01528181611e0f01528181611ea4015281816120d40152612170015260008181610394015281816107ba015281816110aa015281816115c501528181611631015281816117f8015281816118a60152818161192101528181611e3501528181611eca015281816120fa01526121960152600081816106e101528181610c230152610f5601526000818161025d01528181610a3a01528181610ab401528181610b9801528181610d8501528181610de70152610ecb01526128966000f3fe6080604052600436106102045760003560e01c80637ffc2a6e11610118578063b5b7a184116100a0578063d5e6a9df1161006f578063d5e6a9df146106cf578063da2b7bc414610703578063df19e6ff14610723578063e813a75514610750578063eedcf2a91461076657600080fd5b8063b5b7a18414610613578063b633b94414610647578063c2114a1614610667578063d0e30db01461069b57600080fd5b80638d96fdea116100e75780638d96fdea14610541578063930f28af146105755780639588eca214610595578063aa22a1c6146105ab578063b044397e146105df57600080fd5b80637ffc2a6e146104b7578063836e344b146104cd5780638a619a71146105015780638ad3a8f71461052157600080fd5b806331ddf7431161019b57806344df8e701161016a57806344df8e70146104035780634788cb381461043757806349b4299e146104575780634a439cfe14610477578063541adcca1461049757600080fd5b806331ddf743146103425780633ce43cfd146103625780633fc8cef31461038257806343b066d5146103b657600080fd5b80632639c060116101d75780632639c060146102bf57806327ee6bdd146102ec5780632c1925191461030257806331d144571461032257600080fd5b806301139b68146102095780630f0adca51461022b5780631062b39a1461024b578063222ae7861461029c575b600080fd5b34801561021557600080fd5b5061022961022436600461240c565b610779565b005b34801561023757600080fd5b5061022961024636600461243a565b610999565b34801561025757600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102a857600080fd5b506102b1610d49565b604051908152602001610293565b3480156102cb57600080fd5b506102b16102da366004612471565b60026020526000908152604090205481565b3480156102f857600080fd5b506102b160015481565b34801561030e57600080fd5b5061022961031d36600461248a565b610d7a565b34801561032e57600080fd5b5061022961033d36600461248a565b611052565b34801561034e57600080fd5b5061022961035d36600461250d565b61123d565b34801561036e57600080fd5b5061022961037d3660046125cf565b6114dd565b34801561038e57600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103c257600080fd5b506103f36103d1366004612471565b600881901c600090815260036020526040902054600160ff9092161c81161490565b6040519015158152602001610293565b34801561040f57600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b34801561044357600080fd5b5061022961045236600461240c565b611717565b34801561046357600080fd5b5061022961047236600461240c565b611952565b34801561048357600080fd5b506102b1610492366004612471565b6119f9565b3480156104a357600080fd5b506102b16104b2366004612608565b611a2b565b3480156104c357600080fd5b506102b160055481565b3480156104d957600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b34801561050d57600080fd5b5061022961051c36600461262b565b611a7d565b34801561052d57600080fd5b5060065461027f906001600160a01b031681565b34801561054d57600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b34801561058157600080fd5b5061022961059036600461240c565b611b10565b3480156105a157600080fd5b506102b160005481565b3480156105b757600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b3480156105eb57600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b34801561061f57600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b34801561065357600080fd5b5061022961066236600461240c565b611c94565b34801561067357600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b3480156106a757600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b3480156106db57600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561070f57600080fd5b5061022961071e36600461240c565b611f59565b34801561072f57600080fd5b5061074361073e366004612608565b6121c5565b604051610293919061265e565b34801561075c57600080fd5b506102b160045481565b61022961077436600461248a565b61228c565b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af115801561080b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082f9190612678565b6108545760405162461bcd60e51b815260040161084b9061269a565b60405180910390fd5b61085d81611a2b565b600083815260026020526040902054146108895760405162461bcd60e51b815260040161084b906126c9565b60c08101516001600160a01b0316156108e45760405162461bcd60e51b815260206004820152601960248201527f436c61696d20616c7265616479206368616c6c656e6765642e00000000000000604482015260640161084b565b60008160a0015160028111156108fc576108fc612648565b146109495760405162461bcd60e51b815260206004820152601760248201527f436c61696d20616c72656164792076657269666965642e000000000000000000604482015260640161084b565b3360c082015261095881611a2b565b600083815260026020526040808220929092559051339184917fcfe09ca25f55d949baba5e280f5750c9ba4b9048fca5532f916067d433afe4d79190a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f000000000000000000000000000000000000000000000000000000000000000042816109ec576109ec6126f1565b04031115610a2f5760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b604482015260640161084b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ab25760405162461bcd60e51b815260206004820152602260248201527f4e6f742066726f6d206e617469766520476e6f73697320414d42206272696467604482015261329760f11b606482015260840161084b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b349190612707565b7f000000000000000000000000000000000000000000000000000000000000000014610b965760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b604482015260640161084b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c189190612720565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610c8b5760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b604482015260640161084b565b60015483118015610c9b57508115155b15610cab57600183905560008290555b610cb481611a2b565b60008481526002602052604090205403610d11578051829003610cdd57600160a0820152610cf8565b60c08101516001600160a01b031615610cf857600260a08201525b610d0181611a2b565b6000848152600260205260409020555b6040518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a1505050565b6000610d757f00000000000000000000000000000000000000000000000000000000000000004261273d565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610de55760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b690313934b233b29760811b604482015260640161084b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e679190612707565b7f000000000000000000000000000000000000000000000000000000000000000014610ec95760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b604482015260640161084b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4b9190612720565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610fbe5760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b604482015260640161084b565b80600554106110065760405162461bcd60e51b815260206004820152601460248201527326b2b9b9b0b3b29034b99037baba3230ba32b21760611b604482015260640161084b565b816004541461104e57600482905560058190556040518281527f9c5113f22fcac086268c71488477822578ad93bd46c1993c9ce908d65e6fb2fe906020015b60405180910390a15b5050565b6006546001600160a01b0316331461106957600080fd5b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af11580156110fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111f9190612678565b61113b5760405162461bcd60e51b815260040161084b9061269a565b806111585760405162461bcd60e51b815260040161084b906126c9565b600082815260026020526040902054156111aa5760405162461bcd60e51b815260206004820152601360248201527221b630b4b69030b63932b0b23c9036b0b2329760691b604482015260640161084b565b6040805160e0810182528281523360208201524263ffffffff16918101919091526000606082018190526080820181905260a0820181905260c08201526111f090611a2b565b6000838152600260209081526040918290209290925551828152839133917fd95107f4584744c6c893a04c43058aadd1ce8aac8ca5d64140eaf277de6c1d57910160405180910390a35050565b6040851061127f5760405162461bcd60e51b815260206004820152600f60248201526e283937b7b3103a37b7903637b7339760891b604482015260640161084b565b600084848484604051602001611298949392919061275f565b604051602081830303815290604052805190602001209050806000526020600020905060005b868110156113185760008888838181106112da576112da6127a1565b905060200201359050828111156112ff5782600052806020526040600020925061130f565b8060005282602052604060002092505b506001016112be565b50806000541461135b5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b604482015260640161084b565b600885901c66ffffffffffffff1660008181526003602052604090205460ff87169080821c600116156113d05760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792072656c61796564000000000000000000604482015260640161084b565b6000838152600360205260408082206001851b84179055516001600160a01b0389169061140090899089906127b7565b6000604051808303816000865af19150503d806000811461143d576040519150601f19603f3d011682016040523d82523d6000602084013e611442565b606091505b50509050806114935760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2063616c6c20636f6e7472616374000000000000000000604482015260640161084b565b60405167ffffffffffffffff8a1681527f54303fab361bc52c2f1f56ace7351189582264f74ce47a6e7c3f478d64c429439060200160405180910390a15050505050505050505050565b6114ef6104b236839003830183612608565b6000838152600260205260409020541461151b5760405162461bcd60e51b815260040161084b906126c9565b600261152d60c0830160a084016127c7565b600281111561153e5761153e612648565b1461157f5760405162461bcd60e51b815260206004820152601160248201527021b430b63632b733b2903330b4b632b21760791b604482015260640161084b565b6000828152600260205260408082209190915551630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b15801561161157600080fd5b505af1158015611625573d6000803e3d6000fd5b50506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063a9059cbb905061166a60e0840160c0850161262b565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201527f000000000000000000000000000000000000000000000000000000000000000060248201526044015b6020604051808303816000875af11580156116d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fb9190612678565b61104e5760405162461bcd60e51b815260040161084b9061269a565b61172081611a2b565b6000838152600260205260409020541461174c5760405162461bcd60e51b815260040161084b906126c9565b60018160a00151600281111561176457611764612648565b146117a15760405162461bcd60e51b815260206004820152600d60248201526c21b630b4b6903330b4b632b21760991b604482015260640161084b565b60008281526002602052604081205560c08101516001600160a01b0316156118d757604051630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b15801561184457600080fd5b505af1158015611858573d6000803e3d6000fd5b50505050602081015160405163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116b8565b602081015160405163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116b8565b6006546001600160a01b0316331461196957600080fd5b61197281611a2b565b6000838152600260205260409020541461199e5760405162461bcd60e51b815260040161084b906126c9565b63ffffffff4281166060830152431660808201526119bb81611a2b565b60008381526002602052604080822092909255905183917f37b700b61b9b4710dddb0c3316b2be7ef6088ed4b1d7bfe0fb98be8f9a163e1691a25050565b6000611a257f00000000000000000000000000000000000000000000000000000000000000008361273d565b92915050565b80516020808301516040808501516060860151608087015160a088015160c08901519451600098611a609890979691016127e2565b604051602081830303815290604052805190602001209050919050565b6006546001600160a01b03163314611a9457600080fd5b6006546001600160a01b03163314611aee5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420546573746e6574204f70657261746f720000000000000000604482015260640161084b565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611b6357611b636126f1565b04031115611ba65760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b604482015260640161084b565b611baf81611a2b565b60008381526002602052604090205414611bdb5760405162461bcd60e51b815260040161084b906126c9565b60c08101516001600160a01b031615611c2d5760405162461bcd60e51b815260206004820152601460248201527321b630b4b69034b99031b430b63632b733b2b21760611b604482015260640161084b565b600154821115611c4257600182905580516000555b600160a0820152611c5281611a2b565b60008381526002602090815260409182902092909255518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79101611045565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611ce757611ce76126f1565b040311611d285760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b604482015260640161084b565b611d3181611a2b565b60008381526002602052604090205414611d5d5760405162461bcd60e51b815260040161084b906126c9565b60008160a001516002811115611d7557611d75612648565b14611db45760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b604482015260640161084b565b60c08101516001600160a01b03161561104e5760208101516001600160a01b0316611e66576000828152600260205260408082209190915560c0820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116b8565b60c0810180516000909152611e7a82611a2b565b506000839052600260205260405163a9059cbb60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044015b6020604051808303816000875af1158015611f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f389190612678565b611f545760405162461bcd60e51b815260040161084b9061269a565b505050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611fac57611fac6126f1565b040311611fed5760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b604482015260640161084b565b611ff681611a2b565b600083815260026020526040902054146120225760405162461bcd60e51b815260040161084b906126c9565b60008160a00151600281111561203a5761203a612648565b146120795760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b604482015260640161084b565b60208101516001600160a01b03161561104e5760c08101516001600160a01b031661212b57600082815260026020908152604080832092909255820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116b8565b602081018051600090915261213f82611a2b565b60008481526002602052604090819020919091555163a9059cbb60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401611ef5565b6000816060015163ffffffff166000036121e157506002919050565b7f0000000000000000000000000000000000000000000000000000000000000000826060015163ffffffff164203101561221d57506003919050565b60006005836060015163ffffffff1642038161223b5761223b6126f1565b608085015163ffffffff16919004019050437f00000000000000000000000000000000000000000000000000000000000000008183031161227f5760019250612284565b600092505b50505b919050565b6122968282611052565b6040805160e0810182528281523360208201524263ffffffff16918101919091526000606082018190526080820181905260a0820181905260c08201526122dd8382611952565b63ffffffff4281166060830152431660808201526122fb8382611b10565b600160a0820152611f548382611717565b6001600160a01b038116811461232157600080fd5b50565b80356122878161230c565b803563ffffffff8116811461228757600080fd5b80356003811061228757600080fd5b600060e0828403121561236457600080fd5b60405160e0810181811067ffffffffffffffff8211171561239557634e487b7160e01b600052604160045260246000fd5b604052823581529050806123ab60208401612324565b60208201526123bc6040840161232f565b60408201526123cd6060840161232f565b60608201526123de6080840161232f565b60808201526123ef60a08401612343565b60a082015261240060c08401612324565b60c08201525092915050565b600080610100838503121561242057600080fd5b823591506124318460208501612352565b90509250929050565b6000806000610120848603121561245057600080fd5b83359250602084013591506124688560408601612352565b90509250925092565b60006020828403121561248357600080fd5b5035919050565b6000806040838503121561249d57600080fd5b50508035926020909101359150565b803567ffffffffffffffff8116811461228757600080fd5b60008083601f8401126124d657600080fd5b50813567ffffffffffffffff8111156124ee57600080fd5b60208301915083602082850101111561250657600080fd5b9250929050565b6000806000806000806080878903121561252657600080fd5b863567ffffffffffffffff8082111561253e57600080fd5b818901915089601f83011261255257600080fd5b81358181111561256157600080fd5b8a60208260051b850101111561257657600080fd5b6020830198508097505061258c60208a016124ac565b955061259a60408a01612324565b945060608901359150808211156125b057600080fd5b506125bd89828a016124c4565b979a9699509497509295939492505050565b6000808284036101008112156125e457600080fd5b8335925060e0601f19820112156125fa57600080fd5b506020830190509250929050565b600060e0828403121561261a57600080fd5b6126248383612352565b9392505050565b60006020828403121561263d57600080fd5b81356126248161230c565b634e487b7160e01b600052602160045260246000fd5b602081016004831061267257612672612648565b91905290565b60006020828403121561268a57600080fd5b8151801515811461262457600080fd5b6020808252601590820152742330b4b632b2102ba2aa24103a3930b739b332b91760591b604082015260600190565b6020808252600e908201526d24b73b30b634b21031b630b4b69760911b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b60006020828403121561271957600080fd5b5051919050565b60006020828403121561273257600080fd5b81516126248161230c565b60008261275a57634e487b7160e01b600052601260045260246000fd5b500490565b60c085901b6001600160c01b0319168152606084901b6bffffffffffffffffffffffff191660088201528183601c83013760009101601c019081529392505050565b634e487b7160e01b600052603260045260246000fd5b8183823760009101908152919050565b6000602082840312156127d957600080fd5b61262482612343565b87815260006bffffffffffffffffffffffff19808960601b16602084015263ffffffff60e01b808960e01b166034850152808860e01b166038850152808760e01b16603c850152506003851061283a5761283a612648565b60f89490941b60408301525060609190911b90911660418201526055019594505050505056fea2646970667358221220661b042c42e0ee09ab53acf28ff4a8b3ceef7ce45b555567962aeea61ccc187f64736f6c63430008180033",
  "deployedBytecode": "0x6080604052600436106102045760003560e01c80637ffc2a6e11610118578063b5b7a184116100a0578063d5e6a9df1161006f578063d5e6a9df146106cf578063da2b7bc414610703578063df19e6ff14610723578063e813a75514610750578063eedcf2a91461076657600080fd5b8063b5b7a18414610613578063b633b94414610647578063c2114a1614610667578063d0e30db01461069b57600080fd5b80638d96fdea116100e75780638d96fdea14610541578063930f28af146105755780639588eca214610595578063aa22a1c6146105ab578063b044397e146105df57600080fd5b80637ffc2a6e146104b7578063836e344b146104cd5780638a619a71146105015780638ad3a8f71461052157600080fd5b806331ddf7431161019b57806344df8e701161016a57806344df8e70146104035780634788cb381461043757806349b4299e146104575780634a439cfe14610477578063541adcca1461049757600080fd5b806331ddf743146103425780633ce43cfd146103625780633fc8cef31461038257806343b066d5146103b657600080fd5b80632639c060116101d75780632639c060146102bf57806327ee6bdd146102ec5780632c1925191461030257806331d144571461032257600080fd5b806301139b68146102095780630f0adca51461022b5780631062b39a1461024b578063222ae7861461029c575b600080fd5b34801561021557600080fd5b5061022961022436600461240c565b610779565b005b34801561023757600080fd5b5061022961024636600461243a565b610999565b34801561025757600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102a857600080fd5b506102b1610d49565b604051908152602001610293565b3480156102cb57600080fd5b506102b16102da366004612471565b60026020526000908152604090205481565b3480156102f857600080fd5b506102b160015481565b34801561030e57600080fd5b5061022961031d36600461248a565b610d7a565b34801561032e57600080fd5b5061022961033d36600461248a565b611052565b34801561034e57600080fd5b5061022961035d36600461250d565b61123d565b34801561036e57600080fd5b5061022961037d3660046125cf565b6114dd565b34801561038e57600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103c257600080fd5b506103f36103d1366004612471565b600881901c600090815260036020526040902054600160ff9092161c81161490565b6040519015158152602001610293565b34801561040f57600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b34801561044357600080fd5b5061022961045236600461240c565b611717565b34801561046357600080fd5b5061022961047236600461240c565b611952565b34801561048357600080fd5b506102b1610492366004612471565b6119f9565b3480156104a357600080fd5b506102b16104b2366004612608565b611a2b565b3480156104c357600080fd5b506102b160055481565b3480156104d957600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b34801561050d57600080fd5b5061022961051c36600461262b565b611a7d565b34801561052d57600080fd5b5060065461027f906001600160a01b031681565b34801561054d57600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b34801561058157600080fd5b5061022961059036600461240c565b611b10565b3480156105a157600080fd5b506102b160005481565b3480156105b757600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b3480156105eb57600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b34801561061f57600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b34801561065357600080fd5b5061022961066236600461240c565b611c94565b34801561067357600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b3480156106a757600080fd5b506102b17f000000000000000000000000000000000000000000000000000000000000000081565b3480156106db57600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561070f57600080fd5b5061022961071e36600461240c565b611f59565b34801561072f57600080fd5b5061074361073e366004612608565b6121c5565b604051610293919061265e565b34801561075c57600080fd5b506102b160045481565b61022961077436600461248a565b61228c565b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af115801561080b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082f9190612678565b6108545760405162461bcd60e51b815260040161084b9061269a565b60405180910390fd5b61085d81611a2b565b600083815260026020526040902054146108895760405162461bcd60e51b815260040161084b906126c9565b60c08101516001600160a01b0316156108e45760405162461bcd60e51b815260206004820152601960248201527f436c61696d20616c7265616479206368616c6c656e6765642e00000000000000604482015260640161084b565b60008160a0015160028111156108fc576108fc612648565b146109495760405162461bcd60e51b815260206004820152601760248201527f436c61696d20616c72656164792076657269666965642e000000000000000000604482015260640161084b565b3360c082015261095881611a2b565b600083815260026020526040808220929092559051339184917fcfe09ca25f55d949baba5e280f5750c9ba4b9048fca5532f916067d433afe4d79190a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f000000000000000000000000000000000000000000000000000000000000000042816109ec576109ec6126f1565b04031115610a2f5760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b604482015260640161084b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ab25760405162461bcd60e51b815260206004820152602260248201527f4e6f742066726f6d206e617469766520476e6f73697320414d42206272696467604482015261329760f11b606482015260840161084b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b349190612707565b7f000000000000000000000000000000000000000000000000000000000000000014610b965760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b604482015260640161084b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c189190612720565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610c8b5760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b604482015260640161084b565b60015483118015610c9b57508115155b15610cab57600183905560008290555b610cb481611a2b565b60008481526002602052604090205403610d11578051829003610cdd57600160a0820152610cf8565b60c08101516001600160a01b031615610cf857600260a08201525b610d0181611a2b565b6000848152600260205260409020555b6040518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a1505050565b6000610d757f00000000000000000000000000000000000000000000000000000000000000004261273d565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610de55760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b690313934b233b29760811b604482015260640161084b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e679190612707565b7f000000000000000000000000000000000000000000000000000000000000000014610ec95760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b604482015260640161084b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4b9190612720565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610fbe5760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b604482015260640161084b565b80600554106110065760405162461bcd60e51b815260206004820152601460248201527326b2b9b9b0b3b29034b99037baba3230ba32b21760611b604482015260640161084b565b816004541461104e57600482905560058190556040518281527f9c5113f22fcac086268c71488477822578ad93bd46c1993c9ce908d65e6fb2fe906020015b60405180910390a15b5050565b6006546001600160a01b0316331461106957600080fd5b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af11580156110fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111f9190612678565b61113b5760405162461bcd60e51b815260040161084b9061269a565b806111585760405162461bcd60e51b815260040161084b906126c9565b600082815260026020526040902054156111aa5760405162461bcd60e51b815260206004820152601360248201527221b630b4b69030b63932b0b23c9036b0b2329760691b604482015260640161084b565b6040805160e0810182528281523360208201524263ffffffff16918101919091526000606082018190526080820181905260a0820181905260c08201526111f090611a2b565b6000838152600260209081526040918290209290925551828152839133917fd95107f4584744c6c893a04c43058aadd1ce8aac8ca5d64140eaf277de6c1d57910160405180910390a35050565b6040851061127f5760405162461bcd60e51b815260206004820152600f60248201526e283937b7b3103a37b7903637b7339760891b604482015260640161084b565b600084848484604051602001611298949392919061275f565b604051602081830303815290604052805190602001209050806000526020600020905060005b868110156113185760008888838181106112da576112da6127a1565b905060200201359050828111156112ff5782600052806020526040600020925061130f565b8060005282602052604060002092505b506001016112be565b50806000541461135b5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b604482015260640161084b565b600885901c66ffffffffffffff1660008181526003602052604090205460ff87169080821c600116156113d05760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792072656c61796564000000000000000000604482015260640161084b565b6000838152600360205260408082206001851b84179055516001600160a01b0389169061140090899089906127b7565b6000604051808303816000865af19150503d806000811461143d576040519150601f19603f3d011682016040523d82523d6000602084013e611442565b606091505b50509050806114935760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2063616c6c20636f6e7472616374000000000000000000604482015260640161084b565b60405167ffffffffffffffff8a1681527f54303fab361bc52c2f1f56ace7351189582264f74ce47a6e7c3f478d64c429439060200160405180910390a15050505050505050505050565b6114ef6104b236839003830183612608565b6000838152600260205260409020541461151b5760405162461bcd60e51b815260040161084b906126c9565b600261152d60c0830160a084016127c7565b600281111561153e5761153e612648565b1461157f5760405162461bcd60e51b815260206004820152601160248201527021b430b63632b733b2903330b4b632b21760791b604482015260640161084b565b6000828152600260205260408082209190915551630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b15801561161157600080fd5b505af1158015611625573d6000803e3d6000fd5b50506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063a9059cbb905061166a60e0840160c0850161262b565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201527f000000000000000000000000000000000000000000000000000000000000000060248201526044015b6020604051808303816000875af11580156116d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fb9190612678565b61104e5760405162461bcd60e51b815260040161084b9061269a565b61172081611a2b565b6000838152600260205260409020541461174c5760405162461bcd60e51b815260040161084b906126c9565b60018160a00151600281111561176457611764612648565b146117a15760405162461bcd60e51b815260206004820152600d60248201526c21b630b4b6903330b4b632b21760991b604482015260640161084b565b60008281526002602052604081205560c08101516001600160a01b0316156118d757604051630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b15801561184457600080fd5b505af1158015611858573d6000803e3d6000fd5b50505050602081015160405163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116b8565b602081015160405163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116b8565b6006546001600160a01b0316331461196957600080fd5b61197281611a2b565b6000838152600260205260409020541461199e5760405162461bcd60e51b815260040161084b906126c9565b63ffffffff4281166060830152431660808201526119bb81611a2b565b60008381526002602052604080822092909255905183917f37b700b61b9b4710dddb0c3316b2be7ef6088ed4b1d7bfe0fb98be8f9a163e1691a25050565b6000611a257f00000000000000000000000000000000000000000000000000000000000000008361273d565b92915050565b80516020808301516040808501516060860151608087015160a088015160c08901519451600098611a609890979691016127e2565b604051602081830303815290604052805190602001209050919050565b6006546001600160a01b03163314611a9457600080fd5b6006546001600160a01b03163314611aee5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420546573746e6574204f70657261746f720000000000000000604482015260640161084b565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611b6357611b636126f1565b04031115611ba65760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b604482015260640161084b565b611baf81611a2b565b60008381526002602052604090205414611bdb5760405162461bcd60e51b815260040161084b906126c9565b60c08101516001600160a01b031615611c2d5760405162461bcd60e51b815260206004820152601460248201527321b630b4b69034b99031b430b63632b733b2b21760611b604482015260640161084b565b600154821115611c4257600182905580516000555b600160a0820152611c5281611a2b565b60008381526002602090815260409182902092909255518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79101611045565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611ce757611ce76126f1565b040311611d285760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b604482015260640161084b565b611d3181611a2b565b60008381526002602052604090205414611d5d5760405162461bcd60e51b815260040161084b906126c9565b60008160a001516002811115611d7557611d75612648565b14611db45760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b604482015260640161084b565b60c08101516001600160a01b03161561104e5760208101516001600160a01b0316611e66576000828152600260205260408082209190915560c0820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116b8565b60c0810180516000909152611e7a82611a2b565b506000839052600260205260405163a9059cbb60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044015b6020604051808303816000875af1158015611f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f389190612678565b611f545760405162461bcd60e51b815260040161084b9061269a565b505050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611fac57611fac6126f1565b040311611fed5760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b604482015260640161084b565b611ff681611a2b565b600083815260026020526040902054146120225760405162461bcd60e51b815260040161084b906126c9565b60008160a00151600281111561203a5761203a612648565b146120795760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b604482015260640161084b565b60208101516001600160a01b03161561104e5760c08101516001600160a01b031661212b57600082815260026020908152604080832092909255820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116b8565b602081018051600090915261213f82611a2b565b60008481526002602052604090819020919091555163a9059cbb60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401611ef5565b6000816060015163ffffffff166000036121e157506002919050565b7f0000000000000000000000000000000000000000000000000000000000000000826060015163ffffffff164203101561221d57506003919050565b60006005836060015163ffffffff1642038161223b5761223b6126f1565b608085015163ffffffff16919004019050437f00000000000000000000000000000000000000000000000000000000000000008183031161227f5760019250612284565b600092505b50505b919050565b6122968282611052565b6040805160e0810182528281523360208201524263ffffffff16918101919091526000606082018190526080820181905260a0820181905260c08201526122dd8382611952565b63ffffffff4281166060830152431660808201526122fb8382611b10565b600160a0820152611f548382611717565b6001600160a01b038116811461232157600080fd5b50565b80356122878161230c565b803563ffffffff8116811461228757600080fd5b80356003811061228757600080fd5b600060e0828403121561236457600080fd5b60405160e0810181811067ffffffffffffffff8211171561239557634e487b7160e01b600052604160045260246000fd5b604052823581529050806123ab60208401612324565b60208201526123bc6040840161232f565b60408201526123cd6060840161232f565b60608201526123de6080840161232f565b60808201526123ef60a08401612343565b60a082015261240060c08401612324565b60c08201525092915050565b600080610100838503121561242057600080fd5b823591506124318460208501612352565b90509250929050565b6000806000610120848603121561245057600080fd5b83359250602084013591506124688560408601612352565b90509250925092565b60006020828403121561248357600080fd5b5035919050565b6000806040838503121561249d57600080fd5b50508035926020909101359150565b803567ffffffffffffffff8116811461228757600080fd5b60008083601f8401126124d657600080fd5b50813567ffffffffffffffff8111156124ee57600080fd5b60208301915083602082850101111561250657600080fd5b9250929050565b6000806000806000806080878903121561252657600080fd5b863567ffffffffffffffff8082111561253e57600080fd5b818901915089601f83011261255257600080fd5b81358181111561256157600080fd5b8a60208260051b850101111561257657600080fd5b6020830198508097505061258c60208a016124ac565b955061259a60408a01612324565b945060608901359150808211156125b057600080fd5b506125bd89828a016124c4565b979a9699509497509295939492505050565b6000808284036101008112156125e457600080fd5b8335925060e0601f19820112156125fa57600080fd5b506020830190509250929050565b600060e0828403121561261a57600080fd5b6126248383612352565b9392505050565b60006020828403121561263d57600080fd5b81356126248161230c565b634e487b7160e01b600052602160045260246000fd5b602081016004831061267257612672612648565b91905290565b60006020828403121561268a57600080fd5b8151801515811461262457600080fd5b6020808252601590820152742330b4b632b2102ba2aa24103a3930b739b332b91760591b604082015260600190565b6020808252600e908201526d24b73b30b634b21031b630b4b69760911b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b60006020828403121561271957600080fd5b5051919050565b60006020828403121561273257600080fd5b81516126248161230c565b60008261275a57634e487b7160e01b600052601260045260246000fd5b500490565b60c085901b6001600160c01b0319168152606084901b6bffffffffffffffffffffffff191660088201528183601c83013760009101601c019081529392505050565b634e487b7160e01b600052603260045260246000fd5b8183823760009101908152919050565b6000602082840312156127d957600080fd5b61262482612343565b87815260006bffffffffffffffffffffffff19808960601b16602084015263ffffffff60e01b808960e01b166034850152808860e01b166038850152808760e01b16603c850152506003851061283a5761283a612648565b60f89490941b60408301525060609190911b90911660418201526055019594505050505056fea2646970667358221220661b042c42e0ee09ab53acf28ff4a8b3ceef7ce45b555567962aeea61ccc187f64736f6c63430008180033",
  "devdoc": {
    "details": "Vea Outbox From Arbitrum to Chiado. Note: This contract is deployed on Chiado. Note: This contract is permissioned for developer testing (devnet).",
    "events": {
      "Challenged(uint256,address)": {
        "details": "This event indicates that `sendSnapshot(epoch)` should be called in the inbox.",
        "params": {
          "_challenger": "The address of the challenger.",
          "_epoch": "The epoch associated with the challenged claim."
        }
      },
      "Claimed(address,uint256,bytes32)": {
        "details": "Watchers check this event to challenge fraud.",
        "params": {
          "_claimer": "The address of the claimer.",
          "_epoch": "The epoch associated with the claim.",
          "_stateRoot": "The state root of the claim."
        }
      },
      "MessageRelayed(uint64)": {
        "details": "This event indicates that a message has been relayed.",
        "params": {
          "_msgId": "The msgId of the message that was relayed."
        }
      },
      "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."
        }
      },
      "changeDevnetOperator(address)": {
        "details": "Changes the devnet operator.",
        "params": {
          "_devnetOperator": "The new testnet operator."
        }
      },
      "claim(uint256,bytes32)": {
        "details": "Submit a claim about the _stateRoot at _epoch and submit a deposit.",
        "params": {
          "_epoch": "The epoch for which the claim is made.",
          "_stateRoot": "The state root to claim."
        }
      },
      "constructor": {
        "details": "Constructor. 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."
        }
      },
      "devnetAdvanceState(uint256,bytes32)": {
        "details": "Testnet operator utility function to claim, validate and withdraw.",
        "params": {
          "_epoch": "The epoch for which the claim is made.",
          "_stateroot": "The state root to claim."
        }
      },
      "epochAt(uint256)": {
        "details": "Get the current epoch from the outbox's point of view using the Ethereum L1 clock.",
        "returns": {
          "epoch": "The hash of the claim."
        }
      },
      "epochNow()": {
        "details": "Get the current epoch from the outbox's point of view using the Ethereum L1 clock.",
        "returns": {
          "epoch": "The hash of the claim."
        }
      },
      "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": 1530,
        "contract": "src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol:VeaOutboxArbToGnosisDevnet",
        "label": "stateRoot",
        "offset": 0,
        "slot": "0",
        "type": "t_bytes32"
      },
      {
        "astId": 1532,
        "contract": "src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol:VeaOutboxArbToGnosisDevnet",
        "label": "latestVerifiedEpoch",
        "offset": 0,
        "slot": "1",
        "type": "t_uint256"
      },
      {
        "astId": 1536,
        "contract": "src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol:VeaOutboxArbToGnosisDevnet",
        "label": "claimHashes",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_uint256,t_bytes32)"
      },
      {
        "astId": 1540,
        "contract": "src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol:VeaOutboxArbToGnosisDevnet",
        "label": "relayed",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_uint256,t_bytes32)"
      },
      {
        "astId": 1542,
        "contract": "src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol:VeaOutboxArbToGnosisDevnet",
        "label": "sequencerDelayLimit",
        "offset": 0,
        "slot": "4",
        "type": "t_uint256"
      },
      {
        "astId": 1544,
        "contract": "src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol:VeaOutboxArbToGnosisDevnet",
        "label": "timestampDelayUpdated",
        "offset": 0,
        "slot": "5",
        "type": "t_uint256"
      },
      {
        "astId": 3507,
        "contract": "src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol:VeaOutboxArbToGnosisDevnet",
        "label": "devnetOperator",
        "offset": 0,
        "slot": "6",
        "type": "t_address"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_mapping(t_uint256,t_bytes32)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => bytes32)",
        "numberOfBytes": "32",
        "value": "t_bytes32"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}
