ETH Price: $3,065.68 (+2.04%)
Gas: 3 Gwei

Contract

0x0B596b7FACB2e134eC6878100C4Dfa6514e97D60
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Set Approval For...171648932023-05-01 8:48:47435 days ago1682930927IN
0x0B596b7F...514e97D60
0 ETH0.0018521340.14506681
Set Approval For...167959302023-03-10 6:20:47487 days ago1678429247IN
0x0B596b7F...514e97D60
0 ETH0.0009911621.51705041
Set Approval For...167883462023-03-09 4:43:35488 days ago1678337015IN
0x0B596b7F...514e97D60
0 ETH0.0014611331.719608
Set Approval For...167871512023-03-09 0:40:59488 days ago1678322459IN
0x0B596b7F...514e97D60
0 ETH0.0014285530.95602046
Set Approval For...167860022023-03-08 20:47:47488 days ago1678308467IN
0x0B596b7F...514e97D60
0 ETH0.0023122950.19738776
Set Approval For...167583602023-03-04 23:32:47492 days ago1677972767IN
0x0B596b7F...514e97D60
0 ETH0.0008660218.80046674
Safe Transfer Fr...167513262023-03-03 23:47:47493 days ago1677887267IN
0x0B596b7F...514e97D60
0 ETH0.0050208280.26648756
Safe Transfer Fr...167513152023-03-03 23:45:23493 days ago1677887123IN
0x0B596b7F...514e97D60
0 ETH0.00329352.64421254
Safe Transfer Fr...161409722022-12-08 15:46:11579 days ago1670514371IN
0x0B596b7F...514e97D60
0 ETH0.000883915.41265362
Mint158645072022-10-31 0:37:47617 days ago1667176667IN
0x0B596b7F...514e97D60
0 ETH0.000657478.33533788
Mint158644992022-10-31 0:36:11617 days ago1667176571IN
0x0B596b7F...514e97D60
0 ETH0.000758528.98227776
Mint158644882022-10-31 0:33:59617 days ago1667176439IN
0x0B596b7F...514e97D60
0 ETH0.000683388.66380767
Mint158204132022-10-24 20:45:47623 days ago1666644347IN
0x0B596b7F...514e97D60
0 ETH0.0008618413.95331064
Mint157939862022-10-21 4:06:47627 days ago1666325207IN
0x0B596b7F...514e97D60
0 ETH0.001396422.60351594
Mint157939612022-10-21 4:01:47627 days ago1666324907IN
0x0B596b7F...514e97D60
0 ETH0.0011999619.42385805
Mint157859912022-10-20 1:20:47628 days ago1666228847IN
0x0B596b7F...514e97D60
0 ETH0.0012197919.74479551
Mint157859902022-10-20 1:20:35628 days ago1666228835IN
0x0B596b7F...514e97D60
0 ETH0.0012427320.11607513
Set Owner157859862022-10-20 1:19:47628 days ago1666228787IN
0x0B596b7F...514e97D60
0 ETH0.0005341118.71079226
Set Active Mint157859782022-10-20 1:18:11628 days ago1666228691IN
0x0B596b7F...514e97D60
0 ETH0.00057218.74886922
Mint157422232022-10-13 22:38:59634 days ago1665700739IN
0x0B596b7F...514e97D60
0 ETH0.0014409218.26776464
Mint157320792022-10-12 12:37:59636 days ago1665578279IN
0x0B596b7F...514e97D60
0 ETH0.0016631321.08494488
Mint157172552022-10-10 10:58:23638 days ago1665399503IN
0x0B596b7F...514e97D60
0 ETH0.0034007340.27064544
Mint157172302022-10-10 10:53:23638 days ago1665399203IN
0x0B596b7F...514e97D60
0 ETH0.002811335.64112943
Mint157140772022-10-10 0:19:59638 days ago1665361199IN
0x0B596b7F...514e97D60
0 ETH0.0039445829.30011761
Set Active Mint156992592022-10-07 22:42:23640 days ago1665182543IN
0x0B596b7F...514e97D60
0 ETH0.000223917.33639739
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:
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


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.