ETH Price: $3,301.29 (-10.20%)

Token

Metalabel Public Mint (METALABEL-PM)
 

Overview

Max Total Supply

1,560 METALABEL-PM

Holders

721

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 METALABEL-PM
0x051c07a3d0c0c92bc79696b952691e8f45144029
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:
PublicMint

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : PublicMint.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

/*

███╗░░░███╗███████╗████████╗░█████╗░██╗░░░░░░█████╗░██████╗░███████╗██╗░░░░░
████╗░████║██╔════╝╚══██╔══╝██╔══██╗██║░░░░░██╔══██╗██╔══██╗██╔════╝██║░░░░░
██╔████╔██║█████╗░░░░░██║░░░███████║██║░░░░░███████║██████╦╝█████╗░░██║░░░░░
██║╚██╔╝██║██╔══╝░░░░░██║░░░██╔══██║██║░░░░░██╔══██║██╔══██╗██╔══╝░░██║░░░░░
██║░╚═╝░██║███████╗░░░██║░░░██║░░██║███████╗██║░░██║██████╦╝███████╗███████╗
╚═╝░░░░░╚═╝╚══════╝░░░╚═╝░░░╚═╝░░╚═╝╚══════╝╚═╝░░╚═╝╚═════╝░╚══════╝╚══════╝

██████╗░██╗░░░██╗██████╗░██╗░░░░░██╗░█████╗░  ███╗░░░███╗██╗███╗░░██╗████████╗
██╔══██╗██║░░░██║██╔══██╗██║░░░░░██║██╔══██╗  ████╗░████║██║████╗░██║╚══██╔══╝
██████╔╝██║░░░██║██████╦╝██║░░░░░██║██║░░╚═╝  ██╔████╔██║██║██╔██╗██║░░░██║░░░
██╔═══╝░██║░░░██║██╔══██╗██║░░░░░██║██║░░██╗  ██║╚██╔╝██║██║██║╚████║░░░██║░░░
██║░░░░░╚██████╔╝██████╦╝███████╗██║╚█████╔╝  ██║░╚═╝░██║██║██║░╚███║░░░██║░░░
╚═╝░░░░░░╚═════╝░╚═════╝░╚══════╝╚═╝░╚════╝░  ╚═╝░░░░░╚═╝╚═╝╚═╝░░╚══╝░░░╚═╝░░░

Metalabel - Public Mint

Public Mint is a living collection of free-to-mint NFTs that celebrate releases
and meaningful events in the Metalabel universe

Deployed by Metalabel with 💖 as a permanent application on the Ethereum blockchain.

https://public-mint.metalabel.xyz

Anna Bulbrook (Curator)
Austin Robey (Community)
Brandon Valosek (Engineer)
Ilya Yudanov (Designer)
Lauren Dorman (Engineer)
Rob Kalin (Board member)
Yancey Strickler (CEO)

*/

import {ERC721} from "@metalabel/solmate/src/tokens/ERC721.sol";
import {Owned} from "@metalabel/solmate/src/auth/Owned.sol";
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {IERC721} from "@openzeppelin/contracts/interfaces/IERC721.sol";

/// @notice Contract that can compute tokenURI values for a given token ID.
interface IMetadataResolver {
    function resolve(address _contract, uint256 _id)
        external
        view
        returns (string memory);
}

/// @notice Data stored for each token series
struct SeriesConfig {
    string metadataBaseURI;
    uint32 variationCount;
    IMetadataResolver metadataResolver;
}

