ETH Price: $3,111.58 (+1.41%)
Gas: 6 Gwei

Contract

0xD23C25Eb1bAD8b1de60cBD313c09209055fD74c0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Mint144321302022-03-21 21:30:53841 days ago1647898253IN
0xD23C25Eb...055fD74c0
0 ETH0.000931842.29315366
Mint143437962022-03-08 3:33:35855 days ago1646710415IN
0xD23C25Eb...055fD74c0
0 ETH0.000909941.29938025
Mint142857582022-02-27 3:13:36864 days ago1645931616IN
0xD23C25Eb...055fD74c0
0 ETH0.0012352739.40157662
Mint142842902022-02-26 21:55:25864 days ago1645912525IN
0xD23C25Eb...055fD74c0
0 ETH0.0009813630.54537522
Mint142842902022-02-26 21:55:25864 days ago1645912525IN
0xD23C25Eb...055fD74c0
0 ETH0.0010443332.50537522
Mint142820992022-02-26 13:52:20864 days ago1645883540IN
0xD23C25Eb...055fD74c0
0 ETH0.0012233738.07829214
Mint142795802022-02-26 4:33:27865 days ago1645850007IN
0xD23C25Eb...055fD74c0
0 ETH0.0006438520.53687797
Mint142766762022-02-25 17:45:03865 days ago1645811103IN
0xD23C25Eb...055fD74c0
0 ETH0.0021252266.07475748
Mint142762902022-02-25 16:15:37865 days ago1645805737IN
0xD23C25Eb...055fD74c0
0 ETH0.0065951874.22744412
Mint142759472022-02-25 15:00:00865 days ago1645801200IN
0xD23C25Eb...055fD74c0
0 ETH0.0053347374.35063897
Mint142759412022-02-25 14:57:21865 days ago1645801041IN
0xD23C25Eb...055fD74c0
0 ETH0.0054731161.59883352
Mint142759212022-02-25 14:52:09865 days ago1645800729IN
0xD23C25Eb...055fD74c0
0 ETH0.0035449435.55325669
Mint142759152022-02-25 14:51:23865 days ago1645800683IN
0xD23C25Eb...055fD74c0
0 ETH0.0039639339.75540666
Mint142758992022-02-25 14:48:54865 days ago1645800534IN
0xD23C25Eb...055fD74c0
0 ETH0.0033014946.01329463
Mint142758992022-02-25 14:48:54865 days ago1645800534IN
0xD23C25Eb...055fD74c0
0 ETH0.0045888946.02329463
Mint142758962022-02-25 14:47:58865 days ago1645800478IN
0xD23C25Eb...055fD74c0
0 ETH0.0040519440.63813935
Mint142755632022-02-25 13:39:59865 days ago1645796399IN
0xD23C25Eb...055fD74c0
0 ETH0.0054380454.53966994
Mint142755592022-02-25 13:38:53865 days ago1645796333IN
0xD23C25Eb...055fD74c0
0 ETH0.0058569950.14209237
Mint142755432022-02-25 13:35:14865 days ago1645796114IN
0xD23C25Eb...055fD74c0
0 ETH0.0046260152.06490765
Mint142754522022-02-25 13:12:29866 days ago1645794749IN
0xD23C25Eb...055fD74c0
0 ETH0.0044149949.68990032
Mint142753422022-02-25 12:49:21866 days ago1645793361IN
0xD23C25Eb...055fD74c0
0 ETH0.0035374439.81324672
Mint142753422022-02-25 12:49:21866 days ago1645793361IN
0xD23C25Eb...055fD74c0
0 ETH0.0028573539.82324672
Mint142753412022-02-25 12:48:45866 days ago1645793325IN
0xD23C25Eb...055fD74c0
0 ETH0.0031592435.5566107
Mint142753362022-02-25 12:47:20866 days ago1645793240IN
0xD23C25Eb...055fD74c0
0 ETH0.0031202735.11806547
Mint142753302022-02-25 12:46:05866 days ago1645793165IN
0xD23C25Eb...055fD74c0
0 ETH0.0024234133.77527912
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.