Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 8 from a total of 8 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Receive Message | 14885102 | 769 days ago | IN | 0 ETH | 0.02645062 | ||||
Receive Message | 14457768 | 837 days ago | IN | 0 ETH | 0.02879993 | ||||
Receive Message | 14443215 | 839 days ago | IN | 0 ETH | 0.00760284 | ||||
Set Authorized U... | 14443205 | 839 days ago | IN | 0 ETH | 0.00115547 | ||||
Set Fx Child Tun... | 14443204 | 839 days ago | IN | 0 ETH | 0.00132213 | ||||
Set Authorized U... | 14405167 | 845 days ago | IN | 0 ETH | 0.00503809 | ||||
Set Fx Child Tun... | 14405167 | 845 days ago | IN | 0 ETH | 0.00499951 | ||||
0x60806040 | 14340452 | 855 days ago | IN | Create: GHGRootTunnel | 0 ETH | 0.09415943 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
GHGRootTunnel
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {FxBaseRootTunnel} from "./lib/FxBaseRootTunnel.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; contract GHGRootTunnel is FxBaseRootTunnel, Ownable { mapping(address => bool) public authorizedUsers; event CallMade(address target, bool success, bytes data); constructor(address _checkpointManager, address _fxRoot) FxBaseRootTunnel(_checkpointManager, _fxRoot) {} ////////////// ADMIN FUNCTIONS ////////////// function setFxChildTunnel(address _fxChildTunnel) external onlyOwner { _setFxChildTunnel(_fxChildTunnel); } function setAuthorizedUser(address _addr, bool _status) external onlyOwner { authorizedUsers[_addr] = _status; } function replayCall(address _target, bytes memory _data, bool _reqSuccess) external onlyOwner { (bool succ, ) = _target.call(_data); if (_reqSuccess) require(succ, "Call Failed"); } ////////////// PORTAL FUNCTIONS ////////////// function sendMessage(bytes calldata _message) external { require(authorizedUsers[msg.sender], "Message Sender is not Authorized to Use Tunnel"); _sendMessageToChild(_message); } function _processMessageFromChild(bytes memory _message) internal override { (address target, bytes[] memory calls ) = abi.decode(_message, (address, bytes[])); for (uint i = 0; i < calls.length; i++) { (bool succ, ) = target.call(calls[i]); emit CallMade(target, succ, calls[i]); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {RLPReader} from "./RLPReader.sol"; import {MerklePatriciaProof} from "./MerklePatriciaProof.sol"; import {Merkle} from "./Merkle.sol"; import "./ExitPayloadReader.sol"; interface IFxStateSender { function sendMessageToChild(address _receiver, bytes calldata _data) external; } contract ICheckpointManager { struct HeaderBlock { bytes32 root; uint256 start; uint256 end; uint256 createdAt; address proposer; } /** * @notice mapping of checkpoint header numbers to block details * @dev These checkpoints are submited by plasma contracts */ mapping(uint256 => HeaderBlock) public headerBlocks; } abstract contract FxBaseRootTunnel { using RLPReader for RLPReader.RLPItem; using Merkle for bytes32; using ExitPayloadReader for bytes; using ExitPayloadReader for ExitPayloadReader.ExitPayload; using ExitPayloadReader for ExitPayloadReader.Log; using ExitPayloadReader for ExitPayloadReader.LogTopics; using ExitPayloadReader for ExitPayloadReader.Receipt; // keccak256(MessageSent(bytes)) bytes32 public constant SEND_MESSAGE_EVENT_SIG = 0x8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b036; // state sender contract IFxStateSender public fxRoot; // root chain manager ICheckpointManager public checkpointManager; // child tunnel contract which receives and sends messages address public fxChildTunnel; // storage to avoid duplicate exits mapping(bytes32 => bool) public processedExits; constructor(address _checkpointManager, address _fxRoot) { checkpointManager = ICheckpointManager(_checkpointManager); fxRoot = IFxStateSender(_fxRoot); } function _setFxChildTunnel(address _fxChildTunnel) internal { fxChildTunnel = _fxChildTunnel; } /** * @notice Send bytes message to Child Tunnel * @param message bytes message that will be sent to Child Tunnel * some message examples - * abi.encode(tokenId); * abi.encode(tokenId, tokenMetadata); * abi.encode(messageType, messageData); */ function _sendMessageToChild(bytes memory message) internal { fxRoot.sendMessageToChild(fxChildTunnel, message); } function _validateAndExtractMessage(bytes memory inputData) internal returns (bytes memory) { ExitPayloadReader.ExitPayload memory payload = inputData.toExitPayload(); bytes memory branchMaskBytes = payload.getBranchMaskAsBytes(); uint256 blockNumber = payload.getBlockNumber(); // checking if exit has already been processed // unique exit is identified using hash of (blockNumber, branchMask, receiptLogIndex) bytes32 exitHash = keccak256( abi.encodePacked( blockNumber, // first 2 nibbles are dropped while generating nibble array // this allows branch masks that are valid but bypass exitHash check (changing first 2 nibbles only) // so converting to nibble array and then hashing it MerklePatriciaProof._getNibbleArray(branchMaskBytes), payload.getReceiptLogIndex() ) ); require(processedExits[exitHash] == false, "FxRootTunnel: EXIT_ALREADY_PROCESSED"); processedExits[exitHash] = true; ExitPayloadReader.Receipt memory receipt = payload.getReceipt(); ExitPayloadReader.Log memory log = receipt.getLog(); // check child tunnel require(fxChildTunnel == log.getEmitter(), "FxRootTunnel: INVALID_FX_CHILD_TUNNEL"); bytes32 receiptRoot = payload.getReceiptRoot(); // verify receipt inclusion require( MerklePatriciaProof.verify(receipt.toBytes(), branchMaskBytes, payload.getReceiptProof(), receiptRoot), "FxRootTunnel: INVALID_RECEIPT_PROOF" ); // verify checkpoint inclusion _checkBlockMembershipInCheckpoint( blockNumber, payload.getBlockTime(), payload.getTxRoot(), receiptRoot, payload.getHeaderNumber(), payload.getBlockProof() ); ExitPayloadReader.LogTopics memory topics = log.getTopics(); require( bytes32(topics.getField(0).toUint()) == SEND_MESSAGE_EVENT_SIG, // topic0 is event sig "FxRootTunnel: INVALID_SIGNATURE" ); // received message data (bytes memory message) = abi.decode(log.getData(), (bytes)); // event decodes params again, so decoding bytes to get message return message; } function _checkBlockMembershipInCheckpoint( uint256 blockNumber, uint256 blockTime, bytes32 txRoot, bytes32 receiptRoot, uint256 headerNumber, bytes memory blockProof ) private view returns (uint256) { (bytes32 headerRoot, uint256 startBlock, , uint256 createdAt, ) = checkpointManager.headerBlocks(headerNumber); require( keccak256(abi.encodePacked(blockNumber, blockTime, txRoot, receiptRoot)).checkMembership( blockNumber - startBlock, headerRoot, blockProof ), "FxRootTunnel: INVALID_HEADER" ); return createdAt; } /** * @notice receive message from L2 to L1, validated by proof * @dev This function verifies if the transaction actually happened on child chain * * @param inputData RLP encoded data of the reference tx containing following list of fields * 0 - headerNumber - Checkpoint header block number containing the reference tx * 1 - blockProof - Proof that the block header (in the child chain) is a leaf in the submitted merkle root * 2 - blockNumber - Block number containing the reference tx on child chain * 3 - blockTime - Reference tx block time * 4 - txRoot - Transactions root of block * 5 - receiptRoot - Receipts root of block * 6 - receipt - Receipt of the reference transaction * 7 - receiptProof - Merkle proof of the reference receipt * 8 - branchMask - 32 bits denoting the path of receipt in merkle tree * 9 - receiptLogIndex - Log Index to read from the receipt */ function receiveMessage(bytes calldata inputData) public virtual { bytes memory message = _validateAndExtractMessage(inputData); _processMessageFromChild(message); } /** * @notice Process message received from Child Tunnel * @dev function needs to be implemented to handle message as per requirement * This is called by onStateReceive function. * Since it is called via a system call, any event will not be emitted during its execution. * @param message bytes message that was sent from Child Tunnel */ function _processMessageFromChild(bytes memory message) internal virtual; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
/* * @author Hamdi Allam [email protected] * Please reach out with any questions or concerns */ pragma solidity ^0.8.0; library RLPReader { uint8 constant STRING_SHORT_START = 0x80; uint8 constant STRING_LONG_START = 0xb8; uint8 constant LIST_SHORT_START = 0xc0; uint8 constant LIST_LONG_START = 0xf8; uint8 constant WORD_SIZE = 32; struct RLPItem { uint256 len; uint256 memPtr; } struct Iterator { RLPItem item; // Item that's being iterated over. uint256 nextPtr; // Position of the next item in the list. } /* * @dev Returns the next element in the iteration. Reverts if it has not next element. * @param self The iterator. * @return The next element in the iteration. */ function next(Iterator memory self) internal pure returns (RLPItem memory) { require(hasNext(self)); uint256 ptr = self.nextPtr; uint256 itemLength = _itemLength(ptr); self.nextPtr = ptr + itemLength; return RLPItem(itemLength, ptr); } /* * @dev Returns true if the iteration has more elements. * @param self The iterator. * @return true if the iteration has more elements. */ function hasNext(Iterator memory self) internal pure returns (bool) { RLPItem memory item = self.item; return self.nextPtr < item.memPtr + item.len; } /* * @param item RLP encoded bytes */ function toRlpItem(bytes memory item) internal pure returns (RLPItem memory) { uint256 memPtr; assembly { memPtr := add(item, 0x20) } return RLPItem(item.length, memPtr); } /* * @dev Create an iterator. Reverts if item is not a list. * @param self The RLP item. * @return An 'Iterator' over the item. */ function iterator(RLPItem memory self) internal pure returns (Iterator memory) { require(isList(self)); uint256 ptr = self.memPtr + _payloadOffset(self.memPtr); return Iterator(self, ptr); } /* * @param item RLP encoded bytes */ function rlpLen(RLPItem memory item) internal pure returns (uint256) { return item.len; } /* * @param item RLP encoded bytes */ function payloadLen(RLPItem memory item) internal pure returns (uint256) { return item.len - _payloadOffset(item.memPtr); } /* * @param item RLP encoded list in bytes */ function toList(RLPItem memory item) internal pure returns (RLPItem[] memory) { require(isList(item)); uint256 items = numItems(item); RLPItem[] memory result = new RLPItem[](items); uint256 memPtr = item.memPtr + _payloadOffset(item.memPtr); uint256 dataLen; for (uint256 i = 0; i < items; i++) { dataLen = _itemLength(memPtr); result[i] = RLPItem(dataLen, memPtr); memPtr = memPtr + dataLen; } return result; } // @return indicator whether encoded payload is a list. negate this function call for isData. function isList(RLPItem memory item) internal pure returns (bool) { if (item.len == 0) return false; uint8 byte0; uint256 memPtr = item.memPtr; assembly { byte0 := byte(0, mload(memPtr)) } if (byte0 < LIST_SHORT_START) return false; return true; } /* * @dev A cheaper version of keccak256(toRlpBytes(item)) that avoids copying memory. * @return keccak256 hash of RLP encoded bytes. */ function rlpBytesKeccak256(RLPItem memory item) internal pure returns (bytes32) { uint256 ptr = item.memPtr; uint256 len = item.len; bytes32 result; assembly { result := keccak256(ptr, len) } return result; } function payloadLocation(RLPItem memory item) internal pure returns (uint256, uint256) { uint256 offset = _payloadOffset(item.memPtr); uint256 memPtr = item.memPtr + offset; uint256 len = item.len - offset; // data length return (memPtr, len); } /* * @dev A cheaper version of keccak256(toBytes(item)) that avoids copying memory. * @return keccak256 hash of the item payload. */ function payloadKeccak256(RLPItem memory item) internal pure returns (bytes32) { (uint256 memPtr, uint256 len) = payloadLocation(item); bytes32 result; assembly { result := keccak256(memPtr, len) } return result; } /** RLPItem conversions into data types **/ // @returns raw rlp encoding in bytes function toRlpBytes(RLPItem memory item) internal pure returns (bytes memory) { bytes memory result = new bytes(item.len); if (result.length == 0) return result; uint256 ptr; assembly { ptr := add(0x20, result) } copy(item.memPtr, ptr, item.len); return result; } // any non-zero byte is considered true function toBoolean(RLPItem memory item) internal pure returns (bool) { require(item.len == 1); uint256 result; uint256 memPtr = item.memPtr; assembly { result := byte(0, mload(memPtr)) } return result == 0 ? false : true; } function toAddress(RLPItem memory item) internal pure returns (address) { // 1 byte for the length prefix require(item.len == 21); return address(uint160(toUint(item))); } function toUint(RLPItem memory item) internal pure returns (uint256) { require(item.len > 0 && item.len <= 33); uint256 offset = _payloadOffset(item.memPtr); uint256 len = item.len - offset; uint256 result; uint256 memPtr = item.memPtr + offset; assembly { result := mload(memPtr) // shfit to the correct location if neccesary if lt(len, 32) { result := div(result, exp(256, sub(32, len))) } } return result; } // enforces 32 byte length function toUintStrict(RLPItem memory item) internal pure returns (uint256) { // one byte prefix require(item.len == 33); uint256 result; uint256 memPtr = item.memPtr + 1; assembly { result := mload(memPtr) } return result; } function toBytes(RLPItem memory item) internal pure returns (bytes memory) { require(item.len > 0); uint256 offset = _payloadOffset(item.memPtr); uint256 len = item.len - offset; // data length bytes memory result = new bytes(len); uint256 destPtr; assembly { destPtr := add(0x20, result) } copy(item.memPtr + offset, destPtr, len); return result; } /* * Private Helpers */ // @return number of payload items inside an encoded list. function numItems(RLPItem memory item) private pure returns (uint256) { if (item.len == 0) return 0; uint256 count = 0; uint256 currPtr = item.memPtr + _payloadOffset(item.memPtr); uint256 endPtr = item.memPtr + item.len; while (currPtr < endPtr) { currPtr = currPtr + _itemLength(currPtr); // skip over an item count++; } return count; } // @return entire rlp item byte length function _itemLength(uint256 memPtr) private pure returns (uint256) { uint256 itemLen; uint256 byte0; assembly { byte0 := byte(0, mload(memPtr)) } if (byte0 < STRING_SHORT_START) itemLen = 1; else if (byte0 < STRING_LONG_START) itemLen = byte0 - STRING_SHORT_START + 1; else if (byte0 < LIST_SHORT_START) { assembly { let byteLen := sub(byte0, 0xb7) // # of bytes the actual length is memPtr := add(memPtr, 1) // skip over the first byte /* 32 byte word size */ let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to get the len itemLen := add(dataLen, add(byteLen, 1)) } } else if (byte0 < LIST_LONG_START) { itemLen = byte0 - LIST_SHORT_START + 1; } else { assembly { let byteLen := sub(byte0, 0xf7) memPtr := add(memPtr, 1) let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to the correct length itemLen := add(dataLen, add(byteLen, 1)) } } return itemLen; } // @return number of bytes until the data function _payloadOffset(uint256 memPtr) private pure returns (uint256) { uint256 byte0; assembly { byte0 := byte(0, mload(memPtr)) } if (byte0 < STRING_SHORT_START) return 0; else if (byte0 < STRING_LONG_START || (byte0 >= LIST_SHORT_START && byte0 < LIST_LONG_START)) return 1; else if (byte0 < LIST_SHORT_START) // being explicit return byte0 - (STRING_LONG_START - 1) + 1; else return byte0 - (LIST_LONG_START - 1) + 1; } /* * @param src Pointer to source * @param dest Pointer to destination * @param len Amount of memory to copy from the source */ function copy( uint256 src, uint256 dest, uint256 len ) private pure { if (len == 0) return; // copy as many word sizes as possible for (; len >= WORD_SIZE; len -= WORD_SIZE) { assembly { mstore(dest, mload(src)) } src += WORD_SIZE; dest += WORD_SIZE; } if (len == 0) return; // left over bytes. Mask is used to remove unwanted bytes from the word uint256 mask = 256**(WORD_SIZE - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) // zero out src let destpart := and(mload(dest), mask) // retrieve the bytes mstore(dest, or(destpart, srcpart)) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {RLPReader} from "./RLPReader.sol"; library MerklePatriciaProof { /* * @dev Verifies a merkle patricia proof. * @param value The terminating value in the trie. * @param encodedPath The path in the trie leading to value. * @param rlpParentNodes The rlp encoded stack of nodes. * @param root The root hash of the trie. * @return The boolean validity of the proof. */ function verify( bytes memory value, bytes memory encodedPath, bytes memory rlpParentNodes, bytes32 root ) internal pure returns (bool) { RLPReader.RLPItem memory item = RLPReader.toRlpItem(rlpParentNodes); RLPReader.RLPItem[] memory parentNodes = RLPReader.toList(item); bytes memory currentNode; RLPReader.RLPItem[] memory currentNodeList; bytes32 nodeKey = root; uint256 pathPtr = 0; bytes memory path = _getNibbleArray(encodedPath); if (path.length == 0) { return false; } for (uint256 i = 0; i < parentNodes.length; i++) { if (pathPtr > path.length) { return false; } currentNode = RLPReader.toRlpBytes(parentNodes[i]); if (nodeKey != keccak256(currentNode)) { return false; } currentNodeList = RLPReader.toList(parentNodes[i]); if (currentNodeList.length == 17) { if (pathPtr == path.length) { if (keccak256(RLPReader.toBytes(currentNodeList[16])) == keccak256(value)) { return true; } else { return false; } } uint8 nextPathNibble = uint8(path[pathPtr]); if (nextPathNibble > 16) { return false; } nodeKey = bytes32(RLPReader.toUintStrict(currentNodeList[nextPathNibble])); pathPtr += 1; } else if (currentNodeList.length == 2) { uint256 traversed = _nibblesToTraverse(RLPReader.toBytes(currentNodeList[0]), path, pathPtr); if (pathPtr + traversed == path.length) { //leaf node if (keccak256(RLPReader.toBytes(currentNodeList[1])) == keccak256(value)) { return true; } else { return false; } } //extension node if (traversed == 0) { return false; } pathPtr += traversed; nodeKey = bytes32(RLPReader.toUintStrict(currentNodeList[1])); } else { return false; } } } function _nibblesToTraverse( bytes memory encodedPartialPath, bytes memory path, uint256 pathPtr ) private pure returns (uint256) { uint256 len = 0; // encodedPartialPath has elements that are each two hex characters (1 byte), but partialPath // and slicedPath have elements that are each one hex character (1 nibble) bytes memory partialPath = _getNibbleArray(encodedPartialPath); bytes memory slicedPath = new bytes(partialPath.length); // pathPtr counts nibbles in path // partialPath.length is a number of nibbles for (uint256 i = pathPtr; i < pathPtr + partialPath.length; i++) { bytes1 pathNibble = path[i]; slicedPath[i - pathPtr] = pathNibble; } if (keccak256(partialPath) == keccak256(slicedPath)) { len = partialPath.length; } else { len = 0; } return len; } // bytes b must be hp encoded function _getNibbleArray(bytes memory b) internal pure returns (bytes memory) { bytes memory nibbles = ""; if (b.length > 0) { uint8 offset; uint8 hpNibble = uint8(_getNthNibbleOfBytes(0, b)); if (hpNibble == 1 || hpNibble == 3) { nibbles = new bytes(b.length * 2 - 1); bytes1 oddNibble = _getNthNibbleOfBytes(1, b); nibbles[0] = oddNibble; offset = 1; } else { nibbles = new bytes(b.length * 2 - 2); offset = 0; } for (uint256 i = offset; i < nibbles.length; i++) { nibbles[i] = _getNthNibbleOfBytes(i - offset + 2, b); } } return nibbles; } function _getNthNibbleOfBytes(uint256 n, bytes memory str) private pure returns (bytes1) { return bytes1(n % 2 == 0 ? uint8(str[n / 2]) / 0x10 : uint8(str[n / 2]) % 0x10); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library Merkle { function checkMembership( bytes32 leaf, uint256 index, bytes32 rootHash, bytes memory proof ) internal pure returns (bool) { require(proof.length % 32 == 0, "Invalid proof length"); uint256 proofHeight = proof.length / 32; // Proof of size n means, height of the tree is n+1. // In a tree of height n+1, max #leafs possible is 2 ^ n require(index < 2**proofHeight, "Leaf index is too big"); bytes32 proofElement; bytes32 computedHash = leaf; for (uint256 i = 32; i <= proof.length; i += 32) { assembly { proofElement := mload(add(proof, i)) } if (index % 2 == 0) { computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } index = index / 2; } return computedHash == rootHash; } }
pragma solidity ^0.8.0; import {RLPReader} from "./RLPReader.sol"; library ExitPayloadReader { using RLPReader for bytes; using RLPReader for RLPReader.RLPItem; uint8 constant WORD_SIZE = 32; struct ExitPayload { RLPReader.RLPItem[] data; } struct Receipt { RLPReader.RLPItem[] data; bytes raw; uint256 logIndex; } struct Log { RLPReader.RLPItem data; RLPReader.RLPItem[] list; } struct LogTopics { RLPReader.RLPItem[] data; } // copy paste of private copy() from RLPReader to avoid changing of existing contracts function copy( uint256 src, uint256 dest, uint256 len ) private pure { if (len == 0) return; // copy as many word sizes as possible for (; len >= WORD_SIZE; len -= WORD_SIZE) { assembly { mstore(dest, mload(src)) } src += WORD_SIZE; dest += WORD_SIZE; } // left over bytes. Mask is used to remove unwanted bytes from the word uint256 mask = 256**(WORD_SIZE - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) // zero out src let destpart := and(mload(dest), mask) // retrieve the bytes mstore(dest, or(destpart, srcpart)) } } function toExitPayload(bytes memory data) internal pure returns (ExitPayload memory) { RLPReader.RLPItem[] memory payloadData = data.toRlpItem().toList(); return ExitPayload(payloadData); } function getHeaderNumber(ExitPayload memory payload) internal pure returns (uint256) { return payload.data[0].toUint(); } function getBlockProof(ExitPayload memory payload) internal pure returns (bytes memory) { return payload.data[1].toBytes(); } function getBlockNumber(ExitPayload memory payload) internal pure returns (uint256) { return payload.data[2].toUint(); } function getBlockTime(ExitPayload memory payload) internal pure returns (uint256) { return payload.data[3].toUint(); } function getTxRoot(ExitPayload memory payload) internal pure returns (bytes32) { return bytes32(payload.data[4].toUint()); } function getReceiptRoot(ExitPayload memory payload) internal pure returns (bytes32) { return bytes32(payload.data[5].toUint()); } function getReceipt(ExitPayload memory payload) internal pure returns (Receipt memory receipt) { receipt.raw = payload.data[6].toBytes(); RLPReader.RLPItem memory receiptItem = receipt.raw.toRlpItem(); if (receiptItem.isList()) { // legacy tx receipt.data = receiptItem.toList(); } else { // pop first byte before parsting receipt bytes memory typedBytes = receipt.raw; bytes memory result = new bytes(typedBytes.length - 1); uint256 srcPtr; uint256 destPtr; assembly { srcPtr := add(33, typedBytes) destPtr := add(0x20, result) } copy(srcPtr, destPtr, result.length); receipt.data = result.toRlpItem().toList(); } receipt.logIndex = getReceiptLogIndex(payload); return receipt; } function getReceiptProof(ExitPayload memory payload) internal pure returns (bytes memory) { return payload.data[7].toBytes(); } function getBranchMaskAsBytes(ExitPayload memory payload) internal pure returns (bytes memory) { return payload.data[8].toBytes(); } function getBranchMaskAsUint(ExitPayload memory payload) internal pure returns (uint256) { return payload.data[8].toUint(); } function getReceiptLogIndex(ExitPayload memory payload) internal pure returns (uint256) { return payload.data[9].toUint(); } // Receipt methods function toBytes(Receipt memory receipt) internal pure returns (bytes memory) { return receipt.raw; } function getLog(Receipt memory receipt) internal pure returns (Log memory) { RLPReader.RLPItem memory logData = receipt.data[3].toList()[receipt.logIndex]; return Log(logData, logData.toList()); } // Log methods function getEmitter(Log memory log) internal pure returns (address) { return RLPReader.toAddress(log.list[0]); } function getTopics(Log memory log) internal pure returns (LogTopics memory) { return LogTopics(log.list[1].toList()); } function getData(Log memory log) internal pure returns (bytes memory) { return log.list[2].toBytes(); } function toRlpBytes(Log memory log) internal pure returns (bytes memory) { return log.data.toRlpBytes(); } // LogTopics methods function getField(LogTopics memory topics, uint256 index) internal pure returns (RLPReader.RLPItem memory) { return topics.data[index]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_checkpointManager","type":"address"},{"internalType":"address","name":"_fxRoot","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"CallMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"SEND_MESSAGE_EVENT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedUsers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkpointManager","outputs":[{"internalType":"contract ICheckpointManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fxChildTunnel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fxRoot","outputs":[{"internalType":"contract IFxStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedExits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"inputData","type":"bytes"}],"name":"receiveMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bool","name":"_reqSuccess","type":"bool"}],"name":"replayCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"sendMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAuthorizedUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fxChildTunnel","type":"address"}],"name":"setFxChildTunnel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003b7a38038062003b7a83398181016040528101906200003791906200021c565b818181600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050620000dc620000d0620000e460201b60201c565b620000ec60201b60201c565b505062000263565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001e482620001b7565b9050919050565b620001f681620001d7565b81146200020257600080fd5b50565b6000815190506200021681620001eb565b92915050565b60008060408385031215620002365762000235620001b2565b5b6000620002468582860162000205565b9250506020620002598582860162000205565b9150509250929050565b61390780620002736000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063972c49281161008c578063c0857ba011610066578063c0857ba014610223578063de9b771f14610241578063f2fde38b1461025f578063f953cec71461027b576100ea565b8063972c4928146101cd578063a249225e146101eb578063aea4e49e14610207576100ea565b8063628f7420116100c8578063628f74201461016d578063715018a61461018957806382646a58146101935780638da5cb5b146101af576100ea565b80630e387de6146100ef5780631828983a1461010d578063607f2d421461013d575b600080fd5b6100f7610297565b60405161010491906124b3565b60405180910390f35b61012760048036038101906101229190612540565b6102be565b6040516101349190612588565b60405180910390f35b610157600480360381019061015291906125cf565b6102de565b6040516101649190612588565b60405180910390f35b6101876004803603810190610182919061276e565b6102fe565b005b610191610434565b005b6101ad60048036038101906101a8919061283d565b6104bc565b005b6101b7610599565b6040516101c49190612899565b60405180910390f35b6101d56105c3565b6040516101e29190612899565b60405180910390f35b610205600480360381019061020091906128b4565b6105e9565b005b610221600480360381019061021c9190612540565b6106c0565b005b61022b610748565b6040516102389190612953565b60405180910390f35b61024961076e565b604051610256919061298f565b60405180910390f35b61027960048036038101906102749190612540565b610792565b005b6102956004803603810190610290919061283d565b61088a565b005b7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03660001b81565b60056020528060005260406000206000915054906101000a900460ff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b6103066108e9565b73ffffffffffffffffffffffffffffffffffffffff16610324610599565b73ffffffffffffffffffffffffffffffffffffffff161461037a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161037190612a07565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff16836040516103a19190612aa1565b6000604051808303816000865af19150503d80600081146103de576040519150601f19603f3d011682016040523d82523d6000602084013e6103e3565b606091505b50509050811561042e578061042d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042490612b04565b60405180910390fd5b5b50505050565b61043c6108e9565b73ffffffffffffffffffffffffffffffffffffffff1661045a610599565b73ffffffffffffffffffffffffffffffffffffffff16146104b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a790612a07565b60405180910390fd5b6104ba60006108f1565b565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053f90612b96565b60405180910390fd5b61059582828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506109b7565b5050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6105f16108e9565b73ffffffffffffffffffffffffffffffffffffffff1661060f610599565b73ffffffffffffffffffffffffffffffffffffffff1614610665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065c90612a07565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6106c86108e9565b73ffffffffffffffffffffffffffffffffffffffff166106e6610599565b73ffffffffffffffffffffffffffffffffffffffff161461073c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073390612a07565b60405180910390fd5b61074581610a69565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61079a6108e9565b73ffffffffffffffffffffffffffffffffffffffff166107b8610599565b73ffffffffffffffffffffffffffffffffffffffff161461080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080590612a07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561087e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087590612c28565b60405180910390fd5b610887816108f1565b50565b60006108d983838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610aad565b90506108e481610db2565b505050565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b4720477600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401610a34929190612c92565b600060405180830381600087803b158015610a4e57600080fd5b505af1158015610a62573d6000803e3d6000fd5b5050505050565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606000610aba83610ecf565b90506000610ac782610f03565b90506000610ad483610f34565b9050600081610ae284610f65565b610aeb8661117b565b604051602001610afd93929190612ced565b604051602081830303815290604052805190602001209050600015156003600083815260200190815260200160002060009054906101000a900460ff16151514610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7390612d98565b60405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000610bb3856111ac565b90506000610bc0826112d1565b9050610bcb81611348565b73ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5190612e2a565b60405180910390fd5b6000610c6587611379565b9050610c83610c73846113ad565b87610c7d8a6113bb565b846113ec565b610cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb990612ebc565b60405180910390fd5b610cf085610ccf896116f2565b610cd88a611723565b84610ce28c611757565b610ceb8d611788565b6117b9565b506000610cfc8361190f565b90507f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03660001b610d3e610d3960008461195490919063ffffffff16565b611983565b60001b14610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7890612f28565b60405180910390fd5b6000610d8c84611a06565b806020019051810190610d9f9190612fb8565b9050809950505050505050505050919050565b60008082806020019051810190610dc99190613120565b9150915060005b8151811015610ec95760008373ffffffffffffffffffffffffffffffffffffffff16838381518110610e0557610e0461317c565b5b6020026020010151604051610e1a9190612aa1565b6000604051808303816000865af19150503d8060008114610e57576040519150601f19603f3d011682016040523d82523d6000602084013e610e5c565b606091505b505090507fe0480edcd77b6514c6cfa5151626ab4f7f770f9436781efe161c18c1f69cec918482858581518110610e9657610e9561317c565b5b6020026020010151604051610ead939291906131ab565b60405180910390a1508080610ec190613218565b915050610dd0565b50505050565b610ed7612419565b6000610eea610ee584611a37565b611a65565b9050604051806020016040528082815250915050919050565b6060610f2d8260000151600881518110610f2057610f1f61317c565b5b6020026020010151611b7a565b9050919050565b6000610f5e8260000151600281518110610f5157610f5061317c565b5b6020026020010151611983565b9050919050565b6060600060405180602001604052806000815250905060008351111561117257600080610f93600086611c31565b60f81c905060018160ff161480610fad575060038160ff16145b1561107757600160028651610fc29190613261565b610fcc91906132bb565b67ffffffffffffffff811115610fe557610fe4612617565b5b6040519080825280601f01601f1916602001820160405280156110175781602001600182028036833780820191505090505b5092506000611027600187611c31565b9050808460008151811061103e5761103d61317c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019250506110e3565b60028086516110869190613261565b61109091906132bb565b67ffffffffffffffff8111156110a9576110a8612617565b5b6040519080825280601f01601f1916602001820160405280156110db5781602001600182028036833780820191505090505b509250600091505b60008260ff1690505b835181101561116e5761111960028460ff168361110991906132bb565b61111391906132ef565b87611c31565b84828151811061112c5761112b61317c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061116690613218565b9150506110ec565b5050505b80915050919050565b60006111a582600001516009815181106111985761119761317c565b5b6020026020010151611983565b9050919050565b6111b461242c565b6111dc82600001516006815181106111cf576111ce61317c565b5b6020026020010151611b7a565b816020018190525060006111f38260200151611a37565b90506111fe81611cc9565b156112195761120c81611a65565b82600001819052506112b9565b60008260200151905060006001825161123291906132bb565b67ffffffffffffffff81111561124b5761124a612617565b5b6040519080825280601f01601f19166020018201604052801561127d5781602001600182028036833780820191505090505b50905060008083602101915082602001905061129b82828551611d17565b6112ac6112a784611a37565b611a65565b8660000181905250505050505b6112c28361117b565b82604001818152505050919050565b6112d961244d565b600061130383600001516003815181106112f6576112f561317c565b5b6020026020010151611a65565b8360400151815181106113195761131861317c565b5b60200260200101519050604051806040016040528082815260200161133d83611a65565b815250915050919050565b600061137282602001516000815181106113655761136461317c565b5b6020026020010151611db4565b9050919050565b60006113a382600001516005815181106113965761139561317c565b5b6020026020010151611983565b60001b9050919050565b606081602001519050919050565b60606113e582600001516007815181106113d8576113d761317c565b5b6020026020010151611b7a565b9050919050565b6000806113f884611a37565b9050600061140582611a65565b9050606080600086905060008061141b8b610f65565b90506000815114156114375760009750505050505050506116ea565b60005b86518110156116e157815183111561145d576000985050505050505050506116ea565b6114808782815181106114735761147261317c565b5b6020026020010151611dd7565b9550858051906020012084146114a1576000985050505050505050506116ea565b6114c48782815181106114b7576114b661317c565b5b6020026020010151611a65565b94506011855114156115b7578151831415611534578c80519060200120611505866010815181106114f8576114f761317c565b5b6020026020010151611b7a565b805190602001201415611523576001985050505050505050506116ea565b6000985050505050505050506116ea565b60008284815181106115495761154861317c565b5b602001015160f81c60f81b60f81c905060108160ff16111561157757600099505050505050505050506116ea565b61159d868260ff16815181106115905761158f61317c565b5b6020026020010151611e67565b60001b94506001846115af91906132ef565b9350506116ce565b6002855114156116bc5760006115f16115ea876000815181106115dd576115dc61317c565b5b6020026020010151611b7a565b8486611e9e565b90508251818561160191906132ef565b1415611664578d80519060200120611633876001815181106116265761162561317c565b5b6020026020010151611b7a565b80519060200120141561165257600199505050505050505050506116ea565b600099505050505050505050506116ea565b600081141561167f57600099505050505050505050506116ea565b808461168b91906132ef565b93506116b1866001815181106116a4576116a361317c565b5b6020026020010151611e67565b60001b9450506116cd565b6000985050505050505050506116ea565b5b80806116d990613218565b91505061143a565b50505050505050505b949350505050565b600061171c826000015160038151811061170f5761170e61317c565b5b6020026020010151611983565b9050919050565b600061174d82600001516004815181106117405761173f61317c565b5b6020026020010151611983565b60001b9050919050565b600061178182600001516000815181106117745761177361317c565b5b6020026020010151611983565b9050919050565b60606117b282600001516001815181106117a5576117a461317c565b5b6020026020010151611b7a565b9050919050565b600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166341539d4a876040518263ffffffff1660e01b815260040161181a9190613354565b60a06040518083038186803b15801561183257600080fd5b505afa158015611846573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186a91906133c5565b50935050925092506118c0828b61188191906132bb565b84878d8d8d8d60405160200161189a9493929190613461565b60405160208183030381529060405280519060200120611fd4909392919063ffffffff16565b6118ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f6906134fb565b60405180910390fd5b8093505050509695505050505050565b61191761246d565b604051806020016040528061194a846020015160018151811061193d5761193c61317c565b5b6020026020010151611a65565b8152509050919050565b61195c612480565b826000015182815181106119735761197261317c565b5b6020026020010151905092915050565b600080826000015111801561199d57506021826000015111155b6119a657600080fd5b60006119b58360200151612145565b905060008184600001516119c991906132bb565b90506000808386602001516119de91906132ef565b90508051915060208310156119fa57826020036101000a820491505b81945050505050919050565b6060611a308260200151600281518110611a2357611a2261317c565b5b6020026020010151611b7a565b9050919050565b611a3f612480565b600060208301905060405180604001604052808451815260200182815250915050919050565b6060611a7082611cc9565b611a7957600080fd5b6000611a8483612204565b905060008167ffffffffffffffff811115611aa257611aa1612617565b5b604051908082528060200260200182016040528015611adb57816020015b611ac8612480565b815260200190600190039081611ac05790505b5090506000611aed8560200151612145565b8560200151611afc91906132ef565b9050600080600090505b84811015611b6d57611b1783612292565b9150604051806040016040528083815260200184815250848281518110611b4157611b4061317c565b5b60200260200101819052508183611b5891906132ef565b92508080611b6590613218565b915050611b06565b5082945050505050919050565b60606000826000015111611b8d57600080fd5b6000611b9c8360200151612145565b90506000818460000151611bb091906132bb565b905060008167ffffffffffffffff811115611bce57611bcd612617565b5b6040519080825280601f01601f191660200182016040528015611c005781602001600182028036833780820191505090505b5090506000816020019050611c25848760200151611c1e91906132ef565b828561236e565b81945050505050919050565b600080600284611c41919061354a565b14611c8457601082600285611c56919061357b565b81518110611c6757611c6661317c565b5b602001015160f81c60f81b60f81c611c7f91906135b9565b611cbe565b601082600285611c94919061357b565b81518110611ca557611ca461317c565b5b602001015160f81c60f81b60f81c611cbd91906135ea565b5b60f81b905092915050565b60008082600001511415611ce05760009050611d12565b60008083602001519050805160001a915060c060ff168260ff161015611d0b57600092505050611d12565b6001925050505b919050565b6000811415611d2557611daf565b5b602060ff168110611d705782518252602060ff1683611d4591906132ef565b9250602060ff1682611d5791906132ef565b9150602060ff1681611d6991906132bb565b9050611d26565b6000600182602060ff16611d8491906132bb565b610100611d91919061374e565b611d9b91906132bb565b905080198451168184511681811785525050505b505050565b60006015826000015114611dc757600080fd5b611dd082611983565b9050919050565b60606000826000015167ffffffffffffffff811115611df957611df8612617565b5b6040519080825280601f01601f191660200182016040528015611e2b5781602001600182028036833780820191505090505b509050600081511415611e415780915050611e62565b6000816020019050611e5c846020015182866000015161236e565b81925050505b919050565b60006021826000015114611e7a57600080fd5b60008060018460200151611e8e91906132ef565b9050805191508192505050919050565b600080600090506000611eb086610f65565b90506000815167ffffffffffffffff811115611ecf57611ece612617565b5b6040519080825280601f01601f191660200182016040528015611f015781602001600182028036833780820191505090505b50905060008590505b825186611f1791906132ef565b811015611fa2576000878281518110611f3357611f3261317c565b5b602001015160f81c60f81b905080838884611f4e91906132bb565b81518110611f5f57611f5e61317c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080611f9a90613218565b915050611f0a565b50808051906020012082805190602001201415611fc25781519250611fc7565b600092505b8293505050509392505050565b60008060208351611fe5919061354a565b14612025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201c906137e5565b60405180910390fd5b600060208351612035919061357b565b9050806002612044919061374e565b8510612085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207c90613851565b60405180910390fd5b6000808790506000602090505b855181116121345780860151925060006002896120af919061354a565b14156120e55781836040516020016120c8929190613871565b604051602081830303815290604052805190602001209150612111565b82826040516020016120f8929190613871565b6040516020818303038152906040528051906020012091505b60028861211e919061357b565b975060208161212d91906132ef565b9050612092565b508581149350505050949350505050565b600080825160001a9050608060ff168110156121655760009150506121ff565b60b860ff1681108061218a575060c060ff168110158015612189575060f860ff1681105b5b156121995760019150506121ff565b60c060ff168110156121d45760018060b86121b4919061389d565b60ff16826121c291906132bb565b6121cc91906132ef565b9150506121ff565b60018060f86121e3919061389d565b60ff16826121f191906132bb565b6121fb91906132ef565b9150505b919050565b6000808260000151141561221b576000905061228d565b60008061222b8460200151612145565b846020015161223a91906132ef565b905060008460000151856020015161225291906132ef565b90505b808210156122865761226682612292565b8261227191906132ef565b9150828061227e90613218565b935050612255565b8293505050505b919050565b6000806000835160001a9050608060ff168110156122b35760019150612364565b60b860ff168110156122e2576001608060ff16826122d191906132bb565b6122db91906132ef565b9150612363565b60c060ff168110156123125760b78103600185019450806020036101000a85510460018201810193505050612362565b60f860ff1681101561234157600160c060ff168261233091906132bb565b61233a91906132ef565b9150612361565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b600081141561237c57612414565b5b602060ff1681106123c75782518252602060ff168361239c91906132ef565b9250602060ff16826123ae91906132ef565b9150602060ff16816123c091906132bb565b905061237d565b60008114156123d557612414565b6000600182602060ff166123e991906132bb565b6101006123f6919061374e565b61240091906132bb565b905080198451168184511681811785525050505b505050565b6040518060200160405280606081525090565b60405180606001604052806060815260200160608152602001600081525090565b6040518060400160405280612460612480565b8152602001606081525090565b6040518060200160405280606081525090565b604051806040016040528060008152602001600081525090565b6000819050919050565b6124ad8161249a565b82525050565b60006020820190506124c860008301846124a4565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061250d826124e2565b9050919050565b61251d81612502565b811461252857600080fd5b50565b60008135905061253a81612514565b92915050565b600060208284031215612556576125556124d8565b5b60006125648482850161252b565b91505092915050565b60008115159050919050565b6125828161256d565b82525050565b600060208201905061259d6000830184612579565b92915050565b6125ac8161249a565b81146125b757600080fd5b50565b6000813590506125c9816125a3565b92915050565b6000602082840312156125e5576125e46124d8565b5b60006125f3848285016125ba565b91505092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61264f82612606565b810181811067ffffffffffffffff8211171561266e5761266d612617565b5b80604052505050565b60006126816124ce565b905061268d8282612646565b919050565b600067ffffffffffffffff8211156126ad576126ac612617565b5b6126b682612606565b9050602081019050919050565b82818337600083830152505050565b60006126e56126e084612692565b612677565b90508281526020810184848401111561270157612700612601565b5b61270c8482856126c3565b509392505050565b600082601f830112612729576127286125fc565b5b81356127398482602086016126d2565b91505092915050565b61274b8161256d565b811461275657600080fd5b50565b60008135905061276881612742565b92915050565b600080600060608486031215612787576127866124d8565b5b60006127958682870161252b565b935050602084013567ffffffffffffffff8111156127b6576127b56124dd565b5b6127c286828701612714565b92505060406127d386828701612759565b9150509250925092565b600080fd5b600080fd5b60008083601f8401126127fd576127fc6125fc565b5b8235905067ffffffffffffffff81111561281a576128196127dd565b5b602083019150836001820283011115612836576128356127e2565b5b9250929050565b60008060208385031215612854576128536124d8565b5b600083013567ffffffffffffffff811115612872576128716124dd565b5b61287e858286016127e7565b92509250509250929050565b61289381612502565b82525050565b60006020820190506128ae600083018461288a565b92915050565b600080604083850312156128cb576128ca6124d8565b5b60006128d98582860161252b565b92505060206128ea85828601612759565b9150509250929050565b6000819050919050565b600061291961291461290f846124e2565b6128f4565b6124e2565b9050919050565b600061292b826128fe565b9050919050565b600061293d82612920565b9050919050565b61294d81612932565b82525050565b60006020820190506129686000830184612944565b92915050565b600061297982612920565b9050919050565b6129898161296e565b82525050565b60006020820190506129a46000830184612980565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006129f16020836129aa565b91506129fc826129bb565b602082019050919050565b60006020820190508181036000830152612a20816129e4565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015612a5b578082015181840152602081019050612a40565b83811115612a6a576000848401525b50505050565b6000612a7b82612a27565b612a858185612a32565b9350612a95818560208601612a3d565b80840191505092915050565b6000612aad8284612a70565b915081905092915050565b7f43616c6c204661696c6564000000000000000000000000000000000000000000600082015250565b6000612aee600b836129aa565b9150612af982612ab8565b602082019050919050565b60006020820190508181036000830152612b1d81612ae1565b9050919050565b7f4d6573736167652053656e646572206973206e6f7420417574686f72697a656460008201527f20746f205573652054756e6e656c000000000000000000000000000000000000602082015250565b6000612b80602e836129aa565b9150612b8b82612b24565b604082019050919050565b60006020820190508181036000830152612baf81612b73565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c126026836129aa565b9150612c1d82612bb6565b604082019050919050565b60006020820190508181036000830152612c4181612c05565b9050919050565b600082825260208201905092915050565b6000612c6482612a27565b612c6e8185612c48565b9350612c7e818560208601612a3d565b612c8781612606565b840191505092915050565b6000604082019050612ca7600083018561288a565b8181036020830152612cb98184612c59565b90509392505050565b6000819050919050565b6000819050919050565b612ce7612ce282612cc2565b612ccc565b82525050565b6000612cf98286612cd6565b602082019150612d098285612a70565b9150612d158284612cd6565b602082019150819050949350505050565b7f4678526f6f7454756e6e656c3a20455849545f414c52454144595f50524f434560008201527f5353454400000000000000000000000000000000000000000000000000000000602082015250565b6000612d826024836129aa565b9150612d8d82612d26565b604082019050919050565b60006020820190508181036000830152612db181612d75565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f46585f4348494c445f5460008201527f554e4e454c000000000000000000000000000000000000000000000000000000602082015250565b6000612e146025836129aa565b9150612e1f82612db8565b604082019050919050565b60006020820190508181036000830152612e4381612e07565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f524543454950545f505260008201527f4f4f460000000000000000000000000000000000000000000000000000000000602082015250565b6000612ea66023836129aa565b9150612eb182612e4a565b604082019050919050565b60006020820190508181036000830152612ed581612e99565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f5349474e415455524500600082015250565b6000612f12601f836129aa565b9150612f1d82612edc565b602082019050919050565b60006020820190508181036000830152612f4181612f05565b9050919050565b6000612f5b612f5684612692565b612677565b905082815260208101848484011115612f7757612f76612601565b5b612f82848285612a3d565b509392505050565b600082601f830112612f9f57612f9e6125fc565b5b8151612faf848260208601612f48565b91505092915050565b600060208284031215612fce57612fcd6124d8565b5b600082015167ffffffffffffffff811115612fec57612feb6124dd565b5b612ff884828501612f8a565b91505092915050565b600061300c826124e2565b9050919050565b61301c81613001565b811461302757600080fd5b50565b60008151905061303981613013565b92915050565b600067ffffffffffffffff82111561305a57613059612617565b5b602082029050602081019050919050565b600061307e6130798461303f565b612677565b905080838252602082019050602084028301858111156130a1576130a06127e2565b5b835b818110156130e857805167ffffffffffffffff8111156130c6576130c56125fc565b5b8086016130d38982612f8a565b855260208501945050506020810190506130a3565b5050509392505050565b600082601f830112613107576131066125fc565b5b815161311784826020860161306b565b91505092915050565b60008060408385031215613137576131366124d8565b5b60006131458582860161302a565b925050602083015167ffffffffffffffff811115613166576131656124dd565b5b613172858286016130f2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006060820190506131c0600083018661288a565b6131cd6020830185612579565b81810360408301526131df8184612c59565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061322382612cc2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613256576132556131e9565b5b600182019050919050565b600061326c82612cc2565b915061327783612cc2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132b0576132af6131e9565b5b828202905092915050565b60006132c682612cc2565b91506132d183612cc2565b9250828210156132e4576132e36131e9565b5b828203905092915050565b60006132fa82612cc2565b915061330583612cc2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561333a576133396131e9565b5b828201905092915050565b61334e81612cc2565b82525050565b60006020820190506133696000830184613345565b92915050565b60008151905061337e816125a3565b92915050565b61338d81612cc2565b811461339857600080fd5b50565b6000815190506133aa81613384565b92915050565b6000815190506133bf81612514565b92915050565b600080600080600060a086880312156133e1576133e06124d8565b5b60006133ef8882890161336f565b95505060206134008882890161339b565b94505060406134118882890161339b565b93505060606134228882890161339b565b9250506080613433888289016133b0565b9150509295509295909350565b6000819050919050565b61345b6134568261249a565b613440565b82525050565b600061346d8287612cd6565b60208201915061347d8286612cd6565b60208201915061348d828561344a565b60208201915061349d828461344a565b60208201915081905095945050505050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f48454144455200000000600082015250565b60006134e5601c836129aa565b91506134f0826134af565b602082019050919050565b60006020820190508181036000830152613514816134d8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061355582612cc2565b915061356083612cc2565b9250826135705761356f61351b565b5b828206905092915050565b600061358682612cc2565b915061359183612cc2565b9250826135a1576135a061351b565b5b828204905092915050565b600060ff82169050919050565b60006135c4826135ac565b91506135cf836135ac565b9250826135df576135de61351b565b5b828206905092915050565b60006135f5826135ac565b9150613600836135ac565b9250826136105761360f61351b565b5b828204905092915050565b60008160011c9050919050565b6000808291508390505b60018511156136725780860481111561364e5761364d6131e9565b5b600185161561365d5780820291505b808102905061366b8561361b565b9450613632565b94509492505050565b60008261368b5760019050613747565b816136995760009050613747565b81600181146136af57600281146136b9576136e8565b6001915050613747565b60ff8411156136cb576136ca6131e9565b5b8360020a9150848211156136e2576136e16131e9565b5b50613747565b5060208310610133831016604e8410600b841016171561371d5782820a905083811115613718576137176131e9565b5b613747565b61372a8484846001613628565b92509050818404811115613741576137406131e9565b5b81810290505b9392505050565b600061375982612cc2565b915061376483612cc2565b92506137917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461367b565b905092915050565b7f496e76616c69642070726f6f66206c656e677468000000000000000000000000600082015250565b60006137cf6014836129aa565b91506137da82613799565b602082019050919050565b600060208201905081810360008301526137fe816137c2565b9050919050565b7f4c65616620696e64657820697320746f6f206269670000000000000000000000600082015250565b600061383b6015836129aa565b915061384682613805565b602082019050919050565b6000602082019050818103600083015261386a8161382e565b9050919050565b600061387d828561344a565b60208201915061388d828461344a565b6020820191508190509392505050565b60006138a8826135ac565b91506138b3836135ac565b9250828210156138c6576138c56131e9565b5b82820390509291505056fea2646970667358221220df8919751680feda2f45b548671c21a72ab6c64ad8ce136993ca59c9eabea3fb64736f6c6343000809003300000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a2
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063972c49281161008c578063c0857ba011610066578063c0857ba014610223578063de9b771f14610241578063f2fde38b1461025f578063f953cec71461027b576100ea565b8063972c4928146101cd578063a249225e146101eb578063aea4e49e14610207576100ea565b8063628f7420116100c8578063628f74201461016d578063715018a61461018957806382646a58146101935780638da5cb5b146101af576100ea565b80630e387de6146100ef5780631828983a1461010d578063607f2d421461013d575b600080fd5b6100f7610297565b60405161010491906124b3565b60405180910390f35b61012760048036038101906101229190612540565b6102be565b6040516101349190612588565b60405180910390f35b610157600480360381019061015291906125cf565b6102de565b6040516101649190612588565b60405180910390f35b6101876004803603810190610182919061276e565b6102fe565b005b610191610434565b005b6101ad60048036038101906101a8919061283d565b6104bc565b005b6101b7610599565b6040516101c49190612899565b60405180910390f35b6101d56105c3565b6040516101e29190612899565b60405180910390f35b610205600480360381019061020091906128b4565b6105e9565b005b610221600480360381019061021c9190612540565b6106c0565b005b61022b610748565b6040516102389190612953565b60405180910390f35b61024961076e565b604051610256919061298f565b60405180910390f35b61027960048036038101906102749190612540565b610792565b005b6102956004803603810190610290919061283d565b61088a565b005b7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03660001b81565b60056020528060005260406000206000915054906101000a900460ff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b6103066108e9565b73ffffffffffffffffffffffffffffffffffffffff16610324610599565b73ffffffffffffffffffffffffffffffffffffffff161461037a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161037190612a07565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff16836040516103a19190612aa1565b6000604051808303816000865af19150503d80600081146103de576040519150601f19603f3d011682016040523d82523d6000602084013e6103e3565b606091505b50509050811561042e578061042d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042490612b04565b60405180910390fd5b5b50505050565b61043c6108e9565b73ffffffffffffffffffffffffffffffffffffffff1661045a610599565b73ffffffffffffffffffffffffffffffffffffffff16146104b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a790612a07565b60405180910390fd5b6104ba60006108f1565b565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053f90612b96565b60405180910390fd5b61059582828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506109b7565b5050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6105f16108e9565b73ffffffffffffffffffffffffffffffffffffffff1661060f610599565b73ffffffffffffffffffffffffffffffffffffffff1614610665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065c90612a07565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6106c86108e9565b73ffffffffffffffffffffffffffffffffffffffff166106e6610599565b73ffffffffffffffffffffffffffffffffffffffff161461073c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073390612a07565b60405180910390fd5b61074581610a69565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61079a6108e9565b73ffffffffffffffffffffffffffffffffffffffff166107b8610599565b73ffffffffffffffffffffffffffffffffffffffff161461080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080590612a07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561087e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087590612c28565b60405180910390fd5b610887816108f1565b50565b60006108d983838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610aad565b90506108e481610db2565b505050565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b4720477600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401610a34929190612c92565b600060405180830381600087803b158015610a4e57600080fd5b505af1158015610a62573d6000803e3d6000fd5b5050505050565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606000610aba83610ecf565b90506000610ac782610f03565b90506000610ad483610f34565b9050600081610ae284610f65565b610aeb8661117b565b604051602001610afd93929190612ced565b604051602081830303815290604052805190602001209050600015156003600083815260200190815260200160002060009054906101000a900460ff16151514610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7390612d98565b60405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000610bb3856111ac565b90506000610bc0826112d1565b9050610bcb81611348565b73ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5190612e2a565b60405180910390fd5b6000610c6587611379565b9050610c83610c73846113ad565b87610c7d8a6113bb565b846113ec565b610cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb990612ebc565b60405180910390fd5b610cf085610ccf896116f2565b610cd88a611723565b84610ce28c611757565b610ceb8d611788565b6117b9565b506000610cfc8361190f565b90507f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03660001b610d3e610d3960008461195490919063ffffffff16565b611983565b60001b14610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7890612f28565b60405180910390fd5b6000610d8c84611a06565b806020019051810190610d9f9190612fb8565b9050809950505050505050505050919050565b60008082806020019051810190610dc99190613120565b9150915060005b8151811015610ec95760008373ffffffffffffffffffffffffffffffffffffffff16838381518110610e0557610e0461317c565b5b6020026020010151604051610e1a9190612aa1565b6000604051808303816000865af19150503d8060008114610e57576040519150601f19603f3d011682016040523d82523d6000602084013e610e5c565b606091505b505090507fe0480edcd77b6514c6cfa5151626ab4f7f770f9436781efe161c18c1f69cec918482858581518110610e9657610e9561317c565b5b6020026020010151604051610ead939291906131ab565b60405180910390a1508080610ec190613218565b915050610dd0565b50505050565b610ed7612419565b6000610eea610ee584611a37565b611a65565b9050604051806020016040528082815250915050919050565b6060610f2d8260000151600881518110610f2057610f1f61317c565b5b6020026020010151611b7a565b9050919050565b6000610f5e8260000151600281518110610f5157610f5061317c565b5b6020026020010151611983565b9050919050565b6060600060405180602001604052806000815250905060008351111561117257600080610f93600086611c31565b60f81c905060018160ff161480610fad575060038160ff16145b1561107757600160028651610fc29190613261565b610fcc91906132bb565b67ffffffffffffffff811115610fe557610fe4612617565b5b6040519080825280601f01601f1916602001820160405280156110175781602001600182028036833780820191505090505b5092506000611027600187611c31565b9050808460008151811061103e5761103d61317c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019250506110e3565b60028086516110869190613261565b61109091906132bb565b67ffffffffffffffff8111156110a9576110a8612617565b5b6040519080825280601f01601f1916602001820160405280156110db5781602001600182028036833780820191505090505b509250600091505b60008260ff1690505b835181101561116e5761111960028460ff168361110991906132bb565b61111391906132ef565b87611c31565b84828151811061112c5761112b61317c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061116690613218565b9150506110ec565b5050505b80915050919050565b60006111a582600001516009815181106111985761119761317c565b5b6020026020010151611983565b9050919050565b6111b461242c565b6111dc82600001516006815181106111cf576111ce61317c565b5b6020026020010151611b7a565b816020018190525060006111f38260200151611a37565b90506111fe81611cc9565b156112195761120c81611a65565b82600001819052506112b9565b60008260200151905060006001825161123291906132bb565b67ffffffffffffffff81111561124b5761124a612617565b5b6040519080825280601f01601f19166020018201604052801561127d5781602001600182028036833780820191505090505b50905060008083602101915082602001905061129b82828551611d17565b6112ac6112a784611a37565b611a65565b8660000181905250505050505b6112c28361117b565b82604001818152505050919050565b6112d961244d565b600061130383600001516003815181106112f6576112f561317c565b5b6020026020010151611a65565b8360400151815181106113195761131861317c565b5b60200260200101519050604051806040016040528082815260200161133d83611a65565b815250915050919050565b600061137282602001516000815181106113655761136461317c565b5b6020026020010151611db4565b9050919050565b60006113a382600001516005815181106113965761139561317c565b5b6020026020010151611983565b60001b9050919050565b606081602001519050919050565b60606113e582600001516007815181106113d8576113d761317c565b5b6020026020010151611b7a565b9050919050565b6000806113f884611a37565b9050600061140582611a65565b9050606080600086905060008061141b8b610f65565b90506000815114156114375760009750505050505050506116ea565b60005b86518110156116e157815183111561145d576000985050505050505050506116ea565b6114808782815181106114735761147261317c565b5b6020026020010151611dd7565b9550858051906020012084146114a1576000985050505050505050506116ea565b6114c48782815181106114b7576114b661317c565b5b6020026020010151611a65565b94506011855114156115b7578151831415611534578c80519060200120611505866010815181106114f8576114f761317c565b5b6020026020010151611b7a565b805190602001201415611523576001985050505050505050506116ea565b6000985050505050505050506116ea565b60008284815181106115495761154861317c565b5b602001015160f81c60f81b60f81c905060108160ff16111561157757600099505050505050505050506116ea565b61159d868260ff16815181106115905761158f61317c565b5b6020026020010151611e67565b60001b94506001846115af91906132ef565b9350506116ce565b6002855114156116bc5760006115f16115ea876000815181106115dd576115dc61317c565b5b6020026020010151611b7a565b8486611e9e565b90508251818561160191906132ef565b1415611664578d80519060200120611633876001815181106116265761162561317c565b5b6020026020010151611b7a565b80519060200120141561165257600199505050505050505050506116ea565b600099505050505050505050506116ea565b600081141561167f57600099505050505050505050506116ea565b808461168b91906132ef565b93506116b1866001815181106116a4576116a361317c565b5b6020026020010151611e67565b60001b9450506116cd565b6000985050505050505050506116ea565b5b80806116d990613218565b91505061143a565b50505050505050505b949350505050565b600061171c826000015160038151811061170f5761170e61317c565b5b6020026020010151611983565b9050919050565b600061174d82600001516004815181106117405761173f61317c565b5b6020026020010151611983565b60001b9050919050565b600061178182600001516000815181106117745761177361317c565b5b6020026020010151611983565b9050919050565b60606117b282600001516001815181106117a5576117a461317c565b5b6020026020010151611b7a565b9050919050565b600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166341539d4a876040518263ffffffff1660e01b815260040161181a9190613354565b60a06040518083038186803b15801561183257600080fd5b505afa158015611846573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186a91906133c5565b50935050925092506118c0828b61188191906132bb565b84878d8d8d8d60405160200161189a9493929190613461565b60405160208183030381529060405280519060200120611fd4909392919063ffffffff16565b6118ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f6906134fb565b60405180910390fd5b8093505050509695505050505050565b61191761246d565b604051806020016040528061194a846020015160018151811061193d5761193c61317c565b5b6020026020010151611a65565b8152509050919050565b61195c612480565b826000015182815181106119735761197261317c565b5b6020026020010151905092915050565b600080826000015111801561199d57506021826000015111155b6119a657600080fd5b60006119b58360200151612145565b905060008184600001516119c991906132bb565b90506000808386602001516119de91906132ef565b90508051915060208310156119fa57826020036101000a820491505b81945050505050919050565b6060611a308260200151600281518110611a2357611a2261317c565b5b6020026020010151611b7a565b9050919050565b611a3f612480565b600060208301905060405180604001604052808451815260200182815250915050919050565b6060611a7082611cc9565b611a7957600080fd5b6000611a8483612204565b905060008167ffffffffffffffff811115611aa257611aa1612617565b5b604051908082528060200260200182016040528015611adb57816020015b611ac8612480565b815260200190600190039081611ac05790505b5090506000611aed8560200151612145565b8560200151611afc91906132ef565b9050600080600090505b84811015611b6d57611b1783612292565b9150604051806040016040528083815260200184815250848281518110611b4157611b4061317c565b5b60200260200101819052508183611b5891906132ef565b92508080611b6590613218565b915050611b06565b5082945050505050919050565b60606000826000015111611b8d57600080fd5b6000611b9c8360200151612145565b90506000818460000151611bb091906132bb565b905060008167ffffffffffffffff811115611bce57611bcd612617565b5b6040519080825280601f01601f191660200182016040528015611c005781602001600182028036833780820191505090505b5090506000816020019050611c25848760200151611c1e91906132ef565b828561236e565b81945050505050919050565b600080600284611c41919061354a565b14611c8457601082600285611c56919061357b565b81518110611c6757611c6661317c565b5b602001015160f81c60f81b60f81c611c7f91906135b9565b611cbe565b601082600285611c94919061357b565b81518110611ca557611ca461317c565b5b602001015160f81c60f81b60f81c611cbd91906135ea565b5b60f81b905092915050565b60008082600001511415611ce05760009050611d12565b60008083602001519050805160001a915060c060ff168260ff161015611d0b57600092505050611d12565b6001925050505b919050565b6000811415611d2557611daf565b5b602060ff168110611d705782518252602060ff1683611d4591906132ef565b9250602060ff1682611d5791906132ef565b9150602060ff1681611d6991906132bb565b9050611d26565b6000600182602060ff16611d8491906132bb565b610100611d91919061374e565b611d9b91906132bb565b905080198451168184511681811785525050505b505050565b60006015826000015114611dc757600080fd5b611dd082611983565b9050919050565b60606000826000015167ffffffffffffffff811115611df957611df8612617565b5b6040519080825280601f01601f191660200182016040528015611e2b5781602001600182028036833780820191505090505b509050600081511415611e415780915050611e62565b6000816020019050611e5c846020015182866000015161236e565b81925050505b919050565b60006021826000015114611e7a57600080fd5b60008060018460200151611e8e91906132ef565b9050805191508192505050919050565b600080600090506000611eb086610f65565b90506000815167ffffffffffffffff811115611ecf57611ece612617565b5b6040519080825280601f01601f191660200182016040528015611f015781602001600182028036833780820191505090505b50905060008590505b825186611f1791906132ef565b811015611fa2576000878281518110611f3357611f3261317c565b5b602001015160f81c60f81b905080838884611f4e91906132bb565b81518110611f5f57611f5e61317c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080611f9a90613218565b915050611f0a565b50808051906020012082805190602001201415611fc25781519250611fc7565b600092505b8293505050509392505050565b60008060208351611fe5919061354a565b14612025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201c906137e5565b60405180910390fd5b600060208351612035919061357b565b9050806002612044919061374e565b8510612085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207c90613851565b60405180910390fd5b6000808790506000602090505b855181116121345780860151925060006002896120af919061354a565b14156120e55781836040516020016120c8929190613871565b604051602081830303815290604052805190602001209150612111565b82826040516020016120f8929190613871565b6040516020818303038152906040528051906020012091505b60028861211e919061357b565b975060208161212d91906132ef565b9050612092565b508581149350505050949350505050565b600080825160001a9050608060ff168110156121655760009150506121ff565b60b860ff1681108061218a575060c060ff168110158015612189575060f860ff1681105b5b156121995760019150506121ff565b60c060ff168110156121d45760018060b86121b4919061389d565b60ff16826121c291906132bb565b6121cc91906132ef565b9150506121ff565b60018060f86121e3919061389d565b60ff16826121f191906132bb565b6121fb91906132ef565b9150505b919050565b6000808260000151141561221b576000905061228d565b60008061222b8460200151612145565b846020015161223a91906132ef565b905060008460000151856020015161225291906132ef565b90505b808210156122865761226682612292565b8261227191906132ef565b9150828061227e90613218565b935050612255565b8293505050505b919050565b6000806000835160001a9050608060ff168110156122b35760019150612364565b60b860ff168110156122e2576001608060ff16826122d191906132bb565b6122db91906132ef565b9150612363565b60c060ff168110156123125760b78103600185019450806020036101000a85510460018201810193505050612362565b60f860ff1681101561234157600160c060ff168261233091906132bb565b61233a91906132ef565b9150612361565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b600081141561237c57612414565b5b602060ff1681106123c75782518252602060ff168361239c91906132ef565b9250602060ff16826123ae91906132ef565b9150602060ff16816123c091906132bb565b905061237d565b60008114156123d557612414565b6000600182602060ff166123e991906132bb565b6101006123f6919061374e565b61240091906132bb565b905080198451168184511681811785525050505b505050565b6040518060200160405280606081525090565b60405180606001604052806060815260200160608152602001600081525090565b6040518060400160405280612460612480565b8152602001606081525090565b6040518060200160405280606081525090565b604051806040016040528060008152602001600081525090565b6000819050919050565b6124ad8161249a565b82525050565b60006020820190506124c860008301846124a4565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061250d826124e2565b9050919050565b61251d81612502565b811461252857600080fd5b50565b60008135905061253a81612514565b92915050565b600060208284031215612556576125556124d8565b5b60006125648482850161252b565b91505092915050565b60008115159050919050565b6125828161256d565b82525050565b600060208201905061259d6000830184612579565b92915050565b6125ac8161249a565b81146125b757600080fd5b50565b6000813590506125c9816125a3565b92915050565b6000602082840312156125e5576125e46124d8565b5b60006125f3848285016125ba565b91505092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61264f82612606565b810181811067ffffffffffffffff8211171561266e5761266d612617565b5b80604052505050565b60006126816124ce565b905061268d8282612646565b919050565b600067ffffffffffffffff8211156126ad576126ac612617565b5b6126b682612606565b9050602081019050919050565b82818337600083830152505050565b60006126e56126e084612692565b612677565b90508281526020810184848401111561270157612700612601565b5b61270c8482856126c3565b509392505050565b600082601f830112612729576127286125fc565b5b81356127398482602086016126d2565b91505092915050565b61274b8161256d565b811461275657600080fd5b50565b60008135905061276881612742565b92915050565b600080600060608486031215612787576127866124d8565b5b60006127958682870161252b565b935050602084013567ffffffffffffffff8111156127b6576127b56124dd565b5b6127c286828701612714565b92505060406127d386828701612759565b9150509250925092565b600080fd5b600080fd5b60008083601f8401126127fd576127fc6125fc565b5b8235905067ffffffffffffffff81111561281a576128196127dd565b5b602083019150836001820283011115612836576128356127e2565b5b9250929050565b60008060208385031215612854576128536124d8565b5b600083013567ffffffffffffffff811115612872576128716124dd565b5b61287e858286016127e7565b92509250509250929050565b61289381612502565b82525050565b60006020820190506128ae600083018461288a565b92915050565b600080604083850312156128cb576128ca6124d8565b5b60006128d98582860161252b565b92505060206128ea85828601612759565b9150509250929050565b6000819050919050565b600061291961291461290f846124e2565b6128f4565b6124e2565b9050919050565b600061292b826128fe565b9050919050565b600061293d82612920565b9050919050565b61294d81612932565b82525050565b60006020820190506129686000830184612944565b92915050565b600061297982612920565b9050919050565b6129898161296e565b82525050565b60006020820190506129a46000830184612980565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006129f16020836129aa565b91506129fc826129bb565b602082019050919050565b60006020820190508181036000830152612a20816129e4565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015612a5b578082015181840152602081019050612a40565b83811115612a6a576000848401525b50505050565b6000612a7b82612a27565b612a858185612a32565b9350612a95818560208601612a3d565b80840191505092915050565b6000612aad8284612a70565b915081905092915050565b7f43616c6c204661696c6564000000000000000000000000000000000000000000600082015250565b6000612aee600b836129aa565b9150612af982612ab8565b602082019050919050565b60006020820190508181036000830152612b1d81612ae1565b9050919050565b7f4d6573736167652053656e646572206973206e6f7420417574686f72697a656460008201527f20746f205573652054756e6e656c000000000000000000000000000000000000602082015250565b6000612b80602e836129aa565b9150612b8b82612b24565b604082019050919050565b60006020820190508181036000830152612baf81612b73565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c126026836129aa565b9150612c1d82612bb6565b604082019050919050565b60006020820190508181036000830152612c4181612c05565b9050919050565b600082825260208201905092915050565b6000612c6482612a27565b612c6e8185612c48565b9350612c7e818560208601612a3d565b612c8781612606565b840191505092915050565b6000604082019050612ca7600083018561288a565b8181036020830152612cb98184612c59565b90509392505050565b6000819050919050565b6000819050919050565b612ce7612ce282612cc2565b612ccc565b82525050565b6000612cf98286612cd6565b602082019150612d098285612a70565b9150612d158284612cd6565b602082019150819050949350505050565b7f4678526f6f7454756e6e656c3a20455849545f414c52454144595f50524f434560008201527f5353454400000000000000000000000000000000000000000000000000000000602082015250565b6000612d826024836129aa565b9150612d8d82612d26565b604082019050919050565b60006020820190508181036000830152612db181612d75565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f46585f4348494c445f5460008201527f554e4e454c000000000000000000000000000000000000000000000000000000602082015250565b6000612e146025836129aa565b9150612e1f82612db8565b604082019050919050565b60006020820190508181036000830152612e4381612e07565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f524543454950545f505260008201527f4f4f460000000000000000000000000000000000000000000000000000000000602082015250565b6000612ea66023836129aa565b9150612eb182612e4a565b604082019050919050565b60006020820190508181036000830152612ed581612e99565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f5349474e415455524500600082015250565b6000612f12601f836129aa565b9150612f1d82612edc565b602082019050919050565b60006020820190508181036000830152612f4181612f05565b9050919050565b6000612f5b612f5684612692565b612677565b905082815260208101848484011115612f7757612f76612601565b5b612f82848285612a3d565b509392505050565b600082601f830112612f9f57612f9e6125fc565b5b8151612faf848260208601612f48565b91505092915050565b600060208284031215612fce57612fcd6124d8565b5b600082015167ffffffffffffffff811115612fec57612feb6124dd565b5b612ff884828501612f8a565b91505092915050565b600061300c826124e2565b9050919050565b61301c81613001565b811461302757600080fd5b50565b60008151905061303981613013565b92915050565b600067ffffffffffffffff82111561305a57613059612617565b5b602082029050602081019050919050565b600061307e6130798461303f565b612677565b905080838252602082019050602084028301858111156130a1576130a06127e2565b5b835b818110156130e857805167ffffffffffffffff8111156130c6576130c56125fc565b5b8086016130d38982612f8a565b855260208501945050506020810190506130a3565b5050509392505050565b600082601f830112613107576131066125fc565b5b815161311784826020860161306b565b91505092915050565b60008060408385031215613137576131366124d8565b5b60006131458582860161302a565b925050602083015167ffffffffffffffff811115613166576131656124dd565b5b613172858286016130f2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006060820190506131c0600083018661288a565b6131cd6020830185612579565b81810360408301526131df8184612c59565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061322382612cc2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613256576132556131e9565b5b600182019050919050565b600061326c82612cc2565b915061327783612cc2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132b0576132af6131e9565b5b828202905092915050565b60006132c682612cc2565b91506132d183612cc2565b9250828210156132e4576132e36131e9565b5b828203905092915050565b60006132fa82612cc2565b915061330583612cc2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561333a576133396131e9565b5b828201905092915050565b61334e81612cc2565b82525050565b60006020820190506133696000830184613345565b92915050565b60008151905061337e816125a3565b92915050565b61338d81612cc2565b811461339857600080fd5b50565b6000815190506133aa81613384565b92915050565b6000815190506133bf81612514565b92915050565b600080600080600060a086880312156133e1576133e06124d8565b5b60006133ef8882890161336f565b95505060206134008882890161339b565b94505060406134118882890161339b565b93505060606134228882890161339b565b9250506080613433888289016133b0565b9150509295509295909350565b6000819050919050565b61345b6134568261249a565b613440565b82525050565b600061346d8287612cd6565b60208201915061347d8286612cd6565b60208201915061348d828561344a565b60208201915061349d828461344a565b60208201915081905095945050505050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f48454144455200000000600082015250565b60006134e5601c836129aa565b91506134f0826134af565b602082019050919050565b60006020820190508181036000830152613514816134d8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061355582612cc2565b915061356083612cc2565b9250826135705761356f61351b565b5b828206905092915050565b600061358682612cc2565b915061359183612cc2565b9250826135a1576135a061351b565b5b828204905092915050565b600060ff82169050919050565b60006135c4826135ac565b91506135cf836135ac565b9250826135df576135de61351b565b5b828206905092915050565b60006135f5826135ac565b9150613600836135ac565b9250826136105761360f61351b565b5b828204905092915050565b60008160011c9050919050565b6000808291508390505b60018511156136725780860481111561364e5761364d6131e9565b5b600185161561365d5780820291505b808102905061366b8561361b565b9450613632565b94509492505050565b60008261368b5760019050613747565b816136995760009050613747565b81600181146136af57600281146136b9576136e8565b6001915050613747565b60ff8411156136cb576136ca6131e9565b5b8360020a9150848211156136e2576136e16131e9565b5b50613747565b5060208310610133831016604e8410600b841016171561371d5782820a905083811115613718576137176131e9565b5b613747565b61372a8484846001613628565b92509050818404811115613741576137406131e9565b5b81810290505b9392505050565b600061375982612cc2565b915061376483612cc2565b92506137917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461367b565b905092915050565b7f496e76616c69642070726f6f66206c656e677468000000000000000000000000600082015250565b60006137cf6014836129aa565b91506137da82613799565b602082019050919050565b600060208201905081810360008301526137fe816137c2565b9050919050565b7f4c65616620696e64657820697320746f6f206269670000000000000000000000600082015250565b600061383b6015836129aa565b915061384682613805565b602082019050919050565b6000602082019050818103600083015261386a8161382e565b9050919050565b600061387d828561344a565b60208201915061388d828461344a565b6020820191508190509392505050565b60006138a8826135ac565b91506138b3836135ac565b9250828210156138c6576138c56131e9565b5b82820390509291505056fea2646970667358221220df8919751680feda2f45b548671c21a72ab6c64ad8ce136993ca59c9eabea3fb64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a2
-----Decoded View---------------
Arg [0] : _checkpointManager (address): 0x86E4Dc95c7FBdBf52e33D563BbDB00823894C287
Arg [1] : _fxRoot (address): 0xfe5e5D361b2ad62c541bAb87C45a0B9B018389a2
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287
Arg [1] : 000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.