/// @notice ERC721 NFT contract for Metalabel Public Mint
contract PublicMint is ERC721, Owned {
    // ---
    // errors
    // ---

    /// @notice Minting is not allowed currently
    error MintingPaused();

    /// @notice External mint from an invalid msg.sender
    error UnallowedExternalMinter();

    // ---
    // events
    // ---

    /// @notice A token series was configured
    event SeriesConfigSet(
        uint16 indexed seriesId,
        string metadataBaseURI,
        uint32 variationCount,
        IMetadataResolver metadataResolver
    );

    /// @notice An address was added or removed as an allowed minter for a
    /// series.
    event SeriesAllowedMinterSet(
        uint16 indexed seriesId,
        address indexed minter,
        bool isAllowed
    );

    /// @notice The contract owner updated the current active mint.
    event ActiveMintSet(uint16 indexed seriesId, uint64 mintingPausesAt);

    // ---
    // storage
    // ---

    /// @notice Total number of minted tokens.
    uint256 public totalSupply;

    /// @notice The URI for the collection-level metadata, only set during
    /// deployment. Checked by OpenSea.
    string public contractURI;

    /// @notice The address of the ASSEMBLY 001 NFT contract
    IERC721 public immutable assemblyNFT;

    /// @notice The token series actively being minted from this contract.
    /// External minting contracts may mint from any series.
    uint16 public currentMintingSeries = 1;

    /// @notice Timestamp after which minting will be paused. External minting
    /// contracts can mint at any time.
    uint64 public mintingPausesAt = 0;

    /// @notice The token series configurations.
    mapping(uint16 => SeriesConfig) public seriesConfigs;

    /// @notice Addresses that are allowed to mint a specific token series.
    mapping(uint16 => mapping(address => bool)) public seriesAllowedMinters;

    /// @notice Flag to indicate if an address has claimed an NFT with their
    /// ASSEMBLY NFT already
    mapping(address => bool) public assemblyNFTClaimed;

    // ---
    // constructor
    // ---

    constructor(
        string memory _contractURI,
        address _contractOwner,
        IERC721 _assemblyNFT,
        SeriesConfig[] memory _initialSeries
    )
        ERC721("Metalabel Public Mint", "METALABEL-PM")
        Owned(_contractOwner == address(0) ? msg.sender : _contractOwner)
    {
        contractURI = _contractURI;
        assemblyNFT = _assemblyNFT;

        // initialize the first series
        for (uint16 i = 0; i < _initialSeries.length; i++) {
            SeriesConfig memory config = _initialSeries[i];
            seriesConfigs[i] = config;
            emit SeriesConfigSet(
                i,
                config.metadataBaseURI,
                config.variationCount,
                config.metadataResolver
            );
        }
    }

    // ---
    // Owner functionality
    // ---

    /// @notice Set the active minting series and cutoff time. Only callable by
    /// owner.
    function setActiveMint(uint16 _seriesId, uint64 _mintingPausesAt)
        external
        onlyOwner
    {
        currentMintingSeries = _seriesId;
        mintingPausesAt = _mintingPausesAt;
        emit ActiveMintSet(_seriesId, _mintingPausesAt);
    }

    /// @notice Set the configuration for a specific token series. Only callable
    /// by owner.
    function setSeriesConfig(
        uint16 _seriesId,
        SeriesConfig memory _config,
        address[] memory _allowedMinters
    ) external onlyOwner {
        seriesConfigs[_seriesId] = _config;

        emit SeriesConfigSet(
            _seriesId,
            _config.metadataBaseURI,
            _config.variationCount,
            _config.metadataResolver
        );

        setSeriesAllowedMinters(_seriesId, _allowedMinters, true);
    }

    /// @notice Set or unset the allowed minters for a specific token series.
    /// Only callable by owner.
    function setSeriesAllowedMinters(
        uint16 _seriesId,
        address[] memory _allowedMinters,
        bool isAllowed
    ) public onlyOwner {
        for (uint256 i = 0; i < _allowedMinters.length; i++) {
            seriesAllowedMinters[_seriesId][_allowedMinters[i]] = isAllowed;
            emit SeriesAllowedMinterSet(
                _seriesId,
                _allowedMinters[i],
                isAllowed
            );
        }
    }

    // ---
    // external minter functionality
    // ---

    /// @notice Mint from an external allowed minting account with a prandom
    /// seed.
    function externalMint(address to, uint16 seriesId)
        external
        returns (uint256)
    {
        if (!seriesAllowedMinters[seriesId][msg.sender]) {
            revert UnallowedExternalMinter();
        }

        return _mintToSeries(to, seriesId);
    }

    /// @notice Mint from an external allowed minting contract with a custom
    /// seed.
    function externalMint(
        address to,
        uint16 seriesId,
        uint48 seed
    ) external returns (uint256) {
        if (!seriesAllowedMinters[seriesId][msg.sender]) {
            revert UnallowedExternalMinter();
        }

        uint256 tokenId = ++totalSupply;
        _mint(to, tokenId, seriesId, seed);
        return tokenId;
    }

    // ---
    // public functionality
    // ---

    /// @notice Mint a new token from the currently active series.
    /// @param to The address to mint the token to.
    /// @param mintBonusNFT If true, and "to" has an OG ASSEMBLY NFT they
    /// haven't yet used to mint an NFT from the ASSEMBLY series, then a bonus
    /// NFT will also be minted.
    function mint(address to, bool mintBonusNFT) external returns (uint256) {
        if (block.timestamp >= mintingPausesAt) revert MintingPaused();

        // If the caller wants to also their bonus NFT for assembly, check to
        // see if they own the OG assembly NFT and havent yet claimed
        if (
            mintBonusNFT &&
            assemblyNFT.balanceOf(to) > 0 && // assemblyNFT is never 0x0
            !assemblyNFTClaimed[to]
        ) {
            _mintToSeries(
                to,
                0 /* assembly series */
            );
            assemblyNFTClaimed[to] = true;
        }

        return _mintToSeries(to, currentMintingSeries);
    }

    /// @notice Internal mint logic
    function _mintToSeries(address to, uint16 seriesId)
        internal
        returns (uint256)
    {
        uint256 tokenId = ++totalSupply;
        uint48 seed = uint48(
            uint256(
                keccak256(
                    abi.encodePacked(
                        tokenId,
                        seriesId,
                        msg.sender,
                        blockhash(block.number - 1)
                    )
                )
            )
        );
        _mint(to, tokenId, seriesId, seed);
        return tokenId;
    }

    // ---
    // metadata logic
    // ---

    /// @notice Return the metadata URI for a token.
    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        SeriesConfig memory config = seriesConfigs[
            _tokenData[tokenId].seriesId
        ];

        // use an external resolver if set
        if (config.metadataResolver != IMetadataResolver(address(0))) {
            return config.metadataResolver.resolve(address(this), tokenId);
        }

        // determine the variation psuedorandomly as a function of token seed
        uint256 variation = uint256(
            keccak256(abi.encodePacked(_tokenData[tokenId].seed))
        ) % config.variationCount;

        // otherwise concatenate the base URI and the token ID
        return
            string(
                abi.encodePacked(
                    config.metadataBaseURI,
                    "variation-",
                    Strings.toString(variation),
                    ".json"
                )
            );
    }
}

