ETH Price: $3,274.64 (-0.01%)
Gas: 3 Gwei

Token

morphs ()
 

Overview

Max Total Supply

0 morphs

Holders

0

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MorphsEngine

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 11 : MorphsEngine.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/*

            ░░░    ░░░  ░░░░░░  ░░░░░░  ░░░░░░  ░░   ░░ ░░░░░░░
            ▒▒▒▒  ▒▒▒▒ ▒▒    ▒▒ ▒▒   ▒▒ ▒▒   ▒▒ ▒▒   ▒▒ ▒▒
            ▒▒ ▒▒▒▒ ▒▒ ▒▒    ▒▒ ▒▒▒▒▒▒  ▒▒▒▒▒▒  ▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒
            ▓▓  ▓▓  ▓▓ ▓▓    ▓▓ ▓▓   ▓▓ ▓▓      ▓▓   ▓▓      ▓▓
            ██      ██  ██████  ██   ██ ██      ██   ██ ███████

                           https://morphs.wtf

    Drifting through the immateria you find a scroll. You sense something
    mysterious, cosmic.

    You feel compelled to take it. After all, what have you got to lose...

    Designed by @polyforms_

    https://playgrounds.wtf
    https://heyshell.xyz

*/

import "../engines/ShellBaseEngine.sol";
import "../engines/OnChainMetadataEngine.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract MorphsEngine is ShellBaseEngine, OnChainMetadataEngine {
    error MintingPeriodHasEnded();

    // cant mint after midnight 3/1 CST
    uint256 public constant MINTING_ENDS_AT_TIMESTAMP = 1646114400;

    function name() external pure returns (string memory) {
        return "morphs";
    }

    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;
    }

    function getPalette(uint256 tokenId) public pure returns (string memory) {
        uint256 index = uint256(keccak256(abi.encodePacked(tokenId))) % 6;
        return string(abi.encodePacked("P00", Strings.toString(index + 1)));
    }

    function getVariation(uint256 tokenId, uint256 flag)
        public
        pure
        returns (string memory)
    {
        if (flag >= 2) {
            // celestial
            // doing >= 2 to let curious geeks mint things with custom flag
            // values.
            // I wonder if anybody will do this? 🤔
            return "X001";
        } else if (flag == 1) {
            // mythical
            uint256 i = uint256(keccak256(abi.encodePacked(tokenId))) % 4;
            return string(abi.encodePacked("M00", Strings.toString(i + 1)));
        }

        // citizen
        uint256 index = uint256(keccak256(abi.encodePacked(tokenId))) % 10;

        if (index == 9) {
            return "C010"; // double digit case
        } else {
            return string(abi.encodePacked("C00", Strings.toString(index + 1)));
        }
    }

    function getPaletteName(uint256 tokenId)
        public
        pure
        returns (string memory)
    {
        uint256 index = uint256(keccak256(abi.encodePacked(tokenId))) % 6;

        if (index == 0) {
            return "Greyskull";
        } else if (index == 1) {
            return "Ancient Opinions";
        } else if (index == 2) {
            return "The Desert Sun";
        } else if (index == 3) {
            return "The Deep";
        } else if (index == 4) {
            return "The Jade Prism";
        } else if (index == 5) {
            return "Cosmic Understanding";
        }

        return "";
    }

    function getFlag(IShellFramework collection, uint256 tokenId)
        public
        view
        returns (uint256)
    {
        return
            collection.readTokenInt(StorageLocation.MINT_DATA, tokenId, "flag");
    }

    function _computeName(IShellFramework collection, uint256 tokenId)
        internal
        view
        override
        returns (string memory)
    {
        uint256 flag = getFlag(collection, tokenId);

        return
            string(
                abi.encodePacked(
                    "Morph #",
                    Strings.toString(tokenId),
                    flag == 2 ? ": Cosmic Scroll of " : flag == 1
                        ? ": Mythical Scroll of "
                        : ": Scroll of ",
                    getPaletteName(tokenId)
                )
            );
    }

    function _computeDescription(IShellFramework collection, uint256 tokenId)
        internal
        view
        override
        returns (string memory)
    {
        uint256 flag = getFlag(collection, tokenId);

        return
            string(
                abi.encodePacked(
                    flag > 1
                        ? "A mysterious scroll... you feel it pulsating with cosmic energy. Its whispers speak secrets of cosmic significance."
                        : flag > 0
                        ? "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?",
                    "\\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 flag = getFlag(collection, tokenId);

        string memory image = string(
            abi.encodePacked(
                "S001-",
                getPalette(tokenId),
                "-",
                getVariation(tokenId, flag),
                ".png"
            )
        );

        return
            string(
                abi.encodePacked(
                    "ipfs://ipfs/QmRCKXGuM47BzepjiHu2onshPFRWb7TMVEfd4K87cszg4w/",
                    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)
    {
        Attribute[] memory attributes = new Attribute[](3);

        attributes[0] = Attribute({
            key: "Palette",
            value: getPaletteName(tokenId)
        });

        attributes[1] = Attribute({
            key: "Variation",
            value: getVariation(tokenId, getFlag(collection, tokenId))
        });

        uint256 flag = getFlag(collection, tokenId);
        attributes[2] = Attribute({
            key: "Affinity",
            value: flag > 1 ? "Cosmic" : flag > 0 ? "Mythical" : "Citizen"
        });
        return attributes;
    }
}

File 2 of 11 : ShellBaseEngine.sol
//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;
    }
}

File 3 of 11 : OnChainMetadataEngine.sol
//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);
}

