ETH Price: $3,256.52 (-0.38%)

Contract

0x6FB3104B0b3Cd665c7B8506b23eE833eA44d8E91
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Purchase To195208882024-03-26 20:10:59300 days ago1711483859IN
0x6FB3104B...eA44d8E91
0 ETH0.0043865645.91766946
Purchase To189789092024-01-10 20:22:59376 days ago1704918179IN
0x6FB3104B...eA44d8E91
0 ETH0.0055263149.15997988
Purchase To185932842023-11-17 18:07:47430 days ago1700244467IN
0x6FB3104B...eA44d8E91
0 ETH0.0042079237.30862721
Purchase To183440672023-10-13 21:11:11465 days ago1697231471IN
0x6FB3104B...eA44d8E91
0 ETH0.0020405218.12008536
Purchase To183440592023-10-13 21:09:35465 days ago1697231375IN
0x6FB3104B...eA44d8E91
0 ETH0.0017283518.13076361
Purchase To183440512023-10-13 21:07:59465 days ago1697231279IN
0x6FB3104B...eA44d8E91
0 ETH0.001654317.2846943
Update Price Per...183232482023-10-10 23:11:47468 days ago1696979507IN
0x6FB3104B...eA44d8E91
0 ETH0.000295575.53385496
Purchase To182283982023-09-27 16:50:59481 days ago1695833459IN
0x6FB3104B...eA44d8E91
0 ETH0.0035324831.3683251
Purchase To182217882023-09-26 18:38:47482 days ago1695753527IN
0x6FB3104B...eA44d8E91
0 ETH0.0026104623.17465247
Purchase To182217802023-09-26 18:37:11482 days ago1695753431IN
0x6FB3104B...eA44d8E91
0 ETH0.0028268725.14188083
Purchase To182156462023-09-25 22:00:59483 days ago1695679259IN
0x6FB3104B...eA44d8E91
0 ETH0.0023021124.0951009
Purchase To182156422023-09-25 22:00:11483 days ago1695679211IN
0x6FB3104B...eA44d8E91
0 ETH0.002298224.01488843
Purchase To182156342023-09-25 21:58:35483 days ago1695679115IN
0x6FB3104B...eA44d8E91
0 ETH0.002104322.07230348
Purchase To182156232023-09-25 21:56:23483 days ago1695678983IN
0x6FB3104B...eA44d8E91
0 ETH0.0022657920.14990782
Purchase To182156192023-09-25 21:55:35483 days ago1695678935IN
0x6FB3104B...eA44d8E91
0 ETH0.001790918.71394262
Purchase To182156152023-09-25 21:54:47483 days ago1695678887IN
0x6FB3104B...eA44d8E91
0 ETH0.0022511719.95564411
Purchase To182156112023-09-25 21:53:47483 days ago1695678827IN
0x6FB3104B...eA44d8E91
0 ETH0.0018376519.20046407
Purchase To182156062023-09-25 21:52:47483 days ago1695678767IN
0x6FB3104B...eA44d8E91
0 ETH0.0017648618.47389146
Purchase To182154652023-09-25 21:24:35483 days ago1695677075IN
0x6FB3104B...eA44d8E91
0 ETH0.0029167330.46866276
Purchase To182154552023-09-25 21:22:35483 days ago1695676955IN
0x6FB3104B...eA44d8E91
0 ETH0.0025062926.18386142
Purchase To182154492023-09-25 21:21:23483 days ago1695676883IN
0x6FB3104B...eA44d8E91
0 ETH0.0024400725.5417326
Purchase To182154392023-09-25 21:19:23483 days ago1695676763IN
0x6FB3104B...eA44d8E91
0 ETH0.0025306326.43545789
Purchase To182154352023-09-25 21:18:35483 days ago1695676715IN
0x6FB3104B...eA44d8E91
0 ETH0.0025549626.74986855
Purchase To182154122023-09-25 21:13:59483 days ago1695676439IN
0x6FB3104B...eA44d8E91
0 ETH0.002578726.99567363
Purchase To182154042023-09-25 21:12:23483 days ago1695676343IN
0x6FB3104B...eA44d8E91
0 ETH0.0029285726.04408331
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:
MinterSetPriceV2

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 25 runs

Other Settings:
default evmVersion
File 1 of 7 : MinterSetPriceV2.sol
// SPDX-License-Identifier: LGPL-3.0-only
// Created By: Art Blocks Inc.

import "../../../interfaces/0.8.x/IGenArt721CoreContractV3.sol";
import "../../../interfaces/0.8.x/IMinterFilterV0.sol";
import "../../../interfaces/0.8.x/IFilteredMinterV0.sol";

import "@openzeppelin-4.5/contracts/security/ReentrancyGuard.sol";

pragma solidity 0.8.17;

/**
 * @title Filtered Minter contract that allows tokens to be minted with ETH.
 * This is designed to be used with IGenArt721CoreContractV3 contracts.
 * @author Art Blocks Inc.
 * @notice Privileged Roles and Ownership:
 * This contract is designed to be managed, with limited powers.
 * Privileged roles and abilities are controlled by the project's artist, which
 * can be modified by the core contract's Admin ACL contract. Both of these
 * roles hold extensive power and can modify minter details.
 * Care must be taken to ensure that the admin ACL contract and artist
 * addresses are secure behind a multi-sig or other access control mechanism.
 * ----------------------------------------------------------------------------
 * The following functions are restricted to a project's artist:
 * - updatePricePerTokenInWei
 * ----------------------------------------------------------------------------
 * Additional admin and artist privileged roles may be described on other
 * contracts that this minter integrates with.
 */
