Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 2,892 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Update Sigil | 16375456 | 732 days ago | IN | 0 ETH | 0.00098316 | ||||
Update Sigil | 15802299 | 812 days ago | IN | 0 ETH | 0.00109051 | ||||
Update Sigil | 15432659 | 866 days ago | IN | 0 ETH | 0.00071144 | ||||
Update Sigil | 14896032 | 953 days ago | IN | 0 ETH | 0.00349075 | ||||
Update Sigil | 14896031 | 953 days ago | IN | 0 ETH | 0.00343119 | ||||
Update Sigil | 14896026 | 953 days ago | IN | 0 ETH | 0.00336549 | ||||
Update Sigil | 14896025 | 953 days ago | IN | 0 ETH | 0.00334969 | ||||
Update Sigil | 14896023 | 953 days ago | IN | 0 ETH | 0.00267739 | ||||
Update Sigil | 14881482 | 955 days ago | IN | 0 ETH | 0.00336435 | ||||
Update Sigil | 14715699 | 982 days ago | IN | 0 ETH | 0.00201941 | ||||
Update Sigil | 14715688 | 982 days ago | IN | 0 ETH | 0.00187941 | ||||
Update Sigil | 14674764 | 988 days ago | IN | 0 ETH | 0.00391133 | ||||
Update Sigil | 14557628 | 1007 days ago | IN | 0 ETH | 0.00143957 | ||||
Update Sigil | 14557625 | 1007 days ago | IN | 0 ETH | 0.00117199 | ||||
Update Sigil | 14557602 | 1007 days ago | IN | 0 ETH | 0.0014722 | ||||
Update Sigil | 14557533 | 1007 days ago | IN | 0 ETH | 0.0013547 | ||||
Update Sigil | 14557486 | 1007 days ago | IN | 0 ETH | 0.00144828 | ||||
Update Sigil | 14543167 | 1009 days ago | IN | 0 ETH | 0.00281582 | ||||
Update Sigil | 14537992 | 1010 days ago | IN | 0 ETH | 0.00332354 | ||||
Update Sigil | 14531908 | 1011 days ago | IN | 0 ETH | 0.00258609 | ||||
Update Sigil | 14498189 | 1016 days ago | IN | 0 ETH | 0.00416424 | ||||
Update Sigil | 14455312 | 1023 days ago | IN | 0 ETH | 0.00164572 | ||||
Update Sigil | 14453451 | 1023 days ago | IN | 0 ETH | 0.00164281 | ||||
Update Sigil | 14449753 | 1024 days ago | IN | 0 ETH | 0.00363968 | ||||
Update Sigil | 14441531 | 1025 days ago | IN | 0 ETH | 0.00134515 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MorphsEngine
Compiler Version
v0.8.12+commit.f00d7308
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* ███╗ ███╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗███████╗ ████╗ ████║██╔═══██╗██╔══██╗██╔══██╗██║ ██║██╔════╝ ██╔████╔██║██║ ██║██████╔╝██████╔╝███████║███████╗ ██║╚██╔╝██║██║ ██║██╔══██╗██╔═══╝ ██╔══██║╚════██║ ██║ ╚═╝ ██║╚██████╔╝██║ ██║██║ ██║ ██║███████║ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝╚══════╝ Genesis II - 2022-02-25 https://morphs.wtf Dreamt up and built at Playgrounds <https://playgrounds.wtf> Powered by shell <https://heyshell.xyz> Designed by @polyforms_ <https://twitter.com/polyforms_> --- This is the second official Morphs engine from Playgrounds 🪐 It adds a few twists for the final days of minting and leaves some open ended ideas to explore in future engines. You are free to iterate on any Morphs tokens you own! If others like the updates you've made to the project, they could join your fork too. Join us in the lab: https://discord.gg/uskZYttHw6 */ import "@r-group/shell-contracts/contracts/engines/ShellBaseEngine.sol"; import "@r-group/shell-contracts/contracts/engines/OnChainMetadataEngine.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; contract MorphsEngine is ShellBaseEngine, OnChainMetadataEngine { /// @notice Attempted mint after minting period has ended error MintingPeriodHasEnded(); /// @notice Attempted cutover for a collection that already switched, or /// from incorrect msg sender error InvalidCutover(); /// @notice Some actions require msg.sender to own the token being /// interacting with error NotTokenOwner(); /// @notice Morphs only works with ERC-721s for now, since we are allowing /// owner-specific behavior with sigils and balance checks for entangled /// Morphs. It could be made compat with ERC-1155s with some finessing if desired error InvalidCollection(); /// @notice Sigil attempted to be set that didnt pass verification error InvalidSigil(); /// @notice Can't mint after March 1st midnight CST uint256 public constant MINTING_ENDS_AT_TIMESTAMP = 1646114400; /// @notice Displayed on heyshell.xyz function name() external pure returns (string memory) { return "morphs-v2"; } /// @notice Mint a morph! /// @param flag Permenantly written into the NFT. Cannot be modified after mint function mint(IShellFramework collection, uint256 flag) external returns (uint256) { // solhint-disable-next-line not-rely-on-time if (block.timestamp >= MINTING_ENDS_AT_TIMESTAMP) { revert MintingPeriodHasEnded(); } IntStorage[] memory intData; // flag is written to token mint data if set if (flag != 0) { intData = new IntStorage[](1); intData[0] = IntStorage({key: "flag", value: flag}); } else { intData = new IntStorage[](0); } uint256 tokenId = collection.mint( MintEntry({ to: msg.sender, amount: 1, options: MintOptions({ storeEngine: false, storeMintedTo: false, storeTimestamp: false, storeBlockNumber: false, stringData: new StringStorage[](0), intData: intData }) }) ); return tokenId; } /// @notice Mint several Morphs in a single transaction (flag=0 for all) function batchMint(IShellFramework collection, uint256 count) external { // solhint-disable-next-line not-rely-on-time if (block.timestamp >= MINTING_ENDS_AT_TIMESTAMP) { revert MintingPeriodHasEnded(); } StringStorage[] memory stringData = new StringStorage[](0); IntStorage[] memory intData = new IntStorage[](0); for (uint256 i = 0; i < count; i++) { collection.mint( MintEntry({ to: msg.sender, amount: 1, options: MintOptions({ storeEngine: false, storeMintedTo: false, storeTimestamp: false, storeBlockNumber: false, stringData: stringData, intData: intData }) }) ); } } /// @notice start using the new token rolling logic, can only be called once /// and by the root fork owner of the collection function cutover(IShellFramework collection) external { if (collection.readForkInt(StorageLocation.ENGINE, 0, "cutover") != 0) { revert InvalidCutover(); } if (msg.sender != collection.getForkOwner(0)) { revert InvalidCutover(); } // cutover token = next token ID, all future tokens will use new algo collection.writeForkInt( StorageLocation.ENGINE, 0, "cutover", collection.nextTokenId() ); } /// @notice Owner of a token may write a "sigil" string value to token /// storage at any time function updateSigil( IShellFramework collection, uint256 tokenId, string memory sigil ) external { IERC721 erc721 = IERC721(address(collection)); if (erc721.ownerOf(tokenId) != msg.sender) { revert NotTokenOwner(); } if (bytes(sigil).length > 8) { revert InvalidSigil(); } collection.writeTokenString( StorageLocation.ENGINE, tokenId, "sigil", sigil ); } /// @dev because of the owner semantics, we want to be able to assume the /// collection is a 721 function afterEngineSet(uint256) external view override(IEngine, ShellBaseEngine) { IShellFramework collection = IShellFramework(msg.sender); bool is721 = collection.supportsInterface(type(IERC721).interfaceId); if (!is721) { revert InvalidCollection(); } } /// @notice Gets the flag value written at mint time for a specific NFT function getFlag(IShellFramework collection, uint256 tokenId) public view returns (uint256) { return collection.readTokenInt(StorageLocation.MINT_DATA, tokenId, "flag"); } /// @notice Returns true if this token was minted after the engine cutover function isCutoverToken(IShellFramework collection, uint256 tokenId) public view returns (bool) { uint256 transitionTokenId = collection.readForkInt( StorageLocation.ENGINE, 0, "cutover" ); return transitionTokenId != 0 && tokenId >= transitionTokenId; } /// @notice Get the palette index (1-based) for a specific token function getPaletteIndex(IShellFramework collection, uint256 tokenId) public view returns (uint256) { // new logic, select palette 7-24 if (isCutoverToken(collection, tokenId)) { return selectInRange(tokenId, 7, 24); } // OG logic - only selects palette 1-6 return selectInRange(tokenId, 1, 6); } /// @notice Get the edition index (0-based) for a specific token function getEditionIndex(IShellFramework collection, uint256 tokenId) public view returns (uint256) { uint256 flag = getFlag(collection, tokenId); bool isCutover = isCutoverToken(collection, tokenId); // celestial = always use 0th edition if (flag > 2) { return 0; } // OG tokens always = edition 1 if (!isCutover) { return 1; } // else, edition is strictly a function of the palette // palette will be 7-24 since this is a post-cutover token uint256 palette = getPaletteIndex(collection, tokenId); if (palette < 13) { return 2; } if (palette < 19) { return 3; } return 4; } /// @notice Get the variation for a specific token function getVariation(IShellFramework collection, uint256 tokenId) public view returns (string memory) { bool isCutover = isCutoverToken(collection, tokenId); uint256 flag = getFlag(collection, tokenId); // all celestials (old and new) roll a variation based on flag value if (flag > 2) { // 5 celestials, Z1-Z5 return string.concat("Z", Strings.toString(selectInRange(flag, 1, 5))); } // OG logic if (!isCutover) { if (flag == 2) { // Only 1 OG cosmic return "X1"; } else if (flag == 1) { // 4 OG mythicals, M1-M4 return string.concat( "M", Strings.toString(selectInRange(tokenId, 1, 4)) ); } // 10 OG citizen, C1-C10 return string.concat( "C", Strings.toString(selectInRange(tokenId, 1, 10)) ); } // post-cutover logic if (flag == 2) { // 4 new cosmic, X2-5 return string.concat( "X", Strings.toString(selectInRange(tokenId, 2, 5)) ); } else if (flag == 1) { // 11 new mythicals, M5-15 return string.concat( "M", Strings.toString(selectInRange(tokenId, 5, 15)) ); } // 15 new citizens, C11-25 return string.concat( "C", Strings.toString(selectInRange(tokenId, 11, 25)) ); } /// @dev return a number between lower and upper, inclusive... based on seed function selectInRange( uint256 seed, uint256 lower, uint256 upper ) private pure returns (uint256) { uint256 i = uint256(keccak256(abi.encodePacked(seed))) % (upper - lower + 1); return lower + i; } /// @notice Get the name of a palette by index function getPaletteName(uint256 index) public pure returns (string memory) { if (index == 1) { return "Greyskull"; } else if (index == 2) { return "Ancient Opinions"; } else if (index == 3) { return "The Desert Sun"; } else if (index == 4) { return "The Deep"; } else if (index == 5) { return "The Jade Prism"; } else if (index == 6) { return "Cosmic Understanding"; } else if (index == 7) { return "Ancient Grudges"; } else if (index == 8) { return "Radiant Beginnings"; } else if (index == 9) { return "Desert Sand"; } else if (index == 10) { return "Arcane Slate"; } else if (index == 11) { return "The Vibrant Forest"; } else if (index == 12) { return "Evening Star"; } else if (index == 13) { return "Dawn"; } else if (index == 14) { return "Calm Air"; } else if (index == 15) { return "Solarion"; } else if (index == 16) { return "Morning Sun"; } else if (index == 17) { return "Emerald"; } else if (index == 18) { return "Stellaris"; } else if (index == 19) { return "Future Island"; } else if (index == 20) { return "Scorched Emerald"; } else if (index == 21) { return "Stone"; } else if (index == 22) { return "The Night Sky"; } else if (index == 23) { return "The Beacon"; } else if (index == 24) { return "Blackskull"; } return ""; } /// @notice Read the sigil value in storage for a specific token function getSigil(IShellFramework collection, uint256 tokenId) public view returns (string memory) { return collection.readTokenString( StorageLocation.ENGINE, tokenId, "sigil" ); } /// @notice Returns true if a token has an address as a flag that has at /// least 1 Morph function isEntangled(IShellFramework collection, uint256 tokenId) public view returns (bool) { uint256 flag = getFlag(collection, tokenId); IERC721 erc721 = IERC721(address(collection)); address subject = address(uint160(flag)); return flag > 0 && erc721.balanceOf(subject) > 0; } function _computeName(IShellFramework collection, uint256 tokenId) internal view override returns (string memory) { uint256 flag = getFlag(collection, tokenId); bool entangled = isEntangled(collection, tokenId); return string( abi.encodePacked( "Morph #", Strings.toString(tokenId), entangled ? ": Entangled Scroll of " : flag > 2 ? ": Celestial Scroll of " : flag == 2 ? ": Cosmic Scroll of " : flag == 1 ? ": Mythical Scroll of " : ": Scroll of ", getPaletteName(getPaletteIndex(collection, tokenId)) ) ); } function _computeDescription(IShellFramework collection, uint256 tokenId) internal view override returns (string memory) { uint256 flag = getFlag(collection, tokenId); return string.concat( flag > 2 ? "A mysterious scroll... you feel it pulsating with celestial energy. Its presence bridges the gap between old and new." : flag == 2 ? "A mysterious scroll... you feel it pulsating with cosmic energy. Its whispers speak secrets of cosmic significance." : flag == 1 ? "A mysterious scroll... you feel it pulsating with mythical energy. You sense its power is great." : "A mysterious scroll... you feel it pulsating with energy. What secrets might it hold?", isEntangled(collection, tokenId) ? string.concat( "\\n\\nThis Morph is entangled with address ", Strings.toHexString(flag) ) : flag > 2 ? string.concat( "\\n\\nEternal celestial signature: ", Strings.toString(flag) ) : "", isCutoverToken(collection, tokenId) ? "\\n\\nThis Morph was minted in the Genesis II era." : "\\n\\nThis Morph was minted in the Genesis I era.", "\\n\\nhttps://playgrounds.wtf" ); } // compute the metadata image field for a given token function _computeImageUri(IShellFramework collection, uint256 tokenId) internal view override returns (string memory) { uint256 edition = getEditionIndex(collection, tokenId); uint256 palette = getPaletteIndex(collection, tokenId); string memory variation = getVariation(collection, tokenId); string memory image = string.concat( "S", Strings.toString(edition), "-", "P", Strings.toString(palette), "-", variation, ".png" ); return string.concat( "ipfs://ipfs/QmeQi6Ufs4JyrMR54o9TRraKMRhp1MTL2Bn811ad8Y7kK1/", image ); } // compute the external_url field for a given token function _computeExternalUrl(IShellFramework, uint256) internal pure override returns (string memory) { return "https://morphs.wtf"; } function _computeAttributes(IShellFramework collection, uint256 tokenId) internal view override returns (Attribute[] memory) { uint256 palette = getPaletteIndex(collection, tokenId); string memory sigil = getSigil(collection, tokenId); Attribute[] memory attributes = new Attribute[](8); attributes[0] = Attribute({ key: "Palette", value: getPaletteName(palette) }); attributes[1] = Attribute({ key: "Variation", value: getVariation(collection, tokenId) }); uint256 flag = getFlag(collection, tokenId); attributes[2] = Attribute({ key: "Affinity", value: flag > 2 ? "Celestial" : flag == 2 ? "Cosmic" : flag == 1 ? "Mythical" : "Citizen" }); attributes[3] = Attribute({ key: "Era", value: isCutoverToken(collection, tokenId) ? "Genesis II" : "Genesis I" }); attributes[4] = Attribute({ key: "Signature", value: flag > 2 ? Strings.toString(flag) : "None" }); attributes[5] = Attribute({ key: "Group", value: string.concat( "Group ", Strings.toString(getEditionIndex(collection, tokenId)) ) }); attributes[6] = Attribute({ key: "Sigil", value: bytes(sigil).length > 0 ? sigil : "Unaligned" }); attributes[7] = Attribute({ key: "Quantum Status", value: isEntangled(collection, tokenId) ? "Entangled" : "Independent" }); return attributes; } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/interfaces/IERC165.sol"; import "../IEngine.sol"; // simple starting point for engines // - default name // - proper erc165 support // - no royalties // - nop on beforeTokenTransfer and afterEngineSet hooks abstract contract ShellBaseEngine is IEngine { // nop function beforeTokenTransfer( address, address, address, uint256, uint256 ) external pure virtual override { return; } // nop function afterEngineSet(uint256) external view virtual override { return; } // no royalties function getRoyaltyInfo( IShellFramework, uint256, uint256 ) external view virtual returns (address receiver, uint256 royaltyAmount) { receiver = address(0); royaltyAmount = 0; } function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { return interfaceId == type(IEngine).interfaceId || interfaceId == type(IERC165).interfaceId; } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../libraries/Base64.sol"; import "../IShellFramework.sol"; import "../IEngine.sol"; struct Attribute { string key; string value; } abstract contract OnChainMetadataEngine is IEngine { // Called by the collection to resolve a response for tokenURI function getTokenURI(IShellFramework collection, uint256 tokenId) external view returns (string memory) { string memory name = _computeName(collection, tokenId); string memory description = _computeDescription(collection, tokenId); string memory image = _computeImageUri(collection, tokenId); string memory externalUrl = _computeExternalUrl(collection, tokenId); Attribute[] memory attributes = _computeAttributes(collection, tokenId); string memory attributesInnerJson = ""; for (uint256 i = 0; i < attributes.length; i++) { attributesInnerJson = string( bytes( abi.encodePacked( attributesInnerJson, i > 0 ? ", " : "", '{"trait_type": "', attributes[i].key, '", "value": "', attributes[i].value, '"}' ) ) ); } return string( abi.encodePacked( "data:application/json;base64,", Base64.encode( bytes( abi.encodePacked( '{"name":"', name, '", "description":"', description, '", "image": "', image, '", "external_url": "', externalUrl, '", "attributes": [', attributesInnerJson, "]}" ) ) ) ) ); } // compute the metadata name for a given token function _computeName(IShellFramework collection, uint256 tokenId) internal view virtual returns (string memory); // compute the metadata description for a given token function _computeDescription(IShellFramework collection, uint256 tokenId) internal view virtual returns (string memory); // compute the metadata image field for a given token function _computeImageUri(IShellFramework collection, uint256 tokenId) internal view virtual returns (string memory); // compute the external_url field for a given token function _computeExternalUrl(IShellFramework collection, uint256 tokenId) internal view virtual returns (string memory); function _computeAttributes(IShellFramework collection, uint256 token) internal view virtual returns (Attribute[] memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @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`, 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol";
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/interfaces/IERC165.sol"; import "./IShellFramework.sol"; // Required interface for framework engines // interfaceId = 0x0b1d171c interface IEngine is IERC165 { // Get the name for this engine function name() external pure returns (string memory); // Called by the framework to resolve a response for tokenURI method function getTokenURI(IShellFramework collection, uint256 tokenId) external view returns (string memory); // Called by the framework to resolve a response for royaltyInfo method function getRoyaltyInfo( IShellFramework collection, uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); // Called by the framework during a transfer, including mints (from=0) and // burns (to=0). Cannot break transfer even in the case of reverting, as the // collection will wrap the downstream call in a try/catch // collection = msg.sender function beforeTokenTransfer( address operator, address from, address to, uint256 tokenId, uint256 amount ) external; // Called by the framework whenever an engine is set on a fork, including // the collection (fork id = 0). Can be used by engine developers to prevent // an engine from being installed in a collection or non-canonical fork if // desired // collection = msg.sender function afterEngineSet(uint256 forkId) external; }
// SPDX-License-Identifier: MIT // 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); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/interfaces/IERC165.sol"; import "@openzeppelin/contracts/interfaces/IERC2981.sol"; import "./libraries/IOwnable.sol"; import "./IEngine.sol"; // storage flag enum StorageLocation { INVALID, // set by the engine at any time, mutable ENGINE, // set by the engine during minting, immutable MINT_DATA, // set by the framework during minting or collection creation, immutable FRAMEWORK } // string key / value struct StringStorage { string key; string value; } // int key / value struct IntStorage { string key; uint256 value; } // data provided when minting a new token struct MintEntry { address to; uint256 amount; MintOptions options; } // Data provided by engine when minting a new token struct MintOptions { bool storeEngine; bool storeMintedTo; bool storeTimestamp; bool storeBlockNumber; StringStorage[] stringData; IntStorage[] intData; } // Information about a fork struct Fork { IEngine engine; address owner; } // Interface for every collection launched by shell. // Concrete implementations must return true on ERC165 checks for this interface // (as well as erc165 / 2981) // interfaceId = TBD interface IShellFramework is IERC165, IERC2981 { // --- // Framework errors // --- // an engine was provided that did no pass the expected erc165 checks error InvalidEngine(); // a write was attempted that is not allowed error WriteNotAllowed(); // an operation was attempted but msg.sender was not the expected engine error SenderNotEngine(); // an operation was attempted but msg.sender was not the fork owner error SenderNotForkOwner(); // a token fork was attempted by an invalid msg.sender error SenderCannotFork(); // --- // Framework events // --- // a fork was created event ForkCreated(uint256 forkId, IEngine engine, address owner); // a fork had a new engine installed event ForkEngineUpdated(uint256 forkId, IEngine engine); // a fork had a new owner set event ForkOwnerUpdated(uint256 forkId, address owner); // a token has been set to a new fork event TokenForkUpdated(uint256 tokenId, uint256 forkId); // --- // Storage events // --- // A fork string was stored event ForkStringUpdated( StorageLocation location, uint256 forkId, string key, string value ); // A fork int was stored event ForkIntUpdated( StorageLocation location, uint256 forkId, string key, uint256 value ); // A token string was stored event TokenStringUpdated( StorageLocation location, uint256 tokenId, string key, string value ); // A token int was stored event TokenIntUpdated( StorageLocation location, uint256 tokenId, string key, uint256 value ); // --- // Collection base // --- // called immediately after cloning function initialize( string calldata name, string calldata symbol, IEngine engine, address owner ) external; // --- // General collection info / metadata // --- // collection owner (fork 0 owner) function owner() external view returns (address); // collection name function name() external view returns (string memory); // collection name function symbol() external view returns (string memory); // next token id serial number function nextTokenId() external view returns (uint256); // next fork id serial number function nextForkId() external view returns (uint256); // --- // Fork functionality // --- // Create a new fork with a specific engine, fork all the tokenIds to the // new engine, and return the fork ID function createFork( IEngine engine, address owner, uint256[] calldata tokenIds ) external returns (uint256); // Set the engine for a specific fork. Must be fork owner function setForkEngine(uint256 forkId, IEngine engine) external; // Set the fork owner. Must be fork owner function setForkOwner(uint256 forkId, address owner) external; // Set the fork of a specific token. Must be token owner function setTokenFork(uint256 tokenId, uint256 forkId) external; // Set the fork for several tokens. Must own all tokens function setTokenForks(uint256[] memory tokenIds, uint256 forkId) external; // --- // Fork views // --- // Get information about a fork function getFork(uint256 forkId) external view returns (Fork memory); // Get a fork's engine function getForkEngine(uint256 forkId) external view returns (IEngine); // Get a fork's owner function getForkOwner(uint256 forkId) external view returns (address); // Get a token's fork ID function getTokenForkId(uint256 tokenId) external view returns (uint256); // Get a token's engine. getFork(getTokenForkId(tokenId)).engine function getTokenEngine(uint256 tokenId) external view returns (IEngine); // Determine if a given msg.sender can fork a token function canSenderForkToken(address sender, uint256 tokenId) external view returns (bool); // --- // Engine functionality // --- // mint new tokens. Only callable by collection engine function mint(MintEntry calldata entry) external returns (uint256); // --- // Storage writes // --- // Write a string to collection storage. Only callable by collection engine function writeForkString( StorageLocation location, uint256 forkId, string calldata key, string calldata value ) external; // Write a string to collection storage. Only callable by collection engine function writeForkInt( StorageLocation location, uint256 forkId, string calldata key, uint256 value ) external; // Write a string to token storage. Only callable by token engine function writeTokenString( StorageLocation location, uint256 tokenId, string calldata key, string calldata value ) external; // Write a string to token storage. Only callable by token engine function writeTokenInt( StorageLocation location, uint256 tokenId, string calldata key, uint256 value ) external; // --- // Storage reads // --- // Read a string from collection storage function readForkString( StorageLocation location, uint256 forkId, string calldata key ) external view returns (string memory); // Read a uint256 from collection storage function readForkInt( StorageLocation location, uint256 forkId, string calldata key ) external view returns (uint256); // Read a string from token storage function readTokenString( StorageLocation location, uint256 tokenId, string calldata key ) external view returns (string memory); // Read a uint256 from token storage function readTokenInt( StorageLocation location, uint256 tokenId, string calldata key ) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // (semi) standard ownable interface interface IOwnable { event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); function owner() external view returns (address); function renounceOwnership() external; function transferOwnership(address newOwner) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // https://github.com/Brechtpd/base64/blob/main/base64.sol /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides a function for encoding some bytes in base64 library Base64 { string internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ""; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for { } lt(dataPtr, endPtr) { } { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(input, 0x3F)))) ) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"InvalidCollection","type":"error"},{"inputs":[],"name":"InvalidCutover","type":"error"},{"inputs":[],"name":"InvalidSigil","type":"error"},{"inputs":[],"name":"MintingPeriodHasEnded","type":"error"},{"inputs":[],"name":"NotTokenOwner","type":"error"},{"inputs":[],"name":"MINTING_ENDS_AT_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"afterEngineSet","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IShellFramework","name":"collection","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"beforeTokenTransfer","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"contract IShellFramework","name":"collection","type":"address"}],"name":"cutover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IShellFramework","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getEditionIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IShellFramework","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFlag","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IShellFramework","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPaletteIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPaletteName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"contract IShellFramework","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getRoyaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IShellFramework","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSigil","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IShellFramework","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IShellFramework","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getVariation","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IShellFramework","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isCutoverToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IShellFramework","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isEntangled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IShellFramework","name":"collection","type":"address"},{"internalType":"uint256","name":"flag","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"contract IShellFramework","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"sigil","type":"string"}],"name":"updateSigil","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613071806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806343508b05116100ad578063cd0cc7ff11610071578063cd0cc7ff14610295578063d70dee32146102a0578063dd2abcc0146102b5578063e0d07021146102c8578063e7504d0d146102db57600080fd5b806343508b051461023457806359fbbdec146102495780637e0c93ac1461025c578063ab5c45661461026f578063adce53201461028257600080fd5b80630b63fd62116100f45780630b63fd62146101b05780631d00b7c4146101c357806336de9742146101d65780633b9978031461020e57806340c10f191461022157600080fd5b806301ffc9a71461012657806305b8cd591461014e57806306fdde031461016f5780630b5387901461019d575b600080fd5b6101396101343660046121e0565b6102ee565b60405190151581526020015b60405180910390f35b61016161015c366004612222565b610325565b604051908152602001610145565b60408051808201909152600981526836b7b938343996bb1960b91b60208201525b60405161014591906122aa565b6101396101ab366004612222565b61035e565b6101906101be366004612222565b6103f3565b6101396101d1366004612222565b610587565b6101ef6101e43660046122bd565b506000928392509050565b604080516001600160a01b039093168352602083019190915201610145565b61019061021c366004612222565b610614565b61016161022f366004612222565b61068b565b610247610242366004612222565b6108bf565b005b6102476102573660046122f2565b610a39565b61019061026a366004612222565b610c23565b61024761027d36600461237e565b610d7d565b610161610290366004612222565b610e9d565b61016163621db66081565b6102476102ae36600461241a565b5050505050565b6101616102c3366004612222565b610f10565b6101906102d6366004612475565b610f95565b6102476102e9366004612475565b61143c565b60006001600160e01b031982166302c745c760e21b148061031f57506001600160e01b031982166301ffc9a760e01b145b92915050565b60006103318383610587565b1561034a5761034382600760186114cc565b905061031f565b61035782600160066114cc565b9392505050565b60008061036b8484610e9d565b9050838180158015906103e957506040516370a0823160e01b81526001600160a01b038281166004830152600091908416906370a0823190602401602060405180830381865afa1580156103c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e7919061248e565b115b9695505050505050565b60606000610401848461151f565b9050600061040f8585611674565b9050600061041d8686611801565b90506000610450604080518082019091526012815271343a3a38399d1797b6b7b9383439973bba3360711b602082015290565b9050600061045e8888611891565b60408051602081019091526000808252919250905b825181101561052957816000821161049a57604051806020016040528060008152506104b6565b60405180604001604052806002815260200161016160f51b8152505b8483815181106104c8576104c86124a7565b6020026020010151600001518584815181106104e6576104e66124a7565b60200260200101516020015160405160200161050594939291906124bd565b6040516020818303038152906040529150808061052190612570565b915050610473565b5061055a868686868560405160200161054695949392919061258b565b604051602081830303815290604052611d8b565b60405160200161056a919061269c565b604051602081830303815290604052965050505050505092915050565b600080836001600160a01b03166329ca6379600160006040518363ffffffff1660e01b81526004016105ba929190612703565b602060405180830381865afa1580156105d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fb919061248e565b9050801580159061060c5750808310155b949350505050565b604051631a87c60f60e21b81526060906001600160a01b03841690636a1f183c9061064690600190869060040161273d565b600060405180830381865afa158015610663573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103579190810190612775565b600063621db66042106106b157604051638ea4cb3960e01b815260040160405180910390fd5b606082156107455760408051600180825281830190925290816020015b6040805180820190915260608152600060208201528152602001906001900390816106ce57505060408051608081018252600491810191825263666c616760e01b6060820152908152602081018590528151919250908290600090610735576107356124a7565b6020026020010181905250610787565b6040805160008082526020820190925290610783565b60408051808201909152606081526000602082015281526020019060019003908161075b5790505b5090505b6000846001600160a01b031663c5407b8a6040518060600160405280336001600160a01b03168152602001600181526020016040518060c00160405280600015158152602001600015158152602001600015158152602001600015158152602001600067ffffffffffffffff8111156108025761080261230f565b60405190808252806020026020018201604052801561084757816020015b60408051808201909152606080825260208201528152602001906001900390816108205790505b50815260200187905290526040516001600160e01b031960e084901b16815261087391906004016128bc565b6020604051808303816000875af1158015610892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b6919061248e565b95945050505050565b63621db66042106108e357604051638ea4cb3960e01b815260040160405180910390fd5b6040805160008082526020820190925281610920565b60408051808201909152606080825260208201528152602001906001900390816108f95790505b50604080516000808252602082019092529192509081610963565b60408051808201909152606081526000602082015281526020019060019003908161093b5790505b50905060005b838110156102ae5760408051606080820183523382526001602080840191909152835160c0810185526000808252918101829052808501829052918201526080810186905260a081018590528183015290516362a03dc560e11b81526001600160a01b0387169163c5407b8a916109e391906004016128bc565b6020604051808303816000875af1158015610a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a26919061248e565b5080610a3181612570565b915050610969565b6040516329ca637960e01b81526001600160a01b038216906329ca637990610a6990600190600090600401612703565b602060405180830381865afa158015610a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaa919061248e565b15610ac857604051636be354d760e01b815260040160405180910390fd5b60405163bbcdc54360e01b8152600060048201526001600160a01b0382169063bbcdc54390602401602060405180830381865afa158015610b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b31919061294e565b6001600160a01b0316336001600160a01b031614610b6257604051636be354d760e01b815260040160405180910390fd5b806001600160a01b0316638005f3fc60016000846001600160a01b03166375794a3c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd7919061248e565b6040518463ffffffff1660e01b8152600401610bf59392919061296b565b600060405180830381600087803b158015610c0f57600080fd5b505af11580156102ae573d6000803e3d6000fd5b60606000610c318484610587565b90506000610c3f8585610e9d565b90506002811115610c8757610c5f610c5a82600160056114cc565b611ef3565b604051602001610c6f91906129b5565b6040516020818303038152906040529250505061031f565b81610d02578060021415610cb95760405180604001604052806002815260200161583160f01b8152509250505061031f565b8060011415610ce257610cd2610c5a85600160046114cc565b604051602001610c6f91906129de565b610cf2610c5a856001600a6114cc565b604051602001610c6f91906129fa565b8060021415610d2b57610d1b610c5a85600260056114cc565b604051602001610c6f9190612a16565b8060011415610d4457610cd2610c5a856005600f6114cc565b610d54610c5a85600b60196114cc565b604051602001610d6491906129fa565b6040516020818303038152906040529250505092915050565b6040516331a9108f60e11b815260048101839052839033906001600160a01b03831690636352211e90602401602060405180830381865afa158015610dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dea919061294e565b6001600160a01b031614610e11576040516359dc379f60e01b815260040160405180910390fd5b600882511115610e3457604051633984b6c360e01b815260040160405180910390fd5b604051630abd4bcb60e21b81526001600160a01b03851690632af52f2c90610e659060019087908790600401612a32565b600060405180830381600087803b158015610e7f57600080fd5b505af1158015610e93573d6000803e3d6000fd5b5050505050505050565b60405163f8bbb59b60e01b81526000906001600160a01b0384169063f8bbb59b90610ecf906002908690600401612a7c565b602060405180830381865afa158015610eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610357919061248e565b600080610f1d8484610e9d565b90506000610f2b8585610587565b90506002821115610f415760009250505061031f565b80610f515760019250505061031f565b6000610f5d8686610325565b9050600d811015610f74576002935050505061031f565b6013811015610f89576003935050505061031f565b50600495945050505050565b60608160011415610fc557505060408051808201909152600981526811dc995e5cdadd5b1b60ba1b602082015290565b8160021415610ffa57505060408051808201909152601081526f416e6369656e74204f70696e696f6e7360801b602082015290565b816003141561102d57505060408051808201909152600e81526d2a3432902232b9b2b93a1029bab760911b602082015290565b816004141561105a575050604080518082019091526008815267054686520446565760c41b602082015290565b816005141561108d57505060408051808201909152600e81526d546865204a61646520507269736d60901b602082015290565b81600614156110c6575050604080518082019091526014815273436f736d696320556e6465727374616e64696e6760601b602082015290565b81600714156110fa57505060408051808201909152600f81526e416e6369656e74204772756467657360881b602082015290565b816008141561113157505060408051808201909152601281527152616469616e7420426567696e6e696e677360701b602082015290565b816009141561116157505060408051808201909152600b81526a11195cd95c9d0814d85b9960aa1b602082015290565b81600a141561119257505060408051808201909152600c81526b417263616e6520536c61746560a01b602082015290565b81600b14156111c9575050604080518082019091526012815271151a1948159a589c985b9d08119bdc995cdd60721b602082015290565b81600c14156111fa57505060408051808201909152600c81526b22bb32b734b7339029ba30b960a11b602082015290565b81600d14156112235750506040805180820190915260048152632230bbb760e11b602082015290565b81600e141561125057505060408051808201909152600881526721b0b6369020b4b960c11b602082015290565b81600f141561127d57505060408051808201909152600881526729b7b630b934b7b760c11b602082015290565b81601014156112ad57505060408051808201909152600b81526a26b7b93734b7339029bab760a91b602082015290565b81601114156112d9575050604080518082019091526007815266115b595c985b1960ca1b602082015290565b81601214156113075750506040805180820190915260098152685374656c6c6172697360b81b602082015290565b816013141561133957505060408051808201909152600d81526c119d5d1d5c9948125cdb185b99609a1b602082015290565b816014141561136e57505060408051808201909152601081526f14d8dbdc98da195908115b595c985b1960821b602082015290565b816015141561139857505060408051808201909152600581526453746f6e6560d81b602082015290565b81601614156113ca57505060408051808201909152600d81526c546865204e6967687420536b7960981b602082015290565b81601714156113f957505060408051808201909152600a8152692a3432902132b0b1b7b760b11b602082015290565b816018141561142857505060408051808201909152600a815269109b1858dadcdadd5b1b60b21b602082015290565b505060408051602081019091526000815290565b6040516301ffc9a760e01b81526380ac58cd60e01b6004820152339060009082906301ffc9a790602401602060405180830381865afa158015611483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a79190612ab2565b9050806114c75760405163517172a160e11b815260040160405180910390fd5b505050565b6000806114d98484612ad4565b6114e4906001612aeb565b6040805160208101889052016040516020818303038152906040528051906020012060001c6115139190612b19565b90506108b68185612aeb565b6060600061152d8484610e9d565b9050600061153b858561035e565b905061154684611ef3565b8161162557600283116115f157826002146115c0578260011461158d576040518060400160405280600c81526020016b01d1029b1b937b6361037b3160a51b815250611655565b6040518060400160405280601581526020017401d1026bcba3434b1b0b61029b1b937b6361037b31605d1b815250611655565b6040518060400160405280601381526020017201d1021b7b9b6b4b19029b1b937b6361037b31606d1b815250611655565b6040518060400160405280601681526020017501d1021b2b632b9ba34b0b61029b1b937b6361037b3160551b815250611655565b6040518060400160405280601681526020017501d1022b73a30b733b632b21029b1b937b6361037b3160551b8152505b6116626102d68888610325565b604051602001610d6493929190612b2d565b606060006116828484610e9d565b9050600281116116f657806002146116d857806001146116ba57604051806080016040528060558152602001612e0060559139611710565b604051806080016040528060608152602001612fdc60609139611710565b6040518060a0016040528060738152602001612e5560739139611710565b6040518060a0016040528060758152602001612f67607591395b61171a858561035e565b611768576002821161173b5760405180602001604052806000815250611791565b61174482611ef3565b6040516020016117549190612b89565b604051602081830303815290604052611791565b61177182611ff1565b6040516020016117819190612bd8565b6040516020818303038152906040525b61179b8686610587565b6117bd576040518060600160405280602f8152602001612ec8602f91396117d7565b604051806060016040528060308152602001612ef7603091395b6040516020016117e993929190612c2f565b60405160208183030381529060405291505092915050565b6060600061180f8484610f10565b9050600061181d8585610325565b9050600061182b8686610c23565b9050600061183884611ef3565b61184184611ef3565b8360405160200161185493929190612c9a565b6040516020818303038152906040529050806040516020016118769190612d1c565b60405160208183030381529060405294505050505092915050565b6060600061189f8484610325565b905060006118ad8585610614565b604080516008808252610120820190925291925060009190816020015b60408051808201909152606080825260208201528152602001906001900390816118ca5750506040805160808101825260079181019182526650616c6574746560c81b60608201529081529091506020810161192585610f95565b8152508160008151811061193b5761193b6124a7565b60200260200101819052506040518060400160405280604051806040016040528060098152602001682b30b934b0ba34b7b760b91b81525081526020016119828888610c23565b81525081600181518110611998576119986124a7565b602002602001018190525060006119af8787610e9d565b60408051608081018252600891810191825267416666696e69747960c01b60608201529081529091506020810160028311611a635782600214611a3f5782600114611a19576040518060400160405280600781526020016621b4ba34bd32b760c91b815250611a86565b60405180604001604052806008815260200167135e5d1a1a58d85b60c21b815250611a86565b60405180604001604052806006815260200165436f736d696360d01b815250611a86565b6040518060400160405280600981526020016810d95b195cdd1a585b60ba1b8152505b81525082600281518110611a9c57611a9c6124a7565b602002602001018190525060405180604001604052806040518060400160405280600381526020016245726160e81b8152508152602001611add8989610587565b611b08576040518060400160405280600981526020016847656e65736973204960b81b815250611b2c565b6040518060400160405280600a81526020016947656e6573697320494960b01b8152505b81525082600381518110611b4257611b426124a7565b60200260200101819052506040518060400160405280604051806040016040528060098152602001685369676e617475726560b81b815250815260200160028311611ba957604051806040016040528060048152602001634e6f6e6560e01b815250611bb2565b611bb283611ef3565b81525082600481518110611bc857611bc86124a7565b6020026020010181905250604051806040016040528060405180604001604052806005815260200164047726f75760dc1b8152508152602001611c0e610c5a8a8a610f10565b604051602001611c1e9190612d87565b60405160208183030381529060405281525082600581518110611c4357611c436124a7565b602002602001018190525060405180604001604052806040518060400160405280600581526020016414da59da5b60da1b81525081526020016000855111611cac5760405180604001604052806009815260200168155b985b1a59db995960ba1b815250611cae565b845b81525082600681518110611cc457611cc46124a7565b602002602001018190525060405180604001604052806040518060400160405280600e81526020016d5175616e74756d2053746174757360901b8152508152602001611d10898961035e565b611d3d576040518060400160405280600b81526020016a125b99195c195b99195b9d60aa1b815250611d60565b60405180604001604052806009815260200168115b9d185b99db195960ba1b8152505b81525082600781518110611d7657611d766124a7565b60209081029190910101525095945050505050565b6060815160001415611dab57505060408051602081019091526000815290565b6000604051806060016040528060408152602001612f276040913990506000600384516002611dda9190612aeb565b611de49190612db5565b611def906004612dc9565b90506000611dfe826020612aeb565b67ffffffffffffffff811115611e1657611e1661230f565b6040519080825280601f01601f191660200182016040528015611e40576020820181803683370190505b509050818152600183018586518101602084015b81831015611eae5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401611e54565b600389510660018114611ec85760028114611ed957611ee5565b613d3d60f01b600119830152611ee5565b603d60f81b6000198301525b509398975050505050505050565b606081611f175750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611f415780611f2b81612570565b9150611f3a9050600a83612db5565b9150611f1b565b60008167ffffffffffffffff811115611f5c57611f5c61230f565b6040519080825280601f01601f191660200182016040528015611f86576020820181803683370190505b5090505b841561060c57611f9b600183612ad4565b9150611fa8600a86612b19565b611fb3906030612aeb565b60f81b818381518110611fc857611fc86124a7565b60200101906001600160f81b031916908160001a905350611fea600a86612db5565b9450611f8a565b6060816120185750506040805180820190915260048152630307830360e41b602082015290565b8160005b811561203b578061202c81612570565b915050600882901c915061201c565b61060c84826060600061204f836002612dc9565b61205a906002612aeb565b67ffffffffffffffff8111156120725761207261230f565b6040519080825280601f01601f19166020018201604052801561209c576020820181803683370190505b509050600360fc1b816000815181106120b7576120b76124a7565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106120e6576120e66124a7565b60200101906001600160f81b031916908160001a905350600061210a846002612dc9565b612115906001612aeb565b90505b600181111561218d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612149576121496124a7565b1a60f81b82828151811061215f5761215f6124a7565b60200101906001600160f81b031916908160001a90535060049490941c9361218681612de8565b9050612118565b5083156103575760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640160405180910390fd5b6000602082840312156121f257600080fd5b81356001600160e01b03198116811461035757600080fd5b6001600160a01b038116811461221f57600080fd5b50565b6000806040838503121561223557600080fd5b82356122408161220a565b946020939093013593505050565b60005b83811015612269578181015183820152602001612251565b83811115612278576000848401525b50505050565b6000815180845261229681602086016020860161224e565b601f01601f19169290920160200192915050565b602081526000610357602083018461227e565b6000806000606084860312156122d257600080fd5b83356122dd8161220a565b95602085013595506040909401359392505050565b60006020828403121561230457600080fd5b81356103578161220a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561234e5761234e61230f565b604052919050565b600067ffffffffffffffff8211156123705761237061230f565b50601f01601f191660200190565b60008060006060848603121561239357600080fd5b833561239e8161220a565b925060208401359150604084013567ffffffffffffffff8111156123c157600080fd5b8401601f810186136123d257600080fd5b80356123e56123e082612356565b612325565b8181528760208385010111156123fa57600080fd5b816020840160208301376000602083830101528093505050509250925092565b600080600080600060a0868803121561243257600080fd5b853561243d8161220a565b9450602086013561244d8161220a565b9350604086013561245d8161220a565b94979396509394606081013594506080013592915050565b60006020828403121561248757600080fd5b5035919050565b6000602082840312156124a057600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b600085516124cf818460208a0161224e565b8551908301906124e3818360208a0161224e565b6f3d913a3930b4ba2fba3cb832911d101160811b9101908152845161250f81601084016020890161224e565b6c111610113b30b63ab2911d101160991b60109290910191820152835161253d81601d84016020880161224e565b61227d60f01b601d9290910191820152601f019695505050505050565b634e487b7160e01b600052601160045260246000fd5b60006000198214156125845761258461255a565b5060010190565b683d913730b6b2911d1160b91b815285516000906125b0816009850160208b0161224e565b71111610113232b9b1b934b83a34b7b7111d1160711b60099184019182015286516125e281601b840160208b0161224e565b6c1116101134b6b0b3b2911d101160991b601b92909101918201528551612610816028840160208a0161224e565b731116101132bc3a32b93730b62fbab936111d101160611b60289290910191820152845161264581603c84016020890161224e565b71222c202261747472696275746573223a205b60701b603c9290910191820152835161267881604e84016020880161224e565b61268f604e82840101615d7d60f01b815260020190565b9998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516126d481601d85016020870161224e565b91909101601d0192915050565b600481106126ff57634e487b7160e01b600052602160045260246000fd5b9052565b61270d81846126e1565b81602082015260606040820152600061060c60608301600781526631baba37bb32b960c91b602082015260400190565b61274781846126e1565b81602082015260606040820152600061060c6060830160058152641cda59da5b60da1b602082015260400190565b60006020828403121561278757600080fd5b815167ffffffffffffffff81111561279e57600080fd5b8201601f810184136127af57600080fd5b80516127bd6123e082612356565b8181528560208385010111156127d257600080fd5b6108b682602083016020860161224e565b600081518084526020808501808196508360051b8101915082860160005b858110156128515782840389528151604081518187526128238288018261227e565b9150508682015191508581038787015261283d818361227e565b9a87019a9550505090840190600101612801565b5091979650505050505050565b600081518084526020808501808196508360051b8101915082860160005b8581101561285157828403895281516040815181875261289e8288018261227e565b9288015196880196909652509885019893509084019060010161287c565b6020815260018060a01b03825116602082015260208201516040820152600060408301516060808401528051151560808401526020810151151560a08401526040810151151560c08401526060810151151560e0840152608081015160c061010085015261292e6101408501826127e3565b905060a08201519150607f19848203016101208501526108b6818361285e565b60006020828403121561296057600080fd5b81516103578161220a565b61297581856126e1565b8260208201526080604082015260006129a560808301600781526631baba37bb32b960c91b602082015260400190565b9050826060830152949350505050565b602d60f91b8152600082516129d181600185016020870161224e565b9190910160010192915050565b604d60f81b8152600082516129d181600185016020870161224e565b604360f81b8152600082516129d181600185016020870161224e565b600b60fb1b8152600082516129d181600185016020870161224e565b612a3c81856126e1565b826020820152608060408201526000612a6a6080830160058152641cda59da5b60da1b602082015260400190565b82810360608401526103e9818561227e565b612a8681846126e1565b602081019190915260606040820181905260049082015263666c616760e01b608082015260a001919050565b600060208284031215612ac457600080fd5b8151801515811461035757600080fd5b600082821015612ae657612ae661255a565b500390565b60008219821115612afe57612afe61255a565b500190565b634e487b7160e01b600052601260045260246000fd5b600082612b2857612b28612b03565b500690565b664d6f727068202360c81b815260008451612b4f81600785016020890161224e565b845190830190612b6681600784016020890161224e565b8451910190612b7c81600784016020880161224e565b0160070195945050505050565b7f5c6e5c6e457465726e616c2063656c65737469616c207369676e61747572653a8152600160fd1b602082015260008251612bcb81602185016020870161224e565b9190910160210192915050565b7f5c6e5c6e54686973204d6f72706820697320656e74616e676c6564207769746881526801030b2323932b9b9960bd1b602082015260008251612c2281602985016020870161224e565b9190910160290192915050565b60008451612c4181846020890161224e565b845190830190612c5581836020890161224e565b8451910190612c6881836020880161224e565b7f5c6e5c6e68747470733a2f2f706c617967726f756e64732e77746600000000009101908152601b0195945050505050565b605360f81b815260008451612cb681600185016020890161224e565b8083019050602d60f81b806001830152600560fc1b60028301528551612ce3816003850160208a0161224e565b60039201918201528351612cfe81600484016020880161224e565b632e706e6760e01b6004929091019182015260080195945050505050565b7f697066733a2f2f697066732f516d65516936556673344a79724d5235346f395481527f5272614b4d526870314d544c32426e38313161643859376b4b312f0000000000602082015260008251612d7a81603b85016020870161224e565b91909101603b0192915050565b65023b937bab8160d51b815260008251612da881600685016020870161224e565b9190910160060192915050565b600082612dc457612dc4612b03565b500490565b6000816000190483118215151615612de357612de361255a565b500290565b600081612df757612df761255a565b50600019019056fe41206d7973746572696f7573207363726f6c6c2e2e2e20796f75206665656c2069742070756c736174696e67207769746820656e657267792e20576861742073656372657473206d6967687420697420686f6c643f41206d7973746572696f7573207363726f6c6c2e2e2e20796f75206665656c2069742070756c736174696e67207769746820636f736d696320656e657267792e2049747320776869737065727320737065616b2073656372657473206f6620636f736d6963207369676e69666963616e63652e5c6e5c6e54686973204d6f72706820776173206d696e74656420696e207468652047656e657369732049206572612e5c6e5c6e54686973204d6f72706820776173206d696e74656420696e207468652047656e65736973204949206572612e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f41206d7973746572696f7573207363726f6c6c2e2e2e20796f75206665656c2069742070756c736174696e6720776974682063656c65737469616c20656e657267792e204974732070726573656e636520627269646765732074686520676170206265747765656e206f6c6420616e64206e65772e41206d7973746572696f7573207363726f6c6c2e2e2e20796f75206665656c2069742070756c736174696e672077697468206d7974686963616c20656e657267792e20596f752073656e73652069747320706f7765722069732067726561742ea2646970667358221220ea8281db443a2cb03978063400f95d03adb9371826c6cf833051988f0f2add8e64736f6c634300080c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101215760003560e01c806343508b05116100ad578063cd0cc7ff11610071578063cd0cc7ff14610295578063d70dee32146102a0578063dd2abcc0146102b5578063e0d07021146102c8578063e7504d0d146102db57600080fd5b806343508b051461023457806359fbbdec146102495780637e0c93ac1461025c578063ab5c45661461026f578063adce53201461028257600080fd5b80630b63fd62116100f45780630b63fd62146101b05780631d00b7c4146101c357806336de9742146101d65780633b9978031461020e57806340c10f191461022157600080fd5b806301ffc9a71461012657806305b8cd591461014e57806306fdde031461016f5780630b5387901461019d575b600080fd5b6101396101343660046121e0565b6102ee565b60405190151581526020015b60405180910390f35b61016161015c366004612222565b610325565b604051908152602001610145565b60408051808201909152600981526836b7b938343996bb1960b91b60208201525b60405161014591906122aa565b6101396101ab366004612222565b61035e565b6101906101be366004612222565b6103f3565b6101396101d1366004612222565b610587565b6101ef6101e43660046122bd565b506000928392509050565b604080516001600160a01b039093168352602083019190915201610145565b61019061021c366004612222565b610614565b61016161022f366004612222565b61068b565b610247610242366004612222565b6108bf565b005b6102476102573660046122f2565b610a39565b61019061026a366004612222565b610c23565b61024761027d36600461237e565b610d7d565b610161610290366004612222565b610e9d565b61016163621db66081565b6102476102ae36600461241a565b5050505050565b6101616102c3366004612222565b610f10565b6101906102d6366004612475565b610f95565b6102476102e9366004612475565b61143c565b60006001600160e01b031982166302c745c760e21b148061031f57506001600160e01b031982166301ffc9a760e01b145b92915050565b60006103318383610587565b1561034a5761034382600760186114cc565b905061031f565b61035782600160066114cc565b9392505050565b60008061036b8484610e9d565b9050838180158015906103e957506040516370a0823160e01b81526001600160a01b038281166004830152600091908416906370a0823190602401602060405180830381865afa1580156103c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e7919061248e565b115b9695505050505050565b60606000610401848461151f565b9050600061040f8585611674565b9050600061041d8686611801565b90506000610450604080518082019091526012815271343a3a38399d1797b6b7b9383439973bba3360711b602082015290565b9050600061045e8888611891565b60408051602081019091526000808252919250905b825181101561052957816000821161049a57604051806020016040528060008152506104b6565b60405180604001604052806002815260200161016160f51b8152505b8483815181106104c8576104c86124a7565b6020026020010151600001518584815181106104e6576104e66124a7565b60200260200101516020015160405160200161050594939291906124bd565b6040516020818303038152906040529150808061052190612570565b915050610473565b5061055a868686868560405160200161054695949392919061258b565b604051602081830303815290604052611d8b565b60405160200161056a919061269c565b604051602081830303815290604052965050505050505092915050565b600080836001600160a01b03166329ca6379600160006040518363ffffffff1660e01b81526004016105ba929190612703565b602060405180830381865afa1580156105d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fb919061248e565b9050801580159061060c5750808310155b949350505050565b604051631a87c60f60e21b81526060906001600160a01b03841690636a1f183c9061064690600190869060040161273d565b600060405180830381865afa158015610663573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103579190810190612775565b600063621db66042106106b157604051638ea4cb3960e01b815260040160405180910390fd5b606082156107455760408051600180825281830190925290816020015b6040805180820190915260608152600060208201528152602001906001900390816106ce57505060408051608081018252600491810191825263666c616760e01b6060820152908152602081018590528151919250908290600090610735576107356124a7565b6020026020010181905250610787565b6040805160008082526020820190925290610783565b60408051808201909152606081526000602082015281526020019060019003908161075b5790505b5090505b6000846001600160a01b031663c5407b8a6040518060600160405280336001600160a01b03168152602001600181526020016040518060c00160405280600015158152602001600015158152602001600015158152602001600015158152602001600067ffffffffffffffff8111156108025761080261230f565b60405190808252806020026020018201604052801561084757816020015b60408051808201909152606080825260208201528152602001906001900390816108205790505b50815260200187905290526040516001600160e01b031960e084901b16815261087391906004016128bc565b6020604051808303816000875af1158015610892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b6919061248e565b95945050505050565b63621db66042106108e357604051638ea4cb3960e01b815260040160405180910390fd5b6040805160008082526020820190925281610920565b60408051808201909152606080825260208201528152602001906001900390816108f95790505b50604080516000808252602082019092529192509081610963565b60408051808201909152606081526000602082015281526020019060019003908161093b5790505b50905060005b838110156102ae5760408051606080820183523382526001602080840191909152835160c0810185526000808252918101829052808501829052918201526080810186905260a081018590528183015290516362a03dc560e11b81526001600160a01b0387169163c5407b8a916109e391906004016128bc565b6020604051808303816000875af1158015610a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a26919061248e565b5080610a3181612570565b915050610969565b6040516329ca637960e01b81526001600160a01b038216906329ca637990610a6990600190600090600401612703565b602060405180830381865afa158015610a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaa919061248e565b15610ac857604051636be354d760e01b815260040160405180910390fd5b60405163bbcdc54360e01b8152600060048201526001600160a01b0382169063bbcdc54390602401602060405180830381865afa158015610b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b31919061294e565b6001600160a01b0316336001600160a01b031614610b6257604051636be354d760e01b815260040160405180910390fd5b806001600160a01b0316638005f3fc60016000846001600160a01b03166375794a3c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd7919061248e565b6040518463ffffffff1660e01b8152600401610bf59392919061296b565b600060405180830381600087803b158015610c0f57600080fd5b505af11580156102ae573d6000803e3d6000fd5b60606000610c318484610587565b90506000610c3f8585610e9d565b90506002811115610c8757610c5f610c5a82600160056114cc565b611ef3565b604051602001610c6f91906129b5565b6040516020818303038152906040529250505061031f565b81610d02578060021415610cb95760405180604001604052806002815260200161583160f01b8152509250505061031f565b8060011415610ce257610cd2610c5a85600160046114cc565b604051602001610c6f91906129de565b610cf2610c5a856001600a6114cc565b604051602001610c6f91906129fa565b8060021415610d2b57610d1b610c5a85600260056114cc565b604051602001610c6f9190612a16565b8060011415610d4457610cd2610c5a856005600f6114cc565b610d54610c5a85600b60196114cc565b604051602001610d6491906129fa565b6040516020818303038152906040529250505092915050565b6040516331a9108f60e11b815260048101839052839033906001600160a01b03831690636352211e90602401602060405180830381865afa158015610dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dea919061294e565b6001600160a01b031614610e11576040516359dc379f60e01b815260040160405180910390fd5b600882511115610e3457604051633984b6c360e01b815260040160405180910390fd5b604051630abd4bcb60e21b81526001600160a01b03851690632af52f2c90610e659060019087908790600401612a32565b600060405180830381600087803b158015610e7f57600080fd5b505af1158015610e93573d6000803e3d6000fd5b5050505050505050565b60405163f8bbb59b60e01b81526000906001600160a01b0384169063f8bbb59b90610ecf906002908690600401612a7c565b602060405180830381865afa158015610eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610357919061248e565b600080610f1d8484610e9d565b90506000610f2b8585610587565b90506002821115610f415760009250505061031f565b80610f515760019250505061031f565b6000610f5d8686610325565b9050600d811015610f74576002935050505061031f565b6013811015610f89576003935050505061031f565b50600495945050505050565b60608160011415610fc557505060408051808201909152600981526811dc995e5cdadd5b1b60ba1b602082015290565b8160021415610ffa57505060408051808201909152601081526f416e6369656e74204f70696e696f6e7360801b602082015290565b816003141561102d57505060408051808201909152600e81526d2a3432902232b9b2b93a1029bab760911b602082015290565b816004141561105a575050604080518082019091526008815267054686520446565760c41b602082015290565b816005141561108d57505060408051808201909152600e81526d546865204a61646520507269736d60901b602082015290565b81600614156110c6575050604080518082019091526014815273436f736d696320556e6465727374616e64696e6760601b602082015290565b81600714156110fa57505060408051808201909152600f81526e416e6369656e74204772756467657360881b602082015290565b816008141561113157505060408051808201909152601281527152616469616e7420426567696e6e696e677360701b602082015290565b816009141561116157505060408051808201909152600b81526a11195cd95c9d0814d85b9960aa1b602082015290565b81600a141561119257505060408051808201909152600c81526b417263616e6520536c61746560a01b602082015290565b81600b14156111c9575050604080518082019091526012815271151a1948159a589c985b9d08119bdc995cdd60721b602082015290565b81600c14156111fa57505060408051808201909152600c81526b22bb32b734b7339029ba30b960a11b602082015290565b81600d14156112235750506040805180820190915260048152632230bbb760e11b602082015290565b81600e141561125057505060408051808201909152600881526721b0b6369020b4b960c11b602082015290565b81600f141561127d57505060408051808201909152600881526729b7b630b934b7b760c11b602082015290565b81601014156112ad57505060408051808201909152600b81526a26b7b93734b7339029bab760a91b602082015290565b81601114156112d9575050604080518082019091526007815266115b595c985b1960ca1b602082015290565b81601214156113075750506040805180820190915260098152685374656c6c6172697360b81b602082015290565b816013141561133957505060408051808201909152600d81526c119d5d1d5c9948125cdb185b99609a1b602082015290565b816014141561136e57505060408051808201909152601081526f14d8dbdc98da195908115b595c985b1960821b602082015290565b816015141561139857505060408051808201909152600581526453746f6e6560d81b602082015290565b81601614156113ca57505060408051808201909152600d81526c546865204e6967687420536b7960981b602082015290565b81601714156113f957505060408051808201909152600a8152692a3432902132b0b1b7b760b11b602082015290565b816018141561142857505060408051808201909152600a815269109b1858dadcdadd5b1b60b21b602082015290565b505060408051602081019091526000815290565b6040516301ffc9a760e01b81526380ac58cd60e01b6004820152339060009082906301ffc9a790602401602060405180830381865afa158015611483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a79190612ab2565b9050806114c75760405163517172a160e11b815260040160405180910390fd5b505050565b6000806114d98484612ad4565b6114e4906001612aeb565b6040805160208101889052016040516020818303038152906040528051906020012060001c6115139190612b19565b90506108b68185612aeb565b6060600061152d8484610e9d565b9050600061153b858561035e565b905061154684611ef3565b8161162557600283116115f157826002146115c0578260011461158d576040518060400160405280600c81526020016b01d1029b1b937b6361037b3160a51b815250611655565b6040518060400160405280601581526020017401d1026bcba3434b1b0b61029b1b937b6361037b31605d1b815250611655565b6040518060400160405280601381526020017201d1021b7b9b6b4b19029b1b937b6361037b31606d1b815250611655565b6040518060400160405280601681526020017501d1021b2b632b9ba34b0b61029b1b937b6361037b3160551b815250611655565b6040518060400160405280601681526020017501d1022b73a30b733b632b21029b1b937b6361037b3160551b8152505b6116626102d68888610325565b604051602001610d6493929190612b2d565b606060006116828484610e9d565b9050600281116116f657806002146116d857806001146116ba57604051806080016040528060558152602001612e0060559139611710565b604051806080016040528060608152602001612fdc60609139611710565b6040518060a0016040528060738152602001612e5560739139611710565b6040518060a0016040528060758152602001612f67607591395b61171a858561035e565b611768576002821161173b5760405180602001604052806000815250611791565b61174482611ef3565b6040516020016117549190612b89565b604051602081830303815290604052611791565b61177182611ff1565b6040516020016117819190612bd8565b6040516020818303038152906040525b61179b8686610587565b6117bd576040518060600160405280602f8152602001612ec8602f91396117d7565b604051806060016040528060308152602001612ef7603091395b6040516020016117e993929190612c2f565b60405160208183030381529060405291505092915050565b6060600061180f8484610f10565b9050600061181d8585610325565b9050600061182b8686610c23565b9050600061183884611ef3565b61184184611ef3565b8360405160200161185493929190612c9a565b6040516020818303038152906040529050806040516020016118769190612d1c565b60405160208183030381529060405294505050505092915050565b6060600061189f8484610325565b905060006118ad8585610614565b604080516008808252610120820190925291925060009190816020015b60408051808201909152606080825260208201528152602001906001900390816118ca5750506040805160808101825260079181019182526650616c6574746560c81b60608201529081529091506020810161192585610f95565b8152508160008151811061193b5761193b6124a7565b60200260200101819052506040518060400160405280604051806040016040528060098152602001682b30b934b0ba34b7b760b91b81525081526020016119828888610c23565b81525081600181518110611998576119986124a7565b602002602001018190525060006119af8787610e9d565b60408051608081018252600891810191825267416666696e69747960c01b60608201529081529091506020810160028311611a635782600214611a3f5782600114611a19576040518060400160405280600781526020016621b4ba34bd32b760c91b815250611a86565b60405180604001604052806008815260200167135e5d1a1a58d85b60c21b815250611a86565b60405180604001604052806006815260200165436f736d696360d01b815250611a86565b6040518060400160405280600981526020016810d95b195cdd1a585b60ba1b8152505b81525082600281518110611a9c57611a9c6124a7565b602002602001018190525060405180604001604052806040518060400160405280600381526020016245726160e81b8152508152602001611add8989610587565b611b08576040518060400160405280600981526020016847656e65736973204960b81b815250611b2c565b6040518060400160405280600a81526020016947656e6573697320494960b01b8152505b81525082600381518110611b4257611b426124a7565b60200260200101819052506040518060400160405280604051806040016040528060098152602001685369676e617475726560b81b815250815260200160028311611ba957604051806040016040528060048152602001634e6f6e6560e01b815250611bb2565b611bb283611ef3565b81525082600481518110611bc857611bc86124a7565b6020026020010181905250604051806040016040528060405180604001604052806005815260200164047726f75760dc1b8152508152602001611c0e610c5a8a8a610f10565b604051602001611c1e9190612d87565b60405160208183030381529060405281525082600581518110611c4357611c436124a7565b602002602001018190525060405180604001604052806040518060400160405280600581526020016414da59da5b60da1b81525081526020016000855111611cac5760405180604001604052806009815260200168155b985b1a59db995960ba1b815250611cae565b845b81525082600681518110611cc457611cc46124a7565b602002602001018190525060405180604001604052806040518060400160405280600e81526020016d5175616e74756d2053746174757360901b8152508152602001611d10898961035e565b611d3d576040518060400160405280600b81526020016a125b99195c195b99195b9d60aa1b815250611d60565b60405180604001604052806009815260200168115b9d185b99db195960ba1b8152505b81525082600781518110611d7657611d766124a7565b60209081029190910101525095945050505050565b6060815160001415611dab57505060408051602081019091526000815290565b6000604051806060016040528060408152602001612f276040913990506000600384516002611dda9190612aeb565b611de49190612db5565b611def906004612dc9565b90506000611dfe826020612aeb565b67ffffffffffffffff811115611e1657611e1661230f565b6040519080825280601f01601f191660200182016040528015611e40576020820181803683370190505b509050818152600183018586518101602084015b81831015611eae5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401611e54565b600389510660018114611ec85760028114611ed957611ee5565b613d3d60f01b600119830152611ee5565b603d60f81b6000198301525b509398975050505050505050565b606081611f175750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611f415780611f2b81612570565b9150611f3a9050600a83612db5565b9150611f1b565b60008167ffffffffffffffff811115611f5c57611f5c61230f565b6040519080825280601f01601f191660200182016040528015611f86576020820181803683370190505b5090505b841561060c57611f9b600183612ad4565b9150611fa8600a86612b19565b611fb3906030612aeb565b60f81b818381518110611fc857611fc86124a7565b60200101906001600160f81b031916908160001a905350611fea600a86612db5565b9450611f8a565b6060816120185750506040805180820190915260048152630307830360e41b602082015290565b8160005b811561203b578061202c81612570565b915050600882901c915061201c565b61060c84826060600061204f836002612dc9565b61205a906002612aeb565b67ffffffffffffffff8111156120725761207261230f565b6040519080825280601f01601f19166020018201604052801561209c576020820181803683370190505b509050600360fc1b816000815181106120b7576120b76124a7565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106120e6576120e66124a7565b60200101906001600160f81b031916908160001a905350600061210a846002612dc9565b612115906001612aeb565b90505b600181111561218d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612149576121496124a7565b1a60f81b82828151811061215f5761215f6124a7565b60200101906001600160f81b031916908160001a90535060049490941c9361218681612de8565b9050612118565b5083156103575760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640160405180910390fd5b6000602082840312156121f257600080fd5b81356001600160e01b03198116811461035757600080fd5b6001600160a01b038116811461221f57600080fd5b50565b6000806040838503121561223557600080fd5b82356122408161220a565b946020939093013593505050565b60005b83811015612269578181015183820152602001612251565b83811115612278576000848401525b50505050565b6000815180845261229681602086016020860161224e565b601f01601f19169290920160200192915050565b602081526000610357602083018461227e565b6000806000606084860312156122d257600080fd5b83356122dd8161220a565b95602085013595506040909401359392505050565b60006020828403121561230457600080fd5b81356103578161220a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561234e5761234e61230f565b604052919050565b600067ffffffffffffffff8211156123705761237061230f565b50601f01601f191660200190565b60008060006060848603121561239357600080fd5b833561239e8161220a565b925060208401359150604084013567ffffffffffffffff8111156123c157600080fd5b8401601f810186136123d257600080fd5b80356123e56123e082612356565b612325565b8181528760208385010111156123fa57600080fd5b816020840160208301376000602083830101528093505050509250925092565b600080600080600060a0868803121561243257600080fd5b853561243d8161220a565b9450602086013561244d8161220a565b9350604086013561245d8161220a565b94979396509394606081013594506080013592915050565b60006020828403121561248757600080fd5b5035919050565b6000602082840312156124a057600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b600085516124cf818460208a0161224e565b8551908301906124e3818360208a0161224e565b6f3d913a3930b4ba2fba3cb832911d101160811b9101908152845161250f81601084016020890161224e565b6c111610113b30b63ab2911d101160991b60109290910191820152835161253d81601d84016020880161224e565b61227d60f01b601d9290910191820152601f019695505050505050565b634e487b7160e01b600052601160045260246000fd5b60006000198214156125845761258461255a565b5060010190565b683d913730b6b2911d1160b91b815285516000906125b0816009850160208b0161224e565b71111610113232b9b1b934b83a34b7b7111d1160711b60099184019182015286516125e281601b840160208b0161224e565b6c1116101134b6b0b3b2911d101160991b601b92909101918201528551612610816028840160208a0161224e565b731116101132bc3a32b93730b62fbab936111d101160611b60289290910191820152845161264581603c84016020890161224e565b71222c202261747472696275746573223a205b60701b603c9290910191820152835161267881604e84016020880161224e565b61268f604e82840101615d7d60f01b815260020190565b9998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516126d481601d85016020870161224e565b91909101601d0192915050565b600481106126ff57634e487b7160e01b600052602160045260246000fd5b9052565b61270d81846126e1565b81602082015260606040820152600061060c60608301600781526631baba37bb32b960c91b602082015260400190565b61274781846126e1565b81602082015260606040820152600061060c6060830160058152641cda59da5b60da1b602082015260400190565b60006020828403121561278757600080fd5b815167ffffffffffffffff81111561279e57600080fd5b8201601f810184136127af57600080fd5b80516127bd6123e082612356565b8181528560208385010111156127d257600080fd5b6108b682602083016020860161224e565b600081518084526020808501808196508360051b8101915082860160005b858110156128515782840389528151604081518187526128238288018261227e565b9150508682015191508581038787015261283d818361227e565b9a87019a9550505090840190600101612801565b5091979650505050505050565b600081518084526020808501808196508360051b8101915082860160005b8581101561285157828403895281516040815181875261289e8288018261227e565b9288015196880196909652509885019893509084019060010161287c565b6020815260018060a01b03825116602082015260208201516040820152600060408301516060808401528051151560808401526020810151151560a08401526040810151151560c08401526060810151151560e0840152608081015160c061010085015261292e6101408501826127e3565b905060a08201519150607f19848203016101208501526108b6818361285e565b60006020828403121561296057600080fd5b81516103578161220a565b61297581856126e1565b8260208201526080604082015260006129a560808301600781526631baba37bb32b960c91b602082015260400190565b9050826060830152949350505050565b602d60f91b8152600082516129d181600185016020870161224e565b9190910160010192915050565b604d60f81b8152600082516129d181600185016020870161224e565b604360f81b8152600082516129d181600185016020870161224e565b600b60fb1b8152600082516129d181600185016020870161224e565b612a3c81856126e1565b826020820152608060408201526000612a6a6080830160058152641cda59da5b60da1b602082015260400190565b82810360608401526103e9818561227e565b612a8681846126e1565b602081019190915260606040820181905260049082015263666c616760e01b608082015260a001919050565b600060208284031215612ac457600080fd5b8151801515811461035757600080fd5b600082821015612ae657612ae661255a565b500390565b60008219821115612afe57612afe61255a565b500190565b634e487b7160e01b600052601260045260246000fd5b600082612b2857612b28612b03565b500690565b664d6f727068202360c81b815260008451612b4f81600785016020890161224e565b845190830190612b6681600784016020890161224e565b8451910190612b7c81600784016020880161224e565b0160070195945050505050565b7f5c6e5c6e457465726e616c2063656c65737469616c207369676e61747572653a8152600160fd1b602082015260008251612bcb81602185016020870161224e565b9190910160210192915050565b7f5c6e5c6e54686973204d6f72706820697320656e74616e676c6564207769746881526801030b2323932b9b9960bd1b602082015260008251612c2281602985016020870161224e565b9190910160290192915050565b60008451612c4181846020890161224e565b845190830190612c5581836020890161224e565b8451910190612c6881836020880161224e565b7f5c6e5c6e68747470733a2f2f706c617967726f756e64732e77746600000000009101908152601b0195945050505050565b605360f81b815260008451612cb681600185016020890161224e565b8083019050602d60f81b806001830152600560fc1b60028301528551612ce3816003850160208a0161224e565b60039201918201528351612cfe81600484016020880161224e565b632e706e6760e01b6004929091019182015260080195945050505050565b7f697066733a2f2f697066732f516d65516936556673344a79724d5235346f395481527f5272614b4d526870314d544c32426e38313161643859376b4b312f0000000000602082015260008251612d7a81603b85016020870161224e565b91909101603b0192915050565b65023b937bab8160d51b815260008251612da881600685016020870161224e565b9190910160060192915050565b600082612dc457612dc4612b03565b500490565b6000816000190483118215151615612de357612de361255a565b500290565b600081612df757612df761255a565b50600019019056fe41206d7973746572696f7573207363726f6c6c2e2e2e20796f75206665656c2069742070756c736174696e67207769746820656e657267792e20576861742073656372657473206d6967687420697420686f6c643f41206d7973746572696f7573207363726f6c6c2e2e2e20796f75206665656c2069742070756c736174696e67207769746820636f736d696320656e657267792e2049747320776869737065727320737065616b2073656372657473206f6620636f736d6963207369676e69666963616e63652e5c6e5c6e54686973204d6f72706820776173206d696e74656420696e207468652047656e657369732049206572612e5c6e5c6e54686973204d6f72706820776173206d696e74656420696e207468652047656e65736973204949206572612e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f41206d7973746572696f7573207363726f6c6c2e2e2e20796f75206665656c2069742070756c736174696e6720776974682063656c65737469616c20656e657267792e204974732070726573656e636520627269646765732074686520676170206265747765656e206f6c6420616e64206e65772e41206d7973746572696f7573207363726f6c6c2e2e2e20796f75206665656c2069742070756c736174696e672077697468206d7974686963616c20656e657267792e20596f752073656e73652069747320706f7765722069732067726561742ea2646970667358221220ea8281db443a2cb03978063400f95d03adb9371826c6cf833051988f0f2add8e64736f6c634300080c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.