Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,966 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 20144175 | 18 days ago | IN | 0 ETH | 0.00027966 | ||||
Unstake | 20131394 | 20 days ago | IN | 0 ETH | 0.0009727 | ||||
Stake | 19907216 | 51 days ago | IN | 0 ETH | 0.00031864 | ||||
Unstake | 19854284 | 59 days ago | IN | 0 ETH | 0.00043407 | ||||
Unstake | 19843425 | 60 days ago | IN | 0 ETH | 0.00076308 | ||||
Unstake | 19839150 | 61 days ago | IN | 0 ETH | 0.00059405 | ||||
Unstake | 19838339 | 61 days ago | IN | 0 ETH | 0.00032471 | ||||
Unstake | 19820006 | 64 days ago | IN | 0 ETH | 0.00094951 | ||||
Unstake | 19801765 | 66 days ago | IN | 0 ETH | 0.00066665 | ||||
Unstake | 19679462 | 83 days ago | IN | 0 ETH | 0.00067033 | ||||
Unstake | 19615530 | 92 days ago | IN | 0 ETH | 0.00137783 | ||||
Unstake | 19587558 | 96 days ago | IN | 0 ETH | 0.00125977 | ||||
Unstake | 19584217 | 97 days ago | IN | 0 ETH | 0.0032374 | ||||
Unstake | 19571247 | 98 days ago | IN | 0 ETH | 0.00200933 | ||||
Unstake | 19564989 | 99 days ago | IN | 0 ETH | 0.00365992 | ||||
Unstake | 19560934 | 100 days ago | IN | 0 ETH | 0.00155918 | ||||
Stake | 19458194 | 114 days ago | IN | 0 ETH | 0.0041138 | ||||
Unstake | 19274863 | 140 days ago | IN | 0 ETH | 0.00366138 | ||||
Unstake | 19158013 | 156 days ago | IN | 0 ETH | 0.00211236 | ||||
Unstake | 19150625 | 157 days ago | IN | 0 ETH | 0.01347353 | ||||
Unstake | 19116451 | 162 days ago | IN | 0 ETH | 0.0011997 | ||||
Stake | 19099809 | 165 days ago | IN | 0 ETH | 0.00287753 | ||||
Stake | 19092852 | 165 days ago | IN | 0 ETH | 0.00682484 | ||||
Stake | 19020784 | 176 days ago | IN | 0 ETH | 0.00450507 | ||||
Unstake | 18942962 | 187 days ago | IN | 0 ETH | 0.00196206 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
GACStaking
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-01 */ // SPDX-License-Identifier: MIT // File: contracts/fx-portal/lib/Merkle.sol 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; } } // File: contracts/fx-portal/lib/RLPReader.sol /* * @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)) } } } // File: contracts/fx-portal/lib/ExitPayloadReader.sol pragma solidity ^0.8.0; 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]; } } // File: contracts/fx-portal/lib/MerklePatriciaProof.sol pragma solidity ^0.8.0; 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); } } // File: contracts/fx-portal/tunnel/FxBaseRootTunnel.sol pragma solidity ^0.8.0; 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); } // set fxChildTunnel if not set already function setFxChildTunnel(address _fxChildTunnel) public virtual { require(fxChildTunnel == address(0x0), "FxBaseRootTunnel: CHILD_TUNNEL_ALREADY_SET"); 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 memory 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; } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Context.sol // 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; } } // File: contracts/access/DeveloperAccess.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an developer) that can be granted exclusive access to * specific functions. * * By default, the developer account will be the one that deploys the contract. This * can later be changed with {transferDevelopership}. * * This module is used through inheritance. It will make available the modifier * `onlyDeveloper`, which can be applied to your functions to restrict their use to * the developer. */ abstract contract DeveloperAccess is Context { address private _developer; event DevelopershipTransferred(address indexed previousDeveloper, address indexed newDeveloper); /** * @dev Initializes the contract setting the deployer as the initial developer. */ constructor(address dev) { _setDeveloper(dev); } /** * @dev Returns the address of the current developer. */ function developer() public view virtual returns (address) { return _developer; } /** * @dev Throws if called by any account other than the developer. */ modifier onlyDeveloper() { require(developer() == _msgSender(), "Ownable: caller is not the developer"); _; } /** * @dev Leaves the contract without developer. It will not be possible to call * `onlyDeveloper` functions anymore. Can only be called by the current developer. * * NOTE: Renouncing developership will leave the contract without an developer, * thereby removing any functionality that is only available to the developer. */ function renounceDevelopership() public virtual onlyDeveloper { _setDeveloper(address(0)); } /** * @dev Transfers developership of the contract to a new account (`newDeveloper`). * Can only be called by the current developer. */ function transferDevelopership(address newDeveloper) public virtual onlyDeveloper { require(newDeveloper != address(0), "Ownable: new developer is the zero address"); _setDeveloper(newDeveloper); } function _setDeveloper(address newDeveloper) private { address oldDeveloper = _developer; _developer = newDeveloper; emit DevelopershipTransferred(oldDeveloper, newDeveloper); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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); } } // File: contracts/GACStaking.sol pragma solidity ^0.8.10; /** * The staking contract designated to exist on the Ethereum chain, * briged to Polygon (MATIC) via FX-Portal. * * Author: Cory Cherven (Animalmix55/ToxicPizza) */ contract GACStaking is FxBaseRootTunnel, Ownable, DeveloperAccess { IERC721Metadata public gacToken; bool public stakingPaused; /** * Users' staked tokens mapped from their address */ mapping(address => mapping(uint256 => bool)) public staked; constructor( address checkpointManager, address fxRoot, address devAddress, address tokenAddress ) FxBaseRootTunnel(checkpointManager, fxRoot) DeveloperAccess(devAddress) { gacToken = IERC721Metadata(tokenAddress); } // ----------------------------------------------- PUBLIC FUNCTIONS ---------------------------------------------- /** * Stakes the given token ids, provided the contract is approved to move them. * @param tokenIds - the token ids to stake */ function stake(uint256[] calldata tokenIds) external { require(!stakingPaused, "Staking paused"); for (uint256 i; i < tokenIds.length; i++) { gacToken.transferFrom(msg.sender, address(this), tokenIds[i]); staked[msg.sender][tokenIds[i]] = true; } _informChildOfEvent(msg.sender, tokenIds.length, true); } /** * Unstakes the given token ids. * @param tokenIds - the token ids to unstake */ function unstake(uint256[] calldata tokenIds) external { for (uint256 i; i < tokenIds.length; i++) { require(staked[msg.sender][tokenIds[i]], "Not owned"); gacToken.transferFrom(address(this), msg.sender, tokenIds[i]); staked[msg.sender][tokenIds[i]] = false; } _informChildOfEvent(msg.sender, tokenIds.length, false); } // -------------------------------------------- ADMIN FUNCTIONS -------------------------------------------------- /** * @dev Throws if called by any account other than the developer/owner. */ modifier onlyOwnerOrDeveloper() { require( developer() == _msgSender() || owner() == _msgSender(), "Ownable: caller is not the owner or developer" ); _; } /** * Updates the paused state of staking. * @param paused - the state's new value. */ function setStakingPaused(bool paused) external onlyOwnerOrDeveloper { stakingPaused = paused; } /** * Allows permissioned setting of fxChildTunnel * @param _fxChildTunnel - the fxChildTunnel address */ function setFxChildTunnel(address _fxChildTunnel) public override onlyOwnerOrDeveloper { fxChildTunnel = _fxChildTunnel; } // -------------------------------------------- INTERNAL FUNCTIONS ---------------------------------------------- /** * Informs the child contract, via FX-Portal, that a staking event has occurred. * @param from - the user that staked/unstaked * @param count - the number staked/unstaked * @param isInbound - true if staking, false if unstaking */ function _informChildOfEvent( address from, uint256 count, bool isInbound ) internal { _sendMessageToChild(abi.encode(from, count, isInbound)); } /** * A stub that does nothing. We will not anticipate receiving messages from Polygon, * we will only send messages to Polygon via FX-Portal. */ function _processMessageFromChild(bytes memory) internal override {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"checkpointManager","type":"address"},{"internalType":"address","name":"fxRoot","type":"address"},{"internalType":"address","name":"devAddress","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousDeveloper","type":"address"},{"indexed":true,"internalType":"address","name":"newDeveloper","type":"address"}],"name":"DevelopershipTransferred","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":[],"name":"checkpointManager","outputs":[{"internalType":"contract ICheckpointManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developer","outputs":[{"internalType":"address","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":"gacToken","outputs":[{"internalType":"contract IERC721Metadata","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":"renounceDevelopership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fxChildTunnel","type":"address"}],"name":"setFxChildTunnel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setStakingPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"staked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newDeveloper","type":"address"}],"name":"transferDevelopership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002f0338038062002f0383398101604081905262000034916200016e565b600180546001600160a01b038087166001600160a01b03199283161790925560008054928616929091169190911790558162000077620000713390565b620000ad565b6200008281620000ff565b50600680546001600160a01b0319166001600160a01b039290921691909117905550620001cb915050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fede61b2c1b6ea8932acda2da1fa8be10c31d93a5ef149f84a2a04c178054044990600090a35050565b80516001600160a01b03811681146200016957600080fd5b919050565b600080600080608085870312156200018557600080fd5b620001908562000151565b9350620001a06020860162000151565b9250620001b06040860162000151565b9150620001c06060860162000151565b905092959194509250565b612d2880620001db6000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80639bbee240116100cd578063ca4b208b11610081578063e449f34111610066578063e449f34114610351578063f2fde38b14610364578063f953cec71461037757600080fd5b8063ca4b208b14610313578063de9b771f1461033157600080fd5b8063bad96b54116100b2578063bad96b54146102ae578063bbb781cc146102ce578063c0857ba0146102f357600080fd5b80639bbee24014610288578063aea4e49e1461029b57600080fd5b8063715018a6116101245780638da5cb5b116101095780638da5cb5b146101fb5780638f1698161461023a578063972c49281461026857600080fd5b8063715018a6146101eb5780638cc401d5146101f357600080fd5b80630e387de6146101565780630fbf0a931461019057806315b31bbb146101a5578063607f2d42146101b8575b600080fd5b61017d7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03681565b6040519081526020015b60405180910390f35b6101a361019e366004612617565b61038a565b005b6101a36101b336600461268c565b61055a565b6101db6101c63660046126ae565b60036020526000908152604090205460ff1681565b6040519015158152602001610187565b6101a361066d565b6101a36106fa565b60045473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101db6102483660046126e9565b600760209081526000928352604080842090915290825290205460ff1681565b6002546102159073ffffffffffffffffffffffffffffffffffffffff1681565b6101a3610296366004612715565b6107aa565b6101a36102a9366004612715565b6108ff565b6006546102159073ffffffffffffffffffffffffffffffffffffffff1681565b6006546101db9074010000000000000000000000000000000000000000900460ff1681565b6001546102159073ffffffffffffffffffffffffffffffffffffffff1681565b60055473ffffffffffffffffffffffffffffffffffffffff16610215565b6000546102159073ffffffffffffffffffffffffffffffffffffffff1681565b6101a361035f366004612617565b610a0f565b6101a3610372366004612715565b610bf6565b6101a36103853660046127f6565b610d23565b60065474010000000000000000000000000000000000000000900460ff1615610414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f5374616b696e672070617573656400000000000000000000000000000000000060448201526064015b60405180910390fd5b60005b818110156105495760065473ffffffffffffffffffffffffffffffffffffffff166323b872dd333086868681811061045157610451612876565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156104cd57600080fd5b505af11580156104e1573d6000803e3d6000fd5b505033600090815260076020526040812060019350915085858581811061050a5761050a612876565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610541906128d4565b915050610417565b5061055633826001610d33565b5050565b60055473ffffffffffffffffffffffffffffffffffffffff16331480610597575060045473ffffffffffffffffffffffffffffffffffffffff1633145b610623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201527f206f7220646576656c6f70657200000000000000000000000000000000000000606482015260840161040b565b6006805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60045473ffffffffffffffffffffffffffffffffffffffff1633146106ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161040b565b6106f86000610d7c565b565b60055473ffffffffffffffffffffffffffffffffffffffff1633146107a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f776e61626c653a2063616c6c6572206973206e6f742074686520646576656c60448201527f6f70657200000000000000000000000000000000000000000000000000000000606482015260840161040b565b6106f86000610df3565b60055473ffffffffffffffffffffffffffffffffffffffff163314610850576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f776e61626c653a2063616c6c6572206973206e6f742074686520646576656c60448201527f6f70657200000000000000000000000000000000000000000000000000000000606482015260840161040b565b73ffffffffffffffffffffffffffffffffffffffff81166108f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f776e61626c653a206e657720646576656c6f70657220697320746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161040b565b6108fc81610df3565b50565b60055473ffffffffffffffffffffffffffffffffffffffff1633148061093c575060045473ffffffffffffffffffffffffffffffffffffffff1633145b6109c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201527f206f7220646576656c6f70657200000000000000000000000000000000000000606482015260840161040b565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005b81811015610be95733600090815260076020526040812090848484818110610a3c57610a3c612876565b602090810292909201358352508101919091526040016000205460ff16610abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65640000000000000000000000000000000000000000000000604482015260640161040b565b60065473ffffffffffffffffffffffffffffffffffffffff166323b872dd3033868686818110610af157610af1612876565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015610b6d57600080fd5b505af1158015610b81573d6000803e3d6000fd5b5050336000908152600760205260408120909250905081858585818110610baa57610baa612876565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610be1906128d4565b915050610a12565b5061055633826000610d33565b60045473ffffffffffffffffffffffffffffffffffffffff163314610c77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161040b565b73ffffffffffffffffffffffffffffffffffffffff8116610d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161040b565b6108fc81610d7c565b6000610d2e82610e6a565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff851660208201529081018390528115156060820152610d2e9060800160405160208183030381529060405261124c565b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fede61b2c1b6ea8932acda2da1fa8be10c31d93a5ef149f84a2a04c178054044990600090a35050565b60606000610e77836112dd565b90506000610e848261133c565b90506000610e918361136b565b9050600081610e9f84611394565b610ea886611582565b604051602001610eba9392919061293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600390935291205490915060ff1615610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4678526f6f7454756e6e656c3a20455849545f414c52454144595f50524f434560448201527f5353454400000000000000000000000000000000000000000000000000000000606482015260840161040b565b600081815260036020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610fcf8561159e565b90506000610fdc826116e8565b9050610fe781611778565b60025473ffffffffffffffffffffffffffffffffffffffff908116911614611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4678526f6f7454756e6e656c3a20494e56414c49445f46585f4348494c445f5460448201527f554e4e454c000000000000000000000000000000000000000000000000000000606482015260840161040b565b600061109c876117a1565b90506110bc6110ac846020015190565b876110b68a6117bd565b846117d9565b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4678526f6f7454756e6e656c3a20494e56414c49445f524543454950545f505260448201527f4f4f460000000000000000000000000000000000000000000000000000000000606482015260840161040b565b6111768561115589611a90565b61115e8a611aac565b846111688c611ac8565b6111718d611ae4565b611b00565b50600061118283611c66565b90507f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b0366111b86111b3836000611ca2565b611cda565b1461121f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4678526f6f7454756e6e656c3a20494e56414c49445f5349474e415455524500604482015260640161040b565b600061122a84611d55565b80602001905181019061123d919061296a565b9b9a5050505050505050505050565b6000546002546040517fb472047700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169263b4720477926112a89291169085906004016129e1565b600060405180830381600087803b1580156112c257600080fd5b505af11580156112d6573d6000803e3d6000fd5b5050505050565b60408051602081019091526060815260006113276113228460408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b611d71565b60408051602081019091529081529392505050565b6060611365826000015160088151811061135857611358612876565b6020026020010151611e87565b92915050565b6000611365826000015160028151811061138757611387612876565b6020026020010151611cda565b60408051602081019091526000815281516060919015611365576000806113bc600086611f24565b60f81c905060018114806113d357508060ff166003145b15611493576001855160026113e89190612a4f565b6113f29190612a8c565b67ffffffffffffffff81111561140a5761140a612732565b6040519080825280601f01601f191660200182016040528015611434576020820181803683370190505b5092506000611444600187611f24565b9050808460008151811061145a5761145a612876565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019250506114f7565b6002855160026114a39190612a4f565b6114ad9190612a8c565b67ffffffffffffffff8111156114c5576114c5612732565b6040519080825280601f01601f1916602001820160405280156114ef576020820181803683370190505b509250600091505b60ff82165b83518110156115795761152661151560ff851683612a8c565b611520906002612aa3565b87611f24565b84828151811061153857611538612876565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080611571816128d4565b9150506114fc565b50505092915050565b6000611365826000015160098151811061138757611387612876565b6115c260405180606001604052806060815260200160608152602001600081525090565b6115dc826000015160068151811061135857611358612876565b60208281018290526040805180820182526000808252908301528051808201909152825181529181019082015261161281611fa5565b156116275761162081611d71565b82526116d4565b6020820151805160009061163d90600190612a8c565b67ffffffffffffffff81111561165557611655612732565b6040519080825280601f01601f19166020018201604052801561167f576020820181803683370190505b50905060008083602101915082602001905061169d82828551611fde565b6040805180820182526000808252602091820152815180830190925284518252808501908201526116cd90611d71565b8652505050505b6116dd83611582565b604083015250919050565b604080516080810182526000918101828152606080830193909352815260208101919091526000611736836000015160038151811061172957611729612876565b6020026020010151611d71565b83604001518151811061174b5761174b612876565b60200260200101519050604051806040016040528082815260200161176f83611d71565b90529392505050565b6000611365826020015160008151811061179457611794612876565b6020026020010151612059565b6000611365826000015160058151811061138757611387612876565b6060611365826000015160078151811061135857611358612876565b60008061180d8460408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b9050600061181a82611d71565b90506060808560008061182c8b611394565b9050805160001415611848576000975050505050505050611a88565b60005b8651811015611a7f57815183111561186e57600098505050505050505050611a88565b61189087828151811061188357611883612876565b6020026020010151612073565b9550858051906020012084146118b157600098505050505050505050611a88565b6118c687828151811061172957611729612876565b945084516011141561199b578151831415611928578c805190602001206118f98660108151811061135857611358612876565b80519060200120141561191757600198505050505050505050611a88565b600098505050505050505050611a88565b600082848151811061193c5761193c612876565b016020015160f81c905060108111156119615760009950505050505050505050611a88565b611986868260ff168151811061197957611979612876565b60200260200101516120f3565b9450611993600185612aa3565b935050611a6d565b8451600214156119175760006119c76119c08760008151811061135857611358612876565b8486612121565b83519091506119d68286612aa3565b1415611a2b578d805190602001206119fa8760018151811061135857611358612876565b805190602001201415611a195760019950505050505050505050611a88565b60009950505050505050505050611a88565b80611a425760009950505050505050505050611a88565b611a4c8185612aa3565b9350611a648660018151811061197957611979612876565b9450611a6d9050565b80611a77816128d4565b91505061184b565b50505050505050505b949350505050565b6000611365826000015160038151811061138757611387612876565b6000611365826000015160048151811061138757611387612876565b6000611365826000015160008151811061138757611387612876565b6060611365826000015160018151811061135857611358612876565b6001546040517f41539d4a0000000000000000000000000000000000000000000000000000000081526004810184905260009182918291829173ffffffffffffffffffffffffffffffffffffffff909116906341539d4a9060240160a060405180830381865afa158015611b78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9c9190612abb565b5093505092509250611bf3828b611bb39190612a8c565b6040805160208082018f90528183018e9052606082018d905260808083018d90528351808403909101815260a0909201909252805191012090858861225a565b611c59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4678526f6f7454756e6e656c3a20494e56414c49445f48454144455200000000604482015260640161040b565b9998505050505050505050565b6040805160208101909152606081526040518060200160405280611c9a846020015160018151811061172957611729612876565b905292915050565b60408051808201909152600080825260208201528251805183908110611cca57611cca612876565b6020026020010151905092915050565b805160009015801590611cef57508151602110155b611cf857600080fd5b6000611d078360200151612404565b90506000818460000151611d1b9190612a8c565b9050600080838660200151611d309190612aa3565b9050805191506020831015611d4c57826020036101000a820491505b50949350505050565b6060611365826020015160028151811061135857611358612876565b6060611d7c82611fa5565b611d8557600080fd5b6000611d9083612486565b905060008167ffffffffffffffff811115611dad57611dad612732565b604051908082528060200260200182016040528015611df257816020015b6040805180820190915260008082526020820152815260200190600190039081611dcb5790505b5090506000611e048560200151612404565b8560200151611e139190612aa3565b90506000805b84811015611e7c57611e2a83612509565b9150604051806040016040528083815260200184815250848281518110611e5357611e53612876565b6020908102919091010152611e688284612aa3565b925080611e74816128d4565b915050611e19565b509195945050505050565b8051606090611e9557600080fd5b6000611ea48360200151612404565b90506000818460000151611eb89190612a8c565b905060008167ffffffffffffffff811115611ed557611ed5612732565b6040519080825280601f01601f191660200182016040528015611eff576020820181803683370190505b5090506000816020019050611d4c848760200151611f1d9190612aa3565b82856125cb565b6000611f31600284612b37565b15611f6b57601082611f44600286612b4b565b81518110611f5457611f54612876565b0160200151611f66919060f81c612b5f565b611f9b565b601082611f79600286612b4b565b81518110611f8957611f89612876565b0160200151611f9b919060f81c612b81565b60f81b9392505050565b8051600090611fb657506000919050565b6020820151805160001a9060c0821015611fd4575060009392505050565b5060019392505050565b80611fe857505050565b602081106120205782518252611fff602084612aa3565b925061200c602083612aa3565b9150612019602082612a8c565b9050611fe8565b6000600161202f836020612a8c565b61203b90610100612cc3565b6120459190612a8c565b935183518516941916939093179091525050565b805160009060151461206a57600080fd5b61136582611cda565b60606000826000015167ffffffffffffffff81111561209457612094612732565b6040519080825280601f01601f1916602001820160405280156120be576020820181803683370190505b5090508051600014156120d15792915050565b60008160200190506120ec84602001518286600001516125cb565b5092915050565b805160009060211461210457600080fd5b600080836020015160016121189190612aa3565b51949350505050565b6000808061212e86611394565b90506000815167ffffffffffffffff81111561214c5761214c612732565b6040519080825280601f01601f191660200182016040528015612176576020820181803683370190505b509050845b82516121879087612aa3565b81101561222a5760008782815181106121a2576121a2612876565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016905080836121d78985612a8c565b815181106121e7576121e7612876565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080612222906128d4565b91505061217b565b5080805190602001208280519060200120141561224a578151925061224f565b600092505b509095945050505050565b60006020825161226a9190612b37565b156122d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c69642070726f6f66206c656e677468000000000000000000000000604482015260640161040b565b6000602083516122e19190612b4b565b90506122ee816002612cc3565b8510612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4c65616620696e64657820697320746f6f206269670000000000000000000000604482015260640161040b565b60008660205b855181116123f657858101519250612375600289612b37565b6123aa5760408051602081018490529081018490526060016040516020818303038152906040528051906020012091506123d7565b60408051602081018590529081018390526060016040516020818303038152906040528051906020012091505b6123e2600289612b4b565b97506123ef602082612aa3565b905061235c565b509094149695505050505050565b8051600090811a608081101561241d5750600092915050565b60b8811080612438575060c08110801590612438575060f881105b156124465750600192915050565b60c081101561247a5761245b600160b8612ccf565b6124689060ff1682612a8c565b612473906001612aa3565b9392505050565b61245b600160f8612ccf565b805160009061249757506000919050565b6000806124a78460200151612404565b84602001516124b69190612aa3565b90506000846000015185602001516124ce9190612aa3565b90505b80821015612500576124e282612509565b6124ec9083612aa3565b9150826124f8816128d4565b9350506124d1565b50909392505050565b80516000908190811a608081101561252457600191506120ec565b60b881101561254a57612538608082612a8c565b612543906001612aa3565b91506120ec565b60c08110156125775760b78103600185019450806020036101000a855104600182018101935050506120ec565b60f881101561258b5761253860c082612a8c565b60019390930151602084900360f7016101000a90049092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0192915050565b806125d557505050565b6020811061260d57825182526125ec602084612aa3565b92506125f9602083612aa3565b9150612606602082612a8c565b90506125d5565b8061202057505050565b6000806020838503121561262a57600080fd5b823567ffffffffffffffff8082111561264257600080fd5b818501915085601f83011261265657600080fd5b81358181111561266557600080fd5b8660208260051b850101111561267a57600080fd5b60209290920196919550909350505050565b60006020828403121561269e57600080fd5b8135801515811461247357600080fd5b6000602082840312156126c057600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146108fc57600080fd5b600080604083850312156126fc57600080fd5b8235612707816126c7565b946020939093013593505050565b60006020828403121561272757600080fd5b8135612473816126c7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127a8576127a8612732565b604052919050565b600067ffffffffffffffff8211156127ca576127ca612732565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006020828403121561280857600080fd5b813567ffffffffffffffff81111561281f57600080fd5b8201601f8101841361283057600080fd5b803561284361283e826127b0565b612761565b81815285602083850101111561285857600080fd5b81602084016020830137600091810160200191909152949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612906576129066128a5565b5060010190565b60005b83811015612928578181015183820152602001612910565b83811115612937576000848401525b50505050565b8381526000835161295581602085016020880161290d565b60209201918201929092526040019392505050565b60006020828403121561297c57600080fd5b815167ffffffffffffffff81111561299357600080fd5b8201601f810184136129a457600080fd5b80516129b261283e826127b0565b8181528560208385010111156129c757600080fd5b6129d882602083016020860161290d565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260008251806040840152612a1c81606085016020870161290d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a8757612a876128a5565b500290565b600082821015612a9e57612a9e6128a5565b500390565b60008219821115612ab657612ab66128a5565b500190565b600080600080600060a08688031215612ad357600080fd5b855194506020860151935060408601519250606086015191506080860151612afa816126c7565b809150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612b4657612b46612b08565b500690565b600082612b5a57612b5a612b08565b500490565b600060ff831680612b7257612b72612b08565b8060ff84160691505092915050565b600060ff831680612b9457612b94612b08565b8060ff84160491505092915050565b600181815b80851115612bfc57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612be257612be26128a5565b80851615612bef57918102915b93841c9390800290612ba8565b509250929050565b600082612c1357506001611365565b81612c2057506000611365565b8160018114612c365760028114612c4057612c5c565b6001915050611365565b60ff841115612c5157612c516128a5565b50506001821b611365565b5060208310610133831016604e8410600b8410161715612c7f575081810a611365565b612c898383612ba3565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612cbb57612cbb6128a5565b029392505050565b60006124738383612c04565b600060ff821660ff841680821015612ce957612ce96128a5565b9003939250505056fea2646970667358221220525dc0e88414b7326bd513ba35a8439396dca1f584548c353c39dd319a64526c64736f6c634300080a003300000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a20000000000000000000000001569ab627df0c74e55b8e099a3f2b7d133665186000000000000000000000000ac2a6706285b91143eaded25d946ff17a60a6512
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101515760003560e01c80639bbee240116100cd578063ca4b208b11610081578063e449f34111610066578063e449f34114610351578063f2fde38b14610364578063f953cec71461037757600080fd5b8063ca4b208b14610313578063de9b771f1461033157600080fd5b8063bad96b54116100b2578063bad96b54146102ae578063bbb781cc146102ce578063c0857ba0146102f357600080fd5b80639bbee24014610288578063aea4e49e1461029b57600080fd5b8063715018a6116101245780638da5cb5b116101095780638da5cb5b146101fb5780638f1698161461023a578063972c49281461026857600080fd5b8063715018a6146101eb5780638cc401d5146101f357600080fd5b80630e387de6146101565780630fbf0a931461019057806315b31bbb146101a5578063607f2d42146101b8575b600080fd5b61017d7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03681565b6040519081526020015b60405180910390f35b6101a361019e366004612617565b61038a565b005b6101a36101b336600461268c565b61055a565b6101db6101c63660046126ae565b60036020526000908152604090205460ff1681565b6040519015158152602001610187565b6101a361066d565b6101a36106fa565b60045473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101db6102483660046126e9565b600760209081526000928352604080842090915290825290205460ff1681565b6002546102159073ffffffffffffffffffffffffffffffffffffffff1681565b6101a3610296366004612715565b6107aa565b6101a36102a9366004612715565b6108ff565b6006546102159073ffffffffffffffffffffffffffffffffffffffff1681565b6006546101db9074010000000000000000000000000000000000000000900460ff1681565b6001546102159073ffffffffffffffffffffffffffffffffffffffff1681565b60055473ffffffffffffffffffffffffffffffffffffffff16610215565b6000546102159073ffffffffffffffffffffffffffffffffffffffff1681565b6101a361035f366004612617565b610a0f565b6101a3610372366004612715565b610bf6565b6101a36103853660046127f6565b610d23565b60065474010000000000000000000000000000000000000000900460ff1615610414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f5374616b696e672070617573656400000000000000000000000000000000000060448201526064015b60405180910390fd5b60005b818110156105495760065473ffffffffffffffffffffffffffffffffffffffff166323b872dd333086868681811061045157610451612876565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156104cd57600080fd5b505af11580156104e1573d6000803e3d6000fd5b505033600090815260076020526040812060019350915085858581811061050a5761050a612876565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610541906128d4565b915050610417565b5061055633826001610d33565b5050565b60055473ffffffffffffffffffffffffffffffffffffffff16331480610597575060045473ffffffffffffffffffffffffffffffffffffffff1633145b610623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201527f206f7220646576656c6f70657200000000000000000000000000000000000000606482015260840161040b565b6006805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60045473ffffffffffffffffffffffffffffffffffffffff1633146106ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161040b565b6106f86000610d7c565b565b60055473ffffffffffffffffffffffffffffffffffffffff1633146107a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f776e61626c653a2063616c6c6572206973206e6f742074686520646576656c60448201527f6f70657200000000000000000000000000000000000000000000000000000000606482015260840161040b565b6106f86000610df3565b60055473ffffffffffffffffffffffffffffffffffffffff163314610850576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f776e61626c653a2063616c6c6572206973206e6f742074686520646576656c60448201527f6f70657200000000000000000000000000000000000000000000000000000000606482015260840161040b565b73ffffffffffffffffffffffffffffffffffffffff81166108f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f776e61626c653a206e657720646576656c6f70657220697320746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161040b565b6108fc81610df3565b50565b60055473ffffffffffffffffffffffffffffffffffffffff1633148061093c575060045473ffffffffffffffffffffffffffffffffffffffff1633145b6109c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201527f206f7220646576656c6f70657200000000000000000000000000000000000000606482015260840161040b565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005b81811015610be95733600090815260076020526040812090848484818110610a3c57610a3c612876565b602090810292909201358352508101919091526040016000205460ff16610abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65640000000000000000000000000000000000000000000000604482015260640161040b565b60065473ffffffffffffffffffffffffffffffffffffffff166323b872dd3033868686818110610af157610af1612876565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015610b6d57600080fd5b505af1158015610b81573d6000803e3d6000fd5b5050336000908152600760205260408120909250905081858585818110610baa57610baa612876565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610be1906128d4565b915050610a12565b5061055633826000610d33565b60045473ffffffffffffffffffffffffffffffffffffffff163314610c77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161040b565b73ffffffffffffffffffffffffffffffffffffffff8116610d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161040b565b6108fc81610d7c565b6000610d2e82610e6a565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff851660208201529081018390528115156060820152610d2e9060800160405160208183030381529060405261124c565b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fede61b2c1b6ea8932acda2da1fa8be10c31d93a5ef149f84a2a04c178054044990600090a35050565b60606000610e77836112dd565b90506000610e848261133c565b90506000610e918361136b565b9050600081610e9f84611394565b610ea886611582565b604051602001610eba9392919061293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600390935291205490915060ff1615610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4678526f6f7454756e6e656c3a20455849545f414c52454144595f50524f434560448201527f5353454400000000000000000000000000000000000000000000000000000000606482015260840161040b565b600081815260036020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610fcf8561159e565b90506000610fdc826116e8565b9050610fe781611778565b60025473ffffffffffffffffffffffffffffffffffffffff908116911614611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4678526f6f7454756e6e656c3a20494e56414c49445f46585f4348494c445f5460448201527f554e4e454c000000000000000000000000000000000000000000000000000000606482015260840161040b565b600061109c876117a1565b90506110bc6110ac846020015190565b876110b68a6117bd565b846117d9565b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4678526f6f7454756e6e656c3a20494e56414c49445f524543454950545f505260448201527f4f4f460000000000000000000000000000000000000000000000000000000000606482015260840161040b565b6111768561115589611a90565b61115e8a611aac565b846111688c611ac8565b6111718d611ae4565b611b00565b50600061118283611c66565b90507f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b0366111b86111b3836000611ca2565b611cda565b1461121f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4678526f6f7454756e6e656c3a20494e56414c49445f5349474e415455524500604482015260640161040b565b600061122a84611d55565b80602001905181019061123d919061296a565b9b9a5050505050505050505050565b6000546002546040517fb472047700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169263b4720477926112a89291169085906004016129e1565b600060405180830381600087803b1580156112c257600080fd5b505af11580156112d6573d6000803e3d6000fd5b5050505050565b60408051602081019091526060815260006113276113228460408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b611d71565b60408051602081019091529081529392505050565b6060611365826000015160088151811061135857611358612876565b6020026020010151611e87565b92915050565b6000611365826000015160028151811061138757611387612876565b6020026020010151611cda565b60408051602081019091526000815281516060919015611365576000806113bc600086611f24565b60f81c905060018114806113d357508060ff166003145b15611493576001855160026113e89190612a4f565b6113f29190612a8c565b67ffffffffffffffff81111561140a5761140a612732565b6040519080825280601f01601f191660200182016040528015611434576020820181803683370190505b5092506000611444600187611f24565b9050808460008151811061145a5761145a612876565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019250506114f7565b6002855160026114a39190612a4f565b6114ad9190612a8c565b67ffffffffffffffff8111156114c5576114c5612732565b6040519080825280601f01601f1916602001820160405280156114ef576020820181803683370190505b509250600091505b60ff82165b83518110156115795761152661151560ff851683612a8c565b611520906002612aa3565b87611f24565b84828151811061153857611538612876565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080611571816128d4565b9150506114fc565b50505092915050565b6000611365826000015160098151811061138757611387612876565b6115c260405180606001604052806060815260200160608152602001600081525090565b6115dc826000015160068151811061135857611358612876565b60208281018290526040805180820182526000808252908301528051808201909152825181529181019082015261161281611fa5565b156116275761162081611d71565b82526116d4565b6020820151805160009061163d90600190612a8c565b67ffffffffffffffff81111561165557611655612732565b6040519080825280601f01601f19166020018201604052801561167f576020820181803683370190505b50905060008083602101915082602001905061169d82828551611fde565b6040805180820182526000808252602091820152815180830190925284518252808501908201526116cd90611d71565b8652505050505b6116dd83611582565b604083015250919050565b604080516080810182526000918101828152606080830193909352815260208101919091526000611736836000015160038151811061172957611729612876565b6020026020010151611d71565b83604001518151811061174b5761174b612876565b60200260200101519050604051806040016040528082815260200161176f83611d71565b90529392505050565b6000611365826020015160008151811061179457611794612876565b6020026020010151612059565b6000611365826000015160058151811061138757611387612876565b6060611365826000015160078151811061135857611358612876565b60008061180d8460408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b9050600061181a82611d71565b90506060808560008061182c8b611394565b9050805160001415611848576000975050505050505050611a88565b60005b8651811015611a7f57815183111561186e57600098505050505050505050611a88565b61189087828151811061188357611883612876565b6020026020010151612073565b9550858051906020012084146118b157600098505050505050505050611a88565b6118c687828151811061172957611729612876565b945084516011141561199b578151831415611928578c805190602001206118f98660108151811061135857611358612876565b80519060200120141561191757600198505050505050505050611a88565b600098505050505050505050611a88565b600082848151811061193c5761193c612876565b016020015160f81c905060108111156119615760009950505050505050505050611a88565b611986868260ff168151811061197957611979612876565b60200260200101516120f3565b9450611993600185612aa3565b935050611a6d565b8451600214156119175760006119c76119c08760008151811061135857611358612876565b8486612121565b83519091506119d68286612aa3565b1415611a2b578d805190602001206119fa8760018151811061135857611358612876565b805190602001201415611a195760019950505050505050505050611a88565b60009950505050505050505050611a88565b80611a425760009950505050505050505050611a88565b611a4c8185612aa3565b9350611a648660018151811061197957611979612876565b9450611a6d9050565b80611a77816128d4565b91505061184b565b50505050505050505b949350505050565b6000611365826000015160038151811061138757611387612876565b6000611365826000015160048151811061138757611387612876565b6000611365826000015160008151811061138757611387612876565b6060611365826000015160018151811061135857611358612876565b6001546040517f41539d4a0000000000000000000000000000000000000000000000000000000081526004810184905260009182918291829173ffffffffffffffffffffffffffffffffffffffff909116906341539d4a9060240160a060405180830381865afa158015611b78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9c9190612abb565b5093505092509250611bf3828b611bb39190612a8c565b6040805160208082018f90528183018e9052606082018d905260808083018d90528351808403909101815260a0909201909252805191012090858861225a565b611c59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4678526f6f7454756e6e656c3a20494e56414c49445f48454144455200000000604482015260640161040b565b9998505050505050505050565b6040805160208101909152606081526040518060200160405280611c9a846020015160018151811061172957611729612876565b905292915050565b60408051808201909152600080825260208201528251805183908110611cca57611cca612876565b6020026020010151905092915050565b805160009015801590611cef57508151602110155b611cf857600080fd5b6000611d078360200151612404565b90506000818460000151611d1b9190612a8c565b9050600080838660200151611d309190612aa3565b9050805191506020831015611d4c57826020036101000a820491505b50949350505050565b6060611365826020015160028151811061135857611358612876565b6060611d7c82611fa5565b611d8557600080fd5b6000611d9083612486565b905060008167ffffffffffffffff811115611dad57611dad612732565b604051908082528060200260200182016040528015611df257816020015b6040805180820190915260008082526020820152815260200190600190039081611dcb5790505b5090506000611e048560200151612404565b8560200151611e139190612aa3565b90506000805b84811015611e7c57611e2a83612509565b9150604051806040016040528083815260200184815250848281518110611e5357611e53612876565b6020908102919091010152611e688284612aa3565b925080611e74816128d4565b915050611e19565b509195945050505050565b8051606090611e9557600080fd5b6000611ea48360200151612404565b90506000818460000151611eb89190612a8c565b905060008167ffffffffffffffff811115611ed557611ed5612732565b6040519080825280601f01601f191660200182016040528015611eff576020820181803683370190505b5090506000816020019050611d4c848760200151611f1d9190612aa3565b82856125cb565b6000611f31600284612b37565b15611f6b57601082611f44600286612b4b565b81518110611f5457611f54612876565b0160200151611f66919060f81c612b5f565b611f9b565b601082611f79600286612b4b565b81518110611f8957611f89612876565b0160200151611f9b919060f81c612b81565b60f81b9392505050565b8051600090611fb657506000919050565b6020820151805160001a9060c0821015611fd4575060009392505050565b5060019392505050565b80611fe857505050565b602081106120205782518252611fff602084612aa3565b925061200c602083612aa3565b9150612019602082612a8c565b9050611fe8565b6000600161202f836020612a8c565b61203b90610100612cc3565b6120459190612a8c565b935183518516941916939093179091525050565b805160009060151461206a57600080fd5b61136582611cda565b60606000826000015167ffffffffffffffff81111561209457612094612732565b6040519080825280601f01601f1916602001820160405280156120be576020820181803683370190505b5090508051600014156120d15792915050565b60008160200190506120ec84602001518286600001516125cb565b5092915050565b805160009060211461210457600080fd5b600080836020015160016121189190612aa3565b51949350505050565b6000808061212e86611394565b90506000815167ffffffffffffffff81111561214c5761214c612732565b6040519080825280601f01601f191660200182016040528015612176576020820181803683370190505b509050845b82516121879087612aa3565b81101561222a5760008782815181106121a2576121a2612876565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016905080836121d78985612a8c565b815181106121e7576121e7612876565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080612222906128d4565b91505061217b565b5080805190602001208280519060200120141561224a578151925061224f565b600092505b509095945050505050565b60006020825161226a9190612b37565b156122d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c69642070726f6f66206c656e677468000000000000000000000000604482015260640161040b565b6000602083516122e19190612b4b565b90506122ee816002612cc3565b8510612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4c65616620696e64657820697320746f6f206269670000000000000000000000604482015260640161040b565b60008660205b855181116123f657858101519250612375600289612b37565b6123aa5760408051602081018490529081018490526060016040516020818303038152906040528051906020012091506123d7565b60408051602081018590529081018390526060016040516020818303038152906040528051906020012091505b6123e2600289612b4b565b97506123ef602082612aa3565b905061235c565b509094149695505050505050565b8051600090811a608081101561241d5750600092915050565b60b8811080612438575060c08110801590612438575060f881105b156124465750600192915050565b60c081101561247a5761245b600160b8612ccf565b6124689060ff1682612a8c565b612473906001612aa3565b9392505050565b61245b600160f8612ccf565b805160009061249757506000919050565b6000806124a78460200151612404565b84602001516124b69190612aa3565b90506000846000015185602001516124ce9190612aa3565b90505b80821015612500576124e282612509565b6124ec9083612aa3565b9150826124f8816128d4565b9350506124d1565b50909392505050565b80516000908190811a608081101561252457600191506120ec565b60b881101561254a57612538608082612a8c565b612543906001612aa3565b91506120ec565b60c08110156125775760b78103600185019450806020036101000a855104600182018101935050506120ec565b60f881101561258b5761253860c082612a8c565b60019390930151602084900360f7016101000a90049092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0192915050565b806125d557505050565b6020811061260d57825182526125ec602084612aa3565b92506125f9602083612aa3565b9150612606602082612a8c565b90506125d5565b8061202057505050565b6000806020838503121561262a57600080fd5b823567ffffffffffffffff8082111561264257600080fd5b818501915085601f83011261265657600080fd5b81358181111561266557600080fd5b8660208260051b850101111561267a57600080fd5b60209290920196919550909350505050565b60006020828403121561269e57600080fd5b8135801515811461247357600080fd5b6000602082840312156126c057600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146108fc57600080fd5b600080604083850312156126fc57600080fd5b8235612707816126c7565b946020939093013593505050565b60006020828403121561272757600080fd5b8135612473816126c7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127a8576127a8612732565b604052919050565b600067ffffffffffffffff8211156127ca576127ca612732565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006020828403121561280857600080fd5b813567ffffffffffffffff81111561281f57600080fd5b8201601f8101841361283057600080fd5b803561284361283e826127b0565b612761565b81815285602083850101111561285857600080fd5b81602084016020830137600091810160200191909152949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612906576129066128a5565b5060010190565b60005b83811015612928578181015183820152602001612910565b83811115612937576000848401525b50505050565b8381526000835161295581602085016020880161290d565b60209201918201929092526040019392505050565b60006020828403121561297c57600080fd5b815167ffffffffffffffff81111561299357600080fd5b8201601f810184136129a457600080fd5b80516129b261283e826127b0565b8181528560208385010111156129c757600080fd5b6129d882602083016020860161290d565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260008251806040840152612a1c81606085016020870161290d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a8757612a876128a5565b500290565b600082821015612a9e57612a9e6128a5565b500390565b60008219821115612ab657612ab66128a5565b500190565b600080600080600060a08688031215612ad357600080fd5b855194506020860151935060408601519250606086015191506080860151612afa816126c7565b809150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612b4657612b46612b08565b500690565b600082612b5a57612b5a612b08565b500490565b600060ff831680612b7257612b72612b08565b8060ff84160691505092915050565b600060ff831680612b9457612b94612b08565b8060ff84160491505092915050565b600181815b80851115612bfc57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612be257612be26128a5565b80851615612bef57918102915b93841c9390800290612ba8565b509250929050565b600082612c1357506001611365565b81612c2057506000611365565b8160018114612c365760028114612c4057612c5c565b6001915050611365565b60ff841115612c5157612c516128a5565b50506001821b611365565b5060208310610133831016604e8410600b8410161715612c7f575081810a611365565b612c898383612ba3565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612cbb57612cbb6128a5565b029392505050565b60006124738383612c04565b600060ff821660ff841680821015612ce957612ce96128a5565b9003939250505056fea2646970667358221220525dc0e88414b7326bd513ba35a8439396dca1f584548c353c39dd319a64526c64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a20000000000000000000000001569ab627df0c74e55b8e099a3f2b7d133665186000000000000000000000000ac2a6706285b91143eaded25d946ff17a60a6512
-----Decoded View---------------
Arg [0] : checkpointManager (address): 0x86E4Dc95c7FBdBf52e33D563BbDB00823894C287
Arg [1] : fxRoot (address): 0xfe5e5D361b2ad62c541bAb87C45a0B9B018389a2
Arg [2] : devAddress (address): 0x1569ab627df0c74E55B8e099a3F2B7d133665186
Arg [3] : tokenAddress (address): 0xAc2a6706285b91143eaded25d946Ff17A60A6512
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287
Arg [1] : 000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a2
Arg [2] : 0000000000000000000000001569ab627df0c74e55b8e099a3f2b7d133665186
Arg [3] : 000000000000000000000000ac2a6706285b91143eaded25d946ff17a60a6512
Deployed Bytecode Sourcemap
41841:3493:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22978:115;;23027:66;22978:115;;;;;160:25:1;;;148:2;133:18;22978:115:0;;;;;;;;42678:373;;;;;;:::i;:::-;;:::i;:::-;;44114:110;;;;;;:::i;:::-;;:::i;23386:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1444:14:1;;1437:22;1419:41;;1407:2;1392:18;23386:46:0;1279:187:1;40770:103:0;;;:::i;38340:106::-;;;:::i;40119:87::-;40192:6;;;;40119:87;;;1647:42:1;1635:55;;;1617:74;;1605:2;1590:18;40119:87:0;1471:226:1;42059:58:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;23308:28;;;;;;;;;38613:220;;;;;;:::i;:::-;;:::i;44361:136::-;;;;;;:::i;:::-;;:::i;41914:31::-;;;;;;;;;41952:25;;;;;;;;;;;;23194:43;;;;;;;;;37641:95;37718:10;;;;37641:95;;23132:28;;;;;;;;;43166:393;;;;;;:::i;:::-;;:::i;41028:201::-;;;;;;:::i;:::-;;:::i;28439:186::-;;;;;;:::i;:::-;;:::i;42678:373::-;42751:13;;;;;;;42750:14;42742:41;;;;;;;4856:2:1;42742:41:0;;;4838:21:1;4895:2;4875:18;;;4868:30;4934:16;4914:18;;;4907:44;4968:18;;42742:41:0;;;;;;;;;42799:9;42794:183;42810:19;;;42794:183;;;42851:8;;;;:21;42873:10;42893:4;42900:8;;42909:1;42900:11;;;;;;;:::i;:::-;42851:61;;;;;;;;;;5398:42:1;5467:15;;;42851:61:0;;;5449:34:1;5519:15;;;;5499:18;;;5492:43;-1:-1:-1;42900:11:0;;;;;;5551:18:1;;;5544:34;5361:18;;42851:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42934:10:0;42927:18;;;;:6;:18;;;;;42961:4;;-1:-1:-1;42927:18:0;-1:-1:-1;42946:8:0;;42955:1;42946:11;;;;;;;:::i;:::-;;;;;;;42927:31;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;42831:3;;;;;:::i;:::-;;;;42794:183;;;-1:-1:-1;42989:54:0;43009:10;43021:8;43038:4;42989:19;:54::i;:::-;42678:373;;:::o;44114:110::-;37718:10;;43849:27;37718:10;36457;43849:27;;:54;;-1:-1:-1;40192:6:0;;43880:23;40192:6;36457:10;43880:23;43849:54;43827:149;;;;;;;6180:2:1;43827:149:0;;;6162:21:1;6219:2;6199:18;;;6192:30;6258:34;6238:18;;;6231:62;6329:15;6309:18;;;6302:43;6362:19;;43827:149:0;5978:409:1;43827:149:0;44194:13:::1;:22:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;44114:110::o;40770:103::-;40192:6;;40339:23;40192:6;36457:10;40339:23;40331:68;;;;;;;6594:2:1;40331:68:0;;;6576:21:1;;;6613:18;;;6606:30;6672:34;6652:18;;;6645:62;6724:18;;40331:68:0;6392:356:1;40331:68:0;40835:30:::1;40862:1;40835:18;:30::i;:::-;40770:103::o:0;38340:106::-;37718:10;;37877:27;37718:10;36457;37877:27;37869:76;;;;;;;6955:2:1;37869:76:0;;;6937:21:1;6994:2;6974:18;;;6967:30;7033:34;7013:18;;;7006:62;7104:6;7084:18;;;7077:34;7128:19;;37869:76:0;6753:400:1;37869:76:0;38413:25:::1;38435:1;38413:13;:25::i;38613:220::-:0;37718:10;;37877:27;37718:10;36457;37877:27;37869:76;;;;;;;6955:2:1;37869:76:0;;;6937:21:1;6994:2;6974:18;;;6967:30;7033:34;7013:18;;;7006:62;7104:6;7084:18;;;7077:34;7128:19;;37869:76:0;6753:400:1;37869:76:0;38714:26:::1;::::0;::::1;38706:81;;;::::0;::::1;::::0;;7360:2:1;38706:81:0::1;::::0;::::1;7342:21:1::0;7399:2;7379:18;;;7372:30;7438:34;7418:18;;;7411:62;7509:12;7489:18;;;7482:40;7539:19;;38706:81:0::1;7158:406:1::0;38706:81:0::1;38798:27;38812:12;38798:13;:27::i;:::-;38613:220:::0;:::o;44361:136::-;37718:10;;43849:27;37718:10;36457;43849:27;;:54;;-1:-1:-1;40192:6:0;;43880:23;40192:6;36457:10;43880:23;43849:54;43827:149;;;;;;;6180:2:1;43827:149:0;;;6162:21:1;6219:2;6199:18;;;6192:30;6258:34;6238:18;;;6231:62;6329:15;6309:18;;;6302:43;6362:19;;43827:149:0;5978:409:1;43827:149:0;44459:13:::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;44361:136::o;43166:393::-;43237:9;43232:252;43248:19;;;43232:252;;;43304:10;43297:18;;;;:6;:18;;;;;;43316:8;;43325:1;43316:11;;;;;;;:::i;:::-;;;;;;;;;;43297:31;;-1:-1:-1;43297:31:0;;;;;;;;-1:-1:-1;43297:31:0;;;;43289:53;;;;;;;7771:2:1;43289:53:0;;;7753:21:1;7810:1;7790:18;;;7783:29;7848:11;7828:18;;;7821:39;7877:18;;43289:53:0;7569:332:1;43289:53:0;43357:8;;;;:21;43387:4;43394:10;43406:8;;43415:1;43406:11;;;;;;;:::i;:::-;43357:61;;;;;;;;;;5398:42:1;5467:15;;;43357:61:0;;;5449:34:1;5519:15;;;;5499:18;;;5492:43;-1:-1:-1;43406:11:0;;;;;;5551:18:1;;;5544:34;5361:18;;43357:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43440:10:0;43467:5;43433:18;;;:6;:18;;;;;43467:5;;-1:-1:-1;43433:18:0;-1:-1:-1;43467:5:0;43452:8;;43461:1;43452:11;;;;;;;:::i;:::-;;;;;;;43433:31;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;43269:3;;;;;:::i;:::-;;;;43232:252;;;-1:-1:-1;43496:55:0;43516:10;43528:8;43545:5;43496:19;:55::i;41028:201::-;40192:6;;40339:23;40192:6;36457:10;40339:23;40331:68;;;;;;;6594:2:1;40331:68:0;;;6576:21:1;;;6613:18;;;6606:30;6672:34;6652:18;;;6645:62;6724:18;;40331:68:0;6392:356:1;40331:68:0;41117:22:::1;::::0;::::1;41109:73;;;::::0;::::1;::::0;;8108:2:1;41109:73:0::1;::::0;::::1;8090:21:1::0;8147:2;8127:18;;;8120:30;8186:34;8166:18;;;8159:62;8257:8;8237:18;;;8230:36;8283:19;;41109:73:0::1;7906:402:1::0;41109:73:0::1;41193:28;41212:8;41193:18;:28::i;28439:186::-:0;28513:20;28536:37;28563:9;28536:26;:37::i;:::-;-1:-1:-1;;;42678:373:0:o;44895:191::-;45043:34;;;8539:42:1;8527:55;;45043:34:0;;;8509:74:1;8599:18;;;8592:34;;;8669:14;;8662:22;8642:18;;;8635:50;45023:55:0;;8482:18:1;;45043:34:0;;;;;;;;;;;;45023:19;:55::i;41389:191::-;41482:6;;;;41499:17;;;;;;;;;;;41532:40;;41482:6;;;41499:17;41482:6;;41532:40;;41463:16;;41532:40;41452:128;41389:191;:::o;38841:209::-;38928:10;;;;38949:25;;;;;;;;;;;38990:52;;38928:10;;;38949:25;38928:10;;38990:52;;38905:20;;38990:52;38894:156;38841:209;:::o;24321:2411::-;24399:12;24424:44;24471:25;:9;:23;:25::i;:::-;24424:72;;24509:28;24540:30;:7;:28;:30::i;:::-;24509:61;;24581:19;24603:24;:7;:22;:24::i;:::-;24581:46;;24789:16;24867:11;25163:52;25199:15;25163:35;:52::i;:::-;25234:28;:7;:26;:28::i;:::-;24832:445;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;24808:480;;24832:445;24808:480;;;;25307:24;;;;:14;:24;;;;;;24808:480;;-1:-1:-1;25307:24:0;;:33;25299:82;;;;;;;9597:2:1;25299:82:0;;;9579:21:1;9636:2;9616:18;;;9609:30;9675:34;9655:18;;;9648:62;9746:6;9726:18;;;9719:34;9770:19;;25299:82:0;9395:400:1;25299:82:0;25392:24;;;;:14;:24;;;;;:31;;;;25419:4;25392:31;;;25479:20;:7;:18;:20::i;:::-;25436:63;;25510:32;25545:16;:7;:14;:16::i;:::-;25510:51;;25630:16;:3;:14;:16::i;:::-;25613:13;;:33;:13;;;:33;;;25605:83;;;;;;;10002:2:1;25605:83:0;;;9984:21:1;10041:2;10021:18;;;10014:30;10080:34;10060:18;;;10053:62;10151:7;10131:18;;;10124:35;10176:19;;25605:83:0;9800:401:1;25605:83:0;25701:19;25723:24;:7;:22;:24::i;:::-;25701:46;;25817:102;25844:17;:7;15966:11;;;;15870:115;25844:17;25863:15;25880:25;:7;:23;:25::i;:::-;25907:11;25817:26;:102::i;:::-;25795:187;;;;;;;10408:2:1;25795:187:0;;;10390:21:1;10447:2;10427:18;;;10420:30;10486:34;10466:18;;;10459:62;10557:5;10537:18;;;10530:33;10580:19;;25795:187:0;10206:399:1;25795:187:0;26035:245;26083:11;26109:22;:7;:20;:22::i;:::-;26146:19;:7;:17;:19::i;:::-;26180:11;26206:25;:7;:23;:25::i;:::-;26246:23;:7;:21;:23::i;:::-;26035:33;:245::i;:::-;;26293:41;26337:15;:3;:13;:15::i;:::-;26293:59;-1:-1:-1;23027:66:0;26395:27;:18;26293:59;26427:22;26395:15;:18::i;:::-;:25;:27::i;:::-;26387:62;26365:166;;;;;;;10812:2:1;26365:166:0;;;10794:21:1;10851:2;10831:18;;;10824:30;10890:33;10870:18;;;10863:61;10941:18;;26365:166:0;10610:355:1;26365:166:0;26578:20;26612:13;:3;:11;:13::i;:::-;26601:34;;;;;;;;;;;;:::i;:::-;26578:57;24321:2411;-1:-1:-1;;;;;;;;;;;24321:2411:0:o;24185:128::-;24256:6;;24282:13;;24256:49;;;;;:6;;;;;:25;;:49;;24282:13;;;24297:7;;24256:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24185:128;:::o;13220:214::-;-1:-1:-1;;;;;;;;;;;;13316:38:0;13357:25;:16;:4;-1:-1:-1;;;;;;;;;;;;;;;;;2941:28:0;;;;;;;;2949:11;;2941:28;;2896:15;;;2941:28;;;;;;;;2749:228;13357:16;:23;:25::i;:::-;13402:24;;;;;;;;;;;;;13220:214;-1:-1:-1;;;13220:214:0:o;15399:146::-;15480:12;15512:25;:7;:12;;;15525:1;15512:15;;;;;;;;:::i;:::-;;;;;;;:23;:25::i;:::-;15505:32;15399:146;-1:-1:-1;;15399:146:0:o;13732:134::-;13807:7;13834:24;:7;:12;;;13847:1;13834:15;;;;;;;;:::i;:::-;;;;;;;:22;:24::i;20923:795::-;21012:25;;;;;;;;;:20;:25;;21052:8;;20987:12;;21012:25;21052:12;21048:638;;21081:12;21108:14;21131:26;21152:1;21155;21131:20;:26::i;:::-;21125:33;;;-1:-1:-1;21189:1:0;21177:13;;;:30;;;21194:8;:13;;21206:1;21194:13;21177:30;21173:349;;;21263:1;21248;:8;21259:1;21248:12;;;;:::i;:::-;:16;;;;:::i;:::-;21238:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21238:27:0;;21228:37;;21284:16;21303:26;21324:1;21327;21303:20;:26::i;:::-;21284:45;;21361:9;21348:7;21356:1;21348:10;;;;;;;;:::i;:::-;;;;:22;;;;;;;;;;;21398:1;21389:10;;21209:206;21173:349;;;21475:1;21460;:8;21471:1;21460:12;;;;:::i;:::-;:16;;;;:::i;:::-;21450:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21450:27:0;;21440:37;;21505:1;21496:10;;21173:349;21543:18;;;21538:137;21567:7;:14;21563:1;:18;21538:137;;;21620:39;21641:10;;;;:1;:10;:::i;:::-;:14;;21654:1;21641:14;:::i;:::-;21657:1;21620:20;:39::i;:::-;21607:7;21615:1;21607:10;;;;;;;;:::i;:::-;;;;:52;;;;;;;;;;-1:-1:-1;21583:3:0;;;;:::i;:::-;;;;21538:137;;;;21066:620;;21703:7;20923:795;-1:-1:-1;;20923:795:0:o;15700:138::-;15779:7;15806:24;:7;:12;;;15819:1;15806:15;;;;;;;;:::i;14311:931::-;14382:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;14382:22:0;14431:25;:7;:12;;;14444:1;14431:15;;;;;;;;:::i;:25::-;14417:11;;;;:39;;;-1:-1:-1;;;;;;;;;;;;;;;;2941:28:0;;;;;;;;2949:11;;2941:28;;2896:15;;;2941:28;;;;14546:20;2941:28;14546:18;:20::i;:::-;14542:609;;;14624:20;:11;:18;:20::i;:::-;14609:35;;14542:609;;;14758:11;;;;14816:17;;14732:23;;14816:21;;14836:1;;14816:21;:::i;:::-;14806:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14806:32:0;;14784:54;;14853:14;14882:15;14958:10;14954:2;14950:19;14940:29;;15008:6;15002:4;14998:17;14987:28;;15046:36;15051:6;15059:7;15068:6;:13;15046:4;:36::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;2941:28:0;;;;;;;;2949:11;;2941:28;;2896:15;;;2941:28;;;;15112:27;;13357:23;:25::i;15112:27::-;15097:42;;-1:-1:-1;;;;14542:609:0;15182:27;15201:7;15182:18;:27::i;:::-;15163:16;;;:46;-1:-1:-1;15163:7:0;14311:931;-1:-1:-1;14311:931:0:o;15993:219::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16079:32:0;16114:24;:7;:12;;;16127:1;16114:15;;;;;;;;:::i;:::-;;;;;;;:22;:24::i;:::-;16139:7;:16;;;16114:42;;;;;;;;:::i;:::-;;;;;;;16079:77;;16174:30;;;;;;;;16178:7;16174:30;;;;16187:16;:7;:14;:16::i;:::-;16174:30;;16167:37;15993:219;-1:-1:-1;;;15993:219:0:o;16240:126::-;16299:7;16326:32;16346:3;:8;;;16355:1;16346:11;;;;;;;;:::i;:::-;;;;;;;16326:19;:32::i;14160:143::-;14235:7;14270:24;:7;:12;;;14283:1;14270:15;;;;;;;;:::i;15250:141::-;15326:12;15358:25;:7;:12;;;15371:1;15358:15;;;;;;;;:::i;17424:2470::-;17595:4;17612:29;17644:35;17664:14;-1:-1:-1;;;;;;;;;;;;;;;;;2941:28:0;;;;;;;;2949:11;;2941:28;;2896:15;;;2941:28;;;;;;;;2749:228;17644:35;17612:67;;17690:38;17731:22;17748:4;17731:16;:22::i;:::-;17690:63;-1:-1:-1;17766:24:0;;17874:4;17856:15;;17941:28;17957:11;17941:15;:28::i;:::-;17921:48;;17984:4;:11;17999:1;17984:16;17980:61;;;18024:5;18017:12;;;;;;;;;;;17980:61;18058:9;18053:1834;18077:11;:18;18073:1;:22;18053:1834;;;18131:4;:11;18121:7;:21;18117:74;;;18170:5;18163:12;;;;;;;;;;;;18117:74;18221:36;18242:11;18254:1;18242:14;;;;;;;;:::i;:::-;;;;;;;18221:20;:36::i;:::-;18207:50;;18297:11;18287:22;;;;;;18276:7;:33;18272:86;;18337:5;18330:12;;;;;;;;;;;;18272:86;18390:32;18407:11;18419:1;18407:14;;;;;;;;:::i;18390:32::-;18372:50;;18443:15;:22;18469:2;18443:28;18439:1437;;;18507:4;:11;18496:7;:22;18492:276;;;18610:5;18600:16;;;;;;18557:38;18575:15;18591:2;18575:19;;;;;;;;:::i;18557:38::-;18547:49;;;;;;:69;18543:206;;;18652:4;18645:11;;;;;;;;;;;;18543:206;18720:5;18713:12;;;;;;;;;;;;18543:206;18788:20;18817:4;18822:7;18817:13;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;18871:2:0;18854:19;;18850:80;;;18905:5;18898:12;;;;;;;;;;;;;18850:80;18966:55;18989:15;19005:14;18989:31;;;;;;;;;;:::i;:::-;;;;;;;18966:22;:55::i;:::-;18958:64;-1:-1:-1;19041:12:0;19052:1;19041:12;;:::i;:::-;;;18473:596;18439:1437;;;19079:15;:22;19105:1;19079:27;19075:801;;;19127:17;19147:72;19166:37;19184:15;19200:1;19184:18;;;;;;;;:::i;19166:37::-;19205:4;19211:7;19147:18;:72::i;:::-;19265:11;;19127:92;;-1:-1:-1;19242:19:0;19127:92;19242:7;:19;:::i;:::-;:34;19238:320;;;19400:5;19390:16;;;;;;19348:37;19366:15;19382:1;19366:18;;;;;;;;:::i;19348:37::-;19338:48;;;;;;:68;19334:205;;;19442:4;19435:11;;;;;;;;;;;;;19334:205;19510:5;19503:12;;;;;;;;;;;;;19334:205;19616:14;19612:75;;19662:5;19655:12;;;;;;;;;;;;;19612:75;19707:20;19718:9;19707:20;;:::i;:::-;;;19764:42;19787:15;19803:1;19787:18;;;;;;;;:::i;19764:42::-;19756:51;-1:-1:-1;19075:801:0;;-1:-1:-1;19075:801:0;;18097:3;;;;:::i;:::-;;;;18053:1834;;;;17601:2293;;;;;;;17424:2470;;;;;;;:::o;13874:132::-;13947:7;13974:24;:7;:12;;;13987:1;13974:15;;;;;;;;:::i;14014:138::-;14084:7;14119:24;:7;:12;;;14132:1;14119:15;;;;;;;;:::i;13442:135::-;13518:7;13545:24;:7;:12;;;13558:1;13545:15;;;;;;;;:::i;13585:139::-;13659:12;13691:25;:7;:12;;;13704:1;13691:15;;;;;;;;:::i;26740:710::-;27076:17;;:44;;;;;;;;160:25:1;;;26990:7:0;;;;;;;;27076:17;;;;;:30;;133:18:1;;27076:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27010:110;;;;;;;;27155:204;27276:10;27262:11;:24;;;;:::i;:::-;27165:61;;;;;;;13567:19:1;;;13602:12;;;13595:28;;;13639:12;;;13632:28;;;13676:12;;;;13669:28;;;27165:61:0;;;;;;;;;;13713:13:1;;;;27165:61:0;;;27155:72;;;;;;27305:10;27334;27155:88;:204::i;:::-;27133:282;;;;;;;13939:2:1;27133:282:0;;;13921:21:1;13978:2;13958:18;;;13951:30;14017;13997:18;;;13990:58;14065:18;;27133:282:0;13737:352:1;27133:282:0;27433:9;26740:710;-1:-1:-1;;;;;;;;;26740:710:0:o;16374:133::-;-1:-1:-1;;;;;;;;;;;;16468:31:0;;;;;;;;16478:20;:3;:8;;;16487:1;16478:11;;;;;;;;:::i;:20::-;16468:31;;16461:38;16374:133;-1:-1:-1;;16374:133:0:o;16794:151::-;-1:-1:-1;;;;;;;;;;;;;;;;;16919:11:0;;:18;;16931:5;;16919:18;;;;;;:::i;:::-;;;;;;;16912:25;;16794:151;;;;:::o;6983:564::-;7071:8;;7043:7;;7071:12;;;;:30;;-1:-1:-1;7087:8:0;;7099:2;-1:-1:-1;7087:14:0;7071:30;7063:39;;;;;;7115:14;7132:27;7147:4;:11;;;7132:14;:27::i;:::-;7115:44;;7170:11;7195:6;7184:4;:8;;;:17;;;;:::i;:::-;7170:31;;7214:14;7239;7270:6;7256:4;:11;;;:20;;;;:::i;:::-;7239:37;;7327:6;7321:13;7311:23;;7420:2;7415:3;7412:11;7409:94;;;7482:3;7478:2;7474:12;7469:3;7465:22;7457:6;7453:35;7443:45;;7409:94;-1:-1:-1;7533:6:0;6983:564;-1:-1:-1;;;;6983:564:0:o;16515:117::-;16571:12;16603:21;:3;:8;;;16612:1;16603:11;;;;;;;;:::i;3806:534::-;3866:16;3903:12;3910:4;3903:6;:12::i;:::-;3895:21;;;;;;3929:13;3945:14;3954:4;3945:8;:14::i;:::-;3929:30;;3970:23;4010:5;3996:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;3996:20:0;;;;;;;;;;;;;;;;3970:46;;4029:14;4060:27;4075:4;:11;;;4060:14;:27::i;:::-;4046:4;:11;;;:41;;;;:::i;:::-;4029:58;-1:-1:-1;4098:15:0;;4124:183;4148:5;4144:1;:9;4124:183;;;4185:19;4197:6;4185:11;:19::i;:::-;4175:29;;4231:24;;;;;;;;4239:7;4231:24;;;;4248:6;4231:24;;;4219:6;4226:1;4219:9;;;;;;;;:::i;:::-;;;;;;;;;;:36;4279:16;4288:7;4279:6;:16;:::i;:::-;4270:25;-1:-1:-1;4155:3:0;;;;:::i;:::-;;;;4124:183;;;-1:-1:-1;4326:6:0;;3806:534;-1:-1:-1;;;;;3806:534:0:o;7904:454::-;7998:8;;7965:12;;7990:21;;;;;;8024:14;8041:27;8056:4;:11;;;8041:14;:27::i;:::-;8024:44;;8079:11;8104:6;8093:4;:8;;;:17;;;;:::i;:::-;8079:31;;8136:19;8168:3;8158:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8158:14:0;;8136:36;;8185:15;8256:6;8250:4;8246:17;8235:28;;8286:40;8305:6;8291:4;:11;;;:20;;;;:::i;:::-;8313:7;8322:3;8286:4;:40::i;21726:187::-;21807:6;21840:5;21844:1;21840;:5;:::i;:::-;:10;:64;;21900:4;21886:3;21890:5;21894:1;21890;:5;:::i;:::-;21886:10;;;;;;;;:::i;:::-;;;;;21880:24;;;21886:10;;21880:24;:::i;:::-;21840:64;;;21873:4;21859:3;21863:5;21867:1;21863;:5;:::i;:::-;21859:10;;;;;;;;:::i;:::-;;;;;21853:24;;;21859:10;;21853:24;:::i;:::-;21833:72;;;21726:187;-1:-1:-1;;;21726:187:0:o;4447:332::-;4528:8;;4507:4;;4524:31;;-1:-1:-1;4550:5:0;;4447:332;-1:-1:-1;4447:332:0:o;4524:31::-;4607:11;;;;4670:13;;4568:11;4662:22;;1522:4;4711:24;;4707:42;;;-1:-1:-1;4744:5:0;;4447:332;-1:-1:-1;;;4447:332:0:o;4707:42::-;-1:-1:-1;4767:4:0;;4447:332;-1:-1:-1;;;4447:332:0:o;12451:761::-;12567:8;12563:21;;12451:761;;;:::o;12563:21::-;12002:2;12651:16;;12644:201;;12743:10;;12730:24;;12785:16;12002:2;12749:3;12785:16;:::i;:::-;;-1:-1:-1;12816:17:0;12002:2;12816:17;;:::i;:::-;;-1:-1:-1;12669:16:0;12002:2;12669:16;;:::i;:::-;;;12644:201;;;12938:12;12978:1;12959:15;12971:3;12002:2;12959:15;:::i;:::-;12953:22;;:3;:22;:::i;:::-;:26;;;;:::i;:::-;13033:10;;13105:11;;13101:22;;13045:9;;13029:26;13172:21;;;;13159:35;;;-1:-1:-1;;12451:761:0:o;6770:205::-;6902:8;;6833:7;;6914:2;6902:14;6894:23;;;;;;6953:12;6960:4;6953:6;:12::i;6064:348::-;6128:12;6153:19;6185:4;:8;;;6175:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6175:19:0;;6153:41;;6209:6;:13;6226:1;6209:18;6205:37;;;6236:6;6064:348;-1:-1:-1;;6064:348:0:o;6205:37::-;6255:11;6318:6;6312:4;6308:17;6301:24;;6348:32;6353:4;:11;;;6366:3;6371:4;:8;;;6348:4;:32::i;:::-;-1:-1:-1;6398:6:0;6064:348;-1:-1:-1;;6064:348:0:o;7587:309::-;7709:8;;7653:7;;7721:2;7709:14;7701:23;;;;;;7737:14;7762;7779:4;:11;;;7793:1;7779:15;;;;:::i;:::-;7839:13;;7587:309;-1:-1:-1;;;;7587:309:0:o;19902:978::-;20055:7;;;20315:35;20331:18;20315:15;:35::i;:::-;20288:62;;20361:23;20397:11;:18;20387:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20387:29:0;-1:-1:-1;20361:55:0;-1:-1:-1;20543:7:0;20526:170;20566:18;;20556:28;;:7;:28;:::i;:::-;20552:1;:32;20526:170;;;20606:17;20626:4;20631:1;20626:7;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;20626:7:0;20648:10;20659:11;20663:7;20659:1;:11;:::i;:::-;20648:23;;;;;;;;:::i;:::-;;;;:36;;;;;;;;;;;20591:105;20586:3;;;;;:::i;:::-;;;;20526:170;;;;20748:10;20738:21;;;;;;20722:11;20712:22;;;;;;:47;20708:144;;;20782:11;:18;20776:24;;20708:144;;;20839:1;20833:7;;20708:144;-1:-1:-1;20869:3:0;;19902:978;-1:-1:-1;;;;;19902:978:0:o;131:1046::-;289:4;329:2;314:5;:12;:17;;;;:::i;:::-;:22;306:55;;;;;;;16553:2:1;306:55:0;;;16535:21:1;16592:2;16572:18;;;16565:30;16631:22;16611:18;;;16604:50;16671:18;;306:55:0;16351:344:1;306:55:0;372:19;409:2;394:5;:12;:17;;;;:::i;:::-;372:39;-1:-1:-1;566:14:0;372:39;566:1;:14;:::i;:::-;558:5;:22;550:56;;;;;;;16902:2:1;550:56:0;;;16884:21:1;16941:2;16921:18;;;16914:30;16980:23;16960:18;;;16953:51;17021:18;;550:56:0;16700:345:1;550:56:0;619:20;673:4;705:2;688:440;714:5;:12;709:1;:17;688:440;;802:13;;;796:20;;-1:-1:-1;851:9:0;859:1;851:5;:9;:::i;:::-;847:236;;911:44;;;;;;17207:19:1;;;17242:12;;;17235:28;;;17279:12;;911:44:0;;;;;;;;;;;;901:55;;;;;;886:70;;847:236;;;1022:44;;;;;;17207:19:1;;;17242:12;;;17235:28;;;17279:12;;1022:44:0;;;;;;;;;;;;1012:55;;;;;;997:70;;847:236;1107:9;1115:1;1107:5;:9;:::i;:::-;1099:17;-1:-1:-1;728:7:0;733:2;728:7;;:::i;:::-;;;688:440;;;-1:-1:-1;1145:24:0;;;;131:1046;-1:-1:-1;;;;;;131:1046:0:o;10276:533::-;10423:13;;10338:7;;10415:22;;1431:4;10464:26;;10460:341;;;-1:-1:-1;10499:1:0;;10276:533;-1:-1:-1;;10276:533:0:o;10460:341::-;1477:4;10520:25;;;:83;;-1:-1:-1;1522:4:0;10550:25;;;;;:52;;-1:-1:-1;1566:4:0;10579:23;;10550:52;10516:285;;;-1:-1:-1;10612:1:0;;10276:533;-1:-1:-1;;10276:533:0:o;10516:285::-;1522:4;10633:24;;10629:172;;;10719:21;10739:1;1477:4;10719:21;:::i;:::-;10710:31;;;;:5;:31;:::i;:::-;:35;;10744:1;10710:35;:::i;:::-;10703:42;10276:533;-1:-1:-1;;;10276:533:0:o;10629:172::-;10777:19;10795:1;1566:4;10777:19;:::i;8473:436::-;8558:8;;8534:7;;8554:27;;-1:-1:-1;8580:1:0;;8473:436;-1:-1:-1;8473:436:0:o;8554:27::-;8594:13;8622:15;8654:27;8669:4;:11;;;8654:14;:27::i;:::-;8640:4;:11;;;:41;;;;:::i;:::-;8622:59;;8692:14;8723:4;:8;;;8709:4;:11;;;:22;;;;:::i;:::-;8692:39;;8742:135;8759:6;8749:7;:16;8742:135;;;8802:20;8814:7;8802:11;:20::i;:::-;8792:30;;:7;:30;:::i;:::-;8782:40;-1:-1:-1;8858:7:0;;;;:::i;:::-;;;;8742:135;;;-1:-1:-1;8896:5:0;;8473:436;-1:-1:-1;;;8473:436:0:o;8961:1260::-;9131:13;;9020:7;;;;9123:22;;1431:4;9172:26;;9168:1019;;;9210:1;9200:11;;9168:1019;;;1477:4;9231:25;;9227:960;;;9268:26;1431:4;9268:5;:26;:::i;:::-;:30;;9297:1;9268:30;:::i;:::-;9258:40;;9227:960;;;1522:4;9318:24;;9314:873;;;9413:4;9406:5;9402:16;9493:1;9485:6;9481:14;9471:24;;9633:7;9629:2;9625:16;9620:3;9616:26;9607:6;9601:13;9597:46;9731:1;9722:7;9718:15;9709:7;9705:29;9694:40;;;;9314:873;;;1566:4;9770:23;;9766:421;;;9820:24;1522:4;9820:5;:24;:::i;9766:421::-;9980:1;9968:14;;;;10021:13;10049:2;10045:16;;;9935:4;10045:16;10040:3;10036:26;10017:46;;10132:29;;;10145:15;10132:29;;10206:7;-1:-1:-1;;8961:1260:0:o;10974:796::-;11090:8;11086:21;;10974:796;;;:::o;11086:21::-;1604:2;11174:16;;11167:201;;11266:10;;11253:24;;11308:16;1604:2;11272:3;11308:16;:::i;:::-;;-1:-1:-1;11339:17:0;1604:2;11339:17;;:::i;:::-;;-1:-1:-1;11192:16:0;1604:2;11192:16;;:::i;:::-;;;11167:201;;;11384:8;11380:21;;10974:796;;;:::o;196:615:1:-;282:6;290;343:2;331:9;322:7;318:23;314:32;311:52;;;359:1;356;349:12;311:52;399:9;386:23;428:18;469:2;461:6;458:14;455:34;;;485:1;482;475:12;455:34;523:6;512:9;508:22;498:32;;568:7;561:4;557:2;553:13;549:27;539:55;;590:1;587;580:12;539:55;630:2;617:16;656:2;648:6;645:14;642:34;;;672:1;669;662:12;642:34;725:7;720:2;710:6;707:1;703:14;699:2;695:23;691:32;688:45;685:65;;;746:1;743;736:12;685:65;777:2;769:11;;;;;799:6;;-1:-1:-1;196:615:1;;-1:-1:-1;;;;196:615:1:o;816:273::-;872:6;925:2;913:9;904:7;900:23;896:32;893:52;;;941:1;938;931:12;893:52;980:9;967:23;1033:5;1026:13;1019:21;1012:5;1009:32;999:60;;1055:1;1052;1045:12;1094:180;1153:6;1206:2;1194:9;1185:7;1181:23;1177:32;1174:52;;;1222:1;1219;1212:12;1174:52;-1:-1:-1;1245:23:1;;1094:180;-1:-1:-1;1094:180:1:o;1702:154::-;1788:42;1781:5;1777:54;1770:5;1767:65;1757:93;;1846:1;1843;1836:12;1861:315;1929:6;1937;1990:2;1978:9;1969:7;1965:23;1961:32;1958:52;;;2006:1;2003;1996:12;1958:52;2045:9;2032:23;2064:31;2089:5;2064:31;:::i;:::-;2114:5;2166:2;2151:18;;;;2138:32;;-1:-1:-1;;;1861:315:1:o;2181:247::-;2240:6;2293:2;2281:9;2272:7;2268:23;2264:32;2261:52;;;2309:1;2306;2299:12;2261:52;2348:9;2335:23;2367:31;2392:5;2367:31;:::i;3200:184::-;3252:77;3249:1;3242:88;3349:4;3346:1;3339:15;3373:4;3370:1;3363:15;3389:334;3460:2;3454:9;3516:2;3506:13;;3521:66;3502:86;3490:99;;3619:18;3604:34;;3640:22;;;3601:62;3598:88;;;3666:18;;:::i;:::-;3702:2;3695:22;3389:334;;-1:-1:-1;3389:334:1:o;3728:245::-;3776:4;3809:18;3801:6;3798:30;3795:56;;;3831:18;;:::i;:::-;-1:-1:-1;3888:2:1;3876:15;3893:66;3872:88;3962:4;3868:99;;3728:245::o;3978:671::-;4046:6;4099:2;4087:9;4078:7;4074:23;4070:32;4067:52;;;4115:1;4112;4105:12;4067:52;4155:9;4142:23;4188:18;4180:6;4177:30;4174:50;;;4220:1;4217;4210:12;4174:50;4243:22;;4296:4;4288:13;;4284:27;-1:-1:-1;4274:55:1;;4325:1;4322;4315:12;4274:55;4361:2;4348:16;4386:48;4402:31;4430:2;4402:31;:::i;:::-;4386:48;:::i;:::-;4457:2;4450:5;4443:17;4497:7;4492:2;4487;4483;4479:11;4475:20;4472:33;4469:53;;;4518:1;4515;4508:12;4469:53;4573:2;4568;4564;4560:11;4555:2;4548:5;4544:14;4531:45;4617:1;4596:14;;;4612:2;4592:23;4585:34;;;;4600:5;3978:671;-1:-1:-1;;;;3978:671:1:o;4997:184::-;5049:77;5046:1;5039:88;5146:4;5143:1;5136:15;5170:4;5167:1;5160:15;5589:184;5641:77;5638:1;5631:88;5738:4;5735:1;5728:15;5762:4;5759:1;5752:15;5778:195;5817:3;5848:66;5841:5;5838:77;5835:103;;;5918:18;;:::i;:::-;-1:-1:-1;5965:1:1;5954:13;;5778:195::o;8696:258::-;8768:1;8778:113;8792:6;8789:1;8786:13;8778:113;;;8868:11;;;8862:18;8849:11;;;8842:39;8814:2;8807:10;8778:113;;;8909:6;8906:1;8903:13;8900:48;;;8944:1;8935:6;8930:3;8926:16;8919:27;8900:48;;8696:258;;;:::o;8959:431::-;9174:6;9169:3;9162:19;9144:3;9210:6;9204:13;9226:60;9279:6;9274:2;9269:3;9265:12;9260:2;9252:6;9248:15;9226:60;:::i;:::-;9345:2;9305:16;;9337:11;;;9330:27;;;;9381:2;9373:11;;8959:431;-1:-1:-1;;;8959:431:1:o;10970:634::-;11049:6;11102:2;11090:9;11081:7;11077:23;11073:32;11070:52;;;11118:1;11115;11108:12;11070:52;11151:9;11145:16;11184:18;11176:6;11173:30;11170:50;;;11216:1;11213;11206:12;11170:50;11239:22;;11292:4;11284:13;;11280:27;-1:-1:-1;11270:55:1;;11321:1;11318;11311:12;11270:55;11350:2;11344:9;11375:48;11391:31;11419:2;11391:31;:::i;11375:48::-;11446:2;11439:5;11432:17;11486:7;11481:2;11476;11472;11468:11;11464:20;11461:33;11458:53;;;11507:1;11504;11497:12;11458:53;11520:54;11571:2;11566;11559:5;11555:14;11550:2;11546;11542:11;11520:54;:::i;:::-;11593:5;10970:634;-1:-1:-1;;;;;10970:634:1:o;11609:560::-;11796:42;11788:6;11784:55;11773:9;11766:74;11876:2;11871;11860:9;11856:18;11849:30;11747:4;11908:6;11902:13;11951:6;11946:2;11935:9;11931:18;11924:34;11967:66;12026:6;12021:2;12010:9;12006:18;12001:2;11993:6;11989:15;11967:66;:::i;:::-;12085:2;12073:15;12090:66;12069:88;12054:104;;;;12160:2;12050:113;;11609:560;-1:-1:-1;;;11609:560:1:o;12174:228::-;12214:7;12340:1;12272:66;12268:74;12265:1;12262:81;12257:1;12250:9;12243:17;12239:105;12236:131;;;12347:18;;:::i;:::-;-1:-1:-1;12387:9:1;;12174:228::o;12407:125::-;12447:4;12475:1;12472;12469:8;12466:34;;;12480:18;;:::i;:::-;-1:-1:-1;12517:9:1;;12407:125::o;12537:128::-;12577:3;12608:1;12604:6;12601:1;12598:13;12595:39;;;12614:18;;:::i;:::-;-1:-1:-1;12650:9:1;;12537:128::o;12852:497::-;12958:6;12966;12974;12982;12990;13043:3;13031:9;13022:7;13018:23;13014:33;13011:53;;;13060:1;13057;13050:12;13011:53;13089:9;13083:16;13073:26;;13139:2;13128:9;13124:18;13118:25;13108:35;;13183:2;13172:9;13168:18;13162:25;13152:35;;13227:2;13216:9;13212:18;13206:25;13196:35;;13274:3;13263:9;13259:19;13253:26;13288:31;13313:5;13288:31;:::i;:::-;13338:5;13328:15;;;12852:497;;;;;;;;:::o;14094:184::-;14146:77;14143:1;14136:88;14243:4;14240:1;14233:15;14267:4;14264:1;14257:15;14283:112;14315:1;14341;14331:35;;14346:18;;:::i;:::-;-1:-1:-1;14380:9:1;;14283:112::o;14400:120::-;14440:1;14466;14456:35;;14471:18;;:::i;:::-;-1:-1:-1;14505:9:1;;14400:120::o;14525:157::-;14555:1;14589:4;14586:1;14582:12;14613:3;14603:37;;14620:18;;:::i;:::-;14672:3;14665:4;14662:1;14658:12;14654:22;14649:27;;;14525:157;;;;:::o;14687:165::-;14725:1;14759:4;14756:1;14752:12;14783:3;14773:37;;14790:18;;:::i;:::-;14842:3;14835:4;14832:1;14828:12;14824:22;14819:27;;;14687:165;;;;:::o;14857:482::-;14946:1;14989:5;14946:1;15003:330;15024:7;15014:8;15011:21;15003:330;;;15143:4;15075:66;15071:77;15065:4;15062:87;15059:113;;;15152:18;;:::i;:::-;15202:7;15192:8;15188:22;15185:55;;;15222:16;;;;15185:55;15301:22;;;;15261:15;;;;15003:330;;;15007:3;14857:482;;;;;:::o;15344:866::-;15393:5;15423:8;15413:80;;-1:-1:-1;15464:1:1;15478:5;;15413:80;15512:4;15502:76;;-1:-1:-1;15549:1:1;15563:5;;15502:76;15594:4;15612:1;15607:59;;;;15680:1;15675:130;;;;15587:218;;15607:59;15637:1;15628:10;;15651:5;;;15675:130;15712:3;15702:8;15699:17;15696:43;;;15719:18;;:::i;:::-;-1:-1:-1;;15775:1:1;15761:16;;15790:5;;15587:218;;15889:2;15879:8;15876:16;15870:3;15864:4;15861:13;15857:36;15851:2;15841:8;15838:16;15833:2;15827:4;15824:12;15820:35;15817:77;15814:159;;;-1:-1:-1;15926:19:1;;;15958:5;;15814:159;16005:34;16030:8;16024:4;16005:34;:::i;:::-;16135:6;16067:66;16063:79;16054:7;16051:92;16048:118;;;16146:18;;:::i;:::-;16184:20;;15344:866;-1:-1:-1;;;15344:866:1:o;16215:131::-;16275:5;16304:36;16331:8;16325:4;16304:36;:::i;17302:195::-;17340:4;17377;17374:1;17370:12;17409:4;17406:1;17402:12;17434:3;17429;17426:12;17423:38;;;17441:18;;:::i;:::-;17478:13;;;17302:195;-1:-1:-1;;;17302:195:1:o
Swarm Source
ipfs://525dc0e88414b7326bd513ba35a8439396dca1f584548c353c39dd319a64526c
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.