contract MinterSetPriceV2 is ReentrancyGuard, IFilteredMinterV0 {
    /// Core contract address this minter interacts with
    address public immutable genArt721CoreAddress;

    /// This contract handles cores with interface IV3
    IGenArt721CoreContractV3 private immutable genArtCoreContract;

    /// Minter filter address this minter interacts with
    address public immutable minterFilterAddress;

    /// Minter filter this minter may interact with.
    IMinterFilterV0 private immutable minterFilter;

    /// minterType for this minter
    string public constant minterType = "MinterSetPriceV2";

    uint256 constant ONE_MILLION = 1_000_000;

    struct ProjectConfig {
        bool maxHasBeenInvoked;
        bool priceIsConfigured;
        uint24 maxInvocations;
        uint256 pricePerTokenInWei;
    }

    mapping(uint256 => ProjectConfig) public projectConfig;

    modifier onlyArtist(uint256 _projectId) {
        require(
            msg.sender ==
                genArtCoreContract.projectIdToArtistAddress(_projectId),
            "Only Artist"
        );
        _;
    }

    /**
     * @notice Initializes contract to be a Filtered Minter for
     * `_minterFilter`, integrated with Art Blocks core contract
     * at address `_genArt721Address`.
     * @param _genArt721Address Art Blocks core contract address for
     * which this contract will be a minter.
     * @param _minterFilter Minter filter for which this will be a
     * filtered minter.
     */
    constructor(address _genArt721Address, address _minterFilter)
        ReentrancyGuard()
    {
        genArt721CoreAddress = _genArt721Address;
        genArtCoreContract = IGenArt721CoreContractV3(_genArt721Address);
        minterFilterAddress = _minterFilter;
        minterFilter = IMinterFilterV0(_minterFilter);
        require(
            minterFilter.genArt721CoreAddress() == _genArt721Address,
            "Illegal contract pairing"
        );
    }

    /**
     * @notice Syncs local maximum invocations of project `_projectId` based on
     * the value currently defined in the core contract. Only used for gas
     * optimization of mints after maxInvocations has been reached.
     * @param _projectId Project ID to set the maximum invocations for.
     * @dev this enables gas reduction after maxInvocations have been reached -
     * core contracts shall still enforce a maxInvocation check during mint.
     * @dev function is intentionally not gated to any specific access control;
     * it only syncs a local state variable to the core contract's state.
     */
    function setProjectMaxInvocations(uint256 _projectId) external {
        uint256 maxInvocations;
        (, maxInvocations, , , , ) = genArtCoreContract.projectStateData(
            _projectId
        );
        // update storage with results
        projectConfig[_projectId].maxInvocations = uint24(maxInvocations);
    }

    /**
     * @notice Warning: Disabling purchaseTo is not supported on this minter.
     * This method exists purely for interface-conformance purposes.
     */
    function togglePurchaseToDisabled(uint256 _projectId)
        external
        view
        onlyArtist(_projectId)
    {
        revert("Action not supported");
    }

    /**
     * @notice projectId => has project reached its maximum number of
     * invocations? Note that this returns a local cache of the core contract's
     * state, and may be out of sync with the core contract. This is
     * intentional, as it only enables gas optimization of mints after a
     * project's maximum invocations has been reached. A false negative will
     * only result in a gas cost increase, since the core contract will still
     * enforce a maxInvocation check during minting. A false positive is not
     * possible because the V3 core contract only allows maximum invocations
     * to be reduced, not increased. Based on this rationale, we intentionally
     * do not do input validation in this method as to whether or not the input
     * `_projectId` is an existing project ID.
     */
    function projectMaxHasBeenInvoked(uint256 _projectId)
        external
        view
        returns (bool)
    {
        return projectConfig[_projectId].maxHasBeenInvoked;
    }

    /**
     * @notice projectId => project's maximum number of invocations.
     * Optionally synced with core contract value, for gas optimization.
     * Note that this returns a local cache of the core contract's
     * state, and may be out of sync with the core contract. This is
     * intentional, as it only enables gas optimization of mints after a
     * project's maximum invocations has been reached.
     * @dev A number greater than the core contract's project max invocations
     * will only result in a gas cost increase, since the core contract will
     * still enforce a maxInvocation check during minting. A number less than
     * the core contract's project max invocations is only possible when the
     * project's max invocations have not been synced on this minter, since the
     * V3 core contract only allows maximum invocations to be reduced, not
     * increased. When this happens, the minter will enable minting, allowing
     * the core contract to enforce the max invocations check. Based on this
     * rationale, we intentionally do not do input validation in this method as
     * to whether or not the input `_projectId` is an existing project ID.
     */
    function projectMaxInvocations(uint256 _projectId)
        external
        view
        returns (uint256)
    {
        return uint256(projectConfig[_projectId].maxInvocations);
    }

    /**
     * @notice Updates this minter's price per token of project `_projectId`
     * to be '_pricePerTokenInWei`, in Wei.
     * This price supersedes any legacy core contract price per token value.
     * @dev Note that it is intentionally supported here that the configured
     * price may be explicitly set to `0`.
     */
    function updatePricePerTokenInWei(
        uint256 _projectId,
        uint256 _pricePerTokenInWei
    ) external onlyArtist(_projectId) {
        ProjectConfig storage _projectConfig = projectConfig[_projectId];
        _projectConfig.pricePerTokenInWei = _pricePerTokenInWei;
        _projectConfig.priceIsConfigured = true;
        emit PricePerTokenInWeiUpdated(_projectId, _pricePerTokenInWei);
    }

    /**
     * @notice Purchases a token from project `_projectId`.
     * @param _projectId Project ID to mint a token on.
     * @return tokenId Token ID of minted token
     */
    function purchase(uint256 _projectId)
        external
        payable
        returns (uint256 tokenId)
    {
        tokenId = purchaseTo_do6(msg.sender, _projectId);
        return tokenId;
    }

    /**
     * @notice gas-optimized version of purchase(uint256).
     */
    function purchase_H4M(uint256 _projectId)
        external
        payable
        returns (uint256 tokenId)
    {
        tokenId = purchaseTo_do6(msg.sender, _projectId);
        return tokenId;
    }

    /**
     * @notice Purchases a token from project `_projectId` and sets
     * the token's owner to `_to`.
     * @param _to Address to be the new token's owner.
     * @param _projectId Project ID to mint a token on.
     * @return tokenId Token ID of minted token
     */
    function purchaseTo(address _to, uint256 _projectId)
        external
        payable
        returns (uint256 tokenId)
    {
        return purchaseTo_do6(_to, _projectId);
    }

    /**
     * @notice gas-optimized version of purchaseTo(address, uint256).
     */
    function purchaseTo_do6(address _to, uint256 _projectId)
        public
        payable
        nonReentrant
        returns (uint256 tokenId)
    {
        // CHECKS
        ProjectConfig storage _projectConfig = projectConfig[_projectId];

        // Note that `maxHasBeenInvoked` is only checked here to reduce gas
        // consumption after a project has been fully minted.
        // `_projectConfig.maxHasBeenInvoked` is locally cached to reduce
        // gas consumption, but if not in sync with the core contract's value,
        // the core contract also enforces its own max invocation check during
        // minting.
        require(
            !_projectConfig.maxHasBeenInvoked,
            "Maximum number of invocations reached"
        );

        // require artist to have configured price of token on this minter
        require(_projectConfig.priceIsConfigured, "Price not configured");

        // load price of token into memory
        uint256 _pricePerTokenInWei = _projectConfig.pricePerTokenInWei;

        require(
            msg.value >= _pricePerTokenInWei,
            "Must send minimum value to mint!"
        );

        // EFFECTS
        tokenId = minterFilter.mint(_to, _projectId, msg.sender);

        // okay if this underflows because if statement will always eval false.
        // this is only for gas optimization (core enforces maxInvocations).
        unchecked {
            if (tokenId % ONE_MILLION == _projectConfig.maxInvocations - 1) {
                _projectConfig.maxHasBeenInvoked = true;
            }
        }

        // INTERACTIONS
        _splitFundsETH(_projectId, _pricePerTokenInWei);

        return tokenId;
    }

    /**
     * @dev splits ETH funds between sender (if refund), foundation,
     * artist, and artist's additional payee for a token purchased on
     * project `_projectId`.
     * @dev possible DoS during splits is acknowledged, and mitigated by
     * business practices, including end-to-end testing on mainnet, and
     * admin-accepted artist payment addresses.
     */
    function _splitFundsETH(uint256 _projectId, uint256 _pricePerTokenInWei)
        internal
    {
        if (msg.value > 0) {
            bool success_;
            // send refund to sender
            uint256 refund = msg.value - _pricePerTokenInWei;
            if (refund > 0) {
                (success_, ) = msg.sender.call{value: refund}("");
                require(success_, "Refund failed");
            }
            // split remaining funds between foundation, artist, and artist's
            // additional payee
            (
                uint256 artblocksRevenue_,
                address payable artblocksAddress_,
                uint256 artistRevenue_,
                address payable artistAddress_,
                uint256 additionalPayeePrimaryRevenue_,
                address payable additionalPayeePrimaryAddress_
            ) = genArtCoreContract.getPrimaryRevenueSplits(
                    _projectId,
                    _pricePerTokenInWei
                );
            // Art Blocks payment
            if (artblocksRevenue_ > 0) {
                (success_, ) = artblocksAddress_.call{value: artblocksRevenue_}(
                    ""
                );
                require(success_, "Art Blocks payment failed");
            }
            // artist payment
            if (artistRevenue_ > 0) {
                (success_, ) = artistAddress_.call{value: artistRevenue_}("");
                require(success_, "Artist payment failed");
            }
            // additional payee payment
            if (additionalPayeePrimaryRevenue_ > 0) {
                (success_, ) = additionalPayeePrimaryAddress_.call{
                    value: additionalPayeePrimaryRevenue_
                }("");
                require(success_, "Additional Payee payment failed");
            }
        }
    }

    /**
     * @notice Gets if price of token is configured, price of minting a
     * token on project `_projectId`, and currency symbol and address to be
     * used as payment. Supersedes any core contract price information.
     * @param _projectId Project ID to get price information for.
     * @return isConfigured true only if token price has been configured on
     * this minter
     * @return tokenPriceInWei current price of token on this minter - invalid
     * if price has not yet been configured
     * @return currencySymbol currency symbol for purchases of project on this
     * minter. This minter always returns "ETH"
     * @return currencyAddress currency address for purchases of project on
     * this minter. This minter always returns null address, reserved for ether
     */
    function getPriceInfo(uint256 _projectId)
        external
        view
        returns (
            bool isConfigured,
            uint256 tokenPriceInWei,
            string memory currencySymbol,
            address currencyAddress
        )
    {
        ProjectConfig storage _projectConfig = projectConfig[_projectId];
        isConfigured = _projectConfig.priceIsConfigured;
        tokenPriceInWei = _projectConfig.pricePerTokenInWei;
        currencySymbol = "ETH";
        currencyAddress = address(0);
    }
}

