diff --git a/contracts/deployments/arbitrumSepolia/VeaInboxArbToGnosisDevnet.json b/contracts/deployments/arbitrumSepolia/VeaInboxArbToGnosisDevnet.json new file mode 100644 index 00000000..2f0b65d4 --- /dev/null +++ b/contracts/deployments/arbitrumSepolia/VeaInboxArbToGnosisDevnet.json @@ -0,0 +1,449 @@ +{ + "address": "0x496df82A2fE2f4aa6903C8bdcE759a94505E7D0c", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_epochPeriod", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_routerArbToGnosis", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "_nodeData", + "type": "bytes" + } + ], + "name": "MessageSent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_snapshot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_epoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "_count", + "type": "uint64" + } + ], + "name": "SnapshotSaved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_epochSent", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "_ticketId", + "type": "bytes32" + } + ], + "name": "SnapshotSent", + "type": "event" + }, + { + "inputs": [], + "name": "count", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "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": "epochFinalized", + "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": "routerArbToGnosis", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "saveSnapshot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "_fnSelector", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "sendMessage", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_epoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_gasLimit", + "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": "sendSnapshot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + } + ], + "name": "snapshots", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x7cba6ff6d857879b4add277aaf9504a693f836fc6d68a2be919f2853c6d18c3f", + "receipt": { + "to": null, + "from": "0xFa00D29d378EDC57AA1006946F0fc6230a5E3288", + "contractAddress": "0x496df82A2fE2f4aa6903C8bdcE759a94505E7D0c", + "transactionIndex": 2, + "gasUsed": "1859999", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x080a60913a0f10a5ae1dcc704ff829b55386e0d0284444b3bb92e4c6fd64666b", + "transactionHash": "0x7cba6ff6d857879b4add277aaf9504a693f836fc6d68a2be919f2853c6d18c3f", + "logs": [], + "blockNumber": 74272718, + "cumulativeGasUsed": "7283325", + "status": 1, + "byzantium": true + }, + "args": [ + 1800, + "0xAebcedf346f168E5CEaB7Cd367118d2176486ad7" + ], + "numDeployments": 1, + "solcInputHash": "0d66bd5cfdf493ed8e081e9f7e1bf4fa", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epochPeriod\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_routerArbToGnosis\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_nodeData\",\"type\":\"bytes\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_snapshot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"_count\",\"type\":\"uint64\"}],\"name\":\"SnapshotSaved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_epochSent\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_ticketId\",\"type\":\"bytes32\"}],\"name\":\"SnapshotSent\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"count\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"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\":\"epochFinalized\",\"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\":\"routerArbToGnosis\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"saveSnapshot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"_fnSelector\",\"type\":\"bytes4\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"sendMessage\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"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\":\"sendSnapshot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"name\":\"snapshots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Vea Inbox From Arbitrum to Gnosis. Note: This contract is deployed on the Arbitrum.\",\"events\":{\"MessageSent(bytes)\":{\"details\":\"Relayers watch for these events to construct merkle proofs to execute transactions on Gnosis.\",\"params\":{\"_nodeData\":\"The data to create leaves in the merkle tree. abi.encodePacked(msgId, to, message), outbox relays to.call(message).\"}},\"SnapshotSaved(bytes32,uint256,uint64)\":{\"params\":{\"_count\":\"The count of messages in the merkle tree.\",\"_epoch\":\"The epoch of the snapshot.\",\"_snapshot\":\"The snapshot of the merkle tree state root.\"}},\"SnapshotSent(uint256,bytes32)\":{\"details\":\"The event is emitted when a snapshot is sent through the canonical arbitrum bridge.\",\"params\":{\"_epochSent\":\"The epoch of the snapshot.\",\"_ticketId\":\"The ticketId of the L2->L1 message.\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Constructor. Note: epochPeriod must match the VeaOutboxArbToGnosis contract deployment on Gnosis, since it's on a different chain, we can't read it and trust the deployer to set a correct value\",\"params\":{\"_epochPeriod\":\"The duration in seconds between epochs.\",\"_routerArbToGnosis\":\"The router on Ethereum that routes from Arbitrum to Gnosis.\"}},\"epochAt(uint256)\":{\"details\":\"Get the epoch from the inbox's point of view using timestamp.\",\"params\":{\"_timestamp\":\"The timestamp to calculate the epoch from.\"},\"returns\":{\"epoch\":\"The calculated epoch.\"}},\"epochFinalized()\":{\"details\":\"Get the most recent epoch for which snapshots are finalized.\",\"returns\":{\"epoch\":\"The epoch associated with the current inbox block.timestamp\"}},\"epochNow()\":{\"details\":\"Get the current epoch from the inbox's point of view using the Arbitrum L2 clock.\",\"returns\":{\"epoch\":\"The epoch associated with the current inbox block.timestamp\"}},\"saveSnapshot()\":{\"details\":\"Saves snapshot of state root. Snapshots can be saved a maximum of once per epoch. `O(log(count))` where count number of messages in the inbox. Note: See merkle tree docs for details how inbox manages state.\"},\"sendMessage(address,bytes4,bytes)\":{\"details\":\"Sends an arbitrary message to Gnosis. `O(log(count))` where count is the number of messages already sent. Amortized cost is constant. Note: See docs for details how inbox manages merkle tree state.\",\"params\":{\"_data\":\"The message calldata, abi.encode(param1, param2, ...)\",\"_fnSelector\":\"The function selector of the receiving contract.\",\"_to\":\"The address of the contract on the receiving chain which receives the calldata.\"},\"returns\":{\"_0\":\"msgId The zero based index of the message in the inbox.\"}},\"sendSnapshot(uint256,uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Sends the state root snapshot using Arbitrum's canonical bridge.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch of the snapshot requested to send.\",\"_gasLimit\":\"The gas limit for the AMB transaction on Gnosis.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"SnapshotSaved(bytes32,uint256,uint64)\":{\"notice\":\"The bridgers can watch this event to claim the stateRoot on the veaOutbox.\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/arbitrumToGnosis/VeaInboxArbToGnosis.sol\":\"VeaInboxArbToGnosis\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"src/arbitrumToGnosis/VeaInboxArbToGnosis.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/IArbSys.sol\\\";\\nimport \\\"../interfaces/inboxes/IVeaInbox.sol\\\";\\nimport \\\"../interfaces/routers/IRouterToGnosis.sol\\\";\\n\\n/// @dev Vea Inbox From Arbitrum to Gnosis.\\n/// Note: This contract is deployed on the Arbitrum.\\ncontract VeaInboxArbToGnosis is IVeaInbox {\\n // ************************************* //\\n // * Storage * //\\n // ************************************* //\\n\\n // Arbitrum precompile ArbSys for L2->L1 messaging: https://developer.arbitrum.io/arbos/precompiles#arbsys\\n IArbSys internal constant ARB_SYS = IArbSys(address(100));\\n\\n uint256 public immutable epochPeriod; // Epochs mark the period between potential snapshots.\\n address public immutable routerArbToGnosis; // The router on ethereum.\\n\\n mapping(uint256 epoch => bytes32) public snapshots; // epoch => state root snapshot\\n\\n // Inbox represents minimum data availability to maintain incremental merkle tree.\\n // Supports a max of 2^64 - 1 messages. See merkle tree docs for details how inbox manages state.\\n\\n bytes32[64] internal inbox; // stores minimal set of complete subtree roots of the merkle tree to increment.\\n uint64 public count; // count of messages in the merkle tree\\n\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @dev Relayers watch for these events to construct merkle proofs to execute transactions on Gnosis.\\n /// @param _nodeData The data to create leaves in the merkle tree. abi.encodePacked(msgId, to, message), outbox relays to.call(message).\\n event MessageSent(bytes _nodeData);\\n\\n /// The bridgers can watch this event to claim the stateRoot on the veaOutbox.\\n /// @param _snapshot The snapshot of the merkle tree state root.\\n /// @param _epoch The epoch of the snapshot.\\n /// @param _count The count of messages in the merkle tree.\\n event SnapshotSaved(bytes32 _snapshot, uint256 _epoch, uint64 _count);\\n\\n /// @dev The event is emitted when a snapshot is sent through the canonical arbitrum bridge.\\n /// @param _epochSent The epoch of the snapshot.\\n /// @param _ticketId The ticketId of the L2->L1 message.\\n event SnapshotSent(uint256 indexed _epochSent, bytes32 _ticketId);\\n\\n /// @dev Constructor.\\n /// Note: epochPeriod must match the VeaOutboxArbToGnosis contract deployment on Gnosis, since it's on a different chain, we can't read it and trust the deployer to set a correct value\\n /// @param _epochPeriod The duration in seconds between epochs.\\n /// @param _routerArbToGnosis The router on Ethereum that routes from Arbitrum to Gnosis.\\n constructor(uint256 _epochPeriod, address _routerArbToGnosis) {\\n epochPeriod = _epochPeriod;\\n routerArbToGnosis = _routerArbToGnosis;\\n }\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @dev Sends an arbitrary message to Gnosis.\\n /// `O(log(count))` where count is the number of messages already sent.\\n /// Amortized cost is constant.\\n /// Note: See docs for details how inbox manages merkle tree state.\\n /// @param _to The address of the contract on the receiving chain which receives the calldata.\\n /// @param _fnSelector The function selector of the receiving contract.\\n /// @param _data The message calldata, abi.encode(param1, param2, ...)\\n /// @return msgId The zero based index of the message in the inbox.\\n function sendMessage(address _to, bytes4 _fnSelector, bytes memory _data) external override returns (uint64) {\\n uint64 oldCount = count;\\n\\n // Given arbitrum's speed limit of 7 million gas / second, it would take atleast 8 million years of full blocks to overflow.\\n // It *should* be impossible to overflow, but we check to be safe when appending to the tree.\\n require(oldCount < type(uint64).max, \\\"Inbox is full.\\\");\\n\\n bytes memory nodeData = abi.encodePacked(\\n oldCount,\\n _to,\\n // _data is abi.encode(param1, param2, ...), we need to encode it again to get the correct leaf data\\n abi.encodePacked( // equivalent to abi.encodeWithSelector(fnSelector, msg.sender, param1, param2, ...)\\n _fnSelector,\\n bytes32(uint256(uint160(msg.sender))), // big endian padded encoding of msg.sender, simulating abi.encodeWithSelector\\n _data\\n )\\n );\\n\\n // single hashed leaf\\n bytes32 newInboxNode = keccak256(nodeData);\\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 // efficient hash using EVM scratch space\\n mstore(0x00, newInboxNode)\\n newInboxNode := keccak256(0x00, 0x20)\\n }\\n\\n // increment merkle tree calculating minimal number of hashes\\n unchecked {\\n uint256 height;\\n\\n // x = oldCount + 1; acts as a bit mask to determine if a hash is needed\\n // note: x is always non-zero, and x is bit shifted to the right each loop\\n // hence this loop will always terminate in a maximum of log_2(oldCount + 1) iterations\\n for (uint64 x = oldCount + 1; x & 1 == 0; x = x >> 1) {\\n // sort sibling hashes as a convention for efficient proof validation\\n newInboxNode = sortConcatAndHash(inbox[height], newInboxNode);\\n height++;\\n }\\n\\n inbox[height] = newInboxNode;\\n\\n // finally increment count\\n count = oldCount + 1;\\n }\\n\\n emit MessageSent(nodeData);\\n\\n // old count is the zero indexed leaf position in the tree, acts as a msgId\\n // gateways should index these msgIds to later relay proofs\\n return oldCount;\\n }\\n\\n /// @dev Saves snapshot of state root. Snapshots can be saved a maximum of once per epoch.\\n /// `O(log(count))` where count number of messages in the inbox.\\n /// Note: See merkle tree docs for details how inbox manages state.\\n function saveSnapshot() external {\\n uint256 epoch;\\n bytes32 stateRoot;\\n\\n unchecked {\\n epoch = block.timestamp / epochPeriod;\\n\\n // calculate the current root of the incremental merkle tree encoded in the inbox\\n\\n uint256 height;\\n\\n // x acts as a bit mask to determine if the hash stored in the inbox contributes to the root\\n uint256 x;\\n\\n // x is bit shifted to the right each loop, hence this loop will always terminate in a maximum of log_2(count) iterations\\n for (x = uint256(count); x > 0; x = x >> 1) {\\n if ((x & 1) == 1) {\\n // first hash is special case\\n // inbox stores the root of complete subtrees\\n // eg if count = 4 = 0b100, then the first complete subtree is inbox[2]\\n // inbox = [H(3), H(1,2), H(1,4)], we read inbox[2] directly\\n\\n stateRoot = inbox[height];\\n break;\\n }\\n height++;\\n }\\n\\n // after the first hash, we can calculate the root incrementally\\n for (x = x >> 1; x > 0; x = x >> 1) {\\n height++;\\n if ((x & 1) == 1) {\\n // sort sibling hashes as a convention for efficient proof validation\\n stateRoot = sortConcatAndHash(inbox[height], stateRoot);\\n }\\n }\\n }\\n\\n snapshots[epoch] = stateRoot;\\n\\n emit SnapshotSaved(stateRoot, epoch, count);\\n }\\n\\n /// @dev Helper function to calculate merkle tree interior nodes by sorting and concatenating and hashing a pair of children nodes, left and right.\\n /// Note: EVM scratch space is used to efficiently calculate hashes.\\n /// @param _left The left hash.\\n /// @param _right The right hash.\\n /// @return parent The parent hash.\\n function sortConcatAndHash(bytes32 _left, bytes32 _right) internal pure returns (bytes32 parent) {\\n // sort sibling hashes as a convention for efficient proof validation\\n if (_left < _right) {\\n // efficient hash using EVM scratch space\\n assembly {\\n mstore(0x00, _left)\\n mstore(0x20, _right)\\n parent := keccak256(0x00, 0x40)\\n }\\n } else {\\n assembly {\\n mstore(0x00, _right)\\n mstore(0x20, _left)\\n parent := keccak256(0x00, 0x40)\\n }\\n }\\n }\\n\\n /// @dev Sends the state root snapshot using Arbitrum's canonical bridge.\\n /// @param _epoch The epoch of the snapshot requested to send.\\n /// @param _gasLimit The gas limit for the AMB transaction on Gnosis.\\n /// @param _claim The claim associated with the epoch.\\n function sendSnapshot(uint256 _epoch, uint256 _gasLimit, Claim memory _claim) external virtual {\\n unchecked {\\n require(_epoch < block.timestamp / epochPeriod, \\\"Can only send past epoch snapshot.\\\");\\n }\\n\\n bytes memory data = abi.encodeCall(IRouterToGnosis.route, (_epoch, snapshots[_epoch], _gasLimit, _claim));\\n\\n // Arbitrum -> Ethereum message with native bridge\\n // docs: https://developer.arbitrum.io/for-devs/cross-chain-messsaging#arbitrum-to-ethereum-messaging\\n // example: https://github.com/OffchainLabs/arbitrum-tutorials/blob/2c1b7d2db8f36efa496e35b561864c0f94123a5f/packages/greeter/contracts/arbitrum/GreeterL2.sol#L25\\n bytes32 ticketID = bytes32(ARB_SYS.sendTxToL1(routerArbToGnosis, data));\\n\\n emit SnapshotSent(_epoch, ticketID);\\n }\\n\\n // ************************************* //\\n // * Pure / Views * //\\n // ************************************* //\\n\\n /// @dev Get the current epoch from the inbox's point of view using the Arbitrum L2 clock.\\n /// @return epoch The epoch associated with the current inbox block.timestamp\\n function epochNow() external view returns (uint256 epoch) {\\n epoch = block.timestamp / epochPeriod;\\n }\\n\\n /// @dev Get the most recent epoch for which snapshots are finalized.\\n /// @return epoch The epoch associated with the current inbox block.timestamp\\n function epochFinalized() external view returns (uint256 epoch) {\\n epoch = block.timestamp / epochPeriod - 1;\\n }\\n\\n /// @dev Get the epoch from the inbox's point of view using timestamp.\\n /// @param _timestamp The timestamp to calculate the epoch from.\\n /// @return epoch The calculated epoch.\\n function epochAt(uint256 _timestamp) external view returns (uint256 epoch) {\\n epoch = _timestamp / epochPeriod;\\n }\\n}\\n\",\"keccak256\":\"0xf5706fefe86eb3bf49a130df2b54030f325327729e9ade1a94be9132eb77e333\",\"license\":\"MIT\"},\"src/canonical/arbitrum/IArbSys.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n// https://developer.arbitrum.io/arbos/precompiles#arbsys\\n// https://github.com/OffchainLabs/nitro-contracts/blob/39ea5a163afc637e2706d9be29cf7a289c300d00/src/precompiles/ArbSys.sol\\n// https://arbiscan.io/address/0x0000000000000000000000000000000000000064#code\\n// interface is pruned for relevant function stubs\\n\\npragma solidity 0.8.24;\\n\\n///@title System level functionality\\n///@notice For use by contracts to interact with core L2-specific functionality.\\n///Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064.\\ninterface IArbSys {\\n /// @notice Send a transaction to L1\\n /// @dev it is not possible to execute on the L1 any L2-to-L1 transaction which contains data\\n /// to a contract address without any code (as enforced by the Bridge contract).\\n /// @param destination recipient address on L1\\n /// @param data (optional) calldata for L1 contract call\\n /// @return a unique identifier for this L2-to-L1 transaction.\\n function sendTxToL1(address destination, bytes calldata data) external payable returns (uint256);\\n}\\n\",\"keccak256\":\"0x5ae1fd0267552160821402b9bc50b2551b086904436e5abe838599179b279420\",\"license\":\"BUSL-1.1\"},\"src/interfaces/inboxes/IVeaInbox.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\\ninterface IVeaInbox {\\n /// @dev Sends an arbitrary message to receiving chain.\\n /// Note: Calls authenticated by receiving gateway checking the sender argument.\\n /// @param _to The cross-domain contract address which receives the calldata.\\n /// @param _fnSelection The function selector of the receiving contract.\\n /// @param _data The message calldata, abi.encode(...)\\n /// @return msgId The index of the message in the inbox, as a message Id, needed to relay the message.\\n function sendMessage(address _to, bytes4 _fnSelection, bytes memory _data) external returns (uint64 msgId);\\n\\n /// @dev Snapshots can be saved a maximum of once per epoch.\\n /// Saves snapshot of state root.\\n /// `O(log(count))` where count number of messages in the inbox.\\n function saveSnapshot() external;\\n}\\n\",\"keccak256\":\"0xa8e2f65b7596235422f39933af80f02473493d2b15b398d7e34b81c82bd24a29\",\"license\":\"MIT\"},\"src/interfaces/routers/IRouterToGnosis.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@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 Router which routes messages to Gnosis through the AMB.\\n/// @dev eg. L2 on Ethereum -> Ethereum (L1) -> Gnosis (L1), the IRouterToL1 will be deployed on Ethereum (L1) routing messages to Gnosis (L1).\\ninterface IRouterToGnosis {\\n /// @dev Routes state root snapshots through intermediary chains to the final destination L1 chain.\\n /// Note: Access restricted to canonical sending-chain bridge.\\n /// @param _epoch The epoch to verify.\\n /// @param _stateRoot The true state root for the epoch.\\n /// @param _gasLimit The gas limit for the AMB message.\\n /// @param _claim The claim associated with the epoch.\\n function route(uint256 _epoch, bytes32 _stateRoot, uint256 _gasLimit, Claim memory _claim) external;\\n}\\n\",\"keccak256\":\"0x9d78c7872bd2bc3b206fc6d6dfa8f8b2dab4122b10bfe0d0ab1f76bec92613b6\",\"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": "0x60c060405234801561000f575f80fd5b50604051610c01380380610c0183398101604081905261002e91610045565b6080919091526001600160a01b031660a05261007f565b5f8060408385031215610056575f80fd5b825160208401519092506001600160a01b0381168114610074575f80fd5b809150509250929050565b60805160a051610b376100ca5f395f818161014b01526105d201525f8181610124015281816101bd015281816101ef015281816102240152818161025301526104df0152610b375ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c80635f85896c116100635780635f85896c1461010c578063b5b7a1841461011f578063d5e6a9df14610146578063d6565a2d14610185578063dc881a72146101a4575f80fd5b806306661abd1461009f578063222ae786146100d15780633ac3b6b6146100e75780634a439cfe146100ef5780635192053514610102575b5f80fd5b6041546100b39067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6100d96101b7565b6040519081526020016100c8565b6100d96101e7565b6100d96100fd3660046106a8565b61021e565b61010a61024f565b005b6100b361011a366004610748565b610370565b6100d97f000000000000000000000000000000000000000000000000000000000000000081565b61016d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100c8565b6100d96101933660046106a8565b5f6020819052908152604090205481565b61010a6101b2366004610818565b6104dd565b5f6101e27f0000000000000000000000000000000000000000000000000000000000000000426108e3565b905090565b5f60016102147f0000000000000000000000000000000000000000000000000000000000000000426108e3565b6101e29190610902565b5f6102497f0000000000000000000000000000000000000000000000000000000000000000836108e3565b92915050565b5f807f00000000000000000000000000000000000000000000000000000000000000004281610280576102806108cf565b60415491900492505f9067ffffffffffffffff165b80156102ce57806001166001036102c257600182604081106102b9576102b9610921565b015492506102ce565b6001918201911c610295565b60011c5b801561031057600191820191818116900361030857610305600183604081106102fd576102fd610921565b01548461067b565b92505b60011c6102d2565b50505f8281526020818152604091829020839055604154825184815291820185905267ffffffffffffffff168183015290517f592424eb1d6135501bd20833f15fd127c29d08eed4f03872f6f75182126b1e489181900360600190a15050565b6041545f9067ffffffffffffffff9081169081106103c65760405162461bcd60e51b815260206004820152600e60248201526d24b73137bc1034b990333ab6361760911b60448201526064015b60405180910390fd5b6040515f90829087906103e190889033908990602001610957565b60408051601f198184030181529082905261040093929160200161098c565b60408051601f1981840301815291905280516020808301919091205f908152908120919250600184015b600181165f036104625761044a600183604081106102fd576102fd610921565b92506001918201911c677fffffffffffffff1661042a565b50816001826040811061047757610477610921565b0155506041805467ffffffffffffffff19166001850167ffffffffffffffff161790556040517f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b036906104ca908490610a05565b60405180910390a1509095945050505050565b7f0000000000000000000000000000000000000000000000000000000000000000428161050c5761050c6108cf565b0483106105665760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c792073656e6420706173742065706f636820736e617073686f6044820152613a1760f11b60648201526084016103bd565b5f8381526020819052604080822054905161058991869186908690602401610a1e565b60408051601f198184030181529181526020820180516001600160e01b031663b1126dad60e01b179052516349460b4d60e11b81529091505f9060649063928c169a906105fc907f0000000000000000000000000000000000000000000000000000000000000000908690600401610abf565b6020604051808303815f875af1158015610618573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063c9190610aea565b60405181815290915085907f6fdd49f435101fc7b6ebdec7c8972932a926d18f6cb78a8891dfe950743b6b829060200160405180910390a25050505050565b5f8183101561069657825f528160205260405f209050610249565b505f9081526020919091526040902090565b5f602082840312156106b8575f80fd5b5035919050565b80356001600160a01b03811681146106d5575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e0810167ffffffffffffffff81118282101715610711576107116106da565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610740576107406106da565b604052919050565b5f805f6060848603121561075a575f80fd5b610763846106bf565b92506020848101356001600160e01b031981168114610780575f80fd5b9250604085013567ffffffffffffffff8082111561079c575f80fd5b818701915087601f8301126107af575f80fd5b8135818111156107c1576107c16106da565b6107d3601f8201601f19168501610717565b915080825288848285010111156107e8575f80fd5b80848401858401375f848284010152508093505050509250925092565b803563ffffffff811681146106d5575f80fd5b5f805f83850361012081121561082c575f80fd5b843593506020850135925060e0603f1982011215610848575f80fd5b506108516106ee565b60408501358152610864606086016106bf565b602082015261087560808601610805565b604082015261088660a08601610805565b606082015261089760c08601610805565b608082015260e0850135600381106108ad575f80fd5b60a08201526108bf61010086016106bf565b60c0820152809150509250925092565b634e487b7160e01b5f52601260045260245ffd5b5f826108fd57634e487b7160e01b5f52601260045260245ffd5b500490565b8181038181111561024957634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f5b8381101561094f578181015183820152602001610937565b50505f910152565b63ffffffff60e01b841681528260048201525f825161097d816024850160208701610935565b91909101602401949350505050565b67ffffffffffffffff60c01b8460c01b1681526bffffffffffffffffffffffff198360601b1660088201525f82516109cb81601c850160208701610935565b91909101601c01949350505050565b5f81518084526109f1816020860160208601610935565b601f01601f19169290920160200192915050565b602081525f610a1760208301846109da565b9392505050565b5f610140820190508582528460208301528360408301528251606083015260018060a01b036020840151166080830152604083015163ffffffff80821660a08501528060608601511660c08501528060808601511660e0850152505060a083015160038110610a9b57634e487b7160e01b5f52602160045260245ffd5b61010083015260c092909201516001600160a01b0316610120909101529392505050565b6001600160a01b03831681526040602082018190525f90610ae2908301846109da565b949350505050565b5f60208284031215610afa575f80fd5b505191905056fea26469706673582212202d649cbd9f2d8c6de23d68dcef4120219fd7f19544dca063a8d508394cfcb79764736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061009b575f3560e01c80635f85896c116100635780635f85896c1461010c578063b5b7a1841461011f578063d5e6a9df14610146578063d6565a2d14610185578063dc881a72146101a4575f80fd5b806306661abd1461009f578063222ae786146100d15780633ac3b6b6146100e75780634a439cfe146100ef5780635192053514610102575b5f80fd5b6041546100b39067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6100d96101b7565b6040519081526020016100c8565b6100d96101e7565b6100d96100fd3660046106a8565b61021e565b61010a61024f565b005b6100b361011a366004610748565b610370565b6100d97f000000000000000000000000000000000000000000000000000000000000000081565b61016d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100c8565b6100d96101933660046106a8565b5f6020819052908152604090205481565b61010a6101b2366004610818565b6104dd565b5f6101e27f0000000000000000000000000000000000000000000000000000000000000000426108e3565b905090565b5f60016102147f0000000000000000000000000000000000000000000000000000000000000000426108e3565b6101e29190610902565b5f6102497f0000000000000000000000000000000000000000000000000000000000000000836108e3565b92915050565b5f807f00000000000000000000000000000000000000000000000000000000000000004281610280576102806108cf565b60415491900492505f9067ffffffffffffffff165b80156102ce57806001166001036102c257600182604081106102b9576102b9610921565b015492506102ce565b6001918201911c610295565b60011c5b801561031057600191820191818116900361030857610305600183604081106102fd576102fd610921565b01548461067b565b92505b60011c6102d2565b50505f8281526020818152604091829020839055604154825184815291820185905267ffffffffffffffff168183015290517f592424eb1d6135501bd20833f15fd127c29d08eed4f03872f6f75182126b1e489181900360600190a15050565b6041545f9067ffffffffffffffff9081169081106103c65760405162461bcd60e51b815260206004820152600e60248201526d24b73137bc1034b990333ab6361760911b60448201526064015b60405180910390fd5b6040515f90829087906103e190889033908990602001610957565b60408051601f198184030181529082905261040093929160200161098c565b60408051601f1981840301815291905280516020808301919091205f908152908120919250600184015b600181165f036104625761044a600183604081106102fd576102fd610921565b92506001918201911c677fffffffffffffff1661042a565b50816001826040811061047757610477610921565b0155506041805467ffffffffffffffff19166001850167ffffffffffffffff161790556040517f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b036906104ca908490610a05565b60405180910390a1509095945050505050565b7f0000000000000000000000000000000000000000000000000000000000000000428161050c5761050c6108cf565b0483106105665760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c792073656e6420706173742065706f636820736e617073686f6044820152613a1760f11b60648201526084016103bd565b5f8381526020819052604080822054905161058991869186908690602401610a1e565b60408051601f198184030181529181526020820180516001600160e01b031663b1126dad60e01b179052516349460b4d60e11b81529091505f9060649063928c169a906105fc907f0000000000000000000000000000000000000000000000000000000000000000908690600401610abf565b6020604051808303815f875af1158015610618573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063c9190610aea565b60405181815290915085907f6fdd49f435101fc7b6ebdec7c8972932a926d18f6cb78a8891dfe950743b6b829060200160405180910390a25050505050565b5f8183101561069657825f528160205260405f209050610249565b505f9081526020919091526040902090565b5f602082840312156106b8575f80fd5b5035919050565b80356001600160a01b03811681146106d5575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e0810167ffffffffffffffff81118282101715610711576107116106da565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610740576107406106da565b604052919050565b5f805f6060848603121561075a575f80fd5b610763846106bf565b92506020848101356001600160e01b031981168114610780575f80fd5b9250604085013567ffffffffffffffff8082111561079c575f80fd5b818701915087601f8301126107af575f80fd5b8135818111156107c1576107c16106da565b6107d3601f8201601f19168501610717565b915080825288848285010111156107e8575f80fd5b80848401858401375f848284010152508093505050509250925092565b803563ffffffff811681146106d5575f80fd5b5f805f83850361012081121561082c575f80fd5b843593506020850135925060e0603f1982011215610848575f80fd5b506108516106ee565b60408501358152610864606086016106bf565b602082015261087560808601610805565b604082015261088660a08601610805565b606082015261089760c08601610805565b608082015260e0850135600381106108ad575f80fd5b60a08201526108bf61010086016106bf565b60c0820152809150509250925092565b634e487b7160e01b5f52601260045260245ffd5b5f826108fd57634e487b7160e01b5f52601260045260245ffd5b500490565b8181038181111561024957634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f5b8381101561094f578181015183820152602001610937565b50505f910152565b63ffffffff60e01b841681528260048201525f825161097d816024850160208701610935565b91909101602401949350505050565b67ffffffffffffffff60c01b8460c01b1681526bffffffffffffffffffffffff198360601b1660088201525f82516109cb81601c850160208701610935565b91909101601c01949350505050565b5f81518084526109f1816020860160208601610935565b601f01601f19169290920160200192915050565b602081525f610a1760208301846109da565b9392505050565b5f610140820190508582528460208301528360408301528251606083015260018060a01b036020840151166080830152604083015163ffffffff80821660a08501528060608601511660c08501528060808601511660e0850152505060a083015160038110610a9b57634e487b7160e01b5f52602160045260245ffd5b61010083015260c092909201516001600160a01b0316610120909101529392505050565b6001600160a01b03831681526040602082018190525f90610ae2908301846109da565b949350505050565b5f60208284031215610afa575f80fd5b505191905056fea26469706673582212202d649cbd9f2d8c6de23d68dcef4120219fd7f19544dca063a8d508394cfcb79764736f6c63430008180033", + "devdoc": { + "details": "Vea Inbox From Arbitrum to Gnosis. Note: This contract is deployed on the Arbitrum.", + "events": { + "MessageSent(bytes)": { + "details": "Relayers watch for these events to construct merkle proofs to execute transactions on Gnosis.", + "params": { + "_nodeData": "The data to create leaves in the merkle tree. abi.encodePacked(msgId, to, message), outbox relays to.call(message)." + } + }, + "SnapshotSaved(bytes32,uint256,uint64)": { + "params": { + "_count": "The count of messages in the merkle tree.", + "_epoch": "The epoch of the snapshot.", + "_snapshot": "The snapshot of the merkle tree state root." + } + }, + "SnapshotSent(uint256,bytes32)": { + "details": "The event is emitted when a snapshot is sent through the canonical arbitrum bridge.", + "params": { + "_epochSent": "The epoch of the snapshot.", + "_ticketId": "The ticketId of the L2->L1 message." + } + } + }, + "kind": "dev", + "methods": { + "constructor": { + "details": "Constructor. Note: epochPeriod must match the VeaOutboxArbToGnosis contract deployment on Gnosis, since it's on a different chain, we can't read it and trust the deployer to set a correct value", + "params": { + "_epochPeriod": "The duration in seconds between epochs.", + "_routerArbToGnosis": "The router on Ethereum that routes from Arbitrum to Gnosis." + } + }, + "epochAt(uint256)": { + "details": "Get the epoch from the inbox's point of view using timestamp.", + "params": { + "_timestamp": "The timestamp to calculate the epoch from." + }, + "returns": { + "epoch": "The calculated epoch." + } + }, + "epochFinalized()": { + "details": "Get the most recent epoch for which snapshots are finalized.", + "returns": { + "epoch": "The epoch associated with the current inbox block.timestamp" + } + }, + "epochNow()": { + "details": "Get the current epoch from the inbox's point of view using the Arbitrum L2 clock.", + "returns": { + "epoch": "The epoch associated with the current inbox block.timestamp" + } + }, + "saveSnapshot()": { + "details": "Saves snapshot of state root. Snapshots can be saved a maximum of once per epoch. `O(log(count))` where count number of messages in the inbox. Note: See merkle tree docs for details how inbox manages state." + }, + "sendMessage(address,bytes4,bytes)": { + "details": "Sends an arbitrary message to Gnosis. `O(log(count))` where count is the number of messages already sent. Amortized cost is constant. Note: See docs for details how inbox manages merkle tree state.", + "params": { + "_data": "The message calldata, abi.encode(param1, param2, ...)", + "_fnSelector": "The function selector of the receiving contract.", + "_to": "The address of the contract on the receiving chain which receives the calldata." + }, + "returns": { + "_0": "msgId The zero based index of the message in the inbox." + } + }, + "sendSnapshot(uint256,uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))": { + "details": "Sends the state root snapshot using Arbitrum's canonical bridge.", + "params": { + "_claim": "The claim associated with the epoch.", + "_epoch": "The epoch of the snapshot requested to send.", + "_gasLimit": "The gas limit for the AMB transaction on Gnosis." + } + } + }, + "version": 1 + }, + "userdoc": { + "events": { + "SnapshotSaved(bytes32,uint256,uint64)": { + "notice": "The bridgers can watch this event to claim the stateRoot on the veaOutbox." + } + }, + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 2245, + "contract": "src/arbitrumToGnosis/VeaInboxArbToGnosis.sol:VeaInboxArbToGnosis", + "label": "snapshots", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_uint256,t_bytes32)" + }, + { + "astId": 2249, + "contract": "src/arbitrumToGnosis/VeaInboxArbToGnosis.sol:VeaInboxArbToGnosis", + "label": "inbox", + "offset": 0, + "slot": "1", + "type": "t_array(t_bytes32)64_storage" + }, + { + "astId": 2251, + "contract": "src/arbitrumToGnosis/VeaInboxArbToGnosis.sol:VeaInboxArbToGnosis", + "label": "count", + "offset": 0, + "slot": "65", + "type": "t_uint64" + } + ], + "types": { + "t_array(t_bytes32)64_storage": { + "base": "t_bytes32", + "encoding": "inplace", + "label": "bytes32[64]", + "numberOfBytes": "2048" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bytes32)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32", + "value": "t_bytes32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "encoding": "inplace", + "label": "uint64", + "numberOfBytes": "8" + } + } + } +} diff --git a/contracts/deployments/chiado/VeaOutboxArbToGnosisDevnet.json b/contracts/deployments/chiado/VeaOutboxArbToGnosisDevnet.json index d3751a95..7ae86fc9 100644 --- a/contracts/deployments/chiado/VeaOutboxArbToGnosisDevnet.json +++ b/contracts/deployments/chiado/VeaOutboxArbToGnosisDevnet.json @@ -1,5 +1,5 @@ { - "address": "0x9481b3A49ac67d03D9022E6200eFD81850BADDB4", + "address": "0xAebcedf346f168E5CEaB7Cd367118d2176486ad7", "abi": [ { "inputs": [ @@ -287,7 +287,7 @@ ], "name": "challenge", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { @@ -325,7 +325,7 @@ "inputs": [ { "internalType": "uint256", - "name": "", + "name": "epoch", "type": "uint256" } ], @@ -1084,19 +1084,19 @@ "type": "function" } ], - "transactionHash": "0x024db3d1dc9984392dd35c23aa942791b6dc91c007f9b58567beb8e192e35880", + "transactionHash": "0x56d6a1e200179828a6dd31960653df379e47c6cdb5b870140e4d799ce0d5588c", "receipt": { "to": null, - "from": "0x407DDEC61d69b212498B140a26da70AE1C879f5a", - "contractAddress": "0x9481b3A49ac67d03D9022E6200eFD81850BADDB4", - "transactionIndex": 0, - "gasUsed": "2330964", + "from": "0xFa00D29d378EDC57AA1006946F0fc6230a5E3288", + "contractAddress": "0xAebcedf346f168E5CEaB7Cd367118d2176486ad7", + "transactionIndex": 2, + "gasUsed": "2323702", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x1cc726cf09c666bb1572ade935022b165e152421f2f5cbf59944e9822e0c1e10", - "transactionHash": "0x024db3d1dc9984392dd35c23aa942791b6dc91c007f9b58567beb8e192e35880", + "blockHash": "0x7e83fcd1ae53885abb232bc748950660b80ce53821e90c07c0d234b193d47da1", + "transactionHash": "0x56d6a1e200179828a6dd31960653df379e47c6cdb5b870140e4d799ce0d5588c", "logs": [], - "blockNumber": 4814083, - "cumulativeGasUsed": "2330964", + "blockNumber": 11481624, + "cumulativeGasUsed": "2839657", "status": 1, "byzantium": true }, @@ -1106,19 +1106,19 @@ 0, 10000000000000, "0x99Ca51a3534785ED619f46A79C7Ad65Fa8d85e7a", - "0x6164EA58a1f5359D2E54ea8eB9e5971B7C8dB0f1", + "0xA699e7246D7AF936752789408A071805CC8c99c3", 86400, 10000000000000, - 5, + 11155111, "0x8d74e5e4DA11629537C4575cB0f33b4F0Dfa42EB" ], - "numDeployments": 9, - "solcInputHash": "18d8b299616ba6ea1bb506a660a35de5", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_deposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_epochPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minChallengePeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_timeoutEpochs\",\"type\":\"uint256\"},{\"internalType\":\"contract IAMB\",\"name\":\"_amb\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_routerArbToGnosis\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerDelayLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxMissingBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_routerChainId\",\"type\":\"uint256\"},{\"internalType\":\"contract IWETH\",\"name\":\"_weth\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_challenger\",\"type\":\"address\"}],\"name\":\"Challenged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_claimer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_stateRoot\",\"type\":\"bytes32\"}],\"name\":\"Claimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"_msgId\",\"type\":\"uint64\"}],\"name\":\"MessageRelayed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"}],\"name\":\"VerificationStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"}],\"name\":\"Verified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newSequencerDelayLimit\",\"type\":\"uint256\"}],\"name\":\"sequencerDelayLimitUpdateReceived\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"amb\",\"outputs\":[{\"internalType\":\"contract IAMB\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"censorshipTestStatus\",\"outputs\":[{\"internalType\":\"enum VeaOutboxArbToGnosis.CensorshipTestStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"challenge\",\"outputs\":[],\"stateMutability\":\"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\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"claimHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositPlusReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_stateroot\",\"type\":\"bytes32\"}],\"name\":\"devnetAdvanceState\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"devnetOperator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"epochAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"epochNow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"epochPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"hashClaim\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedClaim\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_msgId\",\"type\":\"uint256\"}],\"name\":\"isMsgRelayed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isRelayed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestVerifiedEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxMissingBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minChallengePeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"resolveDisputedClaim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"routerArbToGnosis\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"routerChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_proof\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint64\",\"name\":\"_msgId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sequencerDelayLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"startVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stateRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeoutEpochs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timestampDelayUpdated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newSequencerDelayLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"updateSequencerDelayLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"verifySnapshot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weth\",\"outputs\":[{\"internalType\":\"contract IWETH\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawChallengeDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawChallengerEscapeHatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawClaimDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawClaimerEscapeHatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Vea Outbox From ArbitrumGoerli to Chiado. Note: This contract is deployed on Chiado. Note: This contract is permissioned for developer testing (devnet).\",\"events\":{\"Challenged(uint256,address)\":{\"details\":\"This event indicates that `sendSnapshot(epoch)` should be called in the inbox.\",\"params\":{\"_challenger\":\"The address of the challenger.\",\"_epoch\":\"The epoch associated with the challenged claim.\"}},\"Claimed(address,uint256,bytes32)\":{\"details\":\"Watchers check this event to challenge fraud.\",\"params\":{\"_claimer\":\"The address of the claimer.\",\"_epoch\":\"The epoch associated with the claim.\",\"_stateRoot\":\"The state root of the claim.\"}},\"MessageRelayed(uint64)\":{\"details\":\"This event indicates that a message has been relayed.\",\"params\":{\"_msgId\":\"The msgId of the message that was relayed.\"}},\"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.\"}},\"sequencerDelayLimitUpdateReceived(uint256)\":{\"details\":\"This event indicates the sequencer limit updated.\",\"params\":{\"_newSequencerDelayLimit\":\"The new sequencer delay limit.\"}}},\"kind\":\"dev\",\"methods\":{\"censorshipTestStatus((bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Gets the status of the censorship test for claim.\",\"params\":{\"_claim\":\"The claim to test.\"},\"returns\":{\"status\":\"True if the claim passed the censorship test.\"}},\"challenge(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Submit a challenge for the claim of the inbox state root snapshot taken at 'epoch'.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch of the claim to challenge.\"}},\"changeDevnetOperator(address)\":{\"details\":\"Changes the devnet operator.\",\"params\":{\"_devnetOperator\":\"The new testnet operator.\"}},\"claim(uint256,bytes32)\":{\"details\":\"Submit a claim about the _stateRoot at _epoch and submit a deposit.\",\"params\":{\"_epoch\":\"The epoch for which the claim is made.\",\"_stateRoot\":\"The state root to claim.\"}},\"constructor\":{\"details\":\"Constructor. Note: epochPeriod must match the VeaInboxArbToGnosis contract deployment on Arbitrum, since it's on a different chain, we can't read it and trust the deployer to set a correct value\",\"params\":{\"_amb\":\"The address of the AMB contract on Gnosis.\",\"_deposit\":\"The deposit amount to submit a claim in wei.\",\"_epochPeriod\":\"The duration of each epoch.\",\"_maxMissingBlocks\":\"The maximum number of blocks that can be missing in a challenge period.\",\"_minChallengePeriod\":\"The minimum time window to challenge a claim.\",\"_routerArbToGnosis\":\"The address of the router on Ethereum that routes from Arbitrum to Gnosis.\",\"_routerChainId\":\"The chain id of the routerArbToGnosis.\",\"_sequencerDelayLimit\":\"The maximum delay in seconds that the Arbitrum sequencer can backdate transactions.\",\"_timeoutEpochs\":\"The epochs before the bridge is considered shutdown.\",\"_weth\":\"The address of the WETH contract on Gnosis.\"}},\"devnetAdvanceState(uint256,bytes32)\":{\"details\":\"Testnet operator utility function to claim, validate and withdraw.\",\"params\":{\"_epoch\":\"The epoch for which the claim is made.\",\"_stateroot\":\"The state root to claim.\"}},\"epochAt(uint256)\":{\"details\":\"Get the current epoch from the outbox's point of view using the Ethereum L1 clock.\",\"returns\":{\"epoch\":\"The hash of the claim.\"}},\"epochNow()\":{\"details\":\"Get the current epoch from the outbox's point of view using the Ethereum L1 clock.\",\"returns\":{\"epoch\":\"The hash of the claim.\"}},\"hashClaim((bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Hashes the claim.\",\"params\":{\"_claim\":\"The claim to hash.\"},\"returns\":{\"hashedClaim\":\"The hash of the claim.\"}},\"isMsgRelayed(uint256)\":{\"details\":\"Get the msg relayed status.\",\"params\":{\"_msgId\":\"The msgId to check.\"},\"returns\":{\"isRelayed\":\"True if the msg was relayed.\"}},\"resolveDisputedClaim(uint256,bytes32,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Resolves any challenge of the optimistic claim for '_epoch'.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch to verify.\",\"_stateRoot\":\"The true state root for the epoch.\"}},\"sendMessage(bytes32[],uint64,address,bytes)\":{\"details\":\"Verifies and relays the message. UNTRUSTED.\",\"params\":{\"_message\":\"The message encoded in the vea inbox as abi.encodeWithSelector(fnSelector, msg.sender, param1, param2, ...)\",\"_msgId\":\"The zero based index of the message in the inbox.\",\"_proof\":\"The merkle proof to prove the message inclusion in the inbox state root.\",\"_to\":\"The address of the contract on Gnosis to call.\"}},\"startVerification(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Start verification for claim for 'epoch'.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch of the claim to challenge.\"}},\"updateSequencerDelayLimit(uint256,uint256)\":{\"details\":\"Set the sequencerDelayLimit by receiving a message from the AMB.\",\"params\":{\"_newSequencerDelayLimit\":\"The delaySeconds from the MaxTimeVariation struct in the Arbitrum Sequencer contract.\",\"_timestamp\":\"The timestamp of the message.\"}},\"verifySnapshot(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Resolves the optimistic claim for '_epoch'.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch of the optimistic claim.\"}},\"withdrawChallengeDeposit(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Sends the deposit back to the Challenger if successful. Includes a portion of the Bridger's deposit.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the challenge deposit to withraw.\"}},\"withdrawChallengerEscapeHatch(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"When bridge is shutdown, no claim disputes can be resolved. This allows the challenger to withdraw their deposit.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the claim deposit to withraw.\"}},\"withdrawClaimDeposit(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Sends the deposit back to the Claimer if successful. Includes a portion of the Challenger's deposit if unsuccessfully challenged.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the claim deposit to withraw.\"}},\"withdrawClaimerEscapeHatch(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"When bridge is shutdown, no claim disputes can be resolved. This allows the claimer to withdraw their deposit.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the claim deposit to withraw.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolveDisputedClaim(uint256,bytes32,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"notice\":\"Note: Access restricted to AMB.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol\":\"VeaOutboxArbToGnosisDevnet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"src/arbitrumToGnosis/VeaOutboxArbToGnosis.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@jaybuidl, @shotaronowhere]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.18;\\n\\nimport \\\"../canonical/gnosis-chain/IAMB.sol\\\";\\nimport \\\"../interfaces/outboxes/IVeaOutboxOnL1.sol\\\";\\nimport \\\"../interfaces/updaters/ISequencerDelayUpdatable.sol\\\";\\nimport \\\"../interfaces/tokens/gnosis/IWETH.sol\\\";\\n\\n/// @dev Vea Outbox From Arbitrum to Gnosis.\\n/// Note: This contract is deployed on Gnosis.\\ncontract VeaOutboxArbToGnosis is IVeaOutboxOnL1, ISequencerDelayUpdatable {\\n // ************************************* //\\n // * Storage * //\\n // ************************************* //\\n\\n IAMB public immutable amb; // The address of the AMB contract on Gnosis.\\n address public immutable routerArbToGnosis; // The address of the router from Arbitrum to Gnosis on ethereum.\\n\\n IWETH public immutable weth; // The address of the WETH contract on Gnosis.\\n uint256 public immutable deposit; // The deposit in wei required to submit a claim or challenge\\n uint256 public immutable burn; // The amount of wei to burn. deposit / 2\\n uint256 public immutable depositPlusReward; // 2 * deposit - burn\\n\\n uint256 internal constant SLOT_TIME = 5; // Gnosis 5 second slot time\\n\\n uint256 public immutable routerChainId; // Router chain id for authentication of messages from the AMB.\\n uint256 public immutable epochPeriod; // Epochs mark the period between potential snapshots.\\n uint256 public immutable minChallengePeriod; // Minimum time window to challenge a claim, even with a malicious sequencer.\\n\\n uint256 public immutable timeoutEpochs; // The number of epochs without forward progress before the bridge is considered shutdown.\\n uint256 public immutable maxMissingBlocks; // The maximum number of blocks that can be missing in a challenge period.\\n\\n bytes32 public stateRoot; // merkle root of the outbox state\\n uint256 public latestVerifiedEpoch; // The latest epoch that has been verified.\\n\\n mapping(uint256 => bytes32) public claimHashes; // epoch => claim\\n mapping(uint256 => bytes32) internal relayed; // msgId/256 => packed replay bitmap, preferred over a simple boolean mapping to save 15k gas per message\\n\\n uint256 public sequencerDelayLimit; // This is MaxTimeVariation.delaySeconds from the arbitrum sequencer inbox, it is the maximum seconds the sequencer can backdate L2 txns relative to the L1 clock.\\n uint256 public timestampDelayUpdated; // The timestamp of the last sequencer delay update.\\n\\n enum CensorshipTestStatus {\\n Failed,\\n Passed,\\n NotStarted,\\n InProgress\\n }\\n\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @dev Watchers check this event to challenge fraud.\\n /// @param _claimer The address of the claimer.\\n /// @param _epoch The epoch associated with the claim.\\n /// @param _stateRoot The state root of the claim.\\n event Claimed(address indexed _claimer, uint256 indexed _epoch, bytes32 _stateRoot);\\n\\n /// @dev This event indicates that `sendSnapshot(epoch)` should be called in the inbox.\\n /// @param _epoch The epoch associated with the challenged claim.\\n /// @param _challenger The address of the challenger.\\n event Challenged(uint256 indexed _epoch, address indexed _challenger);\\n\\n /// @dev This event indicates that a message has been relayed.\\n /// @param _msgId The msgId of the message that was relayed.\\n event MessageRelayed(uint64 _msgId);\\n\\n /// @dev This event indicates that the censorship test started and all challengers are ready even in the worst case scenario of a malicious sequencer.\\n /// @param _epoch The epoch that started verification.\\n event VerificationStarted(uint256 indexed _epoch);\\n\\n /// @dev This events indicates that verification has succeeded. The messages are ready to be relayed.\\n /// @param _epoch The epoch that was verified.\\n event Verified(uint256 _epoch);\\n\\n /// @dev This event indicates the sequencer limit updated.\\n /// @param _newSequencerDelayLimit The new sequencer delay limit.\\n event sequencerDelayLimitUpdateReceived(uint256 _newSequencerDelayLimit);\\n\\n // ************************************* //\\n // * Function Modifiers * //\\n // ************************************* //\\n\\n modifier OnlyBridgeRunning() {\\n unchecked {\\n require(block.timestamp / epochPeriod - latestVerifiedEpoch <= timeoutEpochs, \\\"Bridge Shutdown.\\\");\\n }\\n _;\\n }\\n\\n modifier OnlyBridgeShutdown() {\\n unchecked {\\n require(block.timestamp / epochPeriod - latestVerifiedEpoch > timeoutEpochs, \\\"Bridge Running.\\\");\\n }\\n _;\\n }\\n\\n /// @dev Constructor.\\n /// Note: epochPeriod must match the VeaInboxArbToGnosis contract deployment on Arbitrum, since it's on a different chain, we can't read it and trust the deployer to set a correct value\\n /// @param _deposit The deposit amount to submit a claim in wei.\\n /// @param _epochPeriod The duration of each epoch.\\n /// @param _minChallengePeriod The minimum time window to challenge a claim.\\n /// @param _timeoutEpochs The epochs before the bridge is considered shutdown.\\n /// @param _amb The address of the AMB contract on Gnosis.\\n /// @param _routerArbToGnosis The address of the router on Ethereum that routes from Arbitrum to Gnosis.\\n /// @param _sequencerDelayLimit The maximum delay in seconds that the Arbitrum sequencer can backdate transactions.\\n /// @param _maxMissingBlocks The maximum number of blocks that can be missing in a challenge period.\\n /// @param _routerChainId The chain id of the routerArbToGnosis.\\n /// @param _weth The address of the WETH contract on Gnosis.\\n constructor(\\n uint256 _deposit,\\n uint256 _epochPeriod,\\n uint256 _minChallengePeriod,\\n uint256 _timeoutEpochs,\\n IAMB _amb,\\n address _routerArbToGnosis,\\n uint256 _sequencerDelayLimit,\\n uint256 _maxMissingBlocks,\\n uint256 _routerChainId,\\n IWETH _weth\\n ) {\\n deposit = _deposit;\\n // epochPeriod must match the VeaInboxArbToGnosis contract deployment epochPeriod value.\\n epochPeriod = _epochPeriod;\\n timeoutEpochs = _timeoutEpochs;\\n minChallengePeriod = _minChallengePeriod;\\n amb = _amb;\\n routerArbToGnosis = _routerArbToGnosis;\\n // This value is on another chain, so we can't read it, we trust the deployer to set a correct value.\\n sequencerDelayLimit = _sequencerDelayLimit; // MaxTimeVariation.delaySeconds from the arbitrum sequencer inbox\\n maxMissingBlocks = _maxMissingBlocks;\\n routerChainId = _routerChainId;\\n weth = _weth;\\n\\n // claimant and challenger are not sybil resistant\\n // must burn half deposit to prevent zero cost griefing\\n burn = _deposit / 2;\\n depositPlusReward = 2 * _deposit - burn;\\n\\n latestVerifiedEpoch = block.timestamp / epochPeriod - 1;\\n }\\n\\n // ************************************* //\\n // * Parameter Updates * //\\n // ************************************* //\\n\\n /// @dev Set the sequencerDelayLimit by receiving a message from the AMB.\\n /// @param _newSequencerDelayLimit The delaySeconds from the MaxTimeVariation struct in the Arbitrum Sequencer contract.\\n /// @param _timestamp The timestamp of the message.\\n function updateSequencerDelayLimit(uint256 _newSequencerDelayLimit, uint256 _timestamp) external {\\n require(msg.sender == address(amb), \\\"Not from bridge.\\\");\\n require(bytes32(routerChainId) == amb.messageSourceChainId(), \\\"Invalid chain id.\\\");\\n require(routerArbToGnosis == amb.messageSender(), \\\"Not from router.\\\");\\n require(timestampDelayUpdated < _timestamp, \\\"Message is outdated.\\\");\\n\\n if (sequencerDelayLimit != _newSequencerDelayLimit) {\\n // If _newSequencerDelayLimit > timeout * epochPeriod, then the bridge will shutdown.\\n sequencerDelayLimit = _newSequencerDelayLimit;\\n timestampDelayUpdated = _timestamp;\\n emit sequencerDelayLimitUpdateReceived(_newSequencerDelayLimit);\\n }\\n }\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @dev Submit a claim about the _stateRoot at _epoch and submit a deposit.\\n /// @param _epoch The epoch for which the claim is made.\\n /// @param _stateRoot The state root to claim.\\n function claim(uint256 _epoch, bytes32 _stateRoot) external virtual {\\n require(weth.transferFrom(msg.sender, address(this), deposit), \\\"Failed WETH transfer.\\\");\\n unchecked {\\n require(_epoch == block.timestamp / epochPeriod - 1, \\\"Epoch has not yet passed.\\\");\\n }\\n\\n require(_stateRoot != bytes32(0), \\\"Invalid claim.\\\");\\n require(claimHashes[_epoch] == bytes32(0), \\\"Claim already made.\\\");\\n\\n claimHashes[_epoch] = hashClaim(\\n Claim({\\n stateRoot: _stateRoot,\\n claimer: msg.sender,\\n timestampClaimed: uint32(block.timestamp),\\n timestampVerification: uint32(0),\\n blocknumberVerification: uint32(0),\\n honest: Party.None,\\n challenger: address(0)\\n })\\n );\\n\\n emit Claimed(msg.sender, _epoch, _stateRoot);\\n }\\n\\n /// @dev Submit a challenge for the claim of the inbox state root snapshot taken at 'epoch'.\\n /// @param _epoch The epoch of the claim to challenge.\\n /// @param _claim The claim associated with the epoch.\\n function challenge(uint256 _epoch, Claim memory _claim) external payable {\\n require(weth.transferFrom(msg.sender, address(this), deposit), \\\"Failed WETH transfer.\\\");\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.challenger == address(0), \\\"Claim already challenged.\\\");\\n require(_claim.honest == Party.None, \\\"Claim already verified.\\\");\\n\\n _claim.challenger = msg.sender;\\n claimHashes[_epoch] = hashClaim(_claim);\\n\\n emit Challenged(_epoch, msg.sender);\\n }\\n\\n /// @dev Start verification for claim for 'epoch'.\\n /// @param _epoch The epoch of the claim to challenge.\\n /// @param _claim The claim associated with the epoch.\\n function startVerification(uint256 _epoch, Claim memory _claim) external virtual {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n\\n // sequencerDelayLimit + epochPeriod is the worst case time to sync the L2 state compared to L1 clock.\\n // using checked arithmetic incase arbitrum governance sets sequencerDelayLimit to a large value\\n require(\\n block.timestamp - uint256(_claim.timestampClaimed) >= sequencerDelayLimit + epochPeriod,\\n \\\"Claim must wait atleast maxL2StateSyncDelay.\\\"\\n );\\n\\n CensorshipTestStatus _censorshipTestStatus = censorshipTestStatus(_claim);\\n require(\\n _censorshipTestStatus == CensorshipTestStatus.NotStarted ||\\n _censorshipTestStatus == CensorshipTestStatus.Failed,\\n \\\"Claim verification in progress or already completed.\\\"\\n );\\n\\n _claim.timestampVerification = uint32(block.timestamp);\\n _claim.blocknumberVerification = uint32(block.number);\\n\\n claimHashes[_epoch] = hashClaim(_claim);\\n\\n emit VerificationStarted(_epoch);\\n }\\n\\n /// @dev Resolves the optimistic claim for '_epoch'.\\n /// @param _epoch The epoch of the optimistic claim.\\n /// @param _claim The claim associated with the epoch.\\n function verifySnapshot(uint256 _epoch, Claim memory _claim) external virtual OnlyBridgeRunning {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.challenger == address(0), \\\"Claim is challenged.\\\");\\n require(censorshipTestStatus(_claim) == CensorshipTestStatus.Passed, \\\"Censorship test not passed.\\\");\\n\\n if (_epoch > latestVerifiedEpoch) {\\n latestVerifiedEpoch = _epoch;\\n stateRoot = _claim.stateRoot;\\n emit Verified(_epoch);\\n }\\n\\n _claim.honest = Party.Claimer;\\n claimHashes[_epoch] = hashClaim(_claim);\\n }\\n\\n /// Note: Access restricted to AMB.\\n /// @dev Resolves any challenge of the optimistic claim for '_epoch'.\\n /// @param _epoch The epoch to verify.\\n /// @param _stateRoot The true state root for the epoch.\\n /// @param _claim The claim associated with the epoch.\\n function resolveDisputedClaim(\\n uint256 _epoch,\\n bytes32 _stateRoot,\\n Claim memory _claim\\n ) external virtual OnlyBridgeRunning {\\n // Ethereum -> Gnosis message authentication with the AMB, the canonical Ethereum <-> Gnosis bridge.\\n // https://docs.tokenbridge.net/amb-bridge/development-of-a-cross-chain-application/how-to-develop-xchain-apps-by-amb#receive-a-method-call-from-the-amb-bridge\\n\\n require(msg.sender == address(amb), \\\"Not from native Gnosis AMB bridge.\\\");\\n require(bytes32(routerChainId) == amb.messageSourceChainId(), \\\"Invalid chain id.\\\");\\n require(routerArbToGnosis == amb.messageSender(), \\\"Not from router.\\\");\\n\\n if (_epoch > latestVerifiedEpoch && _stateRoot != bytes32(0)) {\\n latestVerifiedEpoch = _epoch;\\n stateRoot = _stateRoot;\\n emit Verified(_epoch);\\n }\\n\\n if (claimHashes[_epoch] == hashClaim(_claim)) {\\n if (_claim.stateRoot == _stateRoot) {\\n _claim.honest = Party.Claimer;\\n } else if (_claim.challenger != address(0)) {\\n _claim.honest = Party.Challenger;\\n }\\n claimHashes[_epoch] = hashClaim(_claim);\\n }\\n }\\n\\n /// @dev Verifies and relays the message. UNTRUSTED.\\n /// @param _proof The merkle proof to prove the message inclusion in the inbox state root.\\n /// @param _msgId The zero based index of the message in the inbox.\\n /// @param _to The address of the contract on Gnosis to call.\\n /// @param _message The message encoded in the vea inbox as abi.encodeWithSelector(fnSelector, msg.sender, param1, param2, ...)\\n function sendMessage(bytes32[] calldata _proof, uint64 _msgId, address _to, bytes calldata _message) external {\\n require(_proof.length < 64, \\\"Proof too long.\\\");\\n\\n bytes32 nodeHash = keccak256(abi.encodePacked(_msgId, _to, _message));\\n\\n // double hashed leaf\\n // avoids second order preimage attacks\\n // https://flawed.net.nz/2018/02/21/attacking-merkle-trees-with-a-second-preimage-attack/\\n assembly {\\n mstore(0x00, nodeHash)\\n nodeHash := keccak256(0x00, 0x20)\\n }\\n\\n unchecked {\\n for (uint256 i = 0; i < _proof.length; i++) {\\n bytes32 proofElement = _proof[i];\\n // sort sibling hashes as a convention for efficient proof validation\\n if (proofElement > nodeHash)\\n assembly {\\n mstore(0x00, nodeHash)\\n mstore(0x20, proofElement)\\n nodeHash := keccak256(0x00, 0x40)\\n }\\n else\\n assembly {\\n mstore(0x00, proofElement)\\n mstore(0x20, nodeHash)\\n nodeHash := keccak256(0x00, 0x40)\\n }\\n }\\n }\\n\\n require(stateRoot == nodeHash, \\\"Invalid proof.\\\");\\n\\n // msgId is the zero-based index of the message in the inbox.\\n // msgId is also used as an index in the relayed bitmap to prevent replay.\\n // Note: a bitmap is used instead of a simple boolean mapping to save 15k gas per message.\\n\\n uint256 relayIndex = _msgId >> 8;\\n uint256 offset;\\n\\n unchecked {\\n offset = _msgId % 256;\\n }\\n\\n bytes32 replay = relayed[relayIndex];\\n\\n require(((replay >> offset) & bytes32(uint256(1))) == bytes32(0), \\\"Message already relayed\\\");\\n relayed[relayIndex] = replay | bytes32(1 << offset);\\n\\n // UNTRUSTED.\\n (bool success, ) = _to.call(_message);\\n require(success, \\\"Failed to call contract\\\");\\n\\n emit MessageRelayed(_msgId);\\n }\\n\\n /// @dev Sends the deposit back to the Claimer if successful. Includes a portion of the Challenger's deposit if unsuccessfully challenged.\\n /// @param _epoch The epoch associated with the claim deposit to withraw.\\n /// @param _claim The claim associated with the epoch.\\n function withdrawClaimDeposit(uint256 _epoch, Claim calldata _claim) external virtual {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.honest == Party.Claimer, \\\"Claim failed.\\\");\\n\\n delete claimHashes[_epoch];\\n\\n if (_claim.challenger != address(0)) {\\n weth.burn(burn); // no return value to check\\n require(weth.transfer(_claim.claimer, depositPlusReward), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n } else {\\n require(weth.transfer(_claim.claimer, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n }\\n }\\n\\n /// @dev Sends the deposit back to the Challenger if successful. Includes a portion of the Bridger's deposit.\\n /// @param _epoch The epoch associated with the challenge deposit to withraw.\\n /// @param _claim The claim associated with the epoch.\\n function withdrawChallengeDeposit(uint256 _epoch, Claim calldata _claim) external {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.honest == Party.Challenger, \\\"Challenge failed.\\\");\\n\\n delete claimHashes[_epoch];\\n\\n weth.burn(burn); // no return value to check\\n require(weth.transfer(_claim.challenger, depositPlusReward), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n }\\n\\n /// @dev When bridge is shutdown, no claim disputes can be resolved. This allows the claimer to withdraw their deposit.\\n /// @param _epoch The epoch associated with the claim deposit to withraw.\\n /// @param _claim The claim associated with the epoch.\\n function withdrawClaimerEscapeHatch(uint256 _epoch, Claim memory _claim) external OnlyBridgeShutdown {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.honest == Party.None, \\\"Claim resolved.\\\");\\n\\n if (_claim.claimer != address(0)) {\\n if (_claim.challenger == address(0)) {\\n delete claimHashes[_epoch];\\n require(weth.transfer(_claim.claimer, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n } else {\\n address claimer = _claim.claimer;\\n _claim.claimer = address(0);\\n claimHashes[_epoch] == hashClaim(_claim);\\n require(weth.transfer(claimer, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n }\\n }\\n }\\n\\n /// @dev When bridge is shutdown, no claim disputes can be resolved. This allows the challenger to withdraw their deposit.\\n /// @param _epoch The epoch associated with the claim deposit to withraw.\\n /// @param _claim The claim associated with the epoch.\\n function withdrawChallengerEscapeHatch(uint256 _epoch, Claim memory _claim) external OnlyBridgeShutdown {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.honest == Party.None, \\\"Claim resolved.\\\");\\n\\n if (_claim.challenger != address(0)) {\\n if (_claim.claimer == address(0)) {\\n delete claimHashes[_epoch];\\n require(weth.transfer(_claim.challenger, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n } else {\\n address challenger = _claim.challenger;\\n _claim.challenger = address(0);\\n claimHashes[_epoch] == hashClaim(_claim);\\n require(weth.transfer(challenger, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n }\\n }\\n }\\n\\n // ************************************* //\\n // * Pure / Views * //\\n // ************************************* //\\n\\n /// @dev Hashes the claim.\\n /// @param _claim The claim to hash.\\n /// @return hashedClaim The hash of the claim.\\n function hashClaim(Claim memory _claim) public pure returns (bytes32 hashedClaim) {\\n return\\n hashedClaim = keccak256(\\n abi.encodePacked(\\n _claim.stateRoot,\\n _claim.claimer,\\n _claim.timestampClaimed,\\n _claim.timestampVerification,\\n _claim.blocknumberVerification,\\n _claim.honest,\\n _claim.challenger\\n )\\n );\\n }\\n\\n /// @dev Gets the status of the censorship test for claim.\\n /// @param _claim The claim to test.\\n /// @return status True if the claim passed the censorship test.\\n function censorshipTestStatus(Claim memory _claim) public view returns (CensorshipTestStatus status) {\\n unchecked {\\n if (uint256(_claim.timestampVerification) == 0) {\\n status = CensorshipTestStatus.NotStarted;\\n } else if (block.timestamp - uint256(_claim.timestampVerification) < minChallengePeriod) {\\n status = CensorshipTestStatus.InProgress;\\n } else {\\n uint256 expectedBlocks = uint256(_claim.blocknumberVerification) +\\n (block.timestamp - uint256(_claim.timestampVerification)) /\\n SLOT_TIME;\\n uint256 actualBlocks = block.number;\\n if (expectedBlocks - actualBlocks <= maxMissingBlocks) {\\n status = CensorshipTestStatus.Passed;\\n } else {\\n status = CensorshipTestStatus.Failed;\\n }\\n }\\n }\\n }\\n\\n /// @dev Get the current epoch from the outbox's point of view using the Ethereum L1 clock.\\n /// @return epoch The hash of the claim.\\n function epochNow() external view returns (uint256 epoch) {\\n epoch = block.timestamp / epochPeriod;\\n }\\n\\n /// @dev Get the current epoch from the outbox's point of view using the Ethereum L1 clock.\\n /// @return epoch The hash of the claim.\\n function epochAt(uint256 timestamp) external view returns (uint256 epoch) {\\n epoch = timestamp / epochPeriod;\\n }\\n\\n /// @dev Get the msg relayed status.\\n /// @param _msgId The msgId to check.\\n /// @return isRelayed True if the msg was relayed.\\n function isMsgRelayed(uint256 _msgId) external view returns (bool isRelayed) {\\n uint256 relayIndex = _msgId >> 8;\\n uint256 offset;\\n\\n unchecked {\\n offset = _msgId % 256;\\n }\\n\\n bytes32 replay = relayed[relayIndex];\\n\\n isRelayed = (replay >> offset) & bytes32(uint256(1)) == bytes32(uint256(1));\\n }\\n}\\n\",\"keccak256\":\"0x8a5031b4acc020c109c8bca88e621aa8b7a480c8c1d6b00f28fd9574ce42be9e\",\"license\":\"MIT\"},\"src/canonical/gnosis-chain/IAMB.sol\":{\"content\":\"// https://docs.gnosischain.com/bridges/tokenbridge/amb-bridge#gnosis\\n// https://github.com/omni/tokenbridge-contracts/blob/908a48107919d4ab127f9af07d44d47eac91547e/contracts/interfaces/IAMB.sol\\n// interface is pruned for relevant function stubs\\n\\npragma solidity 0.8.18;\\n\\ninterface IAMB {\\n function requireToPassMessage(address _contract, bytes memory _data, uint256 _gas) external returns (bytes32);\\n\\n function maxGasPerTx() external view returns (uint256);\\n\\n function messageSender() external view returns (address);\\n\\n function messageSourceChainId() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x529d45e46ca0c046c32b296b35ae8073c4a999ef37510545ec44d26e78deca0d\"},\"src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@jaybuidl, @shotaronowhere]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.18;\\n\\nimport \\\"../../arbitrumToGnosis/VeaOutboxArbToGnosis.sol\\\";\\n\\n/// @dev Vea Outbox From ArbitrumGoerli to Chiado.\\n/// Note: This contract is deployed on Chiado.\\n/// Note: This contract is permissioned for developer testing (devnet).\\ncontract VeaOutboxArbToGnosisDevnet is VeaOutboxArbToGnosis {\\n address public devnetOperator; // permissioned devnet operator\\n\\n /// @dev Requires that the sender is the devnet operator.\\n modifier onlyByDevnetOperator() {\\n require(devnetOperator == msg.sender);\\n _;\\n }\\n\\n /// @dev Changes the devnet operator.\\n /// @param _devnetOperator The new testnet operator.\\n function changeDevnetOperator(address _devnetOperator) external onlyByDevnetOperator {\\n require(msg.sender == devnetOperator, \\\"Invalid Testnet Operator\\\");\\n devnetOperator = _devnetOperator;\\n }\\n\\n /// @dev Submit a claim about the _stateRoot at _epoch and submit a deposit.\\n /// @param _epoch The epoch for which the claim is made.\\n /// @param _stateRoot The state root to claim.\\n function claim(uint256 _epoch, bytes32 _stateRoot) public override onlyByDevnetOperator {\\n require(weth.transferFrom(msg.sender, address(this), deposit), \\\"Failed WETH transfer.\\\");\\n require(_stateRoot != bytes32(0), \\\"Invalid claim.\\\");\\n require(claimHashes[_epoch] == bytes32(0), \\\"Claim already made.\\\");\\n\\n claimHashes[_epoch] = hashClaim(\\n Claim({\\n stateRoot: _stateRoot,\\n claimer: msg.sender,\\n timestampClaimed: uint32(block.timestamp),\\n timestampVerification: uint32(0),\\n blocknumberVerification: uint32(0),\\n honest: Party.None,\\n challenger: address(0)\\n })\\n );\\n\\n emit Claimed(msg.sender, _epoch, _stateRoot);\\n }\\n\\n /// @dev Start verification for claim for 'epoch'.\\n /// @param _epoch The epoch of the claim to challenge.\\n /// @param _claim The claim associated with the epoch.\\n function startVerification(uint256 _epoch, Claim memory _claim) public override onlyByDevnetOperator {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n\\n _claim.timestampVerification = uint32(block.timestamp);\\n _claim.blocknumberVerification = uint32(block.number);\\n\\n claimHashes[_epoch] = hashClaim(_claim);\\n\\n emit VerificationStarted(_epoch);\\n }\\n\\n /// @dev Sends the deposit back to the Claimer if successful. Includes a portion of the Challenger's deposit if unsuccessfully challenged.\\n /// @param _epoch The epoch associated with the claim deposit to withraw.\\n /// @param _claim The claim associated with the epoch.\\n function withdrawClaimDeposit(uint256 _epoch, Claim memory _claim) public override {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.honest == Party.Claimer, \\\"Claim failed.\\\");\\n\\n delete claimHashes[_epoch];\\n\\n if (_claim.challenger != address(0)) {\\n weth.burn(burn); // no return value to check\\n require(weth.transfer(_claim.claimer, depositPlusReward), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n } else {\\n require(weth.transfer(_claim.claimer, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n }\\n }\\n\\n /// @dev Resolves the optimistic claim for '_epoch'.\\n /// @param _epoch The epoch of the optimistic claim.\\n /// @param _claim The claim associated with the epoch.\\n function verifySnapshot(uint256 _epoch, Claim memory _claim) public override OnlyBridgeRunning {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.challenger == address(0), \\\"Claim is challenged.\\\");\\n\\n if (_epoch > latestVerifiedEpoch) {\\n latestVerifiedEpoch = _epoch;\\n stateRoot = _claim.stateRoot;\\n emit Verified(_epoch);\\n }\\n\\n _claim.honest = Party.Claimer;\\n claimHashes[_epoch] = hashClaim(_claim);\\n }\\n\\n /// @dev Testnet operator utility function to claim, validate and withdraw.\\n /// @param _epoch The epoch for which the claim is made.\\n /// @param _stateroot The state root to claim.\\n function devnetAdvanceState(uint256 _epoch, bytes32 _stateroot) external payable {\\n claim(_epoch, _stateroot);\\n Claim memory claim = Claim({\\n stateRoot: _stateroot,\\n claimer: msg.sender,\\n timestampClaimed: uint32(block.timestamp),\\n timestampVerification: uint32(0),\\n blocknumberVerification: uint32(0),\\n honest: Party.None,\\n challenger: address(0)\\n });\\n claim.timestampClaimed = uint32(block.timestamp);\\n startVerification(_epoch, claim);\\n claim.timestampVerification = uint32(block.timestamp);\\n claim.blocknumberVerification = uint32(block.number);\\n verifySnapshot(_epoch, claim);\\n claim.honest = Party.Claimer;\\n withdrawClaimDeposit(_epoch, claim);\\n }\\n\\n /// @dev Constructor.\\n /// Note: epochPeriod must match the VeaInboxArbToGnosis contract deployment on Arbitrum, since it's on a different chain, we can't read it and trust the deployer to set a correct value\\n /// @param _deposit The deposit amount to submit a claim in wei.\\n /// @param _epochPeriod The duration of each epoch.\\n /// @param _minChallengePeriod The minimum time window to challenge a claim.\\n /// @param _timeoutEpochs The epochs before the bridge is considered shutdown.\\n /// @param _amb The address of the AMB contract on Gnosis.\\n /// @param _routerArbToGnosis The address of the router on Ethereum that routes from Arbitrum to Gnosis.\\n /// @param _sequencerDelayLimit The maximum delay in seconds that the Arbitrum sequencer can backdate transactions.\\n /// @param _maxMissingBlocks The maximum number of blocks that can be missing in a challenge period.\\n /// @param _routerChainId The chain id of the routerArbToGnosis.\\n /// @param _weth The address of the WETH contract on Gnosis.\\n constructor(\\n uint256 _deposit,\\n uint256 _epochPeriod,\\n uint256 _minChallengePeriod,\\n uint256 _timeoutEpochs,\\n IAMB _amb,\\n address _routerArbToGnosis,\\n uint256 _sequencerDelayLimit,\\n uint256 _maxMissingBlocks,\\n uint256 _routerChainId,\\n IWETH _weth\\n )\\n VeaOutboxArbToGnosis(\\n _deposit,\\n _epochPeriod,\\n _minChallengePeriod,\\n _timeoutEpochs,\\n _amb,\\n _routerArbToGnosis,\\n _sequencerDelayLimit,\\n _maxMissingBlocks,\\n _routerChainId,\\n _weth\\n )\\n {\\n devnetOperator = msg.sender;\\n }\\n}\\n\",\"keccak256\":\"0xf0586aed26d7bd8cc6b397f996d6d7220abb2f8676670749d81d7f6133ad8a27\",\"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.18;\\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\":\"0x52f714405dbb6f5953f7e59bf7139742837c2f055fc090971421d931a5289b51\",\"license\":\"MIT\"},\"src/interfaces/tokens/gnosis/IWETH.sol\":{\"content\":\"// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/5daaf60d11ee2075260d0f3adfb22b1c536db983/contracts/token/ERC20/BurnableToken.sol\\n// implementation: https://gnosisscan.io/address/0xf8d1677c8a0c961938bf2f9adc3f3cfda759a9d9#code\\n// proxy: https://gnosisscan.io/token/0x6a023ccd1ff6f2045c3309768ead9e68f978f6e1#readProxyContract\\n\\n/**\\n * @title Burnable Token\\n * @dev Token that can be irreversibly burned (destroyed).\\n */\\ninterface IWETH {\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n event Burn(address indexed burner, uint256 value);\\n\\n /**\\n * @dev Burns a specific amount of tokens.\\n * @param _value The amount of token to be burned.\\n */\\n function burn(uint256 _value) external;\\n\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Transfer tokens from one address to another\\n * @param _from address The address which you want to send tokens from\\n * @param _to address The address which you want to transfer to\\n * @param _value uint256 the amount of tokens to be transferred\\n */\\n function transferFrom(address _from, address _to, uint256 _value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd7cb8c8585a387464c451c2ff81ad3f9f02e291fe0dad802ff84646ff18d1eb2\"},\"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.18;\\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\":\"0x1b25222d0ebdb4beed6cd844ea1f262c89e4c002e7520972e6b79083eeed6418\",\"license\":\"MIT\"},\"src/interfaces/updaters/ISequencerDelayUpdatable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@jaybuidl, @shotaronowhere]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.18;\\n\\n/// @dev Interface of a contract which is updatable, receiving parameter updates from an L1 contract through a cross-chain call.\\n/// @dev eg. Arbitrum (L2) -> Ethereum (L1) -> Gnosis (L1), the veaOutbox on Gnosis will be an ISequencerDelayUpdatable contract which receives updates from the router on Ethereum.\\ninterface ISequencerDelayUpdatable {\\n /// @dev Updates the sequencer limit.\\n /// Note: Access restricted to ensure the argument is passed from the Sequencer contract.\\n /// @param _newSequencerDelayLimit The delaySeconds from the MaxTimeVariation struct in the Arbitrum Sequencer contract.\\n /// @param _timestamp The timestamp of the message.\\n function updateSequencerDelayLimit(uint256 _newSequencerDelayLimit, uint256 _timestamp) external;\\n}\\n\",\"keccak256\":\"0xa99728056c1360f321ddac49c565ed0d4f2094569aaca3a2523df9f833e83925\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x6101e06040523480156200001257600080fd5b5060405162002be938038062002be983398101604081905262000035916200012f565b60e08a90526101608990526101a08790526101808890526001600160a01b0380871660805280861660a05260048590556101c0849052610140839052811660c052898989898989898989896200008d60028b620001e0565b610100819052620000a08b600262000203565b620000ac919062000223565b6101205261016051600190620000c39042620001e0565b620000cf919062000223565b6001819055505050505050505050505033600660006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050505050505050505062000239565b6001600160a01b03811681146200012c57600080fd5b50565b6000806000806000806000806000806101408b8d0312156200015057600080fd5b8a51995060208b0151985060408b0151975060608b0151965060808b0151620001798162000116565b60a08c01519096506200018c8162000116565b8095505060c08b0151935060e08b015192506101008b015191506101208b0151620001b78162000116565b809150509295989b9194979a5092959850565b634e487b7160e01b600052601160045260246000fd5b600082620001fe57634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176200021d576200021d620001ca565b92915050565b818103818111156200021d576200021d620001ca565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051612803620003e6600039600081816105b001526121bc0152600081816105e40152818161098e01528181611b0401528181611c8f0152611f4e01526000818161066c0152612150015260008181610618015281816109b201528181610d43015281816119f201528181611b2801528181611cb30152611f7201526000818161054601528181610b290152610e5c0152600081816104d20152818161168201526118720152600081816104080152818161159101526117c40152600081816106a00152818161078701528181611076015281816118ed01528181611e0801528181611e9d01526120c7015260008181610387015281816107ad0152818161109c015281816115b701528181611623015281816117ea015281816118980152818161191301528181611e2e01528181611ec301526120ed0152600081816106d401528181610c160152610f4901526000818161025001528181610a2d01528181610aa701528181610b8b01528181610d7801528181610dda0152610ebe01526128036000f3fe6080604052600436106102045760003560e01c80637ffc2a6e11610118578063b5b7a184116100a0578063d5e6a9df1161006f578063d5e6a9df146106c2578063da2b7bc4146106f6578063df19e6ff14610716578063e813a75514610743578063eedcf2a91461075957600080fd5b8063b5b7a18414610606578063b633b9441461063a578063c2114a161461065a578063d0e30db01461068e57600080fd5b80638d96fdea116100e75780638d96fdea14610534578063930f28af146105685780639588eca214610588578063aa22a1c61461059e578063b044397e146105d257600080fd5b80637ffc2a6e146104aa578063836e344b146104c05780638a619a71146104f45780638ad3a8f71461051457600080fd5b806331ddf7431161019b57806344df8e701161016a57806344df8e70146103f65780634788cb381461042a57806349b4299e1461044a5780634a439cfe1461046a578063541adcca1461048a57600080fd5b806331ddf743146103355780633ce43cfd146103555780633fc8cef31461037557806343b066d5146103a957600080fd5b80632639c060116101d75780632639c060146102b257806327ee6bdd146102df5780632c192519146102f557806331d144571461031557600080fd5b806301139b68146102095780630f0adca51461021e5780631062b39a1461023e578063222ae7861461028f575b600080fd5b61021c610217366004612379565b61076c565b005b34801561022a57600080fd5b5061021c6102393660046123a7565b61098c565b34801561024a57600080fd5b506102727f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561029b57600080fd5b506102a4610d3c565b604051908152602001610286565b3480156102be57600080fd5b506102a46102cd3660046123de565b60026020526000908152604090205481565b3480156102eb57600080fd5b506102a460015481565b34801561030157600080fd5b5061021c6103103660046123f7565b610d6d565b34801561032157600080fd5b5061021c6103303660046123f7565b611044565b34801561034157600080fd5b5061021c61035036600461247a565b61122f565b34801561036157600080fd5b5061021c61037036600461253c565b6114cf565b34801561038157600080fd5b506102727f000000000000000000000000000000000000000000000000000000000000000081565b3480156103b557600080fd5b506103e66103c43660046123de565b600881901c600090815260036020526040902054600160ff9092161c81161490565b6040519015158152602001610286565b34801561040257600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561043657600080fd5b5061021c610445366004612379565b611709565b34801561045657600080fd5b5061021c610465366004612379565b611944565b34801561047657600080fd5b506102a46104853660046123de565b6119eb565b34801561049657600080fd5b506102a46104a5366004612575565b611a1d565b3480156104b657600080fd5b506102a460055481565b3480156104cc57600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561050057600080fd5b5061021c61050f366004612598565b611a6f565b34801561052057600080fd5b50600654610272906001600160a01b031681565b34801561054057600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561057457600080fd5b5061021c610583366004612379565b611b02565b34801561059457600080fd5b506102a460005481565b3480156105aa57600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b3480156105de57600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561061257600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561064657600080fd5b5061021c610655366004612379565b611c8d565b34801561066657600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561069a57600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b3480156106ce57600080fd5b506102727f000000000000000000000000000000000000000000000000000000000000000081565b34801561070257600080fd5b5061021c610711366004612379565b611f4c565b34801561072257600080fd5b50610736610731366004612575565b612132565b60405161028691906125cb565b34801561074f57600080fd5b506102a460045481565b61021c6107673660046123f7565b6121f9565b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af11580156107fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082291906125e5565b6108475760405162461bcd60e51b815260040161083e90612607565b60405180910390fd5b61085081611a1d565b6000838152600260205260409020541461087c5760405162461bcd60e51b815260040161083e90612636565b60c08101516001600160a01b0316156108d75760405162461bcd60e51b815260206004820152601960248201527f436c61696d20616c7265616479206368616c6c656e6765642e00000000000000604482015260640161083e565b60008160a0015160028111156108ef576108ef6125b5565b1461093c5760405162461bcd60e51b815260206004820152601760248201527f436c61696d20616c72656164792076657269666965642e000000000000000000604482015260640161083e565b3360c082015261094b81611a1d565b600083815260026020526040808220929092559051339184917fcfe09ca25f55d949baba5e280f5750c9ba4b9048fca5532f916067d433afe4d79190a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f000000000000000000000000000000000000000000000000000000000000000042816109df576109df61265e565b04031115610a225760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b604482015260640161083e565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610aa55760405162461bcd60e51b815260206004820152602260248201527f4e6f742066726f6d206e617469766520476e6f73697320414d42206272696467604482015261329760f11b606482015260840161083e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b279190612674565b7f000000000000000000000000000000000000000000000000000000000000000014610b895760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b604482015260640161083e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610be7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0b919061268d565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610c7e5760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b604482015260640161083e565b60015483118015610c8e57508115155b15610cd157600183905560008290556040518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a15b610cda81611a1d565b60008481526002602052604090205403610d37578051829003610d0357600160a0820152610d1e565b60c08101516001600160a01b031615610d1e57600260a08201525b610d2781611a1d565b6000848152600260205260409020555b505050565b6000610d687f0000000000000000000000000000000000000000000000000000000000000000426126aa565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610dd85760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b690313934b233b29760811b604482015260640161083e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5a9190612674565b7f000000000000000000000000000000000000000000000000000000000000000014610ebc5760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b604482015260640161083e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3e919061268d565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610fb15760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b604482015260640161083e565b8060055410610ff95760405162461bcd60e51b815260206004820152601460248201527326b2b9b9b0b3b29034b99037baba3230ba32b21760611b604482015260640161083e565b816004541461104057600482905560058190556040518281527f684f6fb71cbcb798156dcca2a95dbd142fa1f8957637833b1897ab89e05aa7079060200160405180910390a15b5050565b6006546001600160a01b0316331461105b57600080fd5b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af11580156110ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111191906125e5565b61112d5760405162461bcd60e51b815260040161083e90612607565b8061114a5760405162461bcd60e51b815260040161083e90612636565b6000828152600260205260409020541561119c5760405162461bcd60e51b815260206004820152601360248201527221b630b4b69030b63932b0b23c9036b0b2329760691b604482015260640161083e565b6040805160e0810182528281523360208201524263ffffffff16918101919091526000606082018190526080820181905260a0820181905260c08201526111e290611a1d565b6000838152600260209081526040918290209290925551828152839133917fd95107f4584744c6c893a04c43058aadd1ce8aac8ca5d64140eaf277de6c1d57910160405180910390a35050565b604085106112715760405162461bcd60e51b815260206004820152600f60248201526e283937b7b3103a37b7903637b7339760891b604482015260640161083e565b60008484848460405160200161128a94939291906126cc565b604051602081830303815290604052805190602001209050806000526020600020905060005b8681101561130a5760008888838181106112cc576112cc61270e565b905060200201359050828111156112f157826000528060205260406000209250611301565b8060005282602052604060002092505b506001016112b0565b50806000541461134d5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b604482015260640161083e565b600885901c66ffffffffffffff1660008181526003602052604090205460ff87169080821c600116156113c25760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792072656c61796564000000000000000000604482015260640161083e565b6000838152600360205260408082206001851b84179055516001600160a01b038916906113f29089908990612724565b6000604051808303816000865af19150503d806000811461142f576040519150601f19603f3d011682016040523d82523d6000602084013e611434565b606091505b50509050806114855760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2063616c6c20636f6e7472616374000000000000000000604482015260640161083e565b60405167ffffffffffffffff8a1681527f54303fab361bc52c2f1f56ace7351189582264f74ce47a6e7c3f478d64c429439060200160405180910390a15050505050505050505050565b6114e16104a536839003830183612575565b6000838152600260205260409020541461150d5760405162461bcd60e51b815260040161083e90612636565b600261151f60c0830160a08401612734565b6002811115611530576115306125b5565b146115715760405162461bcd60e51b815260206004820152601160248201527021b430b63632b733b2903330b4b632b21760791b604482015260640161083e565b6000828152600260205260408082209190915551630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b15801561160357600080fd5b505af1158015611617573d6000803e3d6000fd5b50506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063a9059cbb905061165c60e0840160c08501612598565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201527f000000000000000000000000000000000000000000000000000000000000000060248201526044015b6020604051808303816000875af11580156116c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ed91906125e5565b6110405760405162461bcd60e51b815260040161083e90612607565b61171281611a1d565b6000838152600260205260409020541461173e5760405162461bcd60e51b815260040161083e90612636565b60018160a001516002811115611756576117566125b5565b146117935760405162461bcd60e51b815260206004820152600d60248201526c21b630b4b6903330b4b632b21760991b604482015260640161083e565b60008281526002602052604081205560c08101516001600160a01b0316156118c957604051630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b15801561183657600080fd5b505af115801561184a573d6000803e3d6000fd5b50505050602081015160405163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116aa565b602081015160405163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116aa565b6006546001600160a01b0316331461195b57600080fd5b61196481611a1d565b600083815260026020526040902054146119905760405162461bcd60e51b815260040161083e90612636565b63ffffffff4281166060830152431660808201526119ad81611a1d565b60008381526002602052604080822092909255905183917f37b700b61b9b4710dddb0c3316b2be7ef6088ed4b1d7bfe0fb98be8f9a163e1691a25050565b6000611a177f0000000000000000000000000000000000000000000000000000000000000000836126aa565b92915050565b80516020808301516040808501516060860151608087015160a088015160c08901519451600098611a5298909796910161274f565b604051602081830303815290604052805190602001209050919050565b6006546001600160a01b03163314611a8657600080fd5b6006546001600160a01b03163314611ae05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420546573746e6574204f70657261746f720000000000000000604482015260640161083e565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611b5557611b5561265e565b04031115611b985760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b604482015260640161083e565b611ba181611a1d565b60008381526002602052604090205414611bcd5760405162461bcd60e51b815260040161083e90612636565b60c08101516001600160a01b031615611c1f5760405162461bcd60e51b815260206004820152601460248201527321b630b4b69034b99031b430b63632b733b2b21760611b604482015260640161083e565b600154821115611c6757600182905580516000556040518281527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a15b600160a0820152611c7781611a1d565b6000928352600260205260409092209190915550565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611ce057611ce061265e565b040311611d215760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b604482015260640161083e565b611d2a81611a1d565b60008381526002602052604090205414611d565760405162461bcd60e51b815260040161083e90612636565b60008160a001516002811115611d6e57611d6e6125b5565b14611dad5760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b604482015260640161083e565b60c08101516001600160a01b0316156110405760208101516001600160a01b0316611e5f576000828152600260205260408082209190915560c0820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116aa565b60c0810180516000909152611e7382611a1d565b506000839052600260205260405163a9059cbb60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3091906125e5565b610d375760405162461bcd60e51b815260040161083e90612607565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611f9f57611f9f61265e565b040311611fe05760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b604482015260640161083e565b611fe981611a1d565b600083815260026020526040902054146120155760405162461bcd60e51b815260040161083e90612636565b60008160a00151600281111561202d5761202d6125b5565b1461206c5760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b604482015260640161083e565b60208101516001600160a01b0316156110405760c08101516001600160a01b031661211e57600082815260026020908152604080832092909255820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116aa565b6020810180516000909152611e7382611a1d565b6000816060015163ffffffff1660000361214e57506002919050565b7f0000000000000000000000000000000000000000000000000000000000000000826060015163ffffffff164203101561218a57506003919050565b60006005836060015163ffffffff164203816121a8576121a861265e565b608085015163ffffffff16919004019050437f0000000000000000000000000000000000000000000000000000000000000000818303116121ec57600192506121f1565b600092505b50505b919050565b6122038282611044565b6040805160e0810182528281523360208201524263ffffffff16918101919091526000606082018190526080820181905260a0820181905260c082015261224a8382611944565b63ffffffff4281166060830152431660808201526122688382611b02565b600160a0820152610d378382611709565b6001600160a01b038116811461228e57600080fd5b50565b80356121f481612279565b803563ffffffff811681146121f457600080fd5b8035600381106121f457600080fd5b600060e082840312156122d157600080fd5b60405160e0810181811067ffffffffffffffff8211171561230257634e487b7160e01b600052604160045260246000fd5b6040528235815290508061231860208401612291565b60208201526123296040840161229c565b604082015261233a6060840161229c565b606082015261234b6080840161229c565b608082015261235c60a084016122b0565b60a082015261236d60c08401612291565b60c08201525092915050565b600080610100838503121561238d57600080fd5b8235915061239e84602085016122bf565b90509250929050565b600080600061012084860312156123bd57600080fd5b83359250602084013591506123d585604086016122bf565b90509250925092565b6000602082840312156123f057600080fd5b5035919050565b6000806040838503121561240a57600080fd5b50508035926020909101359150565b803567ffffffffffffffff811681146121f457600080fd5b60008083601f84011261244357600080fd5b50813567ffffffffffffffff81111561245b57600080fd5b60208301915083602082850101111561247357600080fd5b9250929050565b6000806000806000806080878903121561249357600080fd5b863567ffffffffffffffff808211156124ab57600080fd5b818901915089601f8301126124bf57600080fd5b8135818111156124ce57600080fd5b8a60208260051b85010111156124e357600080fd5b602083019850809750506124f960208a01612419565b955061250760408a01612291565b9450606089013591508082111561251d57600080fd5b5061252a89828a01612431565b979a9699509497509295939492505050565b60008082840361010081121561255157600080fd5b8335925060e0601f198201121561256757600080fd5b506020830190509250929050565b600060e0828403121561258757600080fd5b61259183836122bf565b9392505050565b6000602082840312156125aa57600080fd5b813561259181612279565b634e487b7160e01b600052602160045260246000fd5b60208101600483106125df576125df6125b5565b91905290565b6000602082840312156125f757600080fd5b8151801515811461259157600080fd5b6020808252601590820152742330b4b632b2102ba2aa24103a3930b739b332b91760591b604082015260600190565b6020808252600e908201526d24b73b30b634b21031b630b4b69760911b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b60006020828403121561268657600080fd5b5051919050565b60006020828403121561269f57600080fd5b815161259181612279565b6000826126c757634e487b7160e01b600052601260045260246000fd5b500490565b60c085901b6001600160c01b0319168152606084901b6bffffffffffffffffffffffff191660088201528183601c83013760009101601c019081529392505050565b634e487b7160e01b600052603260045260246000fd5b8183823760009101908152919050565b60006020828403121561274657600080fd5b612591826122b0565b87815260006bffffffffffffffffffffffff19808960601b16602084015263ffffffff60e01b808960e01b166034850152808860e01b166038850152808760e01b16603c85015250600385106127a7576127a76125b5565b60f89490941b60408301525060609190911b90911660418201526055019594505050505056fea2646970667358221220a17fd5b938da98973ab10a609859f20d895af40a35b84686cce62850b5d773e864736f6c63430008120033", - "deployedBytecode": "0x6080604052600436106102045760003560e01c80637ffc2a6e11610118578063b5b7a184116100a0578063d5e6a9df1161006f578063d5e6a9df146106c2578063da2b7bc4146106f6578063df19e6ff14610716578063e813a75514610743578063eedcf2a91461075957600080fd5b8063b5b7a18414610606578063b633b9441461063a578063c2114a161461065a578063d0e30db01461068e57600080fd5b80638d96fdea116100e75780638d96fdea14610534578063930f28af146105685780639588eca214610588578063aa22a1c61461059e578063b044397e146105d257600080fd5b80637ffc2a6e146104aa578063836e344b146104c05780638a619a71146104f45780638ad3a8f71461051457600080fd5b806331ddf7431161019b57806344df8e701161016a57806344df8e70146103f65780634788cb381461042a57806349b4299e1461044a5780634a439cfe1461046a578063541adcca1461048a57600080fd5b806331ddf743146103355780633ce43cfd146103555780633fc8cef31461037557806343b066d5146103a957600080fd5b80632639c060116101d75780632639c060146102b257806327ee6bdd146102df5780632c192519146102f557806331d144571461031557600080fd5b806301139b68146102095780630f0adca51461021e5780631062b39a1461023e578063222ae7861461028f575b600080fd5b61021c610217366004612379565b61076c565b005b34801561022a57600080fd5b5061021c6102393660046123a7565b61098c565b34801561024a57600080fd5b506102727f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561029b57600080fd5b506102a4610d3c565b604051908152602001610286565b3480156102be57600080fd5b506102a46102cd3660046123de565b60026020526000908152604090205481565b3480156102eb57600080fd5b506102a460015481565b34801561030157600080fd5b5061021c6103103660046123f7565b610d6d565b34801561032157600080fd5b5061021c6103303660046123f7565b611044565b34801561034157600080fd5b5061021c61035036600461247a565b61122f565b34801561036157600080fd5b5061021c61037036600461253c565b6114cf565b34801561038157600080fd5b506102727f000000000000000000000000000000000000000000000000000000000000000081565b3480156103b557600080fd5b506103e66103c43660046123de565b600881901c600090815260036020526040902054600160ff9092161c81161490565b6040519015158152602001610286565b34801561040257600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561043657600080fd5b5061021c610445366004612379565b611709565b34801561045657600080fd5b5061021c610465366004612379565b611944565b34801561047657600080fd5b506102a46104853660046123de565b6119eb565b34801561049657600080fd5b506102a46104a5366004612575565b611a1d565b3480156104b657600080fd5b506102a460055481565b3480156104cc57600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561050057600080fd5b5061021c61050f366004612598565b611a6f565b34801561052057600080fd5b50600654610272906001600160a01b031681565b34801561054057600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561057457600080fd5b5061021c610583366004612379565b611b02565b34801561059457600080fd5b506102a460005481565b3480156105aa57600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b3480156105de57600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561061257600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561064657600080fd5b5061021c610655366004612379565b611c8d565b34801561066657600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561069a57600080fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b3480156106ce57600080fd5b506102727f000000000000000000000000000000000000000000000000000000000000000081565b34801561070257600080fd5b5061021c610711366004612379565b611f4c565b34801561072257600080fd5b50610736610731366004612575565b612132565b60405161028691906125cb565b34801561074f57600080fd5b506102a460045481565b61021c6107673660046123f7565b6121f9565b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af11580156107fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082291906125e5565b6108475760405162461bcd60e51b815260040161083e90612607565b60405180910390fd5b61085081611a1d565b6000838152600260205260409020541461087c5760405162461bcd60e51b815260040161083e90612636565b60c08101516001600160a01b0316156108d75760405162461bcd60e51b815260206004820152601960248201527f436c61696d20616c7265616479206368616c6c656e6765642e00000000000000604482015260640161083e565b60008160a0015160028111156108ef576108ef6125b5565b1461093c5760405162461bcd60e51b815260206004820152601760248201527f436c61696d20616c72656164792076657269666965642e000000000000000000604482015260640161083e565b3360c082015261094b81611a1d565b600083815260026020526040808220929092559051339184917fcfe09ca25f55d949baba5e280f5750c9ba4b9048fca5532f916067d433afe4d79190a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f000000000000000000000000000000000000000000000000000000000000000042816109df576109df61265e565b04031115610a225760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b604482015260640161083e565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610aa55760405162461bcd60e51b815260206004820152602260248201527f4e6f742066726f6d206e617469766520476e6f73697320414d42206272696467604482015261329760f11b606482015260840161083e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b279190612674565b7f000000000000000000000000000000000000000000000000000000000000000014610b895760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b604482015260640161083e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610be7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0b919061268d565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610c7e5760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b604482015260640161083e565b60015483118015610c8e57508115155b15610cd157600183905560008290556040518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a15b610cda81611a1d565b60008481526002602052604090205403610d37578051829003610d0357600160a0820152610d1e565b60c08101516001600160a01b031615610d1e57600260a08201525b610d2781611a1d565b6000848152600260205260409020555b505050565b6000610d687f0000000000000000000000000000000000000000000000000000000000000000426126aa565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610dd85760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b690313934b233b29760811b604482015260640161083e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5a9190612674565b7f000000000000000000000000000000000000000000000000000000000000000014610ebc5760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b604482015260640161083e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3e919061268d565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610fb15760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b604482015260640161083e565b8060055410610ff95760405162461bcd60e51b815260206004820152601460248201527326b2b9b9b0b3b29034b99037baba3230ba32b21760611b604482015260640161083e565b816004541461104057600482905560058190556040518281527f684f6fb71cbcb798156dcca2a95dbd142fa1f8957637833b1897ab89e05aa7079060200160405180910390a15b5050565b6006546001600160a01b0316331461105b57600080fd5b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af11580156110ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111191906125e5565b61112d5760405162461bcd60e51b815260040161083e90612607565b8061114a5760405162461bcd60e51b815260040161083e90612636565b6000828152600260205260409020541561119c5760405162461bcd60e51b815260206004820152601360248201527221b630b4b69030b63932b0b23c9036b0b2329760691b604482015260640161083e565b6040805160e0810182528281523360208201524263ffffffff16918101919091526000606082018190526080820181905260a0820181905260c08201526111e290611a1d565b6000838152600260209081526040918290209290925551828152839133917fd95107f4584744c6c893a04c43058aadd1ce8aac8ca5d64140eaf277de6c1d57910160405180910390a35050565b604085106112715760405162461bcd60e51b815260206004820152600f60248201526e283937b7b3103a37b7903637b7339760891b604482015260640161083e565b60008484848460405160200161128a94939291906126cc565b604051602081830303815290604052805190602001209050806000526020600020905060005b8681101561130a5760008888838181106112cc576112cc61270e565b905060200201359050828111156112f157826000528060205260406000209250611301565b8060005282602052604060002092505b506001016112b0565b50806000541461134d5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b604482015260640161083e565b600885901c66ffffffffffffff1660008181526003602052604090205460ff87169080821c600116156113c25760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792072656c61796564000000000000000000604482015260640161083e565b6000838152600360205260408082206001851b84179055516001600160a01b038916906113f29089908990612724565b6000604051808303816000865af19150503d806000811461142f576040519150601f19603f3d011682016040523d82523d6000602084013e611434565b606091505b50509050806114855760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2063616c6c20636f6e7472616374000000000000000000604482015260640161083e565b60405167ffffffffffffffff8a1681527f54303fab361bc52c2f1f56ace7351189582264f74ce47a6e7c3f478d64c429439060200160405180910390a15050505050505050505050565b6114e16104a536839003830183612575565b6000838152600260205260409020541461150d5760405162461bcd60e51b815260040161083e90612636565b600261151f60c0830160a08401612734565b6002811115611530576115306125b5565b146115715760405162461bcd60e51b815260206004820152601160248201527021b430b63632b733b2903330b4b632b21760791b604482015260640161083e565b6000828152600260205260408082209190915551630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b15801561160357600080fd5b505af1158015611617573d6000803e3d6000fd5b50506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063a9059cbb905061165c60e0840160c08501612598565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201527f000000000000000000000000000000000000000000000000000000000000000060248201526044015b6020604051808303816000875af11580156116c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ed91906125e5565b6110405760405162461bcd60e51b815260040161083e90612607565b61171281611a1d565b6000838152600260205260409020541461173e5760405162461bcd60e51b815260040161083e90612636565b60018160a001516002811115611756576117566125b5565b146117935760405162461bcd60e51b815260206004820152600d60248201526c21b630b4b6903330b4b632b21760991b604482015260640161083e565b60008281526002602052604081205560c08101516001600160a01b0316156118c957604051630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b15801561183657600080fd5b505af115801561184a573d6000803e3d6000fd5b50505050602081015160405163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116aa565b602081015160405163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116aa565b6006546001600160a01b0316331461195b57600080fd5b61196481611a1d565b600083815260026020526040902054146119905760405162461bcd60e51b815260040161083e90612636565b63ffffffff4281166060830152431660808201526119ad81611a1d565b60008381526002602052604080822092909255905183917f37b700b61b9b4710dddb0c3316b2be7ef6088ed4b1d7bfe0fb98be8f9a163e1691a25050565b6000611a177f0000000000000000000000000000000000000000000000000000000000000000836126aa565b92915050565b80516020808301516040808501516060860151608087015160a088015160c08901519451600098611a5298909796910161274f565b604051602081830303815290604052805190602001209050919050565b6006546001600160a01b03163314611a8657600080fd5b6006546001600160a01b03163314611ae05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420546573746e6574204f70657261746f720000000000000000604482015260640161083e565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611b5557611b5561265e565b04031115611b985760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b604482015260640161083e565b611ba181611a1d565b60008381526002602052604090205414611bcd5760405162461bcd60e51b815260040161083e90612636565b60c08101516001600160a01b031615611c1f5760405162461bcd60e51b815260206004820152601460248201527321b630b4b69034b99031b430b63632b733b2b21760611b604482015260640161083e565b600154821115611c6757600182905580516000556040518281527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a15b600160a0820152611c7781611a1d565b6000928352600260205260409092209190915550565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611ce057611ce061265e565b040311611d215760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b604482015260640161083e565b611d2a81611a1d565b60008381526002602052604090205414611d565760405162461bcd60e51b815260040161083e90612636565b60008160a001516002811115611d6e57611d6e6125b5565b14611dad5760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b604482015260640161083e565b60c08101516001600160a01b0316156110405760208101516001600160a01b0316611e5f576000828152600260205260408082209190915560c0820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116aa565b60c0810180516000909152611e7382611a1d565b506000839052600260205260405163a9059cbb60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3091906125e5565b610d375760405162461bcd60e51b815260040161083e90612607565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611f9f57611f9f61265e565b040311611fe05760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b604482015260640161083e565b611fe981611a1d565b600083815260026020526040902054146120155760405162461bcd60e51b815260040161083e90612636565b60008160a00151600281111561202d5761202d6125b5565b1461206c5760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b604482015260640161083e565b60208101516001600160a01b0316156110405760c08101516001600160a01b031661211e57600082815260026020908152604080832092909255820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016116aa565b6020810180516000909152611e7382611a1d565b6000816060015163ffffffff1660000361214e57506002919050565b7f0000000000000000000000000000000000000000000000000000000000000000826060015163ffffffff164203101561218a57506003919050565b60006005836060015163ffffffff164203816121a8576121a861265e565b608085015163ffffffff16919004019050437f0000000000000000000000000000000000000000000000000000000000000000818303116121ec57600192506121f1565b600092505b50505b919050565b6122038282611044565b6040805160e0810182528281523360208201524263ffffffff16918101919091526000606082018190526080820181905260a0820181905260c082015261224a8382611944565b63ffffffff4281166060830152431660808201526122688382611b02565b600160a0820152610d378382611709565b6001600160a01b038116811461228e57600080fd5b50565b80356121f481612279565b803563ffffffff811681146121f457600080fd5b8035600381106121f457600080fd5b600060e082840312156122d157600080fd5b60405160e0810181811067ffffffffffffffff8211171561230257634e487b7160e01b600052604160045260246000fd5b6040528235815290508061231860208401612291565b60208201526123296040840161229c565b604082015261233a6060840161229c565b606082015261234b6080840161229c565b608082015261235c60a084016122b0565b60a082015261236d60c08401612291565b60c08201525092915050565b600080610100838503121561238d57600080fd5b8235915061239e84602085016122bf565b90509250929050565b600080600061012084860312156123bd57600080fd5b83359250602084013591506123d585604086016122bf565b90509250925092565b6000602082840312156123f057600080fd5b5035919050565b6000806040838503121561240a57600080fd5b50508035926020909101359150565b803567ffffffffffffffff811681146121f457600080fd5b60008083601f84011261244357600080fd5b50813567ffffffffffffffff81111561245b57600080fd5b60208301915083602082850101111561247357600080fd5b9250929050565b6000806000806000806080878903121561249357600080fd5b863567ffffffffffffffff808211156124ab57600080fd5b818901915089601f8301126124bf57600080fd5b8135818111156124ce57600080fd5b8a60208260051b85010111156124e357600080fd5b602083019850809750506124f960208a01612419565b955061250760408a01612291565b9450606089013591508082111561251d57600080fd5b5061252a89828a01612431565b979a9699509497509295939492505050565b60008082840361010081121561255157600080fd5b8335925060e0601f198201121561256757600080fd5b506020830190509250929050565b600060e0828403121561258757600080fd5b61259183836122bf565b9392505050565b6000602082840312156125aa57600080fd5b813561259181612279565b634e487b7160e01b600052602160045260246000fd5b60208101600483106125df576125df6125b5565b91905290565b6000602082840312156125f757600080fd5b8151801515811461259157600080fd5b6020808252601590820152742330b4b632b2102ba2aa24103a3930b739b332b91760591b604082015260600190565b6020808252600e908201526d24b73b30b634b21031b630b4b69760911b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b60006020828403121561268657600080fd5b5051919050565b60006020828403121561269f57600080fd5b815161259181612279565b6000826126c757634e487b7160e01b600052601260045260246000fd5b500490565b60c085901b6001600160c01b0319168152606084901b6bffffffffffffffffffffffff191660088201528183601c83013760009101601c019081529392505050565b634e487b7160e01b600052603260045260246000fd5b8183823760009101908152919050565b60006020828403121561274657600080fd5b612591826122b0565b87815260006bffffffffffffffffffffffff19808960601b16602084015263ffffffff60e01b808960e01b166034850152808860e01b166038850152808760e01b16603c85015250600385106127a7576127a76125b5565b60f89490941b60408301525060609190911b90911660418201526055019594505050505056fea2646970667358221220a17fd5b938da98973ab10a609859f20d895af40a35b84686cce62850b5d773e864736f6c63430008120033", + "numDeployments": 10, + "solcInputHash": "0d66bd5cfdf493ed8e081e9f7e1bf4fa", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_deposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_epochPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minChallengePeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_timeoutEpochs\",\"type\":\"uint256\"},{\"internalType\":\"contract IAMB\",\"name\":\"_amb\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_routerArbToGnosis\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerDelayLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxMissingBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_routerChainId\",\"type\":\"uint256\"},{\"internalType\":\"contract IWETH\",\"name\":\"_weth\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_challenger\",\"type\":\"address\"}],\"name\":\"Challenged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_claimer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_stateRoot\",\"type\":\"bytes32\"}],\"name\":\"Claimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"_msgId\",\"type\":\"uint64\"}],\"name\":\"MessageRelayed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"}],\"name\":\"VerificationStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"}],\"name\":\"Verified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newSequencerDelayLimit\",\"type\":\"uint256\"}],\"name\":\"sequencerDelayLimitUpdateReceived\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"amb\",\"outputs\":[{\"internalType\":\"contract IAMB\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"censorshipTestStatus\",\"outputs\":[{\"internalType\":\"enum VeaOutboxArbToGnosis.CensorshipTestStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"challenge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_devnetOperator\",\"type\":\"address\"}],\"name\":\"changeDevnetOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_stateRoot\",\"type\":\"bytes32\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"name\":\"claimHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositPlusReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_stateroot\",\"type\":\"bytes32\"}],\"name\":\"devnetAdvanceState\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"devnetOperator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"epochAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"epochNow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"epochPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"hashClaim\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedClaim\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_msgId\",\"type\":\"uint256\"}],\"name\":\"isMsgRelayed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isRelayed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestVerifiedEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxMissingBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minChallengePeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_stateRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"resolveDisputedClaim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"routerArbToGnosis\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"routerChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_proof\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint64\",\"name\":\"_msgId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sequencerDelayLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"startVerification\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stateRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeoutEpochs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timestampDelayUpdated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newSequencerDelayLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"updateSequencerDelayLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"verifySnapshot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weth\",\"outputs\":[{\"internalType\":\"contract IWETH\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawChallengeDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawChallengerEscapeHatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawClaimDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"claimer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampClaimed\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timestampVerification\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blocknumberVerification\",\"type\":\"uint32\"},{\"internalType\":\"enum Party\",\"name\":\"honest\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"}],\"internalType\":\"struct Claim\",\"name\":\"_claim\",\"type\":\"tuple\"}],\"name\":\"withdrawClaimerEscapeHatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Vea Outbox From Arbitrum to Chiado. Note: This contract is deployed on Chiado. Note: This contract is permissioned for developer testing (devnet).\",\"events\":{\"Challenged(uint256,address)\":{\"details\":\"This event indicates that `sendSnapshot(epoch)` should be called in the inbox.\",\"params\":{\"_challenger\":\"The address of the challenger.\",\"_epoch\":\"The epoch associated with the challenged claim.\"}},\"Claimed(address,uint256,bytes32)\":{\"details\":\"Watchers check this event to challenge fraud.\",\"params\":{\"_claimer\":\"The address of the claimer.\",\"_epoch\":\"The epoch associated with the claim.\",\"_stateRoot\":\"The state root of the claim.\"}},\"MessageRelayed(uint64)\":{\"details\":\"This event indicates that a message has been relayed.\",\"params\":{\"_msgId\":\"The msgId of the message that was relayed.\"}},\"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.\"}},\"sequencerDelayLimitUpdateReceived(uint256)\":{\"details\":\"This event indicates the sequencer limit updated.\",\"params\":{\"_newSequencerDelayLimit\":\"The new sequencer delay limit.\"}}},\"kind\":\"dev\",\"methods\":{\"censorshipTestStatus((bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Gets the status of the censorship test for claim.\",\"params\":{\"_claim\":\"The claim to test.\"},\"returns\":{\"status\":\"True if the claim passed the censorship test.\"}},\"challenge(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Submit a challenge for the claim of the inbox state root snapshot taken at 'epoch'.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch of the claim to challenge.\"}},\"changeDevnetOperator(address)\":{\"details\":\"Changes the devnet operator.\",\"params\":{\"_devnetOperator\":\"The new testnet operator.\"}},\"claim(uint256,bytes32)\":{\"details\":\"Submit a claim about the _stateRoot at _epoch and submit a deposit.\",\"params\":{\"_epoch\":\"The epoch for which the claim is made.\",\"_stateRoot\":\"The state root to claim.\"}},\"constructor\":{\"details\":\"Constructor. Note: epochPeriod must match the VeaInboxArbToGnosis contract deployment on Arbitrum, since it's on a different chain, we can't read it and trust the deployer to set a correct value\",\"params\":{\"_amb\":\"The address of the AMB contract on Gnosis.\",\"_deposit\":\"The deposit amount to submit a claim in wei.\",\"_epochPeriod\":\"The duration of each epoch.\",\"_maxMissingBlocks\":\"The maximum number of blocks that can be missing in a challenge period.\",\"_minChallengePeriod\":\"The minimum time window to challenge a claim.\",\"_routerArbToGnosis\":\"The address of the router on Ethereum that routes from Arbitrum to Gnosis.\",\"_routerChainId\":\"The chain id of the routerArbToGnosis.\",\"_sequencerDelayLimit\":\"The maximum delay in seconds that the Arbitrum sequencer can backdate transactions.\",\"_timeoutEpochs\":\"The epochs before the bridge is considered shutdown.\",\"_weth\":\"The address of the WETH contract on Gnosis.\"}},\"devnetAdvanceState(uint256,bytes32)\":{\"details\":\"Testnet operator utility function to claim, validate and withdraw.\",\"params\":{\"_epoch\":\"The epoch for which the claim is made.\",\"_stateroot\":\"The state root to claim.\"}},\"epochAt(uint256)\":{\"details\":\"Get the current epoch from the outbox's point of view using the Ethereum L1 clock.\",\"returns\":{\"epoch\":\"The hash of the claim.\"}},\"epochNow()\":{\"details\":\"Get the current epoch from the outbox's point of view using the Ethereum L1 clock.\",\"returns\":{\"epoch\":\"The hash of the claim.\"}},\"hashClaim((bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Hashes the claim.\",\"params\":{\"_claim\":\"The claim to hash.\"},\"returns\":{\"hashedClaim\":\"The hash of the claim.\"}},\"isMsgRelayed(uint256)\":{\"details\":\"Get the msg relayed status.\",\"params\":{\"_msgId\":\"The msgId to check.\"},\"returns\":{\"isRelayed\":\"True if the msg was relayed.\"}},\"resolveDisputedClaim(uint256,bytes32,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Resolves any challenge of the optimistic claim for '_epoch'.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch to verify.\",\"_stateRoot\":\"The true state root for the epoch.\"}},\"sendMessage(bytes32[],uint64,address,bytes)\":{\"details\":\"Verifies and relays the message. UNTRUSTED.\",\"params\":{\"_message\":\"The message encoded in the vea inbox as abi.encodeWithSelector(fnSelector, msg.sender, param1, param2, ...)\",\"_msgId\":\"The zero based index of the message in the inbox.\",\"_proof\":\"The merkle proof to prove the message inclusion in the inbox state root.\",\"_to\":\"The address of the contract on Gnosis to call.\"}},\"startVerification(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Start verification for claim for 'epoch'.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch of the claim to challenge.\"}},\"updateSequencerDelayLimit(uint256,uint256)\":{\"details\":\"Set the sequencerDelayLimit by receiving a message from the AMB.\",\"params\":{\"_newSequencerDelayLimit\":\"The delaySeconds from the MaxTimeVariation struct in the Arbitrum Sequencer contract.\",\"_timestamp\":\"The timestamp of the message.\"}},\"verifySnapshot(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Resolves the optimistic claim for '_epoch'.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch of the optimistic claim.\"}},\"withdrawChallengeDeposit(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Sends the deposit back to the Challenger if successful. Includes a portion of the Bridger's deposit.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the challenge deposit to withraw.\"}},\"withdrawChallengerEscapeHatch(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"When bridge is shutdown, no claim disputes can be resolved. This allows the challenger to withdraw their deposit.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the claim deposit to withraw.\"}},\"withdrawClaimDeposit(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"Sends the deposit back to the Claimer if successful. Includes a portion of the Challenger's deposit if unsuccessfully challenged.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the claim deposit to withraw.\"}},\"withdrawClaimerEscapeHatch(uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"details\":\"When bridge is shutdown, no claim disputes can be resolved. This allows the claimer to withdraw their deposit.\",\"params\":{\"_claim\":\"The claim associated with the epoch.\",\"_epoch\":\"The epoch associated with the claim deposit to withraw.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolveDisputedClaim(uint256,bytes32,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"notice\":\"Note: Access restricted to AMB.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol\":\"VeaOutboxArbToGnosisDevnet\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"src/arbitrumToGnosis/VeaOutboxArbToGnosis.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@jaybuidl, @shotaronowhere]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.24;\\n\\nimport \\\"../canonical/gnosis-chain/IAMB.sol\\\";\\nimport \\\"../interfaces/outboxes/IVeaOutboxOnL1.sol\\\";\\nimport \\\"../interfaces/updaters/ISequencerDelayUpdatable.sol\\\";\\nimport \\\"../interfaces/tokens/gnosis/IWETH.sol\\\";\\n\\n/// @dev Vea Outbox From Arbitrum to Gnosis.\\n/// Note: This contract is deployed on Gnosis.\\ncontract VeaOutboxArbToGnosis is IVeaOutboxOnL1, ISequencerDelayUpdatable {\\n // ************************************* //\\n // * Storage * //\\n // ************************************* //\\n\\n IAMB public immutable amb; // The address of the AMB contract on Gnosis.\\n address public immutable routerArbToGnosis; // The address of the router from Arbitrum to Gnosis on ethereum.\\n\\n IWETH public immutable weth; // The address of the WETH contract on Gnosis.\\n uint256 public immutable deposit; // The deposit in wei required to submit a claim or challenge\\n uint256 public immutable burn; // The amount of wei to burn. deposit / 2\\n uint256 public immutable depositPlusReward; // 2 * deposit - burn\\n\\n uint256 internal constant SLOT_TIME = 5; // Gnosis 5 second slot time\\n\\n uint256 public immutable routerChainId; // Router chain id for authentication of messages from the AMB.\\n uint256 public immutable epochPeriod; // Epochs mark the period between potential snapshots.\\n uint256 public immutable minChallengePeriod; // Minimum time window to challenge a claim, even with a malicious sequencer.\\n\\n uint256 public immutable timeoutEpochs; // The number of epochs without forward progress before the bridge is considered shutdown.\\n uint256 public immutable maxMissingBlocks; // The maximum number of blocks that can be missing in a challenge period.\\n\\n bytes32 public stateRoot; // merkle root of the outbox state\\n uint256 public latestVerifiedEpoch; // The latest epoch that has been verified.\\n\\n mapping(uint256 epoch => bytes32) public claimHashes; // epoch => claim\\n mapping(uint256 messageId => bytes32) internal relayed; // msgId/256 => packed replay bitmap, preferred over a simple boolean mapping to save 15k gas per message\\n\\n uint256 public sequencerDelayLimit; // This is MaxTimeVariation.delaySeconds from the arbitrum sequencer inbox, it is the maximum seconds the sequencer can backdate L2 txns relative to the L1 clock.\\n uint256 public timestampDelayUpdated; // The timestamp of the last sequencer delay update.\\n\\n enum CensorshipTestStatus {\\n Failed,\\n Passed,\\n NotStarted,\\n InProgress\\n }\\n\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @dev Watchers check this event to challenge fraud.\\n /// @param _claimer The address of the claimer.\\n /// @param _epoch The epoch associated with the claim.\\n /// @param _stateRoot The state root of the claim.\\n event Claimed(address indexed _claimer, uint256 indexed _epoch, bytes32 _stateRoot);\\n\\n /// @dev This event indicates that `sendSnapshot(epoch)` should be called in the inbox.\\n /// @param _epoch The epoch associated with the challenged claim.\\n /// @param _challenger The address of the challenger.\\n event Challenged(uint256 indexed _epoch, address indexed _challenger);\\n\\n /// @dev This event indicates that a message has been relayed.\\n /// @param _msgId The msgId of the message that was relayed.\\n event MessageRelayed(uint64 _msgId);\\n\\n /// @dev This event indicates that the censorship test started and all challengers are ready even in the worst case scenario of a malicious sequencer.\\n /// @param _epoch The epoch that started verification.\\n event VerificationStarted(uint256 indexed _epoch);\\n\\n /// @dev This events indicates that verification has succeeded. The messages are ready to be relayed.\\n /// @param _epoch The epoch that was verified.\\n event Verified(uint256 _epoch);\\n\\n /// @dev This event indicates the sequencer limit updated.\\n /// @param _newSequencerDelayLimit The new sequencer delay limit.\\n event sequencerDelayLimitUpdateReceived(uint256 _newSequencerDelayLimit);\\n\\n // ************************************* //\\n // * Function Modifiers * //\\n // ************************************* //\\n\\n modifier OnlyBridgeRunning() {\\n unchecked {\\n require(block.timestamp / epochPeriod - latestVerifiedEpoch <= timeoutEpochs, \\\"Bridge Shutdown.\\\");\\n }\\n _;\\n }\\n\\n modifier OnlyBridgeShutdown() {\\n unchecked {\\n require(block.timestamp / epochPeriod - latestVerifiedEpoch > timeoutEpochs, \\\"Bridge Running.\\\");\\n }\\n _;\\n }\\n\\n /// @dev Constructor.\\n /// Note: epochPeriod must match the VeaInboxArbToGnosis contract deployment on Arbitrum, since it's on a different chain, we can't read it and trust the deployer to set a correct value\\n /// @param _deposit The deposit amount to submit a claim in wei.\\n /// @param _epochPeriod The duration of each epoch.\\n /// @param _minChallengePeriod The minimum time window to challenge a claim.\\n /// @param _timeoutEpochs The epochs before the bridge is considered shutdown.\\n /// @param _amb The address of the AMB contract on Gnosis.\\n /// @param _routerArbToGnosis The address of the router on Ethereum that routes from Arbitrum to Gnosis.\\n /// @param _sequencerDelayLimit The maximum delay in seconds that the Arbitrum sequencer can backdate transactions.\\n /// @param _maxMissingBlocks The maximum number of blocks that can be missing in a challenge period.\\n /// @param _routerChainId The chain id of the routerArbToGnosis.\\n /// @param _weth The address of the WETH contract on Gnosis.\\n constructor(\\n uint256 _deposit,\\n uint256 _epochPeriod,\\n uint256 _minChallengePeriod,\\n uint256 _timeoutEpochs,\\n IAMB _amb,\\n address _routerArbToGnosis,\\n uint256 _sequencerDelayLimit,\\n uint256 _maxMissingBlocks,\\n uint256 _routerChainId,\\n IWETH _weth\\n ) {\\n deposit = _deposit;\\n // epochPeriod must match the VeaInboxArbToGnosis contract deployment epochPeriod value.\\n epochPeriod = _epochPeriod;\\n timeoutEpochs = _timeoutEpochs;\\n minChallengePeriod = _minChallengePeriod;\\n amb = _amb;\\n routerArbToGnosis = _routerArbToGnosis;\\n // This value is on another chain, so we can't read it, we trust the deployer to set a correct value.\\n sequencerDelayLimit = _sequencerDelayLimit; // MaxTimeVariation.delaySeconds from the arbitrum sequencer inbox\\n maxMissingBlocks = _maxMissingBlocks;\\n routerChainId = _routerChainId;\\n weth = _weth;\\n\\n // claimant and challenger are not sybil resistant\\n // must burn half deposit to prevent zero cost griefing\\n burn = _deposit / 2;\\n depositPlusReward = 2 * _deposit - burn;\\n\\n latestVerifiedEpoch = block.timestamp / epochPeriod - 1;\\n }\\n\\n // ************************************* //\\n // * Parameter Updates * //\\n // ************************************* //\\n\\n /// @dev Set the sequencerDelayLimit by receiving a message from the AMB.\\n /// @param _newSequencerDelayLimit The delaySeconds from the MaxTimeVariation struct in the Arbitrum Sequencer contract.\\n /// @param _timestamp The timestamp of the message.\\n function updateSequencerDelayLimit(uint256 _newSequencerDelayLimit, uint256 _timestamp) external {\\n require(msg.sender == address(amb), \\\"Not from bridge.\\\");\\n require(bytes32(routerChainId) == amb.messageSourceChainId(), \\\"Invalid chain id.\\\");\\n require(routerArbToGnosis == amb.messageSender(), \\\"Not from router.\\\");\\n require(timestampDelayUpdated < _timestamp, \\\"Message is outdated.\\\");\\n\\n if (sequencerDelayLimit != _newSequencerDelayLimit) {\\n // If _newSequencerDelayLimit > timeout * epochPeriod, then the bridge will shutdown.\\n sequencerDelayLimit = _newSequencerDelayLimit;\\n timestampDelayUpdated = _timestamp;\\n emit sequencerDelayLimitUpdateReceived(_newSequencerDelayLimit);\\n }\\n }\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @dev Submit a claim about the _stateRoot at _epoch and submit a deposit.\\n /// @param _epoch The epoch for which the claim is made.\\n /// @param _stateRoot The state root to claim.\\n function claim(uint256 _epoch, bytes32 _stateRoot) external virtual {\\n require(weth.transferFrom(msg.sender, address(this), deposit), \\\"Failed WETH transfer.\\\");\\n unchecked {\\n require(_epoch == block.timestamp / epochPeriod - 1, \\\"Epoch has not yet passed.\\\");\\n }\\n\\n require(_stateRoot != bytes32(0), \\\"Invalid claim.\\\");\\n require(claimHashes[_epoch] == bytes32(0), \\\"Claim already made.\\\");\\n\\n claimHashes[_epoch] = hashClaim(\\n Claim({\\n stateRoot: _stateRoot,\\n claimer: msg.sender,\\n timestampClaimed: uint32(block.timestamp),\\n timestampVerification: uint32(0),\\n blocknumberVerification: uint32(0),\\n honest: Party.None,\\n challenger: address(0)\\n })\\n );\\n\\n emit Claimed(msg.sender, _epoch, _stateRoot);\\n }\\n\\n /// @dev Submit a challenge for the claim of the inbox state root snapshot taken at 'epoch'.\\n /// @param _epoch The epoch of the claim to challenge.\\n /// @param _claim The claim associated with the epoch.\\n function challenge(uint256 _epoch, Claim memory _claim) external {\\n require(weth.transferFrom(msg.sender, address(this), deposit), \\\"Failed WETH transfer.\\\");\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.challenger == address(0), \\\"Claim already challenged.\\\");\\n require(_claim.honest == Party.None, \\\"Claim already verified.\\\");\\n\\n _claim.challenger = msg.sender;\\n claimHashes[_epoch] = hashClaim(_claim);\\n\\n emit Challenged(_epoch, msg.sender);\\n }\\n\\n /// @dev Start verification for claim for 'epoch'.\\n /// @param _epoch The epoch of the claim to challenge.\\n /// @param _claim The claim associated with the epoch.\\n function startVerification(uint256 _epoch, Claim memory _claim) external virtual {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n\\n // sequencerDelayLimit + epochPeriod is the worst case time to sync the L2 state compared to L1 clock.\\n // using checked arithmetic incase arbitrum governance sets sequencerDelayLimit to a large value\\n require(\\n block.timestamp - uint256(_claim.timestampClaimed) >= sequencerDelayLimit + epochPeriod,\\n \\\"Claim must wait atleast maxL2StateSyncDelay.\\\"\\n );\\n\\n CensorshipTestStatus _censorshipTestStatus = censorshipTestStatus(_claim);\\n require(\\n _censorshipTestStatus == CensorshipTestStatus.NotStarted ||\\n _censorshipTestStatus == CensorshipTestStatus.Failed,\\n \\\"Claim verification in progress or already completed.\\\"\\n );\\n\\n _claim.timestampVerification = uint32(block.timestamp);\\n _claim.blocknumberVerification = uint32(block.number);\\n\\n claimHashes[_epoch] = hashClaim(_claim);\\n\\n emit VerificationStarted(_epoch);\\n }\\n\\n /// @dev Resolves the optimistic claim for '_epoch'.\\n /// @param _epoch The epoch of the optimistic claim.\\n /// @param _claim The claim associated with the epoch.\\n function verifySnapshot(uint256 _epoch, Claim memory _claim) external virtual OnlyBridgeRunning {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.challenger == address(0), \\\"Claim is challenged.\\\");\\n require(censorshipTestStatus(_claim) == CensorshipTestStatus.Passed, \\\"Censorship test not passed.\\\");\\n\\n if (_epoch > latestVerifiedEpoch) {\\n latestVerifiedEpoch = _epoch;\\n stateRoot = _claim.stateRoot;\\n emit Verified(_epoch);\\n }\\n\\n _claim.honest = Party.Claimer;\\n claimHashes[_epoch] = hashClaim(_claim);\\n }\\n\\n /// Note: Access restricted to AMB.\\n /// @dev Resolves any challenge of the optimistic claim for '_epoch'.\\n /// @param _epoch The epoch to verify.\\n /// @param _stateRoot The true state root for the epoch.\\n /// @param _claim The claim associated with the epoch.\\n function resolveDisputedClaim(\\n uint256 _epoch,\\n bytes32 _stateRoot,\\n Claim memory _claim\\n ) external virtual OnlyBridgeRunning {\\n // Ethereum -> Gnosis message authentication with the AMB, the canonical Ethereum <-> Gnosis bridge.\\n // https://docs.tokenbridge.net/amb-bridge/development-of-a-cross-chain-application/how-to-develop-xchain-apps-by-amb#receive-a-method-call-from-the-amb-bridge\\n\\n require(msg.sender == address(amb), \\\"Not from native Gnosis AMB bridge.\\\");\\n require(bytes32(routerChainId) == amb.messageSourceChainId(), \\\"Invalid chain id.\\\");\\n require(routerArbToGnosis == amb.messageSender(), \\\"Not from router.\\\");\\n\\n if (_epoch > latestVerifiedEpoch && _stateRoot != bytes32(0)) {\\n latestVerifiedEpoch = _epoch;\\n stateRoot = _stateRoot;\\n emit Verified(_epoch);\\n }\\n\\n if (claimHashes[_epoch] == hashClaim(_claim)) {\\n if (_claim.stateRoot == _stateRoot) {\\n _claim.honest = Party.Claimer;\\n } else if (_claim.challenger != address(0)) {\\n _claim.honest = Party.Challenger;\\n }\\n claimHashes[_epoch] = hashClaim(_claim);\\n }\\n }\\n\\n /// @dev Verifies and relays the message. UNTRUSTED.\\n /// @param _proof The merkle proof to prove the message inclusion in the inbox state root.\\n /// @param _msgId The zero based index of the message in the inbox.\\n /// @param _to The address of the contract on Gnosis to call.\\n /// @param _message The message encoded in the vea inbox as abi.encodeWithSelector(fnSelector, msg.sender, param1, param2, ...)\\n function sendMessage(bytes32[] calldata _proof, uint64 _msgId, address _to, bytes calldata _message) external {\\n require(_proof.length < 64, \\\"Proof too long.\\\");\\n\\n bytes32 nodeHash = keccak256(abi.encodePacked(_msgId, _to, _message));\\n\\n // double hashed leaf\\n // avoids second order preimage attacks\\n // https://flawed.net.nz/2018/02/21/attacking-merkle-trees-with-a-second-preimage-attack/\\n assembly {\\n mstore(0x00, nodeHash)\\n nodeHash := keccak256(0x00, 0x20)\\n }\\n\\n unchecked {\\n for (uint256 i = 0; i < _proof.length; i++) {\\n bytes32 proofElement = _proof[i];\\n // sort sibling hashes as a convention for efficient proof validation\\n if (proofElement > nodeHash)\\n assembly {\\n mstore(0x00, nodeHash)\\n mstore(0x20, proofElement)\\n nodeHash := keccak256(0x00, 0x40)\\n }\\n else\\n assembly {\\n mstore(0x00, proofElement)\\n mstore(0x20, nodeHash)\\n nodeHash := keccak256(0x00, 0x40)\\n }\\n }\\n }\\n\\n require(stateRoot == nodeHash, \\\"Invalid proof.\\\");\\n\\n // msgId is the zero-based index of the message in the inbox.\\n // msgId is also used as an index in the relayed bitmap to prevent replay.\\n // Note: a bitmap is used instead of a simple boolean mapping to save 15k gas per message.\\n\\n uint256 relayIndex = _msgId >> 8;\\n uint256 offset;\\n\\n unchecked {\\n offset = _msgId % 256;\\n }\\n\\n bytes32 replay = relayed[relayIndex];\\n\\n require(((replay >> offset) & bytes32(uint256(1))) == bytes32(0), \\\"Message already relayed\\\");\\n relayed[relayIndex] = replay | bytes32(1 << offset);\\n\\n // UNTRUSTED.\\n (bool success, ) = _to.call(_message);\\n require(success, \\\"Failed to call contract\\\");\\n\\n emit MessageRelayed(_msgId);\\n }\\n\\n /// @dev Sends the deposit back to the Claimer if successful. Includes a portion of the Challenger's deposit if unsuccessfully challenged.\\n /// @param _epoch The epoch associated with the claim deposit to withraw.\\n /// @param _claim The claim associated with the epoch.\\n function withdrawClaimDeposit(uint256 _epoch, Claim calldata _claim) external virtual {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.honest == Party.Claimer, \\\"Claim failed.\\\");\\n\\n delete claimHashes[_epoch];\\n\\n if (_claim.challenger != address(0)) {\\n weth.burn(burn); // no return value to check\\n require(weth.transfer(_claim.claimer, depositPlusReward), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n } else {\\n require(weth.transfer(_claim.claimer, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n }\\n }\\n\\n /// @dev Sends the deposit back to the Challenger if successful. Includes a portion of the Bridger's deposit.\\n /// @param _epoch The epoch associated with the challenge deposit to withraw.\\n /// @param _claim The claim associated with the epoch.\\n function withdrawChallengeDeposit(uint256 _epoch, Claim calldata _claim) external {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.honest == Party.Challenger, \\\"Challenge failed.\\\");\\n\\n delete claimHashes[_epoch];\\n\\n weth.burn(burn); // no return value to check\\n require(weth.transfer(_claim.challenger, depositPlusReward), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n }\\n\\n /// @dev When bridge is shutdown, no claim disputes can be resolved. This allows the claimer to withdraw their deposit.\\n /// @param _epoch The epoch associated with the claim deposit to withraw.\\n /// @param _claim The claim associated with the epoch.\\n function withdrawClaimerEscapeHatch(uint256 _epoch, Claim memory _claim) external OnlyBridgeShutdown {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.honest == Party.None, \\\"Claim resolved.\\\");\\n\\n if (_claim.claimer != address(0)) {\\n if (_claim.challenger == address(0)) {\\n delete claimHashes[_epoch];\\n require(weth.transfer(_claim.claimer, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n } else {\\n address claimer = _claim.claimer;\\n _claim.claimer = address(0);\\n claimHashes[_epoch] = hashClaim(_claim);\\n require(weth.transfer(claimer, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n }\\n }\\n }\\n\\n /// @dev When bridge is shutdown, no claim disputes can be resolved. This allows the challenger to withdraw their deposit.\\n /// @param _epoch The epoch associated with the claim deposit to withraw.\\n /// @param _claim The claim associated with the epoch.\\n function withdrawChallengerEscapeHatch(uint256 _epoch, Claim memory _claim) external OnlyBridgeShutdown {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.honest == Party.None, \\\"Claim resolved.\\\");\\n\\n if (_claim.challenger != address(0)) {\\n if (_claim.claimer == address(0)) {\\n delete claimHashes[_epoch];\\n require(weth.transfer(_claim.challenger, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n } else {\\n address challenger = _claim.challenger;\\n _claim.challenger = address(0);\\n claimHashes[_epoch] == hashClaim(_claim);\\n require(weth.transfer(challenger, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n }\\n }\\n }\\n\\n // ************************************* //\\n // * Pure / Views * //\\n // ************************************* //\\n\\n /// @dev Hashes the claim.\\n /// @param _claim The claim to hash.\\n /// @return hashedClaim The hash of the claim.\\n function hashClaim(Claim memory _claim) public pure returns (bytes32 hashedClaim) {\\n return\\n hashedClaim = keccak256(\\n abi.encodePacked(\\n _claim.stateRoot,\\n _claim.claimer,\\n _claim.timestampClaimed,\\n _claim.timestampVerification,\\n _claim.blocknumberVerification,\\n _claim.honest,\\n _claim.challenger\\n )\\n );\\n }\\n\\n /// @dev Gets the status of the censorship test for claim.\\n /// @param _claim The claim to test.\\n /// @return status True if the claim passed the censorship test.\\n function censorshipTestStatus(Claim memory _claim) public view returns (CensorshipTestStatus status) {\\n unchecked {\\n if (uint256(_claim.timestampVerification) == 0) {\\n status = CensorshipTestStatus.NotStarted;\\n } else if (block.timestamp - uint256(_claim.timestampVerification) < minChallengePeriod) {\\n status = CensorshipTestStatus.InProgress;\\n } else {\\n uint256 expectedBlocks = uint256(_claim.blocknumberVerification) +\\n (block.timestamp - uint256(_claim.timestampVerification)) /\\n SLOT_TIME;\\n uint256 actualBlocks = block.number;\\n if (expectedBlocks - actualBlocks <= maxMissingBlocks) {\\n status = CensorshipTestStatus.Passed;\\n } else {\\n status = CensorshipTestStatus.Failed;\\n }\\n }\\n }\\n }\\n\\n /// @dev Get the current epoch from the outbox's point of view using the Ethereum L1 clock.\\n /// @return epoch The hash of the claim.\\n function epochNow() external view returns (uint256 epoch) {\\n epoch = block.timestamp / epochPeriod;\\n }\\n\\n /// @dev Get the current epoch from the outbox's point of view using the Ethereum L1 clock.\\n /// @return epoch The hash of the claim.\\n function epochAt(uint256 timestamp) external view returns (uint256 epoch) {\\n epoch = timestamp / epochPeriod;\\n }\\n\\n /// @dev Get the msg relayed status.\\n /// @param _msgId The msgId to check.\\n /// @return isRelayed True if the msg was relayed.\\n function isMsgRelayed(uint256 _msgId) external view returns (bool isRelayed) {\\n uint256 relayIndex = _msgId >> 8;\\n uint256 offset;\\n\\n unchecked {\\n offset = _msgId % 256;\\n }\\n\\n bytes32 replay = relayed[relayIndex];\\n\\n isRelayed = (replay >> offset) & bytes32(uint256(1)) == bytes32(uint256(1));\\n }\\n}\\n\",\"keccak256\":\"0x9f76fb20913b1458f88779d1ec1045c703a03ef8e185294754b04ee104e0f2ae\",\"license\":\"MIT\"},\"src/canonical/gnosis-chain/IAMB.sol\":{\"content\":\"// https://docs.gnosischain.com/bridges/tokenbridge/amb-bridge#gnosis\\n// https://github.com/omni/tokenbridge-contracts/blob/908a48107919d4ab127f9af07d44d47eac91547e/contracts/interfaces/IAMB.sol\\n// interface is pruned for relevant function stubs\\n\\npragma solidity 0.8.24;\\n\\ninterface IAMB {\\n function requireToPassMessage(address _contract, bytes memory _data, uint256 _gas) external returns (bytes32);\\n\\n function maxGasPerTx() external view returns (uint256);\\n\\n function messageSender() external view returns (address);\\n\\n function messageSourceChainId() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xc94fccde4d2c5ede32856f84b8fd4275c353fce8a3f449a1d2a7246eafb7bc53\"},\"src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@jaybuidl, @shotaronowhere]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.24;\\n\\nimport \\\"../../arbitrumToGnosis/VeaOutboxArbToGnosis.sol\\\";\\n\\n/// @dev Vea Outbox From Arbitrum to Chiado.\\n/// Note: This contract is deployed on Chiado.\\n/// Note: This contract is permissioned for developer testing (devnet).\\ncontract VeaOutboxArbToGnosisDevnet is VeaOutboxArbToGnosis {\\n address public devnetOperator; // permissioned devnet operator\\n\\n /// @dev Requires that the sender is the devnet operator.\\n modifier onlyByDevnetOperator() {\\n require(devnetOperator == msg.sender);\\n _;\\n }\\n\\n /// @dev Changes the devnet operator.\\n /// @param _devnetOperator The new testnet operator.\\n function changeDevnetOperator(address _devnetOperator) external onlyByDevnetOperator {\\n require(msg.sender == devnetOperator, \\\"Invalid Testnet Operator\\\");\\n devnetOperator = _devnetOperator;\\n }\\n\\n /// @dev Submit a claim about the _stateRoot at _epoch and submit a deposit.\\n /// @param _epoch The epoch for which the claim is made.\\n /// @param _stateRoot The state root to claim.\\n function claim(uint256 _epoch, bytes32 _stateRoot) public override onlyByDevnetOperator {\\n require(weth.transferFrom(msg.sender, address(this), deposit), \\\"Failed WETH transfer.\\\");\\n require(_stateRoot != bytes32(0), \\\"Invalid claim.\\\");\\n require(claimHashes[_epoch] == bytes32(0), \\\"Claim already made.\\\");\\n\\n claimHashes[_epoch] = hashClaim(\\n Claim({\\n stateRoot: _stateRoot,\\n claimer: msg.sender,\\n timestampClaimed: uint32(block.timestamp),\\n timestampVerification: uint32(0),\\n blocknumberVerification: uint32(0),\\n honest: Party.None,\\n challenger: address(0)\\n })\\n );\\n\\n emit Claimed(msg.sender, _epoch, _stateRoot);\\n }\\n\\n /// @dev Start verification for claim for 'epoch'.\\n /// @param _epoch The epoch of the claim to challenge.\\n /// @param _claim The claim associated with the epoch.\\n function startVerification(uint256 _epoch, Claim memory _claim) public override onlyByDevnetOperator {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n\\n _claim.timestampVerification = uint32(block.timestamp);\\n _claim.blocknumberVerification = uint32(block.number);\\n\\n claimHashes[_epoch] = hashClaim(_claim);\\n\\n emit VerificationStarted(_epoch);\\n }\\n\\n /// @dev Sends the deposit back to the Claimer if successful. Includes a portion of the Challenger's deposit if unsuccessfully challenged.\\n /// @param _epoch The epoch associated with the claim deposit to withraw.\\n /// @param _claim The claim associated with the epoch.\\n function withdrawClaimDeposit(uint256 _epoch, Claim memory _claim) public override {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.honest == Party.Claimer, \\\"Claim failed.\\\");\\n\\n delete claimHashes[_epoch];\\n\\n if (_claim.challenger != address(0)) {\\n weth.burn(burn); // no return value to check\\n require(weth.transfer(_claim.claimer, depositPlusReward), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n } else {\\n require(weth.transfer(_claim.claimer, deposit), \\\"Failed WETH transfer.\\\"); // should revert on errors, but we check return value anyways\\n }\\n }\\n\\n /// @dev Resolves the optimistic claim for '_epoch'.\\n /// @param _epoch The epoch of the optimistic claim.\\n /// @param _claim The claim associated with the epoch.\\n function verifySnapshot(uint256 _epoch, Claim memory _claim) public override OnlyBridgeRunning {\\n require(claimHashes[_epoch] == hashClaim(_claim), \\\"Invalid claim.\\\");\\n require(_claim.challenger == address(0), \\\"Claim is challenged.\\\");\\n\\n if (_epoch > latestVerifiedEpoch) {\\n latestVerifiedEpoch = _epoch;\\n stateRoot = _claim.stateRoot;\\n emit Verified(_epoch);\\n }\\n\\n _claim.honest = Party.Claimer;\\n claimHashes[_epoch] = hashClaim(_claim);\\n }\\n\\n /// @dev Testnet operator utility function to claim, validate and withdraw.\\n /// @param _epoch The epoch for which the claim is made.\\n /// @param _stateroot The state root to claim.\\n function devnetAdvanceState(uint256 _epoch, bytes32 _stateroot) external payable {\\n claim(_epoch, _stateroot);\\n Claim memory claim = Claim({\\n stateRoot: _stateroot,\\n claimer: msg.sender,\\n timestampClaimed: uint32(block.timestamp),\\n timestampVerification: uint32(0),\\n blocknumberVerification: uint32(0),\\n honest: Party.None,\\n challenger: address(0)\\n });\\n claim.timestampClaimed = uint32(block.timestamp);\\n startVerification(_epoch, claim);\\n claim.timestampVerification = uint32(block.timestamp);\\n claim.blocknumberVerification = uint32(block.number);\\n verifySnapshot(_epoch, claim);\\n claim.honest = Party.Claimer;\\n withdrawClaimDeposit(_epoch, claim);\\n }\\n\\n /// @dev Constructor.\\n /// Note: epochPeriod must match the VeaInboxArbToGnosis contract deployment on Arbitrum, since it's on a different chain, we can't read it and trust the deployer to set a correct value\\n /// @param _deposit The deposit amount to submit a claim in wei.\\n /// @param _epochPeriod The duration of each epoch.\\n /// @param _minChallengePeriod The minimum time window to challenge a claim.\\n /// @param _timeoutEpochs The epochs before the bridge is considered shutdown.\\n /// @param _amb The address of the AMB contract on Gnosis.\\n /// @param _routerArbToGnosis The address of the router on Ethereum that routes from Arbitrum to Gnosis.\\n /// @param _sequencerDelayLimit The maximum delay in seconds that the Arbitrum sequencer can backdate transactions.\\n /// @param _maxMissingBlocks The maximum number of blocks that can be missing in a challenge period.\\n /// @param _routerChainId The chain id of the routerArbToGnosis.\\n /// @param _weth The address of the WETH contract on Gnosis.\\n constructor(\\n uint256 _deposit,\\n uint256 _epochPeriod,\\n uint256 _minChallengePeriod,\\n uint256 _timeoutEpochs,\\n IAMB _amb,\\n address _routerArbToGnosis,\\n uint256 _sequencerDelayLimit,\\n uint256 _maxMissingBlocks,\\n uint256 _routerChainId,\\n IWETH _weth\\n )\\n VeaOutboxArbToGnosis(\\n _deposit,\\n _epochPeriod,\\n _minChallengePeriod,\\n _timeoutEpochs,\\n _amb,\\n _routerArbToGnosis,\\n _sequencerDelayLimit,\\n _maxMissingBlocks,\\n _routerChainId,\\n _weth\\n )\\n {\\n devnetOperator = msg.sender;\\n }\\n}\\n\",\"keccak256\":\"0xbac7c6f71f8aae086c5f377b1be602590a3f9572ebf229e72157e5e8e485e937\",\"license\":\"MIT\"},\"src/interfaces/outboxes/IVeaOutboxOnL1.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@jaybuidl, @shotaronowhere]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.24;\\n\\nimport \\\"../types/VeaClaim.sol\\\";\\n\\n/// @dev Interface of the Vea Outbox on L1 chains like Ethereum, Gnosis, Polygon POS where storage is expensive.\\ninterface IVeaOutboxOnL1 {\\n /// @dev Verifies and relays the message.\\n /// Note: Gateways expect first argument of message call to be the arbitrum message sender, used for authentication.\\n /// @param _proof The merkle proof to prove the message.\\n /// @param _msgId The zero based index of the message in the inbox.\\n /// @param _to The address to send the message to.\\n /// @param _message The message to relay.\\n function sendMessage(bytes32[] calldata _proof, uint64 _msgId, address _to, bytes calldata _message) external;\\n\\n /// @dev Resolves any challenge of the optimistic claim for 'epoch' using the canonical bridge.\\n /// Note: Access restricted to canonical bridge.\\n /// @param _epoch The epoch to verify.\\n /// @param _stateRoot The true state root for the epoch.\\n /// @param _claim The claim associated with the epoch.\\n function resolveDisputedClaim(uint256 _epoch, bytes32 _stateRoot, Claim memory _claim) external;\\n}\\n\",\"keccak256\":\"0xf1d52e289e790088502b7909f11f47bc33ddd3fc545636b7fb29c01ed00d3ff3\",\"license\":\"MIT\"},\"src/interfaces/tokens/gnosis/IWETH.sol\":{\"content\":\"// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/5daaf60d11ee2075260d0f3adfb22b1c536db983/contracts/token/ERC20/StandardBurnableToken.sol\\n// implementation: https://gnosisscan.io/address/0xf8d1677c8a0c961938bf2f9adc3f3cfda759a9d9#code\\n// proxy: https://gnosisscan.io/token/0x6a023ccd1ff6f2045c3309768ead9e68f978f6e1#readProxyContract\\n\\n/**\\n * @title Standard Burnable Token\\n * @dev Token that can be irreversibly burned (destroyed).\\n */\\ninterface IWETH {\\n /**\\n * @dev Burns a specific amount of tokens.\\n * @param _value The amount of token to be burned.\\n */\\n function burn(uint256 _value) external;\\n\\n /**\\n * @dev Gets the balance of the specified address.\\n * @param _owner The address to query the the balance of.\\n * @return An uint256 representing the amount owned by the passed address.\\n */\\n function balanceOf(address _owner) external view returns (uint256);\\n\\n /**\\n * @dev Transfer tokens from one address to another\\n * @param _from address The address which you want to send tokens from\\n * @param _to address The address which you want to transfer to\\n * @param _value uint256 the amount of tokens to be transferred\\n */\\n function transferFrom(address _from, address _to, uint256 _value) external returns (bool);\\n\\n /**\\n * @dev Transfer token for a specified address\\n * @param _to The address to transfer to.\\n * @param _value The amount to be transferred.\\n */\\n function transfer(address _to, uint256 _value) external returns (bool);\\n\\n /**\\n * @dev Function to check the amount of tokens that an owner allowed to a spender.\\n * @param _owner address The address which owns the funds.\\n * @param _spender address The address which will spend the funds.\\n * @return A uint256 specifying the amount of tokens still available for the spender.\\n */\\n function allowance(address _owner, address _spender) external view returns (uint256);\\n\\n /**\\n * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.\\n * Beware that changing an allowance with this method brings the risk that someone may use both the old\\n * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this\\n * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n * @param _spender The address which will spend the funds.\\n * @param _value The amount of tokens to be spent.\\n */\\n function approve(address _spender, uint256 _value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x3d388cba7d9e9c0f579876cd530737511d24f0eac7f31fd6e01802505f4e24e3\"},\"src/interfaces/types/VeaClaim.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@jaybuidl, @shotaronowhere]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.24;\\n\\nenum Party {\\n None,\\n Claimer,\\n Challenger\\n}\\n\\nstruct Claim {\\n bytes32 stateRoot;\\n address claimer;\\n uint32 timestampClaimed;\\n uint32 timestampVerification;\\n uint32 blocknumberVerification;\\n Party honest;\\n address challenger;\\n}\\n\",\"keccak256\":\"0xfef781e359c97aebbe8dbfcb75edb7cb962139fd9ea538b8b89a3f2e13a05bfe\",\"license\":\"MIT\"},\"src/interfaces/updaters/ISequencerDelayUpdatable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@jaybuidl, @shotaronowhere]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.24;\\n\\n/// @dev Interface of a contract which is updatable, receiving parameter updates from an L1 contract through a cross-chain call.\\n/// @dev eg. Arbitrum (L2) -> Ethereum (L1) -> Gnosis (L1), the veaOutbox on Gnosis will be an ISequencerDelayUpdatable contract which receives updates from the router on Ethereum.\\ninterface ISequencerDelayUpdatable {\\n /// @dev Updates the sequencer limit.\\n /// Note: Access restricted to ensure the argument is passed from the Sequencer contract.\\n /// @param _newSequencerDelayLimit The delaySeconds from the MaxTimeVariation struct in the Arbitrum Sequencer contract.\\n /// @param _timestamp The timestamp of the message.\\n function updateSequencerDelayLimit(uint256 _newSequencerDelayLimit, uint256 _timestamp) external;\\n}\\n\",\"keccak256\":\"0x95ca3cc0dfaddee5c94a7e6b68bb9a90ce6d1b9cdd3b59241f5b1b5831ed89ec\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6101e060405234801562000011575f80fd5b5060405162002bb338038062002bb383398101604081905262000034916200012c565b60e08a90526101608990526101a08790526101808890526001600160a01b0380871660805280861660a05260048590556101c0849052610140839052811660c052898989898989898989896200008c60028b620001d5565b6101008190526200009f8b6002620001f5565b620000ab919062000215565b6101205261016051600190620000c29042620001d5565b620000ce919062000215565b600181905550505050505050505050503360065f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050505050505050506200022b565b6001600160a01b038116811462000129575f80fd5b50565b5f805f805f805f805f806101408b8d03121562000147575f80fd5b8a51995060208b0151985060408b0151975060608b0151965060808b0151620001708162000114565b60a08c0151909650620001838162000114565b8095505060c08b0151935060e08b015192506101008b015191506101208b0151620001ae8162000114565b809150509295989b9194979a5092959850565b634e487b7160e01b5f52601160045260245ffd5b5f82620001f057634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176200020f576200020f620001c1565b92915050565b818103818111156200020f576200020f620001c1565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516127da620003d95f395f818161059801526121cf01525f81816105cb0152818161096701528181611aa301528181611c2b0152611ee301525f8181610650015261216401525f81816105fe0152818161098b01528181610d140152818161199301528181611ac701528181611c4f0152611f0701525f818161053201528181610b000152610e2b01525f81816104c101528181611631015261181701525f81816103fd01528181611545015261176e01525f818161068301528181610766015281816110420152818161189201528181611da101528181611e340152818161205901526120f301525f818161037f0152818161078c015281816110680152818161156b015281816115d2015281816117940152818161183d015281816118b801528181611dc701528181611e5a0152818161207f015261211901525f81816106b601528181610beb0152610f1601525f818161025101528181610a0601528181610a8001528181610b6201528181610d4901528181610dab0152610e8d01526127da5ff3fe6080604052600436106101fc575f3560e01c80637ffc2a6e11610113578063b5b7a1841161009d578063d5e6a9df1161006d578063d5e6a9df146106a5578063da2b7bc4146106d8578063df19e6ff146106f7578063e813a75514610723578063eedcf2a914610738575f80fd5b8063b5b7a184146105ed578063b633b94414610620578063c2114a161461063f578063d0e30db014610672575f80fd5b80638d96fdea116100e35780638d96fdea14610521578063930f28af146105545780639588eca214610573578063aa22a1c614610587578063b044397e146105ba575f80fd5b80637ffc2a6e1461049b578063836e344b146104b05780638a619a71146104e35780638ad3a8f714610502575f80fd5b806331ddf7431161019457806344df8e701161016457806344df8e70146103ec5780634788cb381461041f57806349b4299e1461043e5780634a439cfe1461045d578063541adcca1461047c575f80fd5b806331ddf743146103305780633ce43cfd1461034f5780633fc8cef31461036e57806343b066d5146103a1575f80fd5b80632639c060116101cf5780632639c060146102b257806327ee6bdd146102dd5780632c192519146102f257806331d1445714610311575f80fd5b806301139b68146102005780630f0adca5146102215780631062b39a14610240578063222ae78614610290575b5f80fd5b34801561020b575f80fd5b5061021f61021a366004612383565b61074b565b005b34801561022c575f80fd5b5061021f61023b3660046123af565b610965565b34801561024b575f80fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561029b575f80fd5b506102a4610d0e565b604051908152602001610287565b3480156102bd575f80fd5b506102a46102cc3660046123e3565b60026020525f908152604090205481565b3480156102e8575f80fd5b506102a460015481565b3480156102fd575f80fd5b5061021f61030c3660046123fa565b610d3e565b34801561031c575f80fd5b5061021f61032b3660046123fa565b611011565b34801561033b575f80fd5b5061021f61034a366004612476565b6111f5565b34801561035a575f80fd5b5061021f61036936600461252f565b611485565b348015610379575f80fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ac575f80fd5b506103dc6103bb3660046123e3565b600881901c5f90815260036020526040902054600160ff9092161c81161490565b6040519015158152602001610287565b3480156103f7575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561042a575f80fd5b5061021f610439366004612383565b6116b5565b348015610449575f80fd5b5061021f610458366004612383565b6118e9565b348015610468575f80fd5b506102a46104773660046123e3565b61198d565b348015610487575f80fd5b506102a4610496366004612565565b6119be565b3480156104a6575f80fd5b506102a460055481565b3480156104bb575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ee575f80fd5b5061021f6104fd366004612586565b611a0f565b34801561050d575f80fd5b50600654610273906001600160a01b031681565b34801561052c575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561055f575f80fd5b5061021f61056e366004612383565b611aa1565b34801561057e575f80fd5b506102a45f5481565b348015610592575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b3480156105c5575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b3480156105f8575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561062b575f80fd5b5061021f61063a366004612383565b611c29565b34801561064a575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561067d575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b3480156106b0575f80fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156106e3575f80fd5b5061021f6106f2366004612383565b611ee1565b348015610702575f80fd5b50610716610711366004612565565b612148565b60405161028791906125b5565b34801561072e575f80fd5b506102a460045481565b61021f6107463660046123fa565b61220b565b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156107da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fe91906125cf565b6108235760405162461bcd60e51b815260040161081a906125ee565b60405180910390fd5b61082c816119be565b5f83815260026020526040902054146108575760405162461bcd60e51b815260040161081a9061261d565b60c08101516001600160a01b0316156108b25760405162461bcd60e51b815260206004820152601960248201527f436c61696d20616c7265616479206368616c6c656e6765642e00000000000000604482015260640161081a565b5f8160a0015160028111156108c9576108c96125a1565b146109165760405162461bcd60e51b815260206004820152601760248201527f436c61696d20616c72656164792076657269666965642e000000000000000000604482015260640161081a565b3360c0820152610925816119be565b5f83815260026020526040808220929092559051339184917fcfe09ca25f55d949baba5e280f5750c9ba4b9048fca5532f916067d433afe4d79190a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f000000000000000000000000000000000000000000000000000000000000000042816109b8576109b8612645565b040311156109fb5760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b604482015260640161081a565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a7e5760405162461bcd60e51b815260206004820152602260248201527f4e6f742066726f6d206e617469766520476e6f73697320414d42206272696467604482015261329760f11b606482015260840161081a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ada573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610afe9190612659565b7f000000000000000000000000000000000000000000000000000000000000000014610b605760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b604482015260640161081a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bbc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be09190612670565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610c535760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b604482015260640161081a565b60015483118015610c6357508115155b15610ca55760018390555f8290556040518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a15b610cae816119be565b5f8481526002602052604090205403610d09578051829003610cd657600160a0820152610cf1565b60c08101516001600160a01b031615610cf157600260a08201525b610cfa816119be565b5f848152600260205260409020555b505050565b5f610d397f00000000000000000000000000000000000000000000000000000000000000004261268b565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610da95760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b690313934b233b29760811b604482015260640161081a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e299190612659565b7f000000000000000000000000000000000000000000000000000000000000000014610e8b5760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b604482015260640161081a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ee7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0b9190612670565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610f7e5760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b604482015260640161081a565b8060055410610fc65760405162461bcd60e51b815260206004820152601460248201527326b2b9b9b0b3b29034b99037baba3230ba32b21760611b604482015260640161081a565b816004541461100d57600482905560058190556040518281527f684f6fb71cbcb798156dcca2a95dbd142fa1f8957637833b1897ab89e05aa7079060200160405180910390a15b5050565b6006546001600160a01b03163314611027575f80fd5b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156110b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110da91906125cf565b6110f65760405162461bcd60e51b815260040161081a906125ee565b806111135760405162461bcd60e51b815260040161081a9061261d565b5f82815260026020526040902054156111645760405162461bcd60e51b815260206004820152601360248201527221b630b4b69030b63932b0b23c9036b0b2329760691b604482015260640161081a565b6040805160e0810182528281523360208201524263ffffffff16918101919091525f606082018190526080820181905260a0820181905260c08201526111a9906119be565b5f838152600260209081526040918290209290925551828152839133917fd95107f4584744c6c893a04c43058aadd1ce8aac8ca5d64140eaf277de6c1d57910160405180910390a35050565b604085106112375760405162461bcd60e51b815260206004820152600f60248201526e283937b7b3103a37b7903637b7339760891b604482015260640161081a565b5f8484848460405160200161124f94939291906126aa565b604051602081830303815290604052805190602001209050805f5260205f2090505f5b868110156112c7575f88888381811061128d5761128d6126eb565b905060200201359050828111156112b057825f528060205260405f2092506112be565b805f528260205260405f2092505b50600101611272565b50805f54146113095760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b604482015260640161081a565b600885901c66ffffffffffffff165f8181526003602052604090205460ff87169080821c6001161561137d5760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792072656c61796564000000000000000000604482015260640161081a565b5f838152600360205260408082206001851b84179055516001600160a01b038916906113ac90899089906126ff565b5f604051808303815f865af19150503d805f81146113e5576040519150601f19603f3d011682016040523d82523d5f602084013e6113ea565b606091505b505090508061143b5760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2063616c6c20636f6e7472616374000000000000000000604482015260640161081a565b60405167ffffffffffffffff8a1681527f54303fab361bc52c2f1f56ace7351189582264f74ce47a6e7c3f478d64c429439060200160405180910390a15050505050505050505050565b61149761049636839003830183612565565b5f83815260026020526040902054146114c25760405162461bcd60e51b815260040161081a9061261d565b60026114d460c0830160a0840161270e565b60028111156114e5576114e56125a1565b146115265760405162461bcd60e51b815260206004820152601160248201527021b430b63632b733b2903330b4b632b21760791b604482015260640161081a565b5f828152600260205260408082209190915551630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c68906024015f604051808303815f87803b1580156115b4575f80fd5b505af11580156115c6573d5f803e3d5ffd5b50506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063a9059cbb905061160b60e0840160c08501612586565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201527f000000000000000000000000000000000000000000000000000000000000000060248201526044015b6020604051808303815f875af1158015611675573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061169991906125cf565b61100d5760405162461bcd60e51b815260040161081a906125ee565b6116be816119be565b5f83815260026020526040902054146116e95760405162461bcd60e51b815260040161081a9061261d565b60018160a001516002811115611701576117016125a1565b1461173e5760405162461bcd60e51b815260206004820152600d60248201526c21b630b4b6903330b4b632b21760991b604482015260640161081a565b5f8281526002602052604081205560c08101516001600160a01b03161561186e57604051630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c68906024015f604051808303815f87803b1580156117dd575f80fd5b505af11580156117ef573d5f803e3d5ffd5b50505050602081015160405163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401611659565b602081015160405163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401611659565b6006546001600160a01b031633146118ff575f80fd5b611908816119be565b5f83815260026020526040902054146119335760405162461bcd60e51b815260040161081a9061261d565b63ffffffff428116606083015243166080820152611950816119be565b5f8381526002602052604080822092909255905183917f37b700b61b9b4710dddb0c3316b2be7ef6088ed4b1d7bfe0fb98be8f9a163e1691a25050565b5f6119b87f00000000000000000000000000000000000000000000000000000000000000008361268b565b92915050565b80516020808301516040808501516060860151608087015160a088015160c089015194515f986119f2989097969101612727565b604051602081830303815290604052805190602001209050919050565b6006546001600160a01b03163314611a25575f80fd5b6006546001600160a01b03163314611a7f5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420546573746e6574204f70657261746f720000000000000000604482015260640161081a565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611af457611af4612645565b04031115611b375760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b604482015260640161081a565b611b40816119be565b5f8381526002602052604090205414611b6b5760405162461bcd60e51b815260040161081a9061261d565b60c08101516001600160a01b031615611bbd5760405162461bcd60e51b815260206004820152601460248201527321b630b4b69034b99031b430b63632b733b2b21760611b604482015260640161081a565b600154821115611c0457600182905580515f556040518281527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a15b600160a0820152611c14816119be565b5f928352600260205260409092209190915550565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611c7c57611c7c612645565b040311611cbd5760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b604482015260640161081a565b611cc6816119be565b5f8381526002602052604090205414611cf15760405162461bcd60e51b815260040161081a9061261d565b5f8160a001516002811115611d0857611d086125a1565b14611d475760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b604482015260640161081a565b60c08101516001600160a01b03161561100d5760208101516001600160a01b0316611df8575f828152600260205260408082209190915560c0820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401611659565b60c0810180515f909152611e0b826119be565b505f839052600260205260405163a9059cbb60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044015b6020604051808303815f875af1158015611ea1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ec591906125cf565b610d095760405162461bcd60e51b815260040161081a906125ee565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611f3457611f34612645565b040311611f755760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b604482015260640161081a565b611f7e816119be565b5f8381526002602052604090205414611fa95760405162461bcd60e51b815260040161081a9061261d565b5f8160a001516002811115611fc057611fc06125a1565b14611fff5760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b604482015260640161081a565b60208101516001600160a01b03161561100d5760c08101516001600160a01b03166120b0575f82815260026020908152604080832092909255820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401611659565b6020810180515f9091526120c3826119be565b5f8481526002602052604090819020919091555163a9059cbb60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401611e85565b5f816060015163ffffffff165f0361216257506002919050565b7f0000000000000000000000000000000000000000000000000000000000000000826060015163ffffffff164203101561219e57506003919050565b5f6005836060015163ffffffff164203816121bb576121bb612645565b608085015163ffffffff16919004019050437f0000000000000000000000000000000000000000000000000000000000000000818303116121ff5760019250612203565b5f92505b50505b919050565b6122158282611011565b6040805160e0810182528281523360208201524263ffffffff16918101919091525f606082018190526080820181905260a0820181905260c082015261225b83826118e9565b63ffffffff4281166060830152431660808201526122798382611aa1565b600160a0820152610d0983826116b5565b6001600160a01b038116811461229e575f80fd5b50565b80356122068161228a565b803563ffffffff81168114612206575f80fd5b803560038110612206575f80fd5b5f60e082840312156122dd575f80fd5b60405160e0810181811067ffffffffffffffff8211171561230c57634e487b7160e01b5f52604160045260245ffd5b60405282358152905080612322602084016122a1565b6020820152612333604084016122ac565b6040820152612344606084016122ac565b6060820152612355608084016122ac565b608082015261236660a084016122bf565b60a082015261237760c084016122a1565b60c08201525092915050565b5f806101008385031215612395575f80fd5b823591506123a684602085016122cd565b90509250929050565b5f805f61012084860312156123c2575f80fd5b83359250602084013591506123da85604086016122cd565b90509250925092565b5f602082840312156123f3575f80fd5b5035919050565b5f806040838503121561240b575f80fd5b50508035926020909101359150565b803567ffffffffffffffff81168114612206575f80fd5b5f8083601f840112612441575f80fd5b50813567ffffffffffffffff811115612458575f80fd5b60208301915083602082850101111561246f575f80fd5b9250929050565b5f805f805f806080878903121561248b575f80fd5b863567ffffffffffffffff808211156124a2575f80fd5b818901915089601f8301126124b5575f80fd5b8135818111156124c3575f80fd5b8a60208260051b85010111156124d7575f80fd5b602083019850809750506124ed60208a0161241a565b95506124fb60408a016122a1565b94506060890135915080821115612510575f80fd5b5061251d89828a01612431565b979a9699509497509295939492505050565b5f80828403610100811215612542575f80fd5b8335925060e0601f1982011215612557575f80fd5b506020830190509250929050565b5f60e08284031215612575575f80fd5b61257f83836122cd565b9392505050565b5f60208284031215612596575f80fd5b813561257f8161228a565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106125c9576125c96125a1565b91905290565b5f602082840312156125df575f80fd5b8151801515811461257f575f80fd5b6020808252601590820152742330b4b632b2102ba2aa24103a3930b739b332b91760591b604082015260600190565b6020808252600e908201526d24b73b30b634b21031b630b4b69760911b604082015260600190565b634e487b7160e01b5f52601260045260245ffd5b5f60208284031215612669575f80fd5b5051919050565b5f60208284031215612680575f80fd5b815161257f8161228a565b5f826126a557634e487b7160e01b5f52601260045260245ffd5b500490565b60c085901b6001600160c01b0319168152606084901b6bffffffffffffffffffffffff191660088201528183601c8301375f9101601c019081529392505050565b634e487b7160e01b5f52603260045260245ffd5b818382375f9101908152919050565b5f6020828403121561271e575f80fd5b61257f826122bf565b8781525f6bffffffffffffffffffffffff19808960601b16602084015263ffffffff60e01b808960e01b166034850152808860e01b166038850152808760e01b16603c850152506003851061277e5761277e6125a1565b60f89490941b60408301525060609190911b90911660418201526055019594505050505056fea2646970667358221220535aceacac91488256f76d0918dbee45c9bd3486a1fcadeb827698927b74d80a64736f6c63430008180033", + "deployedBytecode": "0x6080604052600436106101fc575f3560e01c80637ffc2a6e11610113578063b5b7a1841161009d578063d5e6a9df1161006d578063d5e6a9df146106a5578063da2b7bc4146106d8578063df19e6ff146106f7578063e813a75514610723578063eedcf2a914610738575f80fd5b8063b5b7a184146105ed578063b633b94414610620578063c2114a161461063f578063d0e30db014610672575f80fd5b80638d96fdea116100e35780638d96fdea14610521578063930f28af146105545780639588eca214610573578063aa22a1c614610587578063b044397e146105ba575f80fd5b80637ffc2a6e1461049b578063836e344b146104b05780638a619a71146104e35780638ad3a8f714610502575f80fd5b806331ddf7431161019457806344df8e701161016457806344df8e70146103ec5780634788cb381461041f57806349b4299e1461043e5780634a439cfe1461045d578063541adcca1461047c575f80fd5b806331ddf743146103305780633ce43cfd1461034f5780633fc8cef31461036e57806343b066d5146103a1575f80fd5b80632639c060116101cf5780632639c060146102b257806327ee6bdd146102dd5780632c192519146102f257806331d1445714610311575f80fd5b806301139b68146102005780630f0adca5146102215780631062b39a14610240578063222ae78614610290575b5f80fd5b34801561020b575f80fd5b5061021f61021a366004612383565b61074b565b005b34801561022c575f80fd5b5061021f61023b3660046123af565b610965565b34801561024b575f80fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561029b575f80fd5b506102a4610d0e565b604051908152602001610287565b3480156102bd575f80fd5b506102a46102cc3660046123e3565b60026020525f908152604090205481565b3480156102e8575f80fd5b506102a460015481565b3480156102fd575f80fd5b5061021f61030c3660046123fa565b610d3e565b34801561031c575f80fd5b5061021f61032b3660046123fa565b611011565b34801561033b575f80fd5b5061021f61034a366004612476565b6111f5565b34801561035a575f80fd5b5061021f61036936600461252f565b611485565b348015610379575f80fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ac575f80fd5b506103dc6103bb3660046123e3565b600881901c5f90815260036020526040902054600160ff9092161c81161490565b6040519015158152602001610287565b3480156103f7575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561042a575f80fd5b5061021f610439366004612383565b6116b5565b348015610449575f80fd5b5061021f610458366004612383565b6118e9565b348015610468575f80fd5b506102a46104773660046123e3565b61198d565b348015610487575f80fd5b506102a4610496366004612565565b6119be565b3480156104a6575f80fd5b506102a460055481565b3480156104bb575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ee575f80fd5b5061021f6104fd366004612586565b611a0f565b34801561050d575f80fd5b50600654610273906001600160a01b031681565b34801561052c575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561055f575f80fd5b5061021f61056e366004612383565b611aa1565b34801561057e575f80fd5b506102a45f5481565b348015610592575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b3480156105c5575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b3480156105f8575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561062b575f80fd5b5061021f61063a366004612383565b611c29565b34801561064a575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561067d575f80fd5b506102a47f000000000000000000000000000000000000000000000000000000000000000081565b3480156106b0575f80fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156106e3575f80fd5b5061021f6106f2366004612383565b611ee1565b348015610702575f80fd5b50610716610711366004612565565b612148565b60405161028791906125b5565b34801561072e575f80fd5b506102a460045481565b61021f6107463660046123fa565b61220b565b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156107da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fe91906125cf565b6108235760405162461bcd60e51b815260040161081a906125ee565b60405180910390fd5b61082c816119be565b5f83815260026020526040902054146108575760405162461bcd60e51b815260040161081a9061261d565b60c08101516001600160a01b0316156108b25760405162461bcd60e51b815260206004820152601960248201527f436c61696d20616c7265616479206368616c6c656e6765642e00000000000000604482015260640161081a565b5f8160a0015160028111156108c9576108c96125a1565b146109165760405162461bcd60e51b815260206004820152601760248201527f436c61696d20616c72656164792076657269666965642e000000000000000000604482015260640161081a565b3360c0820152610925816119be565b5f83815260026020526040808220929092559051339184917fcfe09ca25f55d949baba5e280f5750c9ba4b9048fca5532f916067d433afe4d79190a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001547f000000000000000000000000000000000000000000000000000000000000000042816109b8576109b8612645565b040311156109fb5760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b604482015260640161081a565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a7e5760405162461bcd60e51b815260206004820152602260248201527f4e6f742066726f6d206e617469766520476e6f73697320414d42206272696467604482015261329760f11b606482015260840161081a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ada573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610afe9190612659565b7f000000000000000000000000000000000000000000000000000000000000000014610b605760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b604482015260640161081a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bbc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be09190612670565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610c535760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b604482015260640161081a565b60015483118015610c6357508115155b15610ca55760018390555f8290556040518381527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a15b610cae816119be565b5f8481526002602052604090205403610d09578051829003610cd657600160a0820152610cf1565b60c08101516001600160a01b031615610cf157600260a08201525b610cfa816119be565b5f848152600260205260409020555b505050565b5f610d397f00000000000000000000000000000000000000000000000000000000000000004261268b565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610da95760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b690313934b233b29760811b604482015260640161081a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e307dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e299190612659565b7f000000000000000000000000000000000000000000000000000000000000000014610e8b5760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21031b430b4b71034b21760791b604482015260640161081a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d67bdd256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ee7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0b9190612670565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610f7e5760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b6903937baba32b91760811b604482015260640161081a565b8060055410610fc65760405162461bcd60e51b815260206004820152601460248201527326b2b9b9b0b3b29034b99037baba3230ba32b21760611b604482015260640161081a565b816004541461100d57600482905560058190556040518281527f684f6fb71cbcb798156dcca2a95dbd142fa1f8957637833b1897ab89e05aa7079060200160405180910390a15b5050565b6006546001600160a01b03163314611027575f80fd5b6040516323b872dd60e01b81523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156110b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110da91906125cf565b6110f65760405162461bcd60e51b815260040161081a906125ee565b806111135760405162461bcd60e51b815260040161081a9061261d565b5f82815260026020526040902054156111645760405162461bcd60e51b815260206004820152601360248201527221b630b4b69030b63932b0b23c9036b0b2329760691b604482015260640161081a565b6040805160e0810182528281523360208201524263ffffffff16918101919091525f606082018190526080820181905260a0820181905260c08201526111a9906119be565b5f838152600260209081526040918290209290925551828152839133917fd95107f4584744c6c893a04c43058aadd1ce8aac8ca5d64140eaf277de6c1d57910160405180910390a35050565b604085106112375760405162461bcd60e51b815260206004820152600f60248201526e283937b7b3103a37b7903637b7339760891b604482015260640161081a565b5f8484848460405160200161124f94939291906126aa565b604051602081830303815290604052805190602001209050805f5260205f2090505f5b868110156112c7575f88888381811061128d5761128d6126eb565b905060200201359050828111156112b057825f528060205260405f2092506112be565b805f528260205260405f2092505b50600101611272565b50805f54146113095760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b604482015260640161081a565b600885901c66ffffffffffffff165f8181526003602052604090205460ff87169080821c6001161561137d5760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792072656c61796564000000000000000000604482015260640161081a565b5f838152600360205260408082206001851b84179055516001600160a01b038916906113ac90899089906126ff565b5f604051808303815f865af19150503d805f81146113e5576040519150601f19603f3d011682016040523d82523d5f602084013e6113ea565b606091505b505090508061143b5760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2063616c6c20636f6e7472616374000000000000000000604482015260640161081a565b60405167ffffffffffffffff8a1681527f54303fab361bc52c2f1f56ace7351189582264f74ce47a6e7c3f478d64c429439060200160405180910390a15050505050505050505050565b61149761049636839003830183612565565b5f83815260026020526040902054146114c25760405162461bcd60e51b815260040161081a9061261d565b60026114d460c0830160a0840161270e565b60028111156114e5576114e56125a1565b146115265760405162461bcd60e51b815260206004820152601160248201527021b430b63632b733b2903330b4b632b21760791b604482015260640161081a565b5f828152600260205260408082209190915551630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c68906024015f604051808303815f87803b1580156115b4575f80fd5b505af11580156115c6573d5f803e3d5ffd5b50506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063a9059cbb905061160b60e0840160c08501612586565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201527f000000000000000000000000000000000000000000000000000000000000000060248201526044015b6020604051808303815f875af1158015611675573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061169991906125cf565b61100d5760405162461bcd60e51b815260040161081a906125ee565b6116be816119be565b5f83815260026020526040902054146116e95760405162461bcd60e51b815260040161081a9061261d565b60018160a001516002811115611701576117016125a1565b1461173e5760405162461bcd60e51b815260206004820152600d60248201526c21b630b4b6903330b4b632b21760991b604482015260640161081a565b5f8281526002602052604081205560c08101516001600160a01b03161561186e57604051630852cd8d60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c68906024015f604051808303815f87803b1580156117dd575f80fd5b505af11580156117ef573d5f803e3d5ffd5b50505050602081015160405163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401611659565b602081015160405163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401611659565b6006546001600160a01b031633146118ff575f80fd5b611908816119be565b5f83815260026020526040902054146119335760405162461bcd60e51b815260040161081a9061261d565b63ffffffff428116606083015243166080820152611950816119be565b5f8381526002602052604080822092909255905183917f37b700b61b9b4710dddb0c3316b2be7ef6088ed4b1d7bfe0fb98be8f9a163e1691a25050565b5f6119b87f00000000000000000000000000000000000000000000000000000000000000008361268b565b92915050565b80516020808301516040808501516060860151608087015160a088015160c089015194515f986119f2989097969101612727565b604051602081830303815290604052805190602001209050919050565b6006546001600160a01b03163314611a25575f80fd5b6006546001600160a01b03163314611a7f5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420546573746e6574204f70657261746f720000000000000000604482015260640161081a565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611af457611af4612645565b04031115611b375760405162461bcd60e51b815260206004820152601060248201526f213934b233b29029b43aba3237bbb71760811b604482015260640161081a565b611b40816119be565b5f8381526002602052604090205414611b6b5760405162461bcd60e51b815260040161081a9061261d565b60c08101516001600160a01b031615611bbd5760405162461bcd60e51b815260206004820152601460248201527321b630b4b69034b99031b430b63632b733b2b21760611b604482015260640161081a565b600154821115611c0457600182905580515f556040518281527ff786e7f77ede00a02a5464f8f0555798f42ba99a4a920ef2778db8d75e4656f79060200160405180910390a15b600160a0820152611c14816119be565b5f928352600260205260409092209190915550565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611c7c57611c7c612645565b040311611cbd5760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b604482015260640161081a565b611cc6816119be565b5f8381526002602052604090205414611cf15760405162461bcd60e51b815260040161081a9061261d565b5f8160a001516002811115611d0857611d086125a1565b14611d475760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b604482015260640161081a565b60c08101516001600160a01b03161561100d5760208101516001600160a01b0316611df8575f828152600260205260408082209190915560c0820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401611659565b60c0810180515f909152611e0b826119be565b505f839052600260205260405163a9059cbb60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044015b6020604051808303815f875af1158015611ea1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ec591906125cf565b610d095760405162461bcd60e51b815260040161081a906125ee565b7f00000000000000000000000000000000000000000000000000000000000000006001547f00000000000000000000000000000000000000000000000000000000000000004281611f3457611f34612645565b040311611f755760405162461bcd60e51b815260206004820152600f60248201526e213934b233b290293ab73734b7339760891b604482015260640161081a565b611f7e816119be565b5f8381526002602052604090205414611fa95760405162461bcd60e51b815260040161081a9061261d565b5f8160a001516002811115611fc057611fc06125a1565b14611fff5760405162461bcd60e51b815260206004820152600f60248201526e21b630b4b6903932b9b7b63b32b21760891b604482015260640161081a565b60208101516001600160a01b03161561100d5760c08101516001600160a01b03166120b0575f82815260026020908152604080832092909255820151905163a9059cbb60e01b81526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401611659565b6020810180515f9091526120c3826119be565b5f8481526002602052604090819020919091555163a9059cbb60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401611e85565b5f816060015163ffffffff165f0361216257506002919050565b7f0000000000000000000000000000000000000000000000000000000000000000826060015163ffffffff164203101561219e57506003919050565b5f6005836060015163ffffffff164203816121bb576121bb612645565b608085015163ffffffff16919004019050437f0000000000000000000000000000000000000000000000000000000000000000818303116121ff5760019250612203565b5f92505b50505b919050565b6122158282611011565b6040805160e0810182528281523360208201524263ffffffff16918101919091525f606082018190526080820181905260a0820181905260c082015261225b83826118e9565b63ffffffff4281166060830152431660808201526122798382611aa1565b600160a0820152610d0983826116b5565b6001600160a01b038116811461229e575f80fd5b50565b80356122068161228a565b803563ffffffff81168114612206575f80fd5b803560038110612206575f80fd5b5f60e082840312156122dd575f80fd5b60405160e0810181811067ffffffffffffffff8211171561230c57634e487b7160e01b5f52604160045260245ffd5b60405282358152905080612322602084016122a1565b6020820152612333604084016122ac565b6040820152612344606084016122ac565b6060820152612355608084016122ac565b608082015261236660a084016122bf565b60a082015261237760c084016122a1565b60c08201525092915050565b5f806101008385031215612395575f80fd5b823591506123a684602085016122cd565b90509250929050565b5f805f61012084860312156123c2575f80fd5b83359250602084013591506123da85604086016122cd565b90509250925092565b5f602082840312156123f3575f80fd5b5035919050565b5f806040838503121561240b575f80fd5b50508035926020909101359150565b803567ffffffffffffffff81168114612206575f80fd5b5f8083601f840112612441575f80fd5b50813567ffffffffffffffff811115612458575f80fd5b60208301915083602082850101111561246f575f80fd5b9250929050565b5f805f805f806080878903121561248b575f80fd5b863567ffffffffffffffff808211156124a2575f80fd5b818901915089601f8301126124b5575f80fd5b8135818111156124c3575f80fd5b8a60208260051b85010111156124d7575f80fd5b602083019850809750506124ed60208a0161241a565b95506124fb60408a016122a1565b94506060890135915080821115612510575f80fd5b5061251d89828a01612431565b979a9699509497509295939492505050565b5f80828403610100811215612542575f80fd5b8335925060e0601f1982011215612557575f80fd5b506020830190509250929050565b5f60e08284031215612575575f80fd5b61257f83836122cd565b9392505050565b5f60208284031215612596575f80fd5b813561257f8161228a565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106125c9576125c96125a1565b91905290565b5f602082840312156125df575f80fd5b8151801515811461257f575f80fd5b6020808252601590820152742330b4b632b2102ba2aa24103a3930b739b332b91760591b604082015260600190565b6020808252600e908201526d24b73b30b634b21031b630b4b69760911b604082015260600190565b634e487b7160e01b5f52601260045260245ffd5b5f60208284031215612669575f80fd5b5051919050565b5f60208284031215612680575f80fd5b815161257f8161228a565b5f826126a557634e487b7160e01b5f52601260045260245ffd5b500490565b60c085901b6001600160c01b0319168152606084901b6bffffffffffffffffffffffff191660088201528183601c8301375f9101601c019081529392505050565b634e487b7160e01b5f52603260045260245ffd5b818382375f9101908152919050565b5f6020828403121561271e575f80fd5b61257f826122bf565b8781525f6bffffffffffffffffffffffff19808960601b16602084015263ffffffff60e01b808960e01b166034850152808860e01b166038850152808760e01b16603c850152506003851061277e5761277e6125a1565b60f89490941b60408301525060609190911b90911660418201526055019594505050505056fea2646970667358221220535aceacac91488256f76d0918dbee45c9bd3486a1fcadeb827698927b74d80a64736f6c63430008180033", "devdoc": { - "details": "Vea Outbox From ArbitrumGoerli to Chiado. Note: This contract is deployed on Chiado. Note: This contract is permissioned for developer testing (devnet).", + "details": "Vea Outbox From Arbitrum to Chiado. Note: This contract is deployed on Chiado. Note: This contract is permissioned for developer testing (devnet).", "events": { "Challenged(uint256,address)": { "details": "This event indicates that `sendSnapshot(epoch)` should be called in the inbox.", @@ -1324,7 +1324,7 @@ "storageLayout": { "storage": [ { - "astId": 1495, + "astId": 2671, "contract": "src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol:VeaOutboxArbToGnosisDevnet", "label": "stateRoot", "offset": 0, @@ -1332,7 +1332,7 @@ "type": "t_bytes32" }, { - "astId": 1497, + "astId": 2673, "contract": "src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol:VeaOutboxArbToGnosisDevnet", "label": "latestVerifiedEpoch", "offset": 0, @@ -1340,7 +1340,7 @@ "type": "t_uint256" }, { - "astId": 1501, + "astId": 2677, "contract": "src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol:VeaOutboxArbToGnosisDevnet", "label": "claimHashes", "offset": 0, @@ -1348,7 +1348,7 @@ "type": "t_mapping(t_uint256,t_bytes32)" }, { - "astId": 1505, + "astId": 2681, "contract": "src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol:VeaOutboxArbToGnosisDevnet", "label": "relayed", "offset": 0, @@ -1356,7 +1356,7 @@ "type": "t_mapping(t_uint256,t_bytes32)" }, { - "astId": 1507, + "astId": 2683, "contract": "src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol:VeaOutboxArbToGnosisDevnet", "label": "sequencerDelayLimit", "offset": 0, @@ -1364,7 +1364,7 @@ "type": "t_uint256" }, { - "astId": 1509, + "astId": 2685, "contract": "src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol:VeaOutboxArbToGnosisDevnet", "label": "timestampDelayUpdated", "offset": 0, @@ -1372,7 +1372,7 @@ "type": "t_uint256" }, { - "astId": 3476, + "astId": 7085, "contract": "src/devnets/arbitrumToGnosis/VeaOutboxArbToGnosisDevnet.sol:VeaOutboxArbToGnosisDevnet", "label": "devnetOperator", "offset": 0, diff --git a/contracts/deployments/sepolia/RouterArbToGnosisDevnet.json b/contracts/deployments/sepolia/RouterArbToGnosisDevnet.json new file mode 100644 index 00000000..a7f71731 --- /dev/null +++ b/contracts/deployments/sepolia/RouterArbToGnosisDevnet.json @@ -0,0 +1,395 @@ +{ + "address": "0xA699e7246D7AF936752789408A071805CC8c99c3", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IBridge", + "name": "_bridge", + "type": "address" + }, + { + "internalType": "contract IAMB", + "name": "_amb", + "type": "address" + }, + { + "internalType": "address", + "name": "_veaInboxArbToGnosis", + "type": "address" + }, + { + "internalType": "address", + "name": "_veaOutboxArbToGnosis", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_epoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "_ticketID", + "type": "bytes32" + } + ], + "name": "Routed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_requestedSequencerDelayLimit", + "type": "uint256" + } + ], + "name": "sequencerDelayLimitDecreaseRequested", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_ticketID", + "type": "bytes32" + } + ], + "name": "sequencerDelayLimitSent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_newSequencerDelayLimit", + "type": "uint256" + } + ], + "name": "sequencerDelayLimitUpdated", + "type": "event" + }, + { + "inputs": [], + "name": "amb", + "outputs": [ + { + "internalType": "contract IAMB", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridge", + "outputs": [ + { + "internalType": "contract IBridge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "executeSequencerDelayLimitDecreaseRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_epoch", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_stateroot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_gasLimit", + "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": "route", + "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": "requestedSequencerLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "updatesequencerDelayLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "veaInboxArbToGnosis", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "veaOutboxArbToGnosis", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x0f46ddedce45debf1731d3d09354d4e21e80a9e88aaa884b08184eb1a6464216", + "receipt": { + "to": null, + "from": "0xFa00D29d378EDC57AA1006946F0fc6230a5E3288", + "contractAddress": "0xA699e7246D7AF936752789408A071805CC8c99c3", + "transactionIndex": 71, + "gasUsed": "848386", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x6c27c3349e5a1999111b6439ca15f1e09f6390ace787e8a14bea4b4d63663784", + "transactionHash": "0x0f46ddedce45debf1731d3d09354d4e21e80a9e88aaa884b08184eb1a6464216", + "logs": [], + "blockNumber": 6573258, + "cumulativeGasUsed": "20822512", + "status": 1, + "byzantium": true + }, + "args": [ + "0x38f918D0E9F1b721EDaA41302E399fa1B79333a9", + "0xf2546D6648BD2af6a008A7e7C1542BB240329E11", + "0x496df82A2fE2f4aa6903C8bdcE759a94505E7D0c", + "0xAebcedf346f168E5CEaB7Cd367118d2176486ad7" + ], + "numDeployments": 1, + "solcInputHash": "0d66bd5cfdf493ed8e081e9f7e1bf4fa", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IBridge\",\"name\":\"_bridge\",\"type\":\"address\"},{\"internalType\":\"contract IAMB\",\"name\":\"_amb\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_veaInboxArbToGnosis\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_veaOutboxArbToGnosis\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_ticketID\",\"type\":\"bytes32\"}],\"name\":\"Routed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_requestedSequencerDelayLimit\",\"type\":\"uint256\"}],\"name\":\"sequencerDelayLimitDecreaseRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_ticketID\",\"type\":\"bytes32\"}],\"name\":\"sequencerDelayLimitSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newSequencerDelayLimit\",\"type\":\"uint256\"}],\"name\":\"sequencerDelayLimitUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"amb\",\"outputs\":[{\"internalType\":\"contract IAMB\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridge\",\"outputs\":[{\"internalType\":\"contract IBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executeSequencerDelayLimitDecreaseRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_stateroot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"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\":\"route\",\"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\":\"requestedSequencerLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updatesequencerDelayLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"veaInboxArbToGnosis\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"veaOutboxArbToGnosis\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Router from Arbitrum to Gnosis Chain. Note: This contract is deployed on Ethereum.\",\"events\":{\"Routed(uint256,bytes32)\":{\"details\":\"Event emitted when a message is relayed to another Safe Bridge.\",\"params\":{\"_epoch\":\"The epoch of the batch requested to send.\",\"_ticketID\":\"The unique identifier provided by the underlying canonical bridge.\"}},\"sequencerDelayLimitDecreaseRequested(uint256)\":{\"details\":\"This event indicates that a request to decrease the sequencer limit has been made.\",\"params\":{\"_requestedSequencerDelayLimit\":\"The new sequencer limit requested.\"}},\"sequencerDelayLimitSent(bytes32)\":{\"details\":\"This event indicates a cross-chain message was sent to inform the veaOutbox of the sequencer limit value\",\"params\":{\"_ticketID\":\"The ticketID from the AMB of the cross-chain message.\"}},\"sequencerDelayLimitUpdated(uint256)\":{\"details\":\"This event indicates the sequencer limit updated.\",\"params\":{\"_newSequencerDelayLimit\":\"The new sequencer delay limit.\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Constructor.\",\"params\":{\"_amb\":\"The address of the AMB contract on Ethereum.\",\"_bridge\":\"The address of the arbitrum bridge contract on Ethereum.\",\"_veaInboxArbToGnosis\":\"The vea inbox on Arbitrum.\",\"_veaOutboxArbToGnosis\":\"The vea outbox on Gnosis Chain.\"}},\"executeSequencerDelayLimitDecreaseRequest()\":{\"details\":\"execute sequencerDelayLimitDecreaseRequest\"},\"route(uint256,bytes32,uint256,(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.\",\"_gasLimit\":\"The true batch gas limit for the epoch.\",\"_stateroot\":\"The true batch merkle root for the epoch.\"}},\"updatesequencerDelayLimit()\":{\"details\":\"Update the sequencerDelayLimit. If decreasing, a delayed request is created for later execution.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"route(uint256,bytes32,uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))\":{\"notice\":\"Note: Access restricted to arbitrum canonical bridge.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/arbitrumToGnosis/RouterArbToGnosis.sol\":\"RouterArbToGnosis\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"src/arbitrumToGnosis/RouterArbToGnosis.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@shotaronowhere, @jaybuidl]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.24;\\n\\nimport \\\"../canonical/gnosis-chain/IAMB.sol\\\";\\nimport \\\"../canonical/arbitrum/IBridge.sol\\\";\\nimport \\\"../canonical/arbitrum/IOutbox.sol\\\";\\nimport \\\"../canonical/arbitrum/ISequencerInbox.sol\\\";\\nimport \\\"../interfaces/routers/IRouterToGnosis.sol\\\";\\nimport \\\"../interfaces/outboxes/IVeaOutboxOnL1.sol\\\";\\nimport \\\"../interfaces/updaters/ISequencerDelayUpdatable.sol\\\";\\n\\n/// @dev Router from Arbitrum to Gnosis Chain.\\n/// Note: This contract is deployed on Ethereum.\\ncontract RouterArbToGnosis is IRouterToGnosis {\\n // ************************************* //\\n // * Storage * //\\n // ************************************* //\\n\\n IBridge public immutable bridge; // The address of the Arbitrum bridge contract.\\n IAMB public immutable amb; // The address of the AMB contract on Ethereum.\\n address public immutable veaInboxArbToGnosis; // The address of the veaInbox on Arbitrum.\\n address public immutable veaOutboxArbToGnosis; // The address of the veaOutbox on Gnosis Chain.\\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 SequencerLimitDecreaseRequest public sequencerDelayLimitDecreaseRequest; // Decreasing the sequencerDelayLimit requires a delay to avoid griefing by sequencer, so we keep track of the request here.\\n\\n struct SequencerLimitDecreaseRequest {\\n uint256 requestedSequencerLimit;\\n uint256 timestamp;\\n }\\n\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @dev Event emitted when a message is relayed to another Safe Bridge.\\n /// @param _epoch The epoch of the batch requested to send.\\n /// @param _ticketID The unique identifier provided by the underlying canonical bridge.\\n event Routed(uint256 indexed _epoch, bytes32 _ticketID);\\n\\n /// @dev This event indicates a cross-chain message was sent to inform the veaOutbox of the sequencer limit value\\n /// @param _ticketID The ticketID from the AMB of the cross-chain message.\\n event sequencerDelayLimitSent(bytes32 _ticketID);\\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 limit requested.\\n event sequencerDelayLimitDecreaseRequested(uint256 _requestedSequencerDelayLimit);\\n\\n /// @dev Constructor.\\n /// @param _bridge The address of the arbitrum bridge contract on Ethereum.\\n /// @param _amb The address of the AMB contract on Ethereum.\\n /// @param _veaInboxArbToGnosis The vea inbox on Arbitrum.\\n /// @param _veaOutboxArbToGnosis The vea outbox on Gnosis Chain.\\n constructor(IBridge _bridge, IAMB _amb, address _veaInboxArbToGnosis, address _veaOutboxArbToGnosis) {\\n bridge = _bridge;\\n amb = _amb;\\n veaInboxArbToGnosis = _veaInboxArbToGnosis;\\n veaOutboxArbToGnosis = _veaOutboxArbToGnosis;\\n (, , sequencerDelayLimit, ) = ISequencerInbox(bridge.sequencerInbox()).maxTimeVariation();\\n }\\n\\n // ************************************* //\\n // * Parameter Updates * //\\n // ************************************* //\\n\\n /// @dev Update the sequencerDelayLimit. If decreasing, a delayed request is created for later execution.\\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 sendSequencerDelayLimit();\\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 = SequencerLimitDecreaseRequest({\\n requestedSequencerLimit: newsequencerDelayLimit,\\n timestamp: block.timestamp\\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.requestedSequencerLimit;\\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 sendSequencerDelayLimit();\\n emit sequencerDelayLimitUpdated(requestedSequencerDelayLimit);\\n }\\n }\\n\\n /// @dev Send the sequencer delay limit.\\n function sendSequencerDelayLimit() internal {\\n bytes memory data = abi.encodeCall(\\n ISequencerDelayUpdatable.updateSequencerDelayLimit,\\n (sequencerDelayLimit, block.timestamp)\\n );\\n // Note: using maxGasPerTx here means the relaying txn on Gnosis will need to pass that (large) amount of gas, though almost all will be unused and refunded. This is preferred over hardcoding a gas limit.\\n bytes32 ticketID = amb.requireToPassMessage(veaOutboxArbToGnosis, data, amb.maxGasPerTx());\\n emit sequencerDelayLimitSent(ticketID);\\n }\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// Note: Access restricted to arbitrum canonical bridge.\\n /// @dev Resolves any challenge of the optimistic claim for '_epoch'.\\n /// @param _epoch The epoch to verify.\\n /// @param _stateroot The true batch merkle root for the epoch.\\n /// @param _gasLimit The true batch gas limit for the epoch.\\n /// @param _claim The claim associated with the epoch.\\n function route(uint256 _epoch, bytes32 _stateroot, uint256 _gasLimit, Claim calldata _claim) external {\\n // Arbitrum -> Ethereum message sender authentication\\n // docs: https://developer.arbitrum.io/arbos/l2-to-l1-messaging/\\n // example: https://github.com/OffchainLabs/arbitrum-tutorials/blob/2c1b7d2db8f36efa496e35b561864c0f94123a5f/packages/greeter/contracts/ethereum/GreeterL1.sol#L50\\n // example: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/dfef6a68ee18dbd2e1f5a099061a3b8a0e404485/contracts/crosschain/arbitrum/LibArbitrumL1.sol#L34\\n // note: we use the bridge address as a source of truth for the activeOutbox address\\n\\n require(msg.sender == address(bridge), \\\"Not from bridge.\\\");\\n require(IOutbox(bridge.activeOutbox()).l2ToL1Sender() == veaInboxArbToGnosis, \\\"veaInbox only.\\\");\\n\\n // Ethereum -> Gnosis message passing with the AMB, the canonical Ethereum <-> Gnosis bridge.\\n // https://docs.tokenbridge.net/amb-bridge/development-of-a-cross-chain-application/how-to-develop-xchain-apps-by-amb#receive-a-method-call-from-the-amb-bridge\\n\\n bytes memory data = abi.encodeCall(IVeaOutboxOnL1.resolveDisputedClaim, (_epoch, _stateroot, _claim));\\n\\n uint256 maxGasPerTx = amb.maxGasPerTx();\\n uint256 gasLimitCapped = _gasLimit > maxGasPerTx ? maxGasPerTx : _gasLimit;\\n\\n bytes32 ticketID = amb.requireToPassMessage(veaOutboxArbToGnosis, data, gasLimitCapped);\\n emit Routed(_epoch, ticketID);\\n }\\n}\\n\",\"keccak256\":\"0x6aa5d93df7274bbed40b67e23656699aa9178ac1b64ea44b4e71cf9f2e630971\",\"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/canonical/gnosis-chain/IAMB.sol\":{\"content\":\"// https://docs.gnosischain.com/bridges/tokenbridge/amb-bridge#gnosis\\n// https://github.com/omni/tokenbridge-contracts/blob/908a48107919d4ab127f9af07d44d47eac91547e/contracts/interfaces/IAMB.sol\\n// interface is pruned for relevant function stubs\\n\\npragma solidity 0.8.24;\\n\\ninterface IAMB {\\n function requireToPassMessage(address _contract, bytes memory _data, uint256 _gas) external returns (bytes32);\\n\\n function maxGasPerTx() external view returns (uint256);\\n\\n function messageSender() external view returns (address);\\n\\n function messageSourceChainId() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xc94fccde4d2c5ede32856f84b8fd4275c353fce8a3f449a1d2a7246eafb7bc53\"},\"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/routers/IRouterToGnosis.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@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 Router which routes messages to Gnosis through the AMB.\\n/// @dev eg. L2 on Ethereum -> Ethereum (L1) -> Gnosis (L1), the IRouterToL1 will be deployed on Ethereum (L1) routing messages to Gnosis (L1).\\ninterface IRouterToGnosis {\\n /// @dev Routes state root snapshots through intermediary chains to the final destination L1 chain.\\n /// Note: Access restricted to canonical sending-chain bridge.\\n /// @param _epoch The epoch to verify.\\n /// @param _stateRoot The true state root for the epoch.\\n /// @param _gasLimit The gas limit for the AMB message.\\n /// @param _claim The claim associated with the epoch.\\n function route(uint256 _epoch, bytes32 _stateRoot, uint256 _gasLimit, Claim memory _claim) external;\\n}\\n\",\"keccak256\":\"0x9d78c7872bd2bc3b206fc6d6dfa8f8b2dab4122b10bfe0d0ab1f76bec92613b6\",\"license\":\"MIT\"},\"src/interfaces/types/VeaClaim.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@jaybuidl, @shotaronowhere]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.24;\\n\\nenum Party {\\n None,\\n Claimer,\\n Challenger\\n}\\n\\nstruct Claim {\\n bytes32 stateRoot;\\n address claimer;\\n uint32 timestampClaimed;\\n uint32 timestampVerification;\\n uint32 blocknumberVerification;\\n Party honest;\\n address challenger;\\n}\\n\",\"keccak256\":\"0xfef781e359c97aebbe8dbfcb75edb7cb962139fd9ea538b8b89a3f2e13a05bfe\",\"license\":\"MIT\"},\"src/interfaces/updaters/ISequencerDelayUpdatable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/// @custom:authors: [@jaybuidl, @shotaronowhere]\\n/// @custom:reviewers: []\\n/// @custom:auditors: []\\n/// @custom:bounties: []\\n/// @custom:deployments: []\\n\\npragma solidity 0.8.24;\\n\\n/// @dev Interface of a contract which is updatable, receiving parameter updates from an L1 contract through a cross-chain call.\\n/// @dev eg. Arbitrum (L2) -> Ethereum (L1) -> Gnosis (L1), the veaOutbox on Gnosis will be an ISequencerDelayUpdatable contract which receives updates from the router on Ethereum.\\ninterface ISequencerDelayUpdatable {\\n /// @dev Updates the sequencer limit.\\n /// Note: Access restricted to ensure the argument is passed from the Sequencer contract.\\n /// @param _newSequencerDelayLimit The delaySeconds from the MaxTimeVariation struct in the Arbitrum Sequencer contract.\\n /// @param _timestamp The timestamp of the message.\\n function updateSequencerDelayLimit(uint256 _newSequencerDelayLimit, uint256 _timestamp) external;\\n}\\n\",\"keccak256\":\"0x95ca3cc0dfaddee5c94a7e6b68bb9a90ce6d1b9cdd3b59241f5b1b5831ed89ec\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x61010060405234801562000011575f80fd5b5060405162000fda38038062000fda833981016040819052620000349162000140565b6001600160a01b03808516608081905284821660a05283821660c05290821660e0526040805163ee35f32760e01b8152905163ee35f327916004808201926020929091908290030181865afa15801562000090573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620000b69190620001a5565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa158015620000f2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001189190620001ca565b505f5550620001fe945050505050565b6001600160a01b03811681146200013d575f80fd5b50565b5f805f806080858703121562000154575f80fd5b8451620001618162000128565b6020860151909450620001748162000128565b6040860151909350620001878162000128565b60608601519092506200019a8162000128565b939692955090935050565b5f60208284031215620001b6575f80fd5b8151620001c38162000128565b9392505050565b5f805f8060808587031215620001de575f80fd5b505082516020840151604085015160609095015191969095509092509050565b60805160a05160c05160e051610d63620002775f395f818161010a0152818161089301526109e001525f8181610131015261063701525f818160cb015281816107e30152818161086401526109b701525f8181610173015281816102b9015281816103d9015281816105d501526106610152610d635ff3fe608060405234801561000f575f80fd5b5060043610610090575f3560e01c80638c5f173f116100635780638c5f173f1461012c57806390784ae814610153578063b1126dad1461015b578063e78cea921461016e578063e813a75514610195575f80fd5b8063051d1970146100945780630c63fa84146100bc5780631062b39a146100c65780632fa70aa714610105575b5f80fd5b6001546002546100a2919082565b604080519283526020830191909152015b60405180910390f35b6100c46101ab565b005b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100b3565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100c46103d6565b6100c4610169366004610adc565b6105ca565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b61019d5f5481565b6040519081526020016100b3565b6002545f036102165760405162461bcd60e51b815260206004820152602c60248201527f4e6f2070656e64696e672073657175656e636572206c696d697420646563726560448201526b30b9b2903932b8bab2b9ba1760a11b60648201526084015b60405180910390fd5b5f546002546102259190610b22565b421161028e5760405162461bcd60e51b815260206004820152603260248201527f53657175656e636572206c696d697420646563726561736520726571756573746044820152711034b99039ba34b636103832b73234b7339760711b606482015260840161020d565b600180545f9182905560028290556040805163ee35f32760e01b815290519192916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163ee35f3279160048083019260209291908290030181865afa158015610302573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103269190610b5b565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa158015610361573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103859190610b7d565b50925050508181036103d2575f82905561039d610958565b6040518281527f611c2e4a78552f908fb0eb2cc503efc1f947cde8574277ab3b0f10fdd510258b906020015b60405180910390a15b5050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ee35f3276040518163ffffffff1660e01b8152600401602060405180830381865afa158015610433573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104579190610b5b565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa158015610492573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104b69190610b7d565b50925050505f54811115610506575f8190556104d0610958565b6040518181527f611c2e4a78552f908fb0eb2cc503efc1f947cde8574277ab3b0f10fdd510258b9060200160405180910390a150565b5f548110156105c757600254156105795760405162461bcd60e51b815260206004820152603160248201527f53657175656e636572206c696d697420646563726561736520726571756573746044820152701030b63932b0b23c903832b73234b7339760791b606482015260840161020d565b604080518082018252828152426020918201819052600184905560025590518281527fa552b382e128c9d0732f01f09502c18999aec5dce0ed78c5af0ea2274ce9bd7d910160405180910390a15b50565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106355760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b690313934b233b29760811b604482015260640161020d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ab5d89436040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106df9190610b5b565b6001600160a01b03166380648b026040518163ffffffff1660e01b8152600401602060405180830381865afa15801561071a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073e9190610b5b565b6001600160a01b0316146107855760405162461bcd60e51b815260206004820152600e60248201526d3b32b0a4b73137bc1037b7363c9760911b604482015260640161020d565b5f84848360405160240161079b93929190610c01565b60408051601f19818403018152918152602080830180516001600160e01b0316630f0adca560e01b179052815163e5789d0360e01b815291519293505f926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263e5789d039260048083019391928290030181865afa158015610829573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084d9190610cb3565b90505f81851161085d578461085f565b815b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dc8601b37f000000000000000000000000000000000000000000000000000000000000000086856040518463ffffffff1660e01b81526004016108d293929190610cca565b6020604051808303815f875af11580156108ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109129190610cb3565b9050877f888a9bef5168f83425ebe9503cb6d29081cf58d52c60126f8a85a22c9d9935548260405161094691815260200190565b60405180910390a25050505050505050565b5f8054604051602481019190915242604482015260640160408051601f19818403018152918152602080830180516001600160e01b0316632c19251960e01b179052815163e5789d0360e01b815291519293505f926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263dc8601b3927f0000000000000000000000000000000000000000000000000000000000000000928792869263e5789d03926004808401938290030181865afa158015610a27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4b9190610cb3565b6040518463ffffffff1660e01b8152600401610a6993929190610cca565b6020604051808303815f875af1158015610a85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa99190610cb3565b90507fb38aa59aca3a7ad85f6c314d96b54cae25fc75a92e95994a90c63ae93c63d687816040516103c991815260200190565b5f805f80848603610140811215610af1575f80fd5b85359450602086013593506040860135925060e0605f1982011215610b14575f80fd5b509295919450926060019150565b80820180821115610b4157634e487b7160e01b5f52601160045260245ffd5b92915050565b6001600160a01b03811681146105c7575f80fd5b5f60208284031215610b6b575f80fd5b8151610b7681610b47565b9392505050565b5f805f8060808587031215610b90575f80fd5b505082516020840151604085015160609095015191969095509092509050565b8035610bbb81610b47565b919050565b803563ffffffff81168114610bbb575f80fd5b803560038110610bbb575f80fd5b60038110610bfd57634e487b7160e01b5f52602160045260245ffd5b9052565b838152602080820184905282356040830152610120820190830135610c2581610b47565b6001600160a01b03166060830152610c3f60408401610bc0565b63ffffffff808216608085015280610c5960608701610bc0565b1660a085015280610c6c60808701610bc0565b1660c08501525050610c8060a08401610bd3565b610c8d60e0840182610be1565b50610c9a60c08401610bb0565b6001600160a01b03811661010084015250949350505050565b5f60208284031215610cc3575f80fd5b5051919050565b60018060a01b03841681525f60206060602084015284518060608501525f5b81811015610d0557868101830151858201608001528201610ce9565b505f608082860101526080601f19601f8301168501019250505082604083015294935050505056fea2646970667358221220dca82595a68b87899c3f877b03eb1d1b4281744168df20f3df3de470ffead3f164736f6c63430008180033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610090575f3560e01c80638c5f173f116100635780638c5f173f1461012c57806390784ae814610153578063b1126dad1461015b578063e78cea921461016e578063e813a75514610195575f80fd5b8063051d1970146100945780630c63fa84146100bc5780631062b39a146100c65780632fa70aa714610105575b5f80fd5b6001546002546100a2919082565b604080519283526020830191909152015b60405180910390f35b6100c46101ab565b005b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100b3565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100c46103d6565b6100c4610169366004610adc565b6105ca565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b61019d5f5481565b6040519081526020016100b3565b6002545f036102165760405162461bcd60e51b815260206004820152602c60248201527f4e6f2070656e64696e672073657175656e636572206c696d697420646563726560448201526b30b9b2903932b8bab2b9ba1760a11b60648201526084015b60405180910390fd5b5f546002546102259190610b22565b421161028e5760405162461bcd60e51b815260206004820152603260248201527f53657175656e636572206c696d697420646563726561736520726571756573746044820152711034b99039ba34b636103832b73234b7339760711b606482015260840161020d565b600180545f9182905560028290556040805163ee35f32760e01b815290519192916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163ee35f3279160048083019260209291908290030181865afa158015610302573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103269190610b5b565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa158015610361573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103859190610b7d565b50925050508181036103d2575f82905561039d610958565b6040518281527f611c2e4a78552f908fb0eb2cc503efc1f947cde8574277ab3b0f10fdd510258b906020015b60405180910390a15b5050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ee35f3276040518163ffffffff1660e01b8152600401602060405180830381865afa158015610433573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104579190610b5b565b6001600160a01b031663ebea461d6040518163ffffffff1660e01b8152600401608060405180830381865afa158015610492573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104b69190610b7d565b50925050505f54811115610506575f8190556104d0610958565b6040518181527f611c2e4a78552f908fb0eb2cc503efc1f947cde8574277ab3b0f10fdd510258b9060200160405180910390a150565b5f548110156105c757600254156105795760405162461bcd60e51b815260206004820152603160248201527f53657175656e636572206c696d697420646563726561736520726571756573746044820152701030b63932b0b23c903832b73234b7339760791b606482015260840161020d565b604080518082018252828152426020918201819052600184905560025590518281527fa552b382e128c9d0732f01f09502c18999aec5dce0ed78c5af0ea2274ce9bd7d910160405180910390a15b50565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106355760405162461bcd60e51b815260206004820152601060248201526f2737ba10333937b690313934b233b29760811b604482015260640161020d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ab5d89436040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106df9190610b5b565b6001600160a01b03166380648b026040518163ffffffff1660e01b8152600401602060405180830381865afa15801561071a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073e9190610b5b565b6001600160a01b0316146107855760405162461bcd60e51b815260206004820152600e60248201526d3b32b0a4b73137bc1037b7363c9760911b604482015260640161020d565b5f84848360405160240161079b93929190610c01565b60408051601f19818403018152918152602080830180516001600160e01b0316630f0adca560e01b179052815163e5789d0360e01b815291519293505f926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263e5789d039260048083019391928290030181865afa158015610829573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084d9190610cb3565b90505f81851161085d578461085f565b815b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dc8601b37f000000000000000000000000000000000000000000000000000000000000000086856040518463ffffffff1660e01b81526004016108d293929190610cca565b6020604051808303815f875af11580156108ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109129190610cb3565b9050877f888a9bef5168f83425ebe9503cb6d29081cf58d52c60126f8a85a22c9d9935548260405161094691815260200190565b60405180910390a25050505050505050565b5f8054604051602481019190915242604482015260640160408051601f19818403018152918152602080830180516001600160e01b0316632c19251960e01b179052815163e5789d0360e01b815291519293505f926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263dc8601b3927f0000000000000000000000000000000000000000000000000000000000000000928792869263e5789d03926004808401938290030181865afa158015610a27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4b9190610cb3565b6040518463ffffffff1660e01b8152600401610a6993929190610cca565b6020604051808303815f875af1158015610a85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa99190610cb3565b90507fb38aa59aca3a7ad85f6c314d96b54cae25fc75a92e95994a90c63ae93c63d687816040516103c991815260200190565b5f805f80848603610140811215610af1575f80fd5b85359450602086013593506040860135925060e0605f1982011215610b14575f80fd5b509295919450926060019150565b80820180821115610b4157634e487b7160e01b5f52601160045260245ffd5b92915050565b6001600160a01b03811681146105c7575f80fd5b5f60208284031215610b6b575f80fd5b8151610b7681610b47565b9392505050565b5f805f8060808587031215610b90575f80fd5b505082516020840151604085015160609095015191969095509092509050565b8035610bbb81610b47565b919050565b803563ffffffff81168114610bbb575f80fd5b803560038110610bbb575f80fd5b60038110610bfd57634e487b7160e01b5f52602160045260245ffd5b9052565b838152602080820184905282356040830152610120820190830135610c2581610b47565b6001600160a01b03166060830152610c3f60408401610bc0565b63ffffffff808216608085015280610c5960608701610bc0565b1660a085015280610c6c60808701610bc0565b1660c08501525050610c8060a08401610bd3565b610c8d60e0840182610be1565b50610c9a60c08401610bb0565b6001600160a01b03811661010084015250949350505050565b5f60208284031215610cc3575f80fd5b5051919050565b60018060a01b03841681525f60206060602084015284518060608501525f5b81811015610d0557868101830151858201608001528201610ce9565b505f608082860101526080601f19601f8301168501019250505082604083015294935050505056fea2646970667358221220dca82595a68b87899c3f877b03eb1d1b4281744168df20f3df3de470ffead3f164736f6c63430008180033", + "devdoc": { + "details": "Router from Arbitrum to Gnosis Chain. Note: This contract is deployed on Ethereum.", + "events": { + "Routed(uint256,bytes32)": { + "details": "Event emitted when a message is relayed to another Safe Bridge.", + "params": { + "_epoch": "The epoch of the batch requested to send.", + "_ticketID": "The unique identifier provided by the underlying canonical bridge." + } + }, + "sequencerDelayLimitDecreaseRequested(uint256)": { + "details": "This event indicates that a request to decrease the sequencer limit has been made.", + "params": { + "_requestedSequencerDelayLimit": "The new sequencer limit requested." + } + }, + "sequencerDelayLimitSent(bytes32)": { + "details": "This event indicates a cross-chain message was sent to inform the veaOutbox of the sequencer limit value", + "params": { + "_ticketID": "The ticketID from the AMB of the cross-chain message." + } + }, + "sequencerDelayLimitUpdated(uint256)": { + "details": "This event indicates the sequencer limit updated.", + "params": { + "_newSequencerDelayLimit": "The new sequencer delay limit." + } + } + }, + "kind": "dev", + "methods": { + "constructor": { + "details": "Constructor.", + "params": { + "_amb": "The address of the AMB contract on Ethereum.", + "_bridge": "The address of the arbitrum bridge contract on Ethereum.", + "_veaInboxArbToGnosis": "The vea inbox on Arbitrum.", + "_veaOutboxArbToGnosis": "The vea outbox on Gnosis Chain." + } + }, + "executeSequencerDelayLimitDecreaseRequest()": { + "details": "execute sequencerDelayLimitDecreaseRequest" + }, + "route(uint256,bytes32,uint256,(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.", + "_gasLimit": "The true batch gas limit for the epoch.", + "_stateroot": "The true batch merkle root for the epoch." + } + }, + "updatesequencerDelayLimit()": { + "details": "Update the sequencerDelayLimit. If decreasing, a delayed request is created for later execution." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "route(uint256,bytes32,uint256,(bytes32,address,uint32,uint32,uint32,uint8,address))": { + "notice": "Note: Access restricted to arbitrum canonical bridge." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 1922, + "contract": "src/arbitrumToGnosis/RouterArbToGnosis.sol:RouterArbToGnosis", + "label": "sequencerDelayLimit", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 1925, + "contract": "src/arbitrumToGnosis/RouterArbToGnosis.sol:RouterArbToGnosis", + "label": "sequencerDelayLimitDecreaseRequest", + "offset": 0, + "slot": "1", + "type": "t_struct(SequencerLimitDecreaseRequest)1930_storage" + } + ], + "types": { + "t_struct(SequencerLimitDecreaseRequest)1930_storage": { + "encoding": "inplace", + "label": "struct RouterArbToGnosis.SequencerLimitDecreaseRequest", + "members": [ + { + "astId": 1927, + "contract": "src/arbitrumToGnosis/RouterArbToGnosis.sol:RouterArbToGnosis", + "label": "requestedSequencerLimit", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 1929, + "contract": "src/arbitrumToGnosis/RouterArbToGnosis.sol:RouterArbToGnosis", + "label": "timestamp", + "offset": 0, + "slot": "1", + "type": "t_uint256" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} diff --git a/veascan-web/src/consts/bridges.ts b/veascan-web/src/consts/bridges.ts index 23ad267a..ef3c2e85 100644 --- a/veascan-web/src/consts/bridges.ts +++ b/veascan-web/src/consts/bridges.ts @@ -1,7 +1,8 @@ import VeaInboxArbitrumSepolia from "@kleros/vea-contracts/deployments/arbitrumSepolia/VeaInboxArbToEthDevnet.json"; import VeaOutboxSepolia from "@kleros/vea-contracts/deployments/sepolia/VeaOutboxArbToEthDevnet.json"; -// import VeaInboxArbitrumSepoliaChiado from "@kleros/vea-contracts/deployments/arbitrumSepolia/VeaInboxArbToGnosisDevnet.json"; -// import VeaOutboxArbitrumSepoliaChiado from "@kleros/vea-contracts/deployments/chiado/VeaOutboxArbToGnosisDevnet.json"; +import VeaInboxArbitrumSepoliaChiado from "@kleros/vea-contracts/deployments/arbitrumSepolia/VeaInboxArbToGnosisDevnet.json"; +import VeaOutboxArbitrumSepoliaChiado from "@kleros/vea-contracts/deployments/chiado/VeaOutboxArbToGnosisDevnet.json"; + import { Chain, arbitrumSepolia, @@ -45,17 +46,15 @@ export const bridges: IBridge[] = [ outboxAddress: VeaOutboxSepolia.address as `0x${string}`, outboxEndpoint: `https://api.studio.thegraph.com/query/${process.env.VEASCAN_OUTBOX_ARBSEPOLIA_TO_SEPOLIA_SUBGRAPH}`, }, - // { - // id: 1, - // from: arbitrumSepolia.id, - // to: gnosisChiado.id, - // inboxAddress: VeaInboxArbitrumSepoliaChiado.address as `0x${string}`, - // inboxEndpoint: - // "https://api.studio.thegraph.com/query/67213/veascan-inbox-arb-sep-chiado-devnet/version/latest", - // outboxAddress: VeaOutboxArbitrumSepoliaChiado.address as `0x${string}`, - // outboxEndpoint: - // "https://api.studio.thegraph.com/query/67213/veascan-outbox-arb-chiado-devnet/version/latest", - // }, + { + id: 1, + from: arbitrumSepolia.id, + to: gnosisChiado.id, + inboxAddress: VeaInboxArbitrumSepoliaChiado.address as `0x${string}`, + inboxEndpoint: `https://api.studio.thegraph.com/query/${process.env.VEASCAN_INBOX_ARBSEPOLIA_TO_CHIADO_SUBGRAPH}`, + outboxAddress: VeaOutboxArbitrumSepoliaChiado.address as `0x${string}`, + outboxEndpoint: `https://api.studio.thegraph.com/query/${process.env.VEASCAN_OUTBOX_ARBSEPOLIA_TO_CHIADO_SUBGRAPH}`, + }, ]; export const getBridge = (id: number): IBridge =>