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