File 4 of 11 : Strings.sol
// 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);
    }
}

File 5 of 11 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;

import "../utils/introspection/IERC165.sol";

File 6 of 11 : IEngine.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;
}

File 7 of 11 : IERC165.sol
// 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);
}

File 8 of 11 : IShellFramework.sol
//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 the collection / canonical engine. getFork(0).engine
    function getForkEngine(uint256 forkId) external view returns (IEngine);

    // 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);

    // mint new tokens. Only callable by collection engine
    function batchMint(MintEntry[] calldata entries)
        external
        returns (uint256[] memory);

    // ---
    // 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);
}

File 9 of 11 : IERC2981.sol
// 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);
}

File 10 of 11 : IOwnable.sol
//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;
}

File 11 of 11 : Base64.sol
// 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;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"MintingPeriodHasEnded","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":"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"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFlag","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPalette","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","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":"getTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"flag","type":"uint256"}],"name":"getVariation","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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"}]

608060405234801561001057600080fd5b50611997806100206000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80637047007c116100715780637047007c1461018b578063adce53201461019e578063cd0cc7ff146101b1578063d70dee32146101bc578063e0d07021146101d3578063e7504d0d146101e657600080fd5b806301ffc9a7146100b957806306fdde03146100e15780630b63fd621461010c57806336de97421461011f57806340c10f1914610157578063505e570a14610178575b600080fd5b6100cc6100c7366004610fdc565b6101f7565b60405190151581526020015b60405180910390f35b6040805180820190915260068152656d6f7270687360d01b60208201525b6040516100d89190611062565b6100ff61011a36600461108a565b61022e565b61013861012d3660046110b6565b506000928392509050565b604080516001600160a01b0390931683526020830191909152016100d8565b61016a61016536600461108a565b6103c2565b6040519081526020016100d8565b6100ff6101863660046110eb565b610605565b6100ff610199366004611104565b61067d565b61016a6101ac36600461108a565b6107a7565b61016a63621db66081565b6101d16101ca366004611126565b5050505050565b005b6100ff6101e13660046110eb565b610830565b6101d16101f43660046110eb565b50565b60006001600160e01b031982166302c745c760e21b148061022857506001600160e01b031982166301ffc9a760e01b145b92915050565b6060600061023c84846109bb565b9050600061024a8585610aa1565b905060006102588686610b27565b9050600061028b604080518082019091526012815271343a3a38399d1797b6b7b9383439973bba3360711b602082015290565b905060006102998888610b98565b60408051602081019091526000808252919250905b82518110156103645781600082116102d557604051806020016040528060008152506102f1565b60405180604001604052806002815260200161016160f51b8152505b84838151811061030357610303611181565b60200260200101516000015185848151811061032157610321611181565b6020026020010151602001516040516020016103409493929190611197565b6040516020818303038152906040529150808061035c9061124a565b9150506102ae565b506103958686868685604051602001610381959493929190611265565b604051602081830303815290604052610d6e565b6040516020016103a59190611376565b604051602081830303815290604052965050505050505092915050565b600063621db66042106103e857604051638ea4cb3960e01b815260040160405180910390fd5b6060821561047c5760408051600180825281830190925290816020015b60408051808201909152606081526000602082015281526020019060019003908161040557505060408051608081018252600491810191825263666c616760e01b606082015290815260208101859052815191925090829060009061046c5761046c611181565b60200260200101819052506104be565b60408051600080825260208201909252906104ba565b6040805180820190915260608152600060208201528152602001906001900390816104925790505b5090505b6000846001600160a01b031663c5407b8a6040518060600160405280336001600160a01b03168152602001600181526020016040518060c00160405280600015158152602001600015158152602001600015158152602001600015158152602001600067ffffffffffffffff811115610539576105396113bb565b60405190808252806020026020018201604052801561057e57816020015b60408051808201909152606080825260208201528152602001906001900390816105575790505b50815260200187905290526040516001600160e01b031960e084901b1681526105aa91906004016114aa565b602060405180830381600087803b1580156105c457600080fd5b505af11580156105d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fc919061153c565b95945050505050565b6060600060068360405160200161061e91815260200190565b6040516020818303038152906040528051906020012060001c610641919061156b565b905061065661065182600161157f565b610ed6565b6040516020016106669190611597565b604051602081830303815290604052915050919050565b6060600282106106a857506040805180820190915260048152635830303160e01b6020820152610228565b81600114156107225760006004846040516020016106c891815260200190565b6040516020818303038152906040528051906020012060001c6106eb919061156b565b90506106fb61065182600161157f565b60405160200161070b91906115c2565b604051602081830303815290604052915050610228565b6000600a8460405160200161073991815260200190565b6040516020818303038152906040528051906020012060001c61075c919061156b565b905080600914156107895750506040805180820190915260048152630433031360e41b6020820152610228565b61079761065182600161157f565b60405160200161070b91906115e0565b60405163f8bbb59b60e01b81526000906001600160a01b0384169063f8bbb59b906107d99060029086906004016115fe565b60206040518083038186803b1580156107f157600080fd5b505afa158015610805573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610829919061153c565b9392505050565b6060600060068360405160200161084991815260200190565b6040516020818303038152906040528051906020012060001c61086c919061156b565b90508061089a57505060408051808201909152600981526811dc995e5cdadd5b1b60ba1b6020820152919050565b80600114156108d157505060408051808201909152601081526f416e6369656e74204f70696e696f6e7360801b6020820152919050565b806002141561090657505060408051808201909152600e81526d2a3432902232b9b2b93a1029bab760911b6020820152919050565b8060031415610935575050604080518082019091526008815267054686520446565760c41b6020820152919050565b806004141561096a57505060408051808201909152600e81526d546865204a61646520507269736d60901b6020820152919050565b80600514156109a5575050604080518082019091526014815273436f736d696320556e6465727374616e64696e6760601b6020820152919050565b5050604080516020810190915260008152919050565b606060006109c984846107a7565b90506109d483610ed6565b81600214610a415781600114610a0e576040518060400160405280600c81526020016b01d1029b1b937b6361037b3160a51b815250610a6e565b6040518060400160405280601581526020017401d1026bcba3434b1b0b61029b1b937b6361037b31605d1b815250610a6e565b6040518060400160405280601381526020017201d1021b7b9b6b4b19029b1b937b6361037b31606d1b8152505b610a7785610830565b604051602001610a8993929190611649565b60405160208183030381529060405291505092915050565b60606000610aaf84846107a7565b905060018111610afd5760008111610adf576040518060800160405280605581526020016117fa60559139610b17565b60405180608001604052806060815260200161190260609139610b17565b6040518060a001604052806073815260200161184f607391395b604051602001610a8991906116a5565b60606000610b3584846107a7565b90506000610b4284610605565b610b4c858461067d565b604051602001610b5d9291906116e6565b604051602081830303815290604052905080604051602001610b7f9190611744565b6040516020818303038152906040529250505092915050565b6040805160038082526080820190925260609160009190816020015b6040805180820190915260608082526020820152815260200190600190039081610bb45750506040805160808101825260079181019182526650616c6574746560c81b606082015290815290915060208101610c0f85610830565b81525081600081518110610c2557610c25611181565b60200260200101819052506040518060400160405280604051806040016040528060098152602001682b30b934b0ba34b7b760b91b8152508152602001610c708561019988886107a7565b81525081600181518110610c8657610c86611181565b60200260200101819052506000610c9d85856107a7565b60408051608081018252600891810191825267416666696e69747960c01b60608201529081529091506020810160018311610d255760008311610cff576040518060400160405280600781526020016621b4ba34bd32b760c91b815250610d45565b60405180604001604052806008815260200167135e5d1a1a58d85b60c21b815250610d45565b60405180604001604052806006815260200165436f736d696360d01b8152505b81525082600281518110610d5b57610d5b611181565b6020908102919091010152509392505050565b6060815160001415610d8e57505060408051602081019091526000815290565b60006040518060600160405280604081526020016118c26040913990506000600384516002610dbd919061157f565b610dc791906117af565b610dd29060046117c3565b90506000610de182602061157f565b67ffffffffffffffff811115610df957610df96113bb565b6040519080825280601f01601f191660200182016040528015610e23576020820181803683370190505b509050818152600183018586518101602084015b81831015610e915760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401610e37565b600389510660018114610eab5760028114610ebc57610ec8565b613d3d60f01b600119830152610ec8565b603d60f81b6000198301525b509398975050505050505050565b606081610efa5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f245780610f0e8161124a565b9150610f1d9050600a836117af565b9150610efe565b60008167ffffffffffffffff811115610f3f57610f3f6113bb565b6040519080825280601f01601f191660200182016040528015610f69576020820181803683370190505b5090505b8415610fd457610f7e6001836117e2565b9150610f8b600a8661156b565b610f9690603061157f565b60f81b818381518110610fab57610fab611181565b60200101906001600160f81b031916908160001a905350610fcd600a866117af565b9450610f6d565b949350505050565b600060208284031215610fee57600080fd5b81356001600160e01b03198116811461082957600080fd5b60005b83811015611021578181015183820152602001611009565b83811115611030576000848401525b50505050565b6000815180845261104e816020860160208601611006565b601f01601f19169290920160200192915050565b6020815260006108296020830184611036565b6001600160a01b03811681146101f457600080fd5b6000806040838503121561109d57600080fd5b82356110a881611075565b946020939093013593505050565b6000806000606084860312156110cb57600080fd5b83356110d681611075565b95602085013595506040909401359392505050565b6000602082840312156110fd57600080fd5b5035919050565b6000806040838503121561111757600080fd5b50508035926020909101359150565b600080600080600060a0868803121561113e57600080fd5b853561114981611075565b9450602086013561115981611075565b9350604086013561116981611075565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052603260045260246000fd5b600085516111a9818460208a01611006565b8551908301906111bd818360208a01611006565b6f3d913a3930b4ba2fba3cb832911d101160811b910190815284516111e9816010840160208901611006565b6c111610113b30b63ab2911d101160991b60109290910191820152835161121781601d840160208801611006565b61227d60f01b601d9290910191820152601f019695505050505050565b634e487b7160e01b600052601160045260246000fd5b600060001982141561125e5761125e611234565b5060010190565b683d913730b6b2911d1160b91b8152855160009061128a816009850160208b01611006565b71111610113232b9b1b934b83a34b7b7111d1160711b60099184019182015286516112bc81601b840160208b01611006565b6c1116101134b6b0b3b2911d101160991b601b929091019182015285516112ea816028840160208a01611006565b731116101132bc3a32b93730b62fbab936111d101160611b60289290910191820152845161131f81603c840160208901611006565b71222c202261747472696275746573223a205b60701b603c9290910191820152835161135281604e840160208801611006565b611369604e82840101615d7d60f01b815260020190565b9998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516113ae81601d850160208701611006565b91909101601d0192915050565b634e487b7160e01b600052604160045260246000fd5b600081518084526020808501808196508360051b8101915082860160005b8581101561143f57828403895281516040815181875261141182880182611036565b9150508682015191508581038787015261142b8183611036565b9a87019a95505050908401906001016113ef565b5091979650505050505050565b600081518084526020808501808196508360051b8101915082860160005b8581101561143f57828403895281516040815181875261148c82880182611036565b9288015196880196909652509885019893509084019060010161146a565b6020815260018060a01b03825116602082015260208201516040820152600060408301516060808401528051151560808401526020810151151560a08401526040810151151560c08401526060810151151560e0840152608081015160c061010085015261151c6101408501826113d1565b905060a08201519150607f19848203016101208501526105fc818361144c565b60006020828403121561154e57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008261157a5761157a611555565b500690565b6000821982111561159257611592611234565b500190565b6205030360ec1b8152600082516115b5816003850160208701611006565b9190910160030192915050565b6204d30360ec1b8152600082516115b5816003850160208701611006565b6204330360ec1b8152600082516115b5816003850160208701611006565b60006004841061161e57634e487b7160e01b600052602160045260246000fd5b50918252602082015260606040820181905260049082015263666c616760e01b608082015260a00190565b664d6f727068202360c81b81526000845161166b816007850160208901611006565b845190830190611682816007840160208901611006565b8451910190611698816007840160208801611006565b0160070195945050505050565b600082516116b7818460208701611006565b7f5c6e5c6e68747470733a2f2f706c617967726f756e64732e7774660000000000920191825250601b01919050565b64533030312d60d81b815260008351611706816005850160208801611006565b602d60f81b6005918401918201528351611727816006840160208801611006565b632e706e6760e01b60069290910191820152600a01949350505050565b7f697066733a2f2f697066732f516d52434b5847754d3437427a65706a6948753281527f6f6e7368504652576237544d56456664344b383763737a6734772f00000000006020820152600082516117a281603b850160208701611006565b91909101603b0192915050565b6000826117be576117be611555565b500490565b60008160001904831182151516156117dd576117dd611234565b500290565b6000828210156117f4576117f4611234565b50039056fe41206d7973746572696f7573207363726f6c6c2e2e2e20796f75206665656c2069742070756c736174696e67207769746820656e657267792e20576861742073656372657473206d6967687420697420686f6c643f41206d7973746572696f7573207363726f6c6c2e2e2e20796f75206665656c2069742070756c736174696e67207769746820636f736d696320656e657267792e2049747320776869737065727320737065616b2073656372657473206f6620636f736d6963207369676e69666963616e63652e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f41206d7973746572696f7573207363726f6c6c2e2e2e20796f75206665656c2069742070756c736174696e672077697468206d7974686963616c20656e657267792e20596f752073656e73652069747320706f7765722069732067726561742ea264697066735822122040df0b40064a50e118c9e38a6a9774d1e2997483f94accb424ad4e030c9155ff64736f6c63430008090033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80637047007c116100715780637047007c1461018b578063adce53201461019e578063cd0cc7ff146101b1578063d70dee32146101bc578063e0d07021146101d3578063e7504d0d146101e657600080fd5b806301ffc9a7146100b957806306fdde03146100e15780630b63fd621461010c57806336de97421461011f57806340c10f1914610157578063505e570a14610178575b600080fd5b6100cc6100c7366004610fdc565b6101f7565b60405190151581526020015b60405180910390f35b6040805180820190915260068152656d6f7270687360d01b60208201525b6040516100d89190611062565b6100ff61011a36600461108a565b61022e565b61013861012d3660046110b6565b506000928392509050565b604080516001600160a01b0390931683526020830191909152016100d8565b61016a61016536600461108a565b6103c2565b6040519081526020016100d8565b6100ff6101863660046110eb565b610605565b6100ff610199366004611104565b61067d565b61016a6101ac36600461108a565b6107a7565b61016a63621db66081565b6101d16101ca366004611126565b5050505050565b005b6100ff6101e13660046110eb565b610830565b6101d16101f43660046110eb565b50565b60006001600160e01b031982166302c745c760e21b148061022857506001600160e01b031982166301ffc9a760e01b145b92915050565b6060600061023c84846109bb565b9050600061024a8585610aa1565b905060006102588686610b27565b9050600061028b604080518082019091526012815271343a3a38399d1797b6b7b9383439973bba3360711b602082015290565b905060006102998888610b98565b60408051602081019091526000808252919250905b82518110156103645781600082116102d557604051806020016040528060008152506102f1565b60405180604001604052806002815260200161016160f51b8152505b84838151811061030357610303611181565b60200260200101516000015185848151811061032157610321611181565b6020026020010151602001516040516020016103409493929190611197565b6040516020818303038152906040529150808061035c9061124a565b9150506102ae565b506103958686868685604051602001610381959493929190611265565b604051602081830303815290604052610d6e565b6040516020016103a59190611376565b604051602081830303815290604052965050505050505092915050565b600063621db66042106103e857604051638ea4cb3960e01b815260040160405180910390fd5b6060821561047c5760408051600180825281830190925290816020015b60408051808201909152606081526000602082015281526020019060019003908161040557505060408051608081018252600491810191825263666c616760e01b606082015290815260208101859052815191925090829060009061046c5761046c611181565b60200260200101819052506104be565b60408051600080825260208201909252906104ba565b6040805180820190915260608152600060208201528152602001906001900390816104925790505b5090505b6000846001600160a01b031663c5407b8a6040518060600160405280336001600160a01b03168152602001600181526020016040518060c00160405280600015158152602001600015158152602001600015158152602001600015158152602001600067ffffffffffffffff811115610539576105396113bb565b60405190808252806020026020018201604052801561057e57816020015b60408051808201909152606080825260208201528152602001906001900390816105575790505b50815260200187905290526040516001600160e01b031960e084901b1681526105aa91906004016114aa565b602060405180830381600087803b1580156105c457600080fd5b505af11580156105d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fc919061153c565b95945050505050565b6060600060068360405160200161061e91815260200190565b6040516020818303038152906040528051906020012060001c610641919061156b565b905061065661065182600161157f565b610ed6565b6040516020016106669190611597565b604051602081830303815290604052915050919050565b6060600282106106a857506040805180820190915260048152635830303160e01b6020820152610228565b81600114156107225760006004846040516020016106c891815260200190565b6040516020818303038152906040528051906020012060001c6106eb919061156b565b90506106fb61065182600161157f565b60405160200161070b91906115c2565b604051602081830303815290604052915050610228565b6000600a8460405160200161073991815260200190565b6040516020818303038152906040528051906020012060001c61075c919061156b565b905080600914156107895750506040805180820190915260048152630433031360e41b6020820152610228565b61079761065182600161157f565b60405160200161070b91906115e0565b60405163f8bbb59b60e01b81526000906001600160a01b0384169063f8bbb59b906107d99060029086906004016115fe565b60206040518083038186803b1580156107f157600080fd5b505afa158015610805573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610829919061153c565b9392505050565b6060600060068360405160200161084991815260200190565b6040516020818303038152906040528051906020012060001c61086c919061156b565b90508061089a57505060408051808201909152600981526811dc995e5cdadd5b1b60ba1b6020820152919050565b80600114156108d157505060408051808201909152601081526f416e6369656e74204f70696e696f6e7360801b6020820152919050565b806002141561090657505060408051808201909152600e81526d2a3432902232b9b2b93a1029bab760911b6020820152919050565b8060031415610935575050604080518082019091526008815267054686520446565760c41b6020820152919050565b806004141561096a57505060408051808201909152600e81526d546865204a61646520507269736d60901b6020820152919050565b80600514156109a5575050604080518082019091526014815273436f736d696320556e6465727374616e64696e6760601b6020820152919050565b5050604080516020810190915260008152919050565b606060006109c984846107a7565b90506109d483610ed6565b81600214610a415781600114610a0e576040518060400160405280600c81526020016b01d1029b1b937b6361037b3160a51b815250610a6e565b6040518060400160405280601581526020017401d1026bcba3434b1b0b61029b1b937b6361037b31605d1b815250610a6e565b6040518060400160405280601381526020017201d1021b7b9b6b4b19029b1b937b6361037b31606d1b8152505b610a7785610830565b604051602001610a8993929190611649565b60405160208183030381529060405291505092915050565b60606000610aaf84846107a7565b905060018111610afd5760008111610adf576040518060800160405280605581526020016117fa60559139610b17565b60405180608001604052806060815260200161190260609139610b17565b6040518060a001604052806073815260200161184f607391395b604051602001610a8991906116a5565b60606000610b3584846107a7565b90506000610b4284610605565b610b4c858461067d565b604051602001610b5d9291906116e6565b604051602081830303815290604052905080604051602001610b7f9190611744565b6040516020818303038152906040529250505092915050565b6040805160038082526080820190925260609160009190816020015b6040805180820190915260608082526020820152815260200190600190039081610bb45750506040805160808101825260079181019182526650616c6574746560c81b606082015290815290915060208101610c0f85610830565b81525081600081518110610c2557610c25611181565b60200260200101819052506040518060400160405280604051806040016040528060098152602001682b30b934b0ba34b7b760b91b8152508152602001610c708561019988886107a7565b81525081600181518110610c8657610c86611181565b60200260200101819052506000610c9d85856107a7565b60408051608081018252600891810191825267416666696e69747960c01b60608201529081529091506020810160018311610d255760008311610cff576040518060400160405280600781526020016621b4ba34bd32b760c91b815250610d45565b60405180604001604052806008815260200167135e5d1a1a58d85b60c21b815250610d45565b60405180604001604052806006815260200165436f736d696360d01b8152505b81525082600281518110610d5b57610d5b611181565b6020908102919091010152509392505050565b6060815160001415610d8e57505060408051602081019091526000815290565b60006040518060600160405280604081526020016118c26040913990506000600384516002610dbd919061157f565b610dc791906117af565b610dd29060046117c3565b90506000610de182602061157f565b67ffffffffffffffff811115610df957610df96113bb565b6040519080825280601f01601f191660200182016040528015610e23576020820181803683370190505b509050818152600183018586518101602084015b81831015610e915760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401610e37565b600389510660018114610eab5760028114610ebc57610ec8565b613d3d60f01b600119830152610ec8565b603d60f81b6000198301525b509398975050505050505050565b606081610efa5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f245780610f0e8161124a565b9150610f1d9050600a836117af565b9150610efe565b60008167ffffffffffffffff811115610f3f57610f3f6113bb565b6040519080825280601f01601f191660200182016040528015610f69576020820181803683370190505b5090505b8415610fd457610f7e6001836117e2565b9150610f8b600a8661156b565b610f9690603061157f565b60f81b818381518110610fab57610fab611181565b60200101906001600160f81b031916908160001a905350610fcd600a866117af565b9450610f6d565b949350505050565b600060208284031215610fee57600080fd5b81356001600160e01b03198116811461082957600080fd5b60005b83811015611021578181015183820152602001611009565b83811115611030576000848401525b50505050565b6000815180845261104e816020860160208601611006565b601f01601f19169290920160200192915050565b6020815260006108296020830184611036565b6001600160a01b03811681146101f457600080fd5b6000806040838503121561109d57600080fd5b82356110a881611075565b946020939093013593505050565b6000806000606084860312156110cb57600080fd5b83356110d681611075565b95602085013595506040909401359392505050565b6000602082840312156110fd57600080fd5b5035919050565b6000806040838503121561111757600080fd5b50508035926020909101359150565b600080600080600060a0868803121561113e57600080fd5b853561114981611075565b9450602086013561115981611075565b9350604086013561116981611075565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052603260045260246000fd5b600085516111a9818460208a01611006565b8551908301906111bd818360208a01611006565b6f3d913a3930b4ba2fba3cb832911d101160811b910190815284516111e9816010840160208901611006565b6c111610113b30b63ab2911d101160991b60109290910191820152835161121781601d840160208801611006565b61227d60f01b601d9290910191820152601f019695505050505050565b634e487b7160e01b600052601160045260246000fd5b600060001982141561125e5761125e611234565b5060010190565b683d913730b6b2911d1160b91b8152855160009061128a816009850160208b01611006565b71111610113232b9b1b934b83a34b7b7111d1160711b60099184019182015286516112bc81601b840160208b01611006565b6c1116101134b6b0b3b2911d101160991b601b929091019182015285516112ea816028840160208a01611006565b731116101132bc3a32b93730b62fbab936111d101160611b60289290910191820152845161131f81603c840160208901611006565b71222c202261747472696275746573223a205b60701b603c9290910191820152835161135281604e840160208801611006565b611369604e82840101615d7d60f01b815260020190565b9998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516113ae81601d850160208701611006565b91909101601d0192915050565b634e487b7160e01b600052604160045260246000fd5b600081518084526020808501808196508360051b8101915082860160005b8581101561143f57828403895281516040815181875261141182880182611036565b9150508682015191508581038787015261142b8183611036565b9a87019a95505050908401906001016113ef565b5091979650505050505050565b600081518084526020808501808196508360051b8101915082860160005b8581101561143f57828403895281516040815181875261148c82880182611036565b9288015196880196909652509885019893509084019060010161146a565b6020815260018060a01b03825116602082015260208201516040820152600060408301516060808401528051151560808401526020810151151560a08401526040810151151560c08401526060810151151560e0840152608081015160c061010085015261151c6101408501826113d1565b905060a08201519150607f19848203016101208501526105fc818361144c565b60006020828403121561154e57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008261157a5761157a611555565b500690565b6000821982111561159257611592611234565b500190565b6205030360ec1b8152600082516115b5816003850160208701611006565b9190910160030192915050565b6204d30360ec1b8152600082516115b5816003850160208701611006565b6204330360ec1b8152600082516115b5816003850160208701611006565b60006004841061161e57634e487b7160e01b600052602160045260246000fd5b50918252602082015260606040820181905260049082015263666c616760e01b608082015260a00190565b664d6f727068202360c81b81526000845161166b816007850160208901611006565b845190830190611682816007840160208901611006565b8451910190611698816007840160208801611006565b0160070195945050505050565b600082516116b7818460208701611006565b7f5c6e5c6e68747470733a2f2f706c617967726f756e64732e7774660000000000920191825250601b01919050565b64533030312d60d81b815260008351611706816005850160208801611006565b602d60f81b6005918401918201528351611727816006840160208801611006565b632e706e6760e01b60069290910191820152600a01949350505050565b7f697066733a2f2f697066732f516d52434b5847754d3437427a65706a6948753281527f6f6e7368504652576237544d56456664344b383763737a6734772f00000000006020820152600082516117a281603b850160208701611006565b91909101603b0192915050565b6000826117be576117be611555565b500490565b60008160001904831182151516156117dd576117dd611234565b500290565b6000828210156117f4576117f4611234565b50039056fe41206d7973746572696f7573207363726f6c6c2e2e2e20796f75206665656c2069742070756c736174696e67207769746820656e657267792e20576861742073656372657473206d6967687420697420686f6c643f41206d7973746572696f7573207363726f6c6c2e2e2e20796f75206665656c2069742070756c736174696e67207769746820636f736d696320656e657267792e2049747320776869737065727320737065616b2073656372657473206f6620636f736d6963207369676e69666963616e63652e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f41206d7973746572696f7573207363726f6c6c2e2e2e20796f75206665656c2069742070756c736174696e672077697468206d7974686963616c20656e657267792e20596f752073656e73652069747320706f7765722069732067726561742ea264697066735822122040df0b40064a50e118c9e38a6a9774d1e2997483f94accb424ad4e030c9155ff64736f6c63430008090033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.