File 2 of 7 : IGenArt721CoreContractV3.sol
// SPDX-License-Identifier: LGPL-3.0-only
// Created By: Art Blocks Inc.

pragma solidity ^0.8.0;

import "./IAdminACLV0.sol";
/// use the Royalty Registry's IManifold interface for token royalties
import "./IManifold.sol";

interface IGenArt721CoreContractV3 is IManifold {
    /**
     * @notice Token ID `_tokenId` minted to `_to`.
     */
    event Mint(address indexed _to, uint256 indexed _tokenId);

    /**
     * @notice currentMinter updated to `_currentMinter`.
     * @dev Implemented starting with V3 core
     */
    event MinterUpdated(address indexed _currentMinter);

    /**
     * @notice Platform updated on bytes32-encoded field `_field`.
     */
    event PlatformUpdated(bytes32 indexed _field);

    /**
     * @notice Project ID `_projectId` updated on bytes32-encoded field
     * `_update`.
     */
    event ProjectUpdated(uint256 indexed _projectId, bytes32 indexed _update);

    event ProposedArtistAddressesAndSplits(
        uint256 indexed _projectId,
        address _artistAddress,
        address _additionalPayeePrimarySales,
        uint256 _additionalPayeePrimarySalesPercentage,
        address _additionalPayeeSecondarySales,
        uint256 _additionalPayeeSecondarySalesPercentage
    );

