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