File 2 of 7 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Data stored per-token, fits into a single storage word
struct TokenData {
    address owner;
    uint32 truncatedTimestamp;
    uint16 seriesId;
    uint48 seed;
}

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    event TokenDataSet(uint256 indexed id, uint16 indexed seriesId, uint48 indexed seed);

    /*//////////////////////////////////////////////////////////////
                         METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                      ERC721 BALANCE/OWNER STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => TokenData) internal _tokenData;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        require((owner = _tokenData[id].owner) != address(0), "NOT_MINTED");
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ZERO_ADDRESS");

        return _balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                         ERC721 APPROVAL STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = _tokenData[id].owner;

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == _tokenData[id].owner, "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _balanceOf[from]--;

            _balanceOf[to]++;
        }

        _tokenData[id].owner = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        return _mint(to, id, 0, 0);
    }

    function _mint(address to, uint256 id, uint16 seriesId, uint48 seed) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(_tokenData[id].owner == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            _balanceOf[to]++;
        }

        _tokenData[id] = TokenData({
            owner: to,
            truncatedTimestamp: uint32(block.timestamp / 10),
            seriesId: seriesId,
            seed: seed
        });

        emit Transfer(address(0), to, id);
        emit TokenDataSet(id, seriesId, seed);
    }

    function _burn(uint256 id) internal virtual {
        address owner = _tokenData[id].owner;

        require(owner != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            _balanceOf[owner]--;
        }

        delete _tokenData[id];

        delete getApproved[id];

        emit Transfer(owner, address(0), id);
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                    METALABEL ADDED FUNCTIONALITY
    //////////////////////////////////////////////////////////////*/

    function getTokenData(uint256 id) external view virtual returns (TokenData memory) {
        TokenData memory data = _tokenData[id];
        require(data.owner != address(0), "NOT_MINTED");
        return data;
    }

    function getApproximateTokenMintTimestamp(uint256 id) external view virtual returns (uint256) {
        TokenData memory data = _tokenData[id];
        require(data.owner != address(0), "NOT_MINTED");
        return uint256(data.truncatedTimestamp) * 10;
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

File 3 of 7 : Owned.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event OwnershipTransferred(address indexed user, address indexed newOwner);

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(address _owner) {
        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function setOwner(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnershipTransferred(msg.sender, newOwner);
    }
}

File 4 of 7 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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

pragma solidity ^0.8.0;

import "../token/ERC721/IERC721.sol";

File 6 of 7 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 7 of 7 : 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);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"address","name":"_contractOwner","type":"address"},{"internalType":"contract IERC721","name":"_assemblyNFT","type":"address"},{"components":[{"internalType":"string","name":"metadataBaseURI","type":"string"},{"internalType":"uint32","name":"variationCount","type":"uint32"},{"internalType":"contract IMetadataResolver","name":"metadataResolver","type":"address"}],"internalType":"struct SeriesConfig[]","name":"_initialSeries","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MintingPaused","type":"error"},{"inputs":[],"name":"UnallowedExternalMinter","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"seriesId","type":"uint16"},{"indexed":false,"internalType":"uint64","name":"mintingPausesAt","type":"uint64"}],"name":"ActiveMintSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"seriesId","type":"uint16"},{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"SeriesAllowedMinterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"seriesId","type":"uint16"},{"indexed":false,"internalType":"string","name":"metadataBaseURI","type":"string"},{"indexed":false,"internalType":"uint32","name":"variationCount","type":"uint32"},{"indexed":false,"internalType":"contract IMetadataResolver","name":"metadataResolver","type":"address"}],"name":"SeriesConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint16","name":"seriesId","type":"uint16"},{"indexed":true,"internalType":"uint48","name":"seed","type":"uint48"}],"name":"TokenDataSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assemblyNFT","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"assemblyNFTClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMintingSeries","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"seriesId","type":"uint16"},{"internalType":"uint48","name":"seed","type":"uint48"}],"name":"externalMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"seriesId","type":"uint16"}],"name":"externalMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getApproximateTokenMintTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getTokenData","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"truncatedTimestamp","type":"uint32"},{"internalType":"uint16","name":"seriesId","type":"uint16"},{"internalType":"uint48","name":"seed","type":"uint48"}],"internalType":"struct TokenData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"mintBonusNFT","type":"bool"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingPausesAt","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"address","name":"","type":"address"}],"name":"seriesAllowedMinters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"seriesConfigs","outputs":[{"internalType":"string","name":"metadataBaseURI","type":"string"},{"internalType":"uint32","name":"variationCount","type":"uint32"},{"internalType":"contract IMetadataResolver","name":"metadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_seriesId","type":"uint16"},{"internalType":"uint64","name":"_mintingPausesAt","type":"uint64"}],"name":"setActiveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_seriesId","type":"uint16"},{"internalType":"address[]","name":"_allowedMinters","type":"address[]"},{"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"setSeriesAllowedMinters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_seriesId","type":"uint16"},{"components":[{"internalType":"string","name":"metadataBaseURI","type":"string"},{"internalType":"uint32","name":"variationCount","type":"uint32"},{"internalType":"contract IMetadataResolver","name":"metadataResolver","type":"address"}],"internalType":"struct SeriesConfig","name":"_config","type":"tuple"},{"internalType":"address[]","name":"_allowedMinters","type":"address[]"}],"name":"setSeriesConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052600980546001600160501b03191660011790553480156200002457600080fd5b50604051620029083803806200290883398101604081905262000047916200043f565b6001600160a01b038316156200005e578262000060565b335b604080518082018252601581527f4d6574616c6162656c205075626c6963204d696e74000000000000000000000060208083019182528351808501909452600c84526b4d4554414c4142454c2d504d60a01b908401528151919291620000c99160009162000265565b508051620000df90600190602084019062000265565b5050600680546001600160a01b0319166001600160a01b0384169081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35083516200014390600890602087019062000265565b506001600160a01b03821660805260005b81518161ffff1610156200025a576000828261ffff16815181106200017d576200017d620005d4565b60209081029190910181015161ffff84166000908152600a8352604090208151805192945084939192620001b5928492019062000265565b50602082810151600190920180546040948501516001600160a01b0316640100000000026001600160c01b031990911663ffffffff909416939093179290921790915582519083015183830151925161ffff8616937f52da2742a4f5c7a457afe1b3278b2a76aa8e6bdb37206c2240514ac7f6e2d10c936200023c939092909190620005ea565b60405180910390a2508062000251816200063d565b91505062000154565b5050505050620006a9565b82805462000273906200066d565b90600052602060002090601f016020900481019282620002975760008555620002e2565b82601f10620002b257805160ff1916838001178555620002e2565b82800160010185558215620002e2579182015b82811115620002e2578251825591602001919060010190620002c5565b50620002f0929150620002f4565b5090565b5b80821115620002f05760008155600101620002f5565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156200034657620003466200030b565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200037757620003776200030b565b604052919050565b60005b838110156200039c57818101518382015260200162000382565b83811115620003ac576000848401525b50505050565b600082601f830112620003c457600080fd5b81516001600160401b03811115620003e057620003e06200030b565b620003f5601f8201601f19166020016200034c565b8181528460208386010111156200040b57600080fd5b6200041e8260208301602087016200037f565b949350505050565b6001600160a01b03811681146200043c57600080fd5b50565b600080600080608085870312156200045657600080fd5b84516001600160401b03808211156200046e57600080fd5b6200047c88838901620003b2565b955060208701519150620004908262000426565b6040870151919450620004a38262000426565b606087015191935080821115620004b957600080fd5b818701915087601f830112620004ce57600080fd5b815181811115620004e357620004e36200030b565b620004f460208260051b016200034c565b8082825260208201915060208360051b86010192508a8311156200051757600080fd5b602085015b83811015620005c4578051858111156200053557600080fd5b86016060818e03601f190112156200054c57600080fd5b6200055662000321565b6020820151878111156200056957600080fd5b6200057a8f602083860101620003b2565b825250604082015163ffffffff811681146200059557600080fd5b60208201526060919091015190620005ad8262000426565b60408101919091528352602092830192016200051c565b50979a9699509497505050505050565b634e487b7160e01b600052603260045260246000fd5b60608152600084518060608401526200060b8160808501602089016200037f565b63ffffffff949094166020830152506001600160a01b039190911660408201526080601f909201601f19160101919050565b600061ffff8083168181036200066357634e487b7160e01b600052601160045260246000fd5b6001019392505050565b600181811c908216806200068257607f821691505b602082108103620006a357634e487b7160e01b600052602260045260246000fd5b50919050565b60805161223c620006cc600039600081816104150152610855015261223c6000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806387b862941161010f578063b88d4fde116100a2578063e10e769411610071578063e10e7694146104f3578063e8a3d48514610506578063e985e9c51461050e578063f5d1c95e1461053c57600080fd5b8063b88d4fde14610498578063c87b56dd146104ab578063cdfc597b146104be578063d014f27a146104e057600080fd5b80639c46d883116100de5780639c46d883146103ea578063a22cb465146103fd578063aa2af3a514610410578063b09afec11461043757600080fd5b806387b862941461037d5780638da5cb5b1461039e578063949b3fc6146103b157806395d89b41146103e257600080fd5b80631abcc4f21161018757806350c97dae1161015657806350c97dae146103215780636352211e1461034457806370a082311461035757806385412eb61461036a57600080fd5b80631abcc4f2146102ba5780632097d3fb146102e857806323b872dd146102fb57806342842e0e1461030e57600080fd5b8063081812fc116101c3578063081812fc14610248578063095ea7b31461028957806313af40351461029e57806318160ddd146102b157600080fd5b806301ffc9a7146101ea57806302a40b5f1461021257806306fdde0314610233575b600080fd5b6101fd6101f8366004611927565b61054f565b60405190151581526020015b60405180910390f35b61022561022036600461196b565b6105a1565b604051908152602001610209565b61023b61060c565b6040516102099190611a17565b610271610256366004611a2a565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610209565b61029c610297366004611a43565b61069a565b005b61029c6102ac366004611a6f565b610781565b61022560075481565b6101fd6102c8366004611a8c565b600b60209081526000928352604080842090915290825290205460ff1681565b6102256102f6366004611ad3565b6107f7565b61029c610309366004611b08565b610937565b61029c61031c366004611b08565b610afe565b6101fd61032f366004611a6f565b600c6020526000908152604090205460ff1681565b610271610352366004611a2a565b610bf6565b610225610365366004611a6f565b610c30565b610225610378366004611b49565b610c93565b60095461038b9061ffff1681565b60405161ffff9091168152602001610209565b600654610271906001600160a01b031681565b6009546103ca906201000090046001600160401b031681565b6040516001600160401b039091168152602001610209565b61023b610cdc565b61029c6103f8366004611cb1565b610ce9565b61029c61040b366004611ad3565b610dd6565b6102717f000000000000000000000000000000000000000000000000000000000000000081565b61044a610445366004611a2a565b610e42565b604051610209919081516001600160a01b0316815260208083015163ffffffff169082015260408083015161ffff169082015260609182015165ffffffffffff169181019190915260800190565b61029c6104a6366004611db5565b610ee6565b61023b6104b9366004611a2a565b610fce565b6104d16104cc366004611e53565b6111d8565b60405161020993929190611e6e565b61029c6104ee366004611ea7565b611296565b61029c610501366004611edf565b61132a565b61023b611444565b6101fd61051c366004611f3c565b600560209081526000928352604080842090915290825290205460ff1681565b61022561054a366004611a2a565b611451565b60006301ffc9a760e01b6001600160e01b03198316148061058057506380ac58cd60e01b6001600160e01b03198316145b8061059b5750635b5e139f60e01b6001600160e01b03198316145b92915050565b61ffff82166000908152600b6020908152604080832033845290915281205460ff166105e05760405163bce9cceb60e01b815260040160405180910390fd5b60006007600081546105f190611f70565b91829055509050610604858286866114e7565b949350505050565b6000805461061990611f89565b80601f016020809104026020016040519081016040528092919081815260200182805461064590611f89565b80156106925780601f1061066757610100808354040283529160200191610692565b820191906000526020600020905b81548152906001019060200180831161067557829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b0316338114806106e357506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6107255760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b031633146107ab5760405162461bcd60e51b815260040161071c90611fc3565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6009546000906201000090046001600160401b0316421061082b576040516375ab03ab60e11b815260040160405180910390fd5b8180156108c457506040516370a0823160e01b81526001600160a01b0384811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561089e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c29190611fe9565b115b80156108e957506001600160a01b0383166000908152600c602052604090205460ff16155b1561091e576108f98360006116d4565b506001600160a01b0383166000908152600c60205260409020805460ff191660011790555b60095461093090849061ffff166116d4565b9392505050565b6000818152600260205260409020546001600160a01b0384811691161461098d5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161071c565b6001600160a01b0382166109d75760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161071c565b336001600160a01b0384161480610a1157506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b80610a3257506000818152600460205260409020546001600160a01b031633145b610a6f5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161071c565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610b09838383610937565b6001600160a01b0382163b1580610bb25750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba69190612002565b6001600160e01b031916145b610bf15760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161071c565b505050565b6000818152600260205260409020546001600160a01b031680610c2b5760405162461bcd60e51b815260040161071c9061201f565b919050565b60006001600160a01b038216610c775760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161071c565b506001600160a01b031660009081526003602052604090205490565b61ffff81166000908152600b6020908152604080832033845290915281205460ff16610cd25760405163bce9cceb60e01b815260040160405180910390fd5b61093083836116d4565b6001805461061990611f89565b6006546001600160a01b03163314610d135760405162461bcd60e51b815260040161071c90611fc3565b61ffff83166000908152600a60209081526040909120835180518593610d3d928492910190611875565b50602082810151600190920180546040948501516001600160a01b0316640100000000026001600160c01b031990911663ffffffff909416939093179290921790915583519084015184830151925161ffff8716937f52da2742a4f5c7a457afe1b3278b2a76aa8e6bdb37206c2240514ac7f6e2d10c93610dc2939092909190611e6e565b60405180910390a2610bf18382600161132a565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260026020908152604091829020825160808101845290546001600160a01b038116808352600160a01b820463ffffffff1693830193909352600160c01b810461ffff1693820193909352600160d01b90920465ffffffffffff16606083015261059b5760405162461bcd60e51b815260040161071c9061201f565b610ef1858585610937565b6001600160a01b0384163b1580610f885750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610f399033908a90899089908990600401612043565b6020604051808303816000875af1158015610f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7c9190612002565b6001600160e01b031916145b610fc75760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161071c565b5050505050565b600081815260026020908152604080832054600160c01b900461ffff168352600a9091528082208151606080820190935281549293929091908290829061101490611f89565b80601f016020809104026020016040519081016040528092919081815260200182805461104090611f89565b801561108d5780601f106110625761010080835404028352916020019161108d565b820191906000526020600020905b81548152906001019060200180831161107057829003601f168201915b50505091835250506001919091015463ffffffff811660208301526001600160a01b03640100000000909104811660409283015290820151919250161561114757604080820151905163abadc6f560e01b8152306004820152602481018590526001600160a01b039091169063abadc6f590604401600060405180830381865afa15801561111f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109309190810190612097565b6020818101516000858152600283526040808220548151600160d01b90910460d01b6001600160d01b0319168186015281518082036006018152602690910190915280519301929092206111a19163ffffffff1690612123565b82519091506111af82611775565b6040516020016111c0929190612137565b60405160208183030381529060405292505050919050565b600a602052600090815260409020805481906111f390611f89565b80601f016020809104026020016040519081016040528092919081815260200182805461121f90611f89565b801561126c5780601f106112415761010080835404028352916020019161126c565b820191906000526020600020905b81548152906001019060200180831161124f57829003601f168201915b5050506001909301549192505063ffffffff8116906001600160a01b036401000000009091041683565b6006546001600160a01b031633146112c05760405162461bcd60e51b815260040161071c90611fc3565b6009805461ffff841669ffffffffffffffffffff199091168117620100006001600160401b03851690810291909117909255604051918252907fcfbefe3f366bbb4a493b14a3593708dded6b8142161c08294185d7025a413d4e9060200160405180910390a25050565b6006546001600160a01b031633146113545760405162461bcd60e51b815260040161071c90611fc3565b60005b825181101561143e5761ffff84166000908152600b60205260408120845184929086908590811061138a5761138a61218e565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055508281815181106113db576113db61218e565b60200260200101516001600160a01b03168461ffff167fca884cd40bb3d8b0870e71cefde9a92ea9280e51d293171937dc1a7fcd09311884604051611424911515815260200190565b60405180910390a38061143681611f70565b915050611357565b50505050565b6008805461061990611f89565b6000818152600260209081526040808320815160808101835290546001600160a01b038116808352600160a01b820463ffffffff1694830194909452600160c01b810461ffff1692820192909252600160d01b90910465ffffffffffff166060820152906114d15760405162461bcd60e51b815260040161071c9061201f565b60208101516109309063ffffffff16600a6121a4565b6001600160a01b0384166115315760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161071c565b6000838152600260205260409020546001600160a01b0316156115875760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161071c565b6001600160a01b038416600081815260036020908152604091829020805460010190558151608081019092529181529081016115c4600a426121c3565b63ffffffff908116825261ffff80861660208085019190915265ffffffffffff8087166040958601526000898152600283528581208751815494890151898901516060909a0151909416600160d01b026001600160d01b0399909616600160c01b02989098166001600160c01b0393909616600160a01b026001600160c01b03199094166001600160a01b039889161793909317919091169390931791909117905590518592871691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48065ffffffffffff168261ffff16847ffcffdff9d332a0ab8fd46670633891644ab14b6217e60961030eba90a26557e860405160405180910390a450505050565b6000806007600081546116e690611f70565b9182905550905060008184336116fd6001436121d7565b40604051602001611746949392919093845260f09290921b6001600160f01b031916602084015260601b6bffffffffffffffffffffffff19166022830152603682015260560190565b6040516020818303038152906040528051906020012060001c905061176d858386846114e7565b509392505050565b60608160000361179c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156117c657806117b081611f70565b91506117bf9050600a836121c3565b91506117a0565b6000816001600160401b038111156117e0576117e0611b75565b6040519080825280601f01601f19166020018201604052801561180a576020820181803683370190505b5090505b84156106045761181f6001836121d7565b915061182c600a86612123565b6118379060306121ee565b60f81b81838151811061184c5761184c61218e565b60200101906001600160f81b031916908160001a90535061186e600a866121c3565b945061180e565b82805461188190611f89565b90600052602060002090601f0160209004810192826118a357600085556118e9565b82601f106118bc57805160ff19168380011785556118e9565b828001600101855582156118e9579182015b828111156118e95782518255916020019190600101906118ce565b506118f59291506118f9565b5090565b5b808211156118f557600081556001016118fa565b6001600160e01b03198116811461192457600080fd5b50565b60006020828403121561193957600080fd5b81356109308161190e565b6001600160a01b038116811461192457600080fd5b803561ffff81168114610c2b57600080fd5b60008060006060848603121561198057600080fd5b833561198b81611944565b925061199960208501611959565b9150604084013565ffffffffffff811681146119b457600080fd5b809150509250925092565b60005b838110156119da5781810151838201526020016119c2565b8381111561143e5750506000910152565b60008151808452611a038160208601602086016119bf565b601f01601f19169290920160200192915050565b60208152600061093060208301846119eb565b600060208284031215611a3c57600080fd5b5035919050565b60008060408385031215611a5657600080fd5b8235611a6181611944565b946020939093013593505050565b600060208284031215611a8157600080fd5b813561093081611944565b60008060408385031215611a9f57600080fd5b611aa883611959565b91506020830135611ab881611944565b809150509250929050565b80358015158114610c2b57600080fd5b60008060408385031215611ae657600080fd5b8235611af181611944565b9150611aff60208401611ac3565b90509250929050565b600080600060608486031215611b1d57600080fd5b8335611b2881611944565b92506020840135611b3881611944565b929592945050506040919091013590565b60008060408385031215611b5c57600080fd5b8235611b6781611944565b9150611aff60208401611959565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715611bad57611bad611b75565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611bdb57611bdb611b75565b604052919050565b60006001600160401b03821115611bfc57611bfc611b75565b50601f01601f191660200190565b803563ffffffff81168114610c2b57600080fd5b8035610c2b81611944565b600082601f830112611c3a57600080fd5b813560206001600160401b03821115611c5557611c55611b75565b8160051b611c64828201611bb3565b9283528481018201928281019087851115611c7e57600080fd5b83870192505b84831015611ca6578235611c9781611944565b82529183019190830190611c84565b979650505050505050565b600080600060608486031215611cc657600080fd5b611ccf84611959565b92506020808501356001600160401b0380821115611cec57600080fd5b9086019060608289031215611d0057600080fd5b611d08611b8b565b823582811115611d1757600080fd5b8301601f81018a13611d2857600080fd5b8035611d3b611d3682611be3565b611bb3565b8181528b87838501011115611d4f57600080fd5b81878401888301376000878383010152808452505050611d70848401611c0a565b84820152611d8060408401611c1e565b6040820152809550506040870135925080831115611d9d57600080fd5b5050611dab86828701611c29565b9150509250925092565b600080600080600060808688031215611dcd57600080fd5b8535611dd881611944565b94506020860135611de881611944565b93506040860135925060608601356001600160401b0380821115611e0b57600080fd5b818801915088601f830112611e1f57600080fd5b813581811115611e2e57600080fd5b896020828501011115611e4057600080fd5b9699959850939650602001949392505050565b600060208284031215611e6557600080fd5b61093082611959565b606081526000611e8160608301866119eb565b63ffffffff949094166020830152506001600160a01b0391909116604090910152919050565b60008060408385031215611eba57600080fd5b611ec383611959565b915060208301356001600160401b0381168114611ab857600080fd5b600080600060608486031215611ef457600080fd5b611efd84611959565b925060208401356001600160401b03811115611f1857600080fd5b611f2486828701611c29565b925050611f3360408501611ac3565b90509250925092565b60008060408385031215611f4f57600080fd5b8235611aa881611944565b634e487b7160e01b600052601160045260246000fd5b600060018201611f8257611f82611f5a565b5060010190565b600181811c90821680611f9d57607f821691505b602082108103611fbd57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b600060208284031215611ffb57600080fd5b5051919050565b60006020828403121561201457600080fd5b81516109308161190e565b6020808252600a90820152691393d517d3525395115160b21b604082015260600190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000602082840312156120a957600080fd5b81516001600160401b038111156120bf57600080fd5b8201601f810184136120d057600080fd5b80516120de611d3682611be3565b8181528560208385010111156120f357600080fd5b6121048260208301602086016119bf565b95945050505050565b634e487b7160e01b600052601260045260246000fd5b6000826121325761213261210d565b500690565b600083516121498184602088016119bf565b69766172696174696f6e2d60b01b908301908152835161217081600a8401602088016119bf565b64173539b7b760d91b600a9290910191820152600f01949350505050565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156121be576121be611f5a565b500290565b6000826121d2576121d261210d565b500490565b6000828210156121e9576121e9611f5a565b500390565b6000821982111561220157612201611f5a565b50019056fea26469706673582212207634a301593f845d071d4d0caed39e029c0a5b6936faebce1f7b935c9c96cb1064736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000de8ec3ab24525439efa66fb44106605943f46499000000000000000000000000279c4e78e71614ef94516d24e39a6c0c6c7e68be00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d654a7035554a74504457334e7665677970746634656b5252356f5a7258756a32677137387061593164676531000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d636745534d32487036596274784a6b7a5a754c59584258313737744454647171676e4b614a315969764436792f000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d51696a3454364a38425673505155396b356d65795a5936484232745a366d7568354c737963375747347848522f000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d523432574c34466b68755637486936694a644a645238787068486d324d647975447832485a347a79796878622f00000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806387b862941161010f578063b88d4fde116100a2578063e10e769411610071578063e10e7694146104f3578063e8a3d48514610506578063e985e9c51461050e578063f5d1c95e1461053c57600080fd5b8063b88d4fde14610498578063c87b56dd146104ab578063cdfc597b146104be578063d014f27a146104e057600080fd5b80639c46d883116100de5780639c46d883146103ea578063a22cb465146103fd578063aa2af3a514610410578063b09afec11461043757600080fd5b806387b862941461037d5780638da5cb5b1461039e578063949b3fc6146103b157806395d89b41146103e257600080fd5b80631abcc4f21161018757806350c97dae1161015657806350c97dae146103215780636352211e1461034457806370a082311461035757806385412eb61461036a57600080fd5b80631abcc4f2146102ba5780632097d3fb146102e857806323b872dd146102fb57806342842e0e1461030e57600080fd5b8063081812fc116101c3578063081812fc14610248578063095ea7b31461028957806313af40351461029e57806318160ddd146102b157600080fd5b806301ffc9a7146101ea57806302a40b5f1461021257806306fdde0314610233575b600080fd5b6101fd6101f8366004611927565b61054f565b60405190151581526020015b60405180910390f35b61022561022036600461196b565b6105a1565b604051908152602001610209565b61023b61060c565b6040516102099190611a17565b610271610256366004611a2a565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610209565b61029c610297366004611a43565b61069a565b005b61029c6102ac366004611a6f565b610781565b61022560075481565b6101fd6102c8366004611a8c565b600b60209081526000928352604080842090915290825290205460ff1681565b6102256102f6366004611ad3565b6107f7565b61029c610309366004611b08565b610937565b61029c61031c366004611b08565b610afe565b6101fd61032f366004611a6f565b600c6020526000908152604090205460ff1681565b610271610352366004611a2a565b610bf6565b610225610365366004611a6f565b610c30565b610225610378366004611b49565b610c93565b60095461038b9061ffff1681565b60405161ffff9091168152602001610209565b600654610271906001600160a01b031681565b6009546103ca906201000090046001600160401b031681565b6040516001600160401b039091168152602001610209565b61023b610cdc565b61029c6103f8366004611cb1565b610ce9565b61029c61040b366004611ad3565b610dd6565b6102717f000000000000000000000000279c4e78e71614ef94516d24e39a6c0c6c7e68be81565b61044a610445366004611a2a565b610e42565b604051610209919081516001600160a01b0316815260208083015163ffffffff169082015260408083015161ffff169082015260609182015165ffffffffffff169181019190915260800190565b61029c6104a6366004611db5565b610ee6565b61023b6104b9366004611a2a565b610fce565b6104d16104cc366004611e53565b6111d8565b60405161020993929190611e6e565b61029c6104ee366004611ea7565b611296565b61029c610501366004611edf565b61132a565b61023b611444565b6101fd61051c366004611f3c565b600560209081526000928352604080842090915290825290205460ff1681565b61022561054a366004611a2a565b611451565b60006301ffc9a760e01b6001600160e01b03198316148061058057506380ac58cd60e01b6001600160e01b03198316145b8061059b5750635b5e139f60e01b6001600160e01b03198316145b92915050565b61ffff82166000908152600b6020908152604080832033845290915281205460ff166105e05760405163bce9cceb60e01b815260040160405180910390fd5b60006007600081546105f190611f70565b91829055509050610604858286866114e7565b949350505050565b6000805461061990611f89565b80601f016020809104026020016040519081016040528092919081815260200182805461064590611f89565b80156106925780601f1061066757610100808354040283529160200191610692565b820191906000526020600020905b81548152906001019060200180831161067557829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b0316338114806106e357506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6107255760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b031633146107ab5760405162461bcd60e51b815260040161071c90611fc3565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6009546000906201000090046001600160401b0316421061082b576040516375ab03ab60e11b815260040160405180910390fd5b8180156108c457506040516370a0823160e01b81526001600160a01b0384811660048301526000917f000000000000000000000000279c4e78e71614ef94516d24e39a6c0c6c7e68be909116906370a0823190602401602060405180830381865afa15801561089e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c29190611fe9565b115b80156108e957506001600160a01b0383166000908152600c602052604090205460ff16155b1561091e576108f98360006116d4565b506001600160a01b0383166000908152600c60205260409020805460ff191660011790555b60095461093090849061ffff166116d4565b9392505050565b6000818152600260205260409020546001600160a01b0384811691161461098d5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161071c565b6001600160a01b0382166109d75760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161071c565b336001600160a01b0384161480610a1157506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b80610a3257506000818152600460205260409020546001600160a01b031633145b610a6f5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161071c565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610b09838383610937565b6001600160a01b0382163b1580610bb25750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba69190612002565b6001600160e01b031916145b610bf15760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161071c565b505050565b6000818152600260205260409020546001600160a01b031680610c2b5760405162461bcd60e51b815260040161071c9061201f565b919050565b60006001600160a01b038216610c775760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161071c565b506001600160a01b031660009081526003602052604090205490565b61ffff81166000908152600b6020908152604080832033845290915281205460ff16610cd25760405163bce9cceb60e01b815260040160405180910390fd5b61093083836116d4565b6001805461061990611f89565b6006546001600160a01b03163314610d135760405162461bcd60e51b815260040161071c90611fc3565b61ffff83166000908152600a60209081526040909120835180518593610d3d928492910190611875565b50602082810151600190920180546040948501516001600160a01b0316640100000000026001600160c01b031990911663ffffffff909416939093179290921790915583519084015184830151925161ffff8716937f52da2742a4f5c7a457afe1b3278b2a76aa8e6bdb37206c2240514ac7f6e2d10c93610dc2939092909190611e6e565b60405180910390a2610bf18382600161132a565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260026020908152604091829020825160808101845290546001600160a01b038116808352600160a01b820463ffffffff1693830193909352600160c01b810461ffff1693820193909352600160d01b90920465ffffffffffff16606083015261059b5760405162461bcd60e51b815260040161071c9061201f565b610ef1858585610937565b6001600160a01b0384163b1580610f885750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610f399033908a90899089908990600401612043565b6020604051808303816000875af1158015610f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7c9190612002565b6001600160e01b031916145b610fc75760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161071c565b5050505050565b600081815260026020908152604080832054600160c01b900461ffff168352600a9091528082208151606080820190935281549293929091908290829061101490611f89565b80601f016020809104026020016040519081016040528092919081815260200182805461104090611f89565b801561108d5780601f106110625761010080835404028352916020019161108d565b820191906000526020600020905b81548152906001019060200180831161107057829003601f168201915b50505091835250506001919091015463ffffffff811660208301526001600160a01b03640100000000909104811660409283015290820151919250161561114757604080820151905163abadc6f560e01b8152306004820152602481018590526001600160a01b039091169063abadc6f590604401600060405180830381865afa15801561111f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109309190810190612097565b6020818101516000858152600283526040808220548151600160d01b90910460d01b6001600160d01b0319168186015281518082036006018152602690910190915280519301929092206111a19163ffffffff1690612123565b82519091506111af82611775565b6040516020016111c0929190612137565b60405160208183030381529060405292505050919050565b600a602052600090815260409020805481906111f390611f89565b80601f016020809104026020016040519081016040528092919081815260200182805461121f90611f89565b801561126c5780601f106112415761010080835404028352916020019161126c565b820191906000526020600020905b81548152906001019060200180831161124f57829003601f168201915b5050506001909301549192505063ffffffff8116906001600160a01b036401000000009091041683565b6006546001600160a01b031633146112c05760405162461bcd60e51b815260040161071c90611fc3565b6009805461ffff841669ffffffffffffffffffff199091168117620100006001600160401b03851690810291909117909255604051918252907fcfbefe3f366bbb4a493b14a3593708dded6b8142161c08294185d7025a413d4e9060200160405180910390a25050565b6006546001600160a01b031633146113545760405162461bcd60e51b815260040161071c90611fc3565b60005b825181101561143e5761ffff84166000908152600b60205260408120845184929086908590811061138a5761138a61218e565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055508281815181106113db576113db61218e565b60200260200101516001600160a01b03168461ffff167fca884cd40bb3d8b0870e71cefde9a92ea9280e51d293171937dc1a7fcd09311884604051611424911515815260200190565b60405180910390a38061143681611f70565b915050611357565b50505050565b6008805461061990611f89565b6000818152600260209081526040808320815160808101835290546001600160a01b038116808352600160a01b820463ffffffff1694830194909452600160c01b810461ffff1692820192909252600160d01b90910465ffffffffffff166060820152906114d15760405162461bcd60e51b815260040161071c9061201f565b60208101516109309063ffffffff16600a6121a4565b6001600160a01b0384166115315760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161071c565b6000838152600260205260409020546001600160a01b0316156115875760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161071c565b6001600160a01b038416600081815260036020908152604091829020805460010190558151608081019092529181529081016115c4600a426121c3565b63ffffffff908116825261ffff80861660208085019190915265ffffffffffff8087166040958601526000898152600283528581208751815494890151898901516060909a0151909416600160d01b026001600160d01b0399909616600160c01b02989098166001600160c01b0393909616600160a01b026001600160c01b03199094166001600160a01b039889161793909317919091169390931791909117905590518592871691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48065ffffffffffff168261ffff16847ffcffdff9d332a0ab8fd46670633891644ab14b6217e60961030eba90a26557e860405160405180910390a450505050565b6000806007600081546116e690611f70565b9182905550905060008184336116fd6001436121d7565b40604051602001611746949392919093845260f09290921b6001600160f01b031916602084015260601b6bffffffffffffffffffffffff19166022830152603682015260560190565b6040516020818303038152906040528051906020012060001c905061176d858386846114e7565b509392505050565b60608160000361179c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156117c657806117b081611f70565b91506117bf9050600a836121c3565b91506117a0565b6000816001600160401b038111156117e0576117e0611b75565b6040519080825280601f01601f19166020018201604052801561180a576020820181803683370190505b5090505b84156106045761181f6001836121d7565b915061182c600a86612123565b6118379060306121ee565b60f81b81838151811061184c5761184c61218e565b60200101906001600160f81b031916908160001a90535061186e600a866121c3565b945061180e565b82805461188190611f89565b90600052602060002090601f0160209004810192826118a357600085556118e9565b82601f106118bc57805160ff19168380011785556118e9565b828001600101855582156118e9579182015b828111156118e95782518255916020019190600101906118ce565b506118f59291506118f9565b5090565b5b808211156118f557600081556001016118fa565b6001600160e01b03198116811461192457600080fd5b50565b60006020828403121561193957600080fd5b81356109308161190e565b6001600160a01b038116811461192457600080fd5b803561ffff81168114610c2b57600080fd5b60008060006060848603121561198057600080fd5b833561198b81611944565b925061199960208501611959565b9150604084013565ffffffffffff811681146119b457600080fd5b809150509250925092565b60005b838110156119da5781810151838201526020016119c2565b8381111561143e5750506000910152565b60008151808452611a038160208601602086016119bf565b601f01601f19169290920160200192915050565b60208152600061093060208301846119eb565b600060208284031215611a3c57600080fd5b5035919050565b60008060408385031215611a5657600080fd5b8235611a6181611944565b946020939093013593505050565b600060208284031215611a8157600080fd5b813561093081611944565b60008060408385031215611a9f57600080fd5b611aa883611959565b91506020830135611ab881611944565b809150509250929050565b80358015158114610c2b57600080fd5b60008060408385031215611ae657600080fd5b8235611af181611944565b9150611aff60208401611ac3565b90509250929050565b600080600060608486031215611b1d57600080fd5b8335611b2881611944565b92506020840135611b3881611944565b929592945050506040919091013590565b60008060408385031215611b5c57600080fd5b8235611b6781611944565b9150611aff60208401611959565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715611bad57611bad611b75565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611bdb57611bdb611b75565b604052919050565b60006001600160401b03821115611bfc57611bfc611b75565b50601f01601f191660200190565b803563ffffffff81168114610c2b57600080fd5b8035610c2b81611944565b600082601f830112611c3a57600080fd5b813560206001600160401b03821115611c5557611c55611b75565b8160051b611c64828201611bb3565b9283528481018201928281019087851115611c7e57600080fd5b83870192505b84831015611ca6578235611c9781611944565b82529183019190830190611c84565b979650505050505050565b600080600060608486031215611cc657600080fd5b611ccf84611959565b92506020808501356001600160401b0380821115611cec57600080fd5b9086019060608289031215611d0057600080fd5b611d08611b8b565b823582811115611d1757600080fd5b8301601f81018a13611d2857600080fd5b8035611d3b611d3682611be3565b611bb3565b8181528b87838501011115611d4f57600080fd5b81878401888301376000878383010152808452505050611d70848401611c0a565b84820152611d8060408401611c1e565b6040820152809550506040870135925080831115611d9d57600080fd5b5050611dab86828701611c29565b9150509250925092565b600080600080600060808688031215611dcd57600080fd5b8535611dd881611944565b94506020860135611de881611944565b93506040860135925060608601356001600160401b0380821115611e0b57600080fd5b818801915088601f830112611e1f57600080fd5b813581811115611e2e57600080fd5b896020828501011115611e4057600080fd5b9699959850939650602001949392505050565b600060208284031215611e6557600080fd5b61093082611959565b606081526000611e8160608301866119eb565b63ffffffff949094166020830152506001600160a01b0391909116604090910152919050565b60008060408385031215611eba57600080fd5b611ec383611959565b915060208301356001600160401b0381168114611ab857600080fd5b600080600060608486031215611ef457600080fd5b611efd84611959565b925060208401356001600160401b03811115611f1857600080fd5b611f2486828701611c29565b925050611f3360408501611ac3565b90509250925092565b60008060408385031215611f4f57600080fd5b8235611aa881611944565b634e487b7160e01b600052601160045260246000fd5b600060018201611f8257611f82611f5a565b5060010190565b600181811c90821680611f9d57607f821691505b602082108103611fbd57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b600060208284031215611ffb57600080fd5b5051919050565b60006020828403121561201457600080fd5b81516109308161190e565b6020808252600a90820152691393d517d3525395115160b21b604082015260600190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000602082840312156120a957600080fd5b81516001600160401b038111156120bf57600080fd5b8201601f810184136120d057600080fd5b80516120de611d3682611be3565b8181528560208385010111156120f357600080fd5b6121048260208301602086016119bf565b95945050505050565b634e487b7160e01b600052601260045260246000fd5b6000826121325761213261210d565b500690565b600083516121498184602088016119bf565b69766172696174696f6e2d60b01b908301908152835161217081600a8401602088016119bf565b64173539b7b760d91b600a9290910191820152600f01949350505050565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156121be576121be611f5a565b500290565b6000826121d2576121d261210d565b500490565b6000828210156121e9576121e9611f5a565b500390565b6000821982111561220157612201611f5a565b50019056fea26469706673582212207634a301593f845d071d4d0caed39e029c0a5b6936faebce1f7b935c9c96cb1064736f6c634300080d0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000de8ec3ab24525439efa66fb44106605943f46499000000000000000000000000279c4e78e71614ef94516d24e39a6c0c6c7e68be00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d654a7035554a74504457334e7665677970746634656b5252356f5a7258756a32677137387061593164676531000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d636745534d32487036596274784a6b7a5a754c59584258313737744454647171676e4b614a315969764436792f000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d51696a3454364a38425673505155396b356d65795a5936484232745a366d7568354c737963375747347848522f000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d523432574c34466b68755637486936694a644a645238787068486d324d647975447832485a347a79796878622f00000000000000000000