    event AcceptedArtistAddressesAndSplits(uint256 indexed _projectId);

    // version and type of the core contract
    // coreVersion is a string of the form "0.x.y"
    function coreVersion() external view returns (string memory);

    // coreType is a string of the form "GenArt721CoreV3"
    function coreType() external view returns (string memory);

    // owner (pre-V3 was named admin) of contract
    // this is expected to be an Admin ACL contract for V3
    function owner() external view returns (address);

    // Admin ACL contract for V3, will be at the address owner()
    function adminACLContract() external returns (IAdminACLV0);

    // backwards-compatible (pre-V3) admin - equal to owner()
    function admin() external view returns (address);

    /**
     * Function determining if _sender is allowed to call function with
     * selector _selector on contract `_contract`. Intended to be used with
     * peripheral contracts such as minters, as well as internally by the
     * core contract itself.
     */
    function adminACLAllowed(
        address _sender,
        address _contract,
        bytes4 _selector
    ) external returns (bool);

    // getter function of public variable
    function nextProjectId() external view returns (uint256);

    // getter function of public mapping
    function tokenIdToProjectId(uint256 tokenId)
        external
        view
        returns (uint256 projectId);

    // @dev this is not available in V0
    function isMintWhitelisted(address minter) external view returns (bool);

    function projectIdToArtistAddress(uint256 _projectId)
        external
        view
        returns (address payable);

    function projectIdToAdditionalPayeePrimarySales(uint256 _projectId)
        external
        view
        returns (address payable);

    function projectIdToAdditionalPayeePrimarySalesPercentage(
        uint256 _projectId
    ) external view returns (uint256);

    // @dev new function in V3
    function getPrimaryRevenueSplits(uint256 _projectId, uint256 _price)
        external
        view
        returns (
            uint256 artblocksRevenue_,
            address payable artblocksAddress_,
            uint256 artistRevenue_,
            address payable artistAddress_,
            uint256 additionalPayeePrimaryRevenue_,
            address payable additionalPayeePrimaryAddress_
        );

    // @dev new function in V3
    function projectStateData(uint256 _projectId)
        external
        view
        returns (
            uint256 invocations,
            uint256 maxInvocations,
            bool active,
            bool paused,
            uint256 completedTimestamp,
            bool locked
        );

    // @dev Art Blocks primary sales payment address
    function artblocksPrimarySalesAddress()
        external
        view
        returns (address payable);

    /**
     * @notice Backwards-compatible (pre-V3) function returning Art Blocks
     * primary sales payment address (now called artblocksPrimarySalesAddress).
     */
    function artblocksAddress() external view returns (address payable);

    // @dev Percentage of primary sales allocated to Art Blocks
    function artblocksPrimarySalesPercentage() external view returns (uint256);

    /**
     * @notice Backwards-compatible (pre-V3) function returning Art Blocks
     * primary sales percentage (now called artblocksPrimarySalesPercentage).
     */
    function artblocksPercentage() external view returns (uint256);

    // @dev Art Blocks secondary sales royalties payment address
    function artblocksSecondarySalesAddress()
        external
        view
        returns (address payable);

    // @dev Basis points of secondary sales allocated to Art Blocks
    function artblocksSecondarySalesBPS() external view returns (uint256);

    // function to set a token's hash (must be guarded)
    function setTokenHash_8PT(uint256 _tokenId, bytes32 _hash) external;

    // @dev gas-optimized signature in V3 for `mint`
    function mint_Ecf(
        address _to,
        uint256 _projectId,
        address _by
    ) external returns (uint256 tokenId);

    /**
     * @notice Backwards-compatible (pre-V3) function  that gets artist +
     * artist's additional payee royalty data for token ID `_tokenId`.
     * WARNING: Does not include Art Blocks portion of royalties.
     */
    function getRoyaltyData(uint256 _tokenId)
        external
        view
        returns (
            address artistAddress,
            address additionalPayee,
            uint256 additionalPayeePercentage,
            uint256 royaltyFeeByID
        );
}

File 3 of 7 : IMinterFilterV0.sol
// SPDX-License-Identifier: LGPL-3.0-only
// Created By: Art Blocks Inc.

pragma solidity ^0.8.0;

interface IMinterFilterV0 {
    /**
     * @notice Approved minter `_minterAddress`.
     */
    event MinterApproved(address indexed _minterAddress, string _minterType);

    /**
     * @notice Revoked approval for minter `_minterAddress`
     */
    event MinterRevoked(address indexed _minterAddress);

    /**
     * @notice Minter `_minterAddress` of type `_minterType`
     * registered for project `_projectId`.
     */
    event ProjectMinterRegistered(
        uint256 indexed _projectId,
        address indexed _minterAddress,
        string _minterType
    );

    /**
     * @notice Any active minter removed for project `_projectId`.
     */
    event ProjectMinterRemoved(uint256 indexed _projectId);

    function genArt721CoreAddress() external returns (address);

    function setMinterForProject(uint256, address) external;

    function removeMinterForProject(uint256) external;

    function mint(
        address _to,
        uint256 _projectId,
        address sender
    ) external returns (uint256);

    function getMinterForProject(uint256) external view returns (address);

    function projectHasMinter(uint256) external view returns (bool);
}

File 4 of 7 : IFilteredMinterV0.sol
// SPDX-License-Identifier: LGPL-3.0-only
// Created By: Art Blocks Inc.

pragma solidity ^0.8.0;

interface IFilteredMinterV0 {
    /**
     * @notice Price per token in wei updated for project `_projectId` to
     * `_pricePerTokenInWei`.
     */
    event PricePerTokenInWeiUpdated(
        uint256 indexed _projectId,
        uint256 indexed _pricePerTokenInWei
    );

    /**
     * @notice Currency updated for project `_projectId` to symbol
     * `_currencySymbol` and address `_currencyAddress`.
     */
    event ProjectCurrencyInfoUpdated(
        uint256 indexed _projectId,
        address indexed _currencyAddress,
        string _currencySymbol
    );

    /// togglePurchaseToDisabled updated
    event PurchaseToDisabledUpdated(
        uint256 indexed _projectId,
        bool _purchaseToDisabled
    );

    // getter function of public variable
    function minterType() external view returns (string memory);

    function genArt721CoreAddress() external returns (address);

    function minterFilterAddress() external returns (address);

    // Triggers a purchase of a token from the desired project, to the
    // TX-sending address.
    function purchase(uint256 _projectId)
        external
        payable
        returns (uint256 tokenId);

    // Triggers a purchase of a token from the desired project, to the specified
    // receiving address.
    function purchaseTo(address _to, uint256 _projectId)
        external
        payable
        returns (uint256 tokenId);

    // Toggles the ability for `purchaseTo` to be called directly with a
    // specified receiving address that differs from the TX-sending address.
    function togglePurchaseToDisabled(uint256 _projectId) external;

    // Called to make the minter contract aware of the max invocations for a
    // given project.
    function setProjectMaxInvocations(uint256 _projectId) external;

    // Gets if token price is configured, token price in wei, currency symbol,
    // and currency address, assuming this is project's minter.
    // Supersedes any defined core price.
    function getPriceInfo(uint256 _projectId)
        external
        view
        returns (
            bool isConfigured,
            uint256 tokenPriceInWei,
            string memory currencySymbol,
            address currencyAddress
        );
}

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

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 6 of 7 : IAdminACLV0.sol
// SPDX-License-Identifier: LGPL-3.0-only
// Created By: Art Blocks Inc.

pragma solidity ^0.8.0;

interface IAdminACLV0 {
    /**
     * @notice Token ID `_tokenId` minted to `_to`.
     * @param previousSuperAdmin The previous superAdmin address.
     * @param newSuperAdmin The new superAdmin address.
     * @param genArt721CoreAddressesToUpdate Array of genArt721Core
     * addresses to update to the new superAdmin, for indexing purposes only.
     */
    event SuperAdminTransferred(
        address indexed previousSuperAdmin,
        address indexed newSuperAdmin,
        address[] genArt721CoreAddressesToUpdate
    );

    /// Type of the Admin ACL contract, e.g. "AdminACLV0"
    function AdminACLType() external view returns (string memory);

    /// super admin address
    function superAdmin() external view returns (address);

    /**
     * @notice Calls transferOwnership on other contract from this contract.
     * This is useful for updating to a new AdminACL contract.
     * @dev this function should be gated to only superAdmin-like addresses.
     */
    function transferOwnershipOn(address _contract, address _newAdminACL)
        external;

    /**
     * @notice Calls renounceOwnership on other contract from this contract.
     * @dev this function should be gated to only superAdmin-like addresses.
     */
    function renounceOwnershipOn(address _contract) external;

    /**
     * @notice Checks if sender `_sender` is allowed to call function with selector
     * `_selector` on contract `_contract`.
     */
    function allowed(
        address _sender,
        address _contract,
        bytes4 _selector
    ) external returns (bool);
}

File 7 of 7 : IManifold.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/// @dev Royalty Registry interface, used to support the Royalty Registry.
/// @dev Source: https://github.com/manifoldxyz/royalty-registry-solidity/blob/main/contracts/specs/IManifold.sol

/// @author: manifold.xyz

/**
 * @dev Royalty interface for creator core classes
 */