-----Decoded View---------------
Arg [0] : _contractURI (string): ipfs://QmeJp5UJtPDW3Nvegyptf4ekRR5oZrXuj2gq78paY1dge1
Arg [1] : _contractOwner (address): 0xde8eC3Ab24525439EfA66Fb44106605943F46499
Arg [2] : _assemblyNFT (address): 0x279C4e78e71614EF94516d24e39a6c0c6C7e68Be
Arg [3] : _initialSeries (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
29 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 000000000000000000000000de8ec3ab24525439efa66fb44106605943f46499
Arg [2] : 000000000000000000000000279c4e78e71614ef94516d24e39a6c0c6c7e68be
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [5] : 697066733a2f2f516d654a7035554a74504457334e7665677970746634656b52
Arg [6] : 52356f5a7258756a326771373870615931646765310000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [10] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [15] : 697066733a2f2f516d636745534d32487036596274784a6b7a5a754c59584258
Arg [16] : 313737744454647171676e4b614a315969764436792f00000000000000000000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [21] : 697066733a2f2f516d51696a3454364a38425673505155396b356d65795a5936
Arg [22] : 484232745a366d7568354c737963375747347848522f00000000000000000000
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [27] : 697066733a2f2f516d523432574c34466b68755637486936694a644a64523878
Arg [28] : 7068486d324d647975447832485a347a79796878622f00000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.