interface IManifold {
    /**
     * @dev Get royalites of a token.  Returns list of receivers and basisPoints
     *
     *  bytes4(keccak256('getRoyalties(uint256)')) == 0xbb3bafd6
     *
     *  => 0xbb3bafd6 = 0xbb3bafd6
     */
    function getRoyalties(uint256 tokenId)
        external
        view
        returns (address payable[] memory, uint256[] memory);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_genArt721Address","type":"address"},{"internalType":"address","name":"_minterFilter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_pricePerTokenInWei","type":"uint256"}],"name":"PricePerTokenInWeiUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_currencyAddress","type":"address"},{"indexed":false,"internalType":"string","name":"_currencySymbol","type":"string"}],"name":"ProjectCurrencyInfoUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_purchaseToDisabled","type":"bool"}],"name":"PurchaseToDisabledUpdated","type":"event"},{"inputs":[],"name":"genArt721CoreAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"getPriceInfo","outputs":[{"internalType":"bool","name":"isConfigured","type":"bool"},{"internalType":"uint256","name":"tokenPriceInWei","type":"uint256"},{"internalType":"string","name":"currencySymbol","type":"string"},{"internalType":"address","name":"currencyAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minterFilterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minterType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"projectConfig","outputs":[{"internalType":"bool","name":"maxHasBeenInvoked","type":"bool"},{"internalType":"bool","name":"priceIsConfigured","type":"bool"},{"internalType":"uint24","name":"maxInvocations","type":"uint24"},{"internalType":"uint256","name":"pricePerTokenInWei","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectMaxHasBeenInvoked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectMaxInvocations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"purchase","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"purchaseTo","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"purchaseTo_do6","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"purchase_H4M","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"setProjectMaxInvocations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"togglePurchaseToDisabled","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_pricePerTokenInWei","type":"uint256"}],"name":"updatePricePerTokenInWei","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101006040523480156200001257600080fd5b506040516200109d3803806200109d833981016040819052620000359162000147565b600160009081556001600160a01b03808416608081905260a081905290831660c081905260e0819052604080516392a10f8360e01b81529051929391926392a10f83926004808401936020939290839003909101908290875af1158015620000a1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c791906200017f565b6001600160a01b031614620001225760405162461bcd60e51b815260206004820152601860248201527f496c6c6567616c20636f6e74726163742070616972696e670000000000000000604482015260640160405180910390fd5b5050620001a4565b80516001600160a01b03811681146200014257600080fd5b919050565b600080604083850312156200015b57600080fd5b62000166836200012a565b915062000176602084016200012a565b90509250929050565b6000602082840312156200019257600080fd5b6200019d826200012a565b9392505050565b60805160a05160c05160e051610eaa620001f3600039600061051e015260006102f90152600081816105fa015281816106f401528181610817015261096e015260006102300152610eaa6000f3fe6080604052600436106100a95760003560e01c80619987146100ae578061b460146100d457806340d1397e146100e7578063462add461461010957806356690aaf146101495780636cb9b7ff14610181578063774159c6146101a1578063891407c01461020b57806392a10f831461021e578063c71b1b711461026a578063dd85582f146102e7578063e9d1e8ac1461031b578063efef39a1146100d4578063f7bd4b8814610364575b600080fd5b6100c16100bc366004610c21565b610384565b6040519081526020015b60405180910390f35b6100c16100e2366004610c4d565b6105d0565b3480156100f357600080fd5b50610107610102366004610c4d565b6105e2565b005b34801561011557600080fd5b50610139610124366004610c4d565b60009081526001602052604090205460ff1690565b60405190151581526020016100cb565b34801561015557600080fd5b506100c1610164366004610c4d565b60009081526001602052604090205462010000900462ffffff1690565b34801561018d57600080fd5b5061010761019c366004610c66565b6106dc565b3480156101ad57600080fd5b506101fb6101bc366004610c4d565b600090815260016020818152604080842080549301548151808301909252600382526208aa8960eb1b9282019290925261010090920460ff1693909290565b6040516100cb9493929190610cce565b6100c1610219366004610c21565b6107eb565b34801561022a57600080fd5b506102527f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100cb565b34801561027657600080fd5b506102ba610285366004610c4d565b6001602081905260009182526040909120805491015460ff808316926101008104909116916201000090910462ffffff169084565b6040516100cb94939291909315158452911515602084015262ffffff166040830152606082015260800190565b3480156102f357600080fd5b506102527f000000000000000000000000000000000000000000000000000000000000000081565b34801561032757600080fd5b506103576040518060400160405280601081526020016f26b4b73a32b929b2ba283934b1b2ab1960811b81525081565b6040516100cb9190610d08565b34801561037057600080fd5b5061010761037f366004610c4d565b6107fe565b60006002600054036103dd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000908155828152600160205260409020805460ff16156104505760405162461bcd60e51b815260206004820152602560248201527f4d6178696d756d206e756d626572206f6620696e766f636174696f6e732072656044820152641858da195960da1b60648201526084016103d4565b8054610100900460ff1661049d5760405162461bcd60e51b8152602060048201526014602482015273141c9a58d9481b9bdd0818dbdb999a59dd5c995960621b60448201526064016103d4565b6001810154348111156104f25760405162461bcd60e51b815260206004820181905260248201527f4d7573742073656e64206d696e696d756d2076616c756520746f206d696e742160448201526064016103d4565b604051630d4d151360e01b81526001600160a01b038681166004830152602482018690523360448301527f00000000000000000000000000000000000000000000000000000000000000001690630d4d1513906064016020604051808303816000875af1158015610567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058b9190610d1b565b825490935060001962ffffff6201000090920482160116620f42408406036105b957815460ff191660011782555b6105c384826108c0565b5050600160005592915050565b60006105dc3383610384565b92915050565b60405163a47d29cb60e01b81526004810182905281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066d9190610d34565b6001600160a01b0316336001600160a01b03161461069d5760405162461bcd60e51b81526004016103d490610d51565b60405162461bcd60e51b81526020600482015260146024820152731058dd1a5bdb881b9bdd081cdd5c1c1bdc9d195960621b60448201526064016103d4565b60405163a47d29cb60e01b81526004810183905282907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610743573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107679190610d34565b6001600160a01b0316336001600160a01b0316146107975760405162461bcd60e51b81526004016103d490610d51565b6000838152600160208190526040808320918201859055815461ff001916610100178255519091849186917f26118a27aca826f829f3bfe21b140b4455c00b434849bd0da50d1e1a9720fb5c91a350505050565b60006107f78383610384565b9392505050565b604051630ea5613f60e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630ea5613f9060240160c060405180830381865afa158015610866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088a9190610d8b565b50505060009485525060016020526040909320805462ffffff909416620100000264ffffff000019909416939093179092555050565b3415610c05576000806108d38334610dea565b905080156109635760405133908290600081818185875af1925050503d806000811461091b576040519150601f19603f3d011682016040523d82523d6000602084013e610920565b606091505b505080925050816109635760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b60448201526064016103d4565b6000806000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638639415b8b8b6040518363ffffffff1660e01b81526004016109c3929190918252602082015260400190565b60c060405180830381865afa1580156109e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a049190610e0b565b9550955095509550955095506000861115610ab6576040516001600160a01b038616908790600081818185875af1925050503d8060008114610a62576040519150601f19603f3d011682016040523d82523d6000602084013e610a67565b606091505b50508098505087610ab65760405162461bcd60e51b8152602060048201526019602482015278105c9d08109b1bd8dadcc81c185e5b595b9d0819985a5b1959603a1b60448201526064016103d4565b8315610b55576040516001600160a01b038416908590600081818185875af1925050503d8060008114610b05576040519150601f19603f3d011682016040523d82523d6000602084013e610b0a565b606091505b50508098505087610b555760405162461bcd60e51b8152602060048201526015602482015274105c9d1a5cdd081c185e5b595b9d0819985a5b1959605a1b60448201526064016103d4565b8115610bfc576040516001600160a01b038216908390600081818185875af1925050503d8060008114610ba4576040519150601f19603f3d011682016040523d82523d6000602084013e610ba9565b606091505b50508098505087610bfc5760405162461bcd60e51b815260206004820152601f60248201527f4164646974696f6e616c205061796565207061796d656e74206661696c65640060448201526064016103d4565b50505050505050505b5050565b6001600160a01b0381168114610c1e57600080fd5b50565b60008060408385031215610c3457600080fd5b8235610c3f81610c09565b946020939093013593505050565b600060208284031215610c5f57600080fd5b5035919050565b60008060408385031215610c7957600080fd5b50508035926020909101359150565b6000815180845260005b81811015610cae57602081850181015186830182015201610c92565b506000602082860101526020601f19601f83011685010191505092915050565b8415158152836020820152608060408201526000610cef6080830185610c88565b905060018060a01b038316606083015295945050505050565b6020815260006107f76020830184610c88565b600060208284031215610d2d57600080fd5b5051919050565b600060208284031215610d4657600080fd5b81516107f781610c09565b6020808252600b908201526a13db9b1e48105c9d1a5cdd60aa1b604082015260600190565b80518015158114610d8657600080fd5b919050565b60008060008060008060c08789031215610da457600080fd5b8651955060208701519450610dbb60408801610d76565b9350610dc960608801610d76565b925060808701519150610dde60a08801610d76565b90509295509295509295565b818103818111156105dc57634e487b7160e01b600052601160045260246000fd5b60008060008060008060c08789031215610e2457600080fd5b865195506020870151610e3681610c09565b604088015160608901519196509450610e4e81610c09565b608088015160a08901519194509250610e6681610c09565b80915050929550929550929556fea2646970667358221220ad8ca5d52d9e3cb0f46bb5a302403aeb44ef0f0ce0129c24af47b25dbd37e2fa64736f6c63430008110033000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a0000000000000000000000003f4bbde879f9bb0e95aea08ff12f55e171495c8f

Deployed Bytecode

0x6080604052600436106100a95760003560e01c80619987146100ae578061b460146100d457806340d1397e146100e7578063462add461461010957806356690aaf146101495780636cb9b7ff14610181578063774159c6146101a1578063891407c01461020b57806392a10f831461021e578063c71b1b711461026a578063dd85582f146102e7578063e9d1e8ac1461031b578063efef39a1146100d4578063f7bd4b8814610364575b600080fd5b6100c16100bc366004610c21565b610384565b6040519081526020015b60405180910390f35b6100c16100e2366004610c4d565b6105d0565b3480156100f357600080fd5b50610107610102366004610c4d565b6105e2565b005b34801561011557600080fd5b50610139610124366004610c4d565b60009081526001602052604090205460ff1690565b60405190151581526020016100cb565b34801561015557600080fd5b506100c1610164366004610c4d565b60009081526001602052604090205462010000900462ffffff1690565b34801561018d57600080fd5b5061010761019c366004610c66565b6106dc565b3480156101ad57600080fd5b506101fb6101bc366004610c4d565b600090815260016020818152604080842080549301548151808301909252600382526208aa8960eb1b9282019290925261010090920460ff1693909290565b6040516100cb9493929190610cce565b6100c1610219366004610c21565b6107eb565b34801561022a57600080fd5b506102527f000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a81565b6040516001600160a01b0390911681526020016100cb565b34801561027657600080fd5b506102ba610285366004610c4d565b6001602081905260009182526040909120805491015460ff808316926101008104909116916201000090910462ffffff169084565b6040516100cb94939291909315158452911515602084015262ffffff166040830152606082015260800190565b3480156102f357600080fd5b506102527f0000000000000000000000003f4bbde879f9bb0e95aea08ff12f55e171495c8f81565b34801561032757600080fd5b506103576040518060400160405280601081526020016f26b4b73a32b929b2ba283934b1b2ab1960811b81525081565b6040516100cb9190610d08565b34801561037057600080fd5b5061010761037f366004610c4d565b6107fe565b60006002600054036103dd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000908155828152600160205260409020805460ff16156104505760405162461bcd60e51b815260206004820152602560248201527f4d6178696d756d206e756d626572206f6620696e766f636174696f6e732072656044820152641858da195960da1b60648201526084016103d4565b8054610100900460ff1661049d5760405162461bcd60e51b8152602060048201526014602482015273141c9a58d9481b9bdd0818dbdb999a59dd5c995960621b60448201526064016103d4565b6001810154348111156104f25760405162461bcd60e51b815260206004820181905260248201527f4d7573742073656e64206d696e696d756d2076616c756520746f206d696e742160448201526064016103d4565b604051630d4d151360e01b81526001600160a01b038681166004830152602482018690523360448301527f0000000000000000000000003f4bbde879f9bb0e95aea08ff12f55e171495c8f1690630d4d1513906064016020604051808303816000875af1158015610567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058b9190610d1b565b825490935060001962ffffff6201000090920482160116620f42408406036105b957815460ff191660011782555b6105c384826108c0565b5050600160005592915050565b60006105dc3383610384565b92915050565b60405163a47d29cb60e01b81526004810182905281907f000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a6001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066d9190610d34565b6001600160a01b0316336001600160a01b03161461069d5760405162461bcd60e51b81526004016103d490610d51565b60405162461bcd60e51b81526020600482015260146024820152731058dd1a5bdb881b9bdd081cdd5c1c1bdc9d195960621b60448201526064016103d4565b60405163a47d29cb60e01b81526004810183905282907f000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a6001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610743573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107679190610d34565b6001600160a01b0316336001600160a01b0316146107975760405162461bcd60e51b81526004016103d490610d51565b6000838152600160208190526040808320918201859055815461ff001916610100178255519091849186917f26118a27aca826f829f3bfe21b140b4455c00b434849bd0da50d1e1a9720fb5c91a350505050565b60006107f78383610384565b9392505050565b604051630ea5613f60e01b8152600481018290526000907f000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a6001600160a01b031690630ea5613f9060240160c060405180830381865afa158015610866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088a9190610d8b565b50505060009485525060016020526040909320805462ffffff909416620100000264ffffff000019909416939093179092555050565b3415610c05576000806108d38334610dea565b905080156109635760405133908290600081818185875af1925050503d806000811461091b576040519150601f19603f3d011682016040523d82523d6000602084013e610920565b606091505b505080925050816109635760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b60448201526064016103d4565b6000806000806000807f000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a6001600160a01b0316638639415b8b8b6040518363ffffffff1660e01b81526004016109c3929190918252602082015260400190565b60c060405180830381865afa1580156109e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a049190610e0b565b9550955095509550955095506000861115610ab6576040516001600160a01b038616908790600081818185875af1925050503d8060008114610a62576040519150601f19603f3d011682016040523d82523d6000602084013e610a67565b606091505b50508098505087610ab65760405162461bcd60e51b8152602060048201526019602482015278105c9d08109b1bd8dadcc81c185e5b595b9d0819985a5b1959603a1b60448201526064016103d4565b8315610b55576040516001600160a01b038416908590600081818185875af1925050503d8060008114610b05576040519150601f19603f3d011682016040523d82523d6000602084013e610b0a565b606091505b50508098505087610b555760405162461bcd60e51b8152602060048201526015602482015274105c9d1a5cdd081c185e5b595b9d0819985a5b1959605a1b60448201526064016103d4565b8115610bfc576040516001600160a01b038216908390600081818185875af1925050503d8060008114610ba4576040519150601f19603f3d011682016040523d82523d6000602084013e610ba9565b606091505b50508098505087610bfc5760405162461bcd60e51b815260206004820152601f60248201527f4164646974696f6e616c205061796565207061796d656e74206661696c65640060448201526064016103d4565b50505050505050505b5050565b6001600160a01b0381168114610c1e57600080fd5b50565b60008060408385031215610c3457600080fd5b8235610c3f81610c09565b946020939093013593505050565b600060208284031215610c5f57600080fd5b5035919050565b60008060408385031215610c7957600080fd5b50508035926020909101359150565b6000815180845260005b81811015610cae57602081850181015186830182015201610c92565b506000602082860101526020601f19601f83011685010191505092915050565b8415158152836020820152608060408201526000610cef6080830185610c88565b905060018060a01b038316606083015295945050505050565b6020815260006107f76020830184610c88565b600060208284031215610d2d57600080fd5b5051919050565b600060208284031215610d4657600080fd5b81516107f781610c09565b6020808252600b908201526a13db9b1e48105c9d1a5cdd60aa1b604082015260600190565b80518015158114610d8657600080fd5b919050565b60008060008060008060c08789031215610da457600080fd5b8651955060208701519450610dbb60408801610d76565b9350610dc960608801610d76565b925060808701519150610dde60a08801610d76565b90509295509295509295565b818103818111156105dc57634e487b7160e01b600052601160045260246000fd5b60008060008060008060c08789031215610e2457600080fd5b865195506020870151610e3681610c09565b604088015160608901519196509450610e4e81610c09565b608088015160a08901519194509250610e6681610c09565b80915050929550929550929556fea2646970667358221220ad8ca5d52d9e3cb0f46bb5a302403aeb44ef0f0ce0129c24af47b25dbd37e2fa64736f6c63430008110033

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

000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a0000000000000000000000003f4bbde879f9bb0e95aea08ff12f55e171495c8f

-----Decoded View---------------
Arg [0] : _genArt721Address (address): 0x942BC2d3e7a589FE5bd4A5C6eF9727DFd82F5C8a
Arg [1] : _minterFilter (address): 0x3F4bbde879F9BB0E95AEa08fF12F55E171495C8f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a
Arg [1] : 0000000000000000000000003f4bbde879f9bb0e95aea08ff12f55e171495c8f


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.