ETH Price: $3,392.18 (-2.55%)
Gas: 1 Gwei

Contract

0x706d6C6ef700a3c1C3a727f0c46492492E0A72b5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Purchase178751132023-08-09 4:58:47324 days ago1691557127IN
0x706d6C6e...92E0A72b5
0.15 ETH0.002223915.42436511
Purchase176958382023-07-15 2:27:23349 days ago1689388043IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0020625717.05340962
Purchase176233372023-07-04 21:49:47360 days ago1688507387IN
0x706d6C6e...92E0A72b5
0.2 ETH0.0061205550.68278663
Purchase170636612023-04-17 2:49:23438 days ago1681699763IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0039787728.85846949
Purchase170213202023-04-11 0:28:11445 days ago1681172891IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0028393520.59410498
Purchase170213112023-04-11 0:26:23445 days ago1681172783IN
0x706d6C6e...92E0A72b5
0.15 ETH0.003262922.85557239
Purchase170213062023-04-11 0:25:23445 days ago1681172723IN
0x706d6C6e...92E0A72b5
0.15 ETH0.002920520.45569429
Purchase170211722023-04-10 23:58:11445 days ago1681171091IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0028283623.38307349
Purchase170055762023-04-08 18:56:11447 days ago1680980171IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0023562119.44973241
Purchase To170005012023-04-08 1:40:11448 days ago1680918011IN
0x706d6C6e...92E0A72b5
0.15 ETH0.002777220.07678306
Purchase169697142023-04-03 16:35:59452 days ago1680539759IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0047935234.72359535
Purchase169347222023-03-29 18:28:11457 days ago1680114491IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0057468341.57325214
Purchase168902332023-03-23 12:26:59463 days ago1679574419IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0033345524.18938487
Purchase168807042023-03-22 4:17:35464 days ago1679458655IN
0x706d6C6e...92E0A72b5
0.15 ETH0.001495410.83251697
Purchase168778042023-03-21 18:32:11465 days ago1679423531IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0038403831.79865639
Purchase168690402023-03-20 12:59:47466 days ago1679317187IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0029229121.14771573
Purchase168622842023-03-19 14:12:59467 days ago1679235179IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0019579916.16389306
Purchase168433572023-03-16 22:25:23470 days ago1679005523IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0027407919.88357257
Purchase168371082023-03-16 1:20:23471 days ago1678929623IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0025345918.36292757
Purchase168303502023-03-15 2:30:35471 days ago1678847435IN
0x706d6C6e...92E0A72b5
0.15 ETH0.003624926.26019726
Purchase168231812023-03-14 2:20:23472 days ago1678760423IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0037785827.37348819
Purchase168217632023-03-13 21:32:47473 days ago1678743167IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0031863126.38505087
Purchase168005562023-03-10 22:01:23476 days ago1678485683IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0067152748.64099097
Purchase168000432023-03-10 20:17:35476 days ago1678479455IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0066384148.02300803
Purchase167996162023-03-10 18:51:35476 days ago1678474295IN
0x706d6C6e...92E0A72b5
0.15 ETH0.0033828628.01500074
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
178751132023-08-09 4:58:47324 days ago1691557127
0x706d6C6e...92E0A72b5
0.135 ETH
178751132023-08-09 4:58:47324 days ago1691557127
0x706d6C6e...92E0A72b5
0.015 ETH
176958382023-07-15 2:27:23349 days ago1689388043
0x706d6C6e...92E0A72b5
0.135 ETH
176958382023-07-15 2:27:23349 days ago1689388043
0x706d6C6e...92E0A72b5
0.015 ETH
176233372023-07-04 21:49:47360 days ago1688507387
0x706d6C6e...92E0A72b5
0.18 ETH
176233372023-07-04 21:49:47360 days ago1688507387
0x706d6C6e...92E0A72b5
0.02 ETH
170636612023-04-17 2:49:23438 days ago1681699763
0x706d6C6e...92E0A72b5
0.135 ETH
170636612023-04-17 2:49:23438 days ago1681699763
0x706d6C6e...92E0A72b5
0.015 ETH
170213202023-04-11 0:28:11445 days ago1681172891
0x706d6C6e...92E0A72b5
0.135 ETH
170213202023-04-11 0:28:11445 days ago1681172891
0x706d6C6e...92E0A72b5
0.015 ETH
170213112023-04-11 0:26:23445 days ago1681172783
0x706d6C6e...92E0A72b5
0.135 ETH
170213112023-04-11 0:26:23445 days ago1681172783
0x706d6C6e...92E0A72b5
0.015 ETH
170213062023-04-11 0:25:23445 days ago1681172723
0x706d6C6e...92E0A72b5
0.015 ETH
170211722023-04-10 23:58:11445 days ago1681171091
0x706d6C6e...92E0A72b5
0.135 ETH
170211722023-04-10 23:58:11445 days ago1681171091
0x706d6C6e...92E0A72b5
0.015 ETH
170055762023-04-08 18:56:11447 days ago1680980171
0x706d6C6e...92E0A72b5
0.135 ETH
170055762023-04-08 18:56:11447 days ago1680980171
0x706d6C6e...92E0A72b5
0.015 ETH
170005012023-04-08 1:40:11448 days ago1680918011
0x706d6C6e...92E0A72b5
0.135 ETH
170005012023-04-08 1:40:11448 days ago1680918011
0x706d6C6e...92E0A72b5
0.015 ETH
169697142023-04-03 16:35:59452 days ago1680539759
0x706d6C6e...92E0A72b5
0.135 ETH
169697142023-04-03 16:35:59452 days ago1680539759
0x706d6C6e...92E0A72b5
0.015 ETH
169347222023-03-29 18:28:11457 days ago1680114491
0x706d6C6e...92E0A72b5
0.135 ETH
169347222023-03-29 18:28:11457 days ago1680114491
0x706d6C6e...92E0A72b5
0.015 ETH
168902332023-03-23 12:26:59463 days ago1679574419
0x706d6C6e...92E0A72b5
0.135 ETH
168902332023-03-23 12:26:59463 days ago1679574419
0x706d6C6e...92E0A72b5
0.015 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MinterDAExpV2

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 25 runs

Other Settings:
default evmVersion
File 1 of 8 : MinterDAExpV2.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";
import "@openzeppelin-4.5/contracts/utils/math/SafeCast.sol";

pragma solidity 0.8.17;

/**
 * @title Filtered Minter contract that allows tokens to be minted with ETH.
 * Pricing is achieved using an automated Dutch-auction mechanism.
 * 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 core contract's Admin
 * ACL contract and a project's artist. 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 the core contract's Admin ACL
 * contract:
 * - setAllowablePriceDecayHalfLifeRangeSeconds (note: this range is only
 *   enforced when creating new auctions)
 * - resetAuctionDetails (note: this will prevent minting until a new auction
 *   is created)
 * ----------------------------------------------------------------------------
 * The following functions are restricted to a project's artist:
 * - setAuctionDetails (note: this may only be called when there is no active
 *   auction)
 * ----------------------------------------------------------------------------
 * Additional admin and artist privileged roles may be described on other
 * contracts that this minter integrates with.
 *
 * @dev Note that while this minter makes use of `block.timestamp` and it is
 * technically possible that this value is manipulated by block producers, such
 * manipulation will not have material impact on the price values of this minter
 * given the business practices for how pricing is congfigured for this minter
 * and that variations on the order of less than a minute should not
 * meaningfully impact price given the minimum allowable price decay rate that
 * this minter intends to support.
 */
contract MinterDAExpV2 is ReentrancyGuard, IFilteredMinterV0 {
    using SafeCast for uint256;

    /// Auction details updated for project `projectId`.
    event SetAuctionDetails(
        uint256 indexed projectId,
        uint256 _auctionTimestampStart,
        uint256 _priceDecayHalfLifeSeconds,
        uint256 _startPrice,
        uint256 _basePrice
    );

    /// Auction details cleared for project `projectId`.
    event ResetAuctionDetails(uint256 indexed projectId);

    /// Maximum and minimum allowed price decay half lifes updated.
    event AuctionHalfLifeRangeSecondsUpdated(
        uint256 _minimumPriceDecayHalfLifeSeconds,
        uint256 _maximumPriceDecayHalfLifeSeconds
    );

    /// 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 = "MinterDAExpV2";

    uint256 constant ONE_MILLION = 1_000_000;

    struct ProjectConfig {
        bool maxHasBeenInvoked;
        uint24 maxInvocations;
        // max uint64 ~= 1.8e19 sec ~= 570 billion years
        uint64 timestampStart;
        uint64 priceDecayHalfLifeSeconds;
        uint256 startPrice;
        uint256 basePrice;
    }

    mapping(uint256 => ProjectConfig) public projectConfig;

    /// Minimum price decay half life: price must decay with a half life of at
    /// least this amount (must cut in half at least every N seconds).
    uint256 public minimumPriceDecayHalfLifeSeconds = 300; // 5 minutes
    /// Maximum price decay half life: price may decay with a half life of no
    /// more than this amount (may cut in half at no more than every N seconds).
    uint256 public maximumPriceDecayHalfLifeSeconds = 3600; // 60 minutes

    // modifier to restrict access to only AdminACL allowed calls
    // @dev defers which ACL contract is used to the core contract
    modifier onlyCoreAdminACL(bytes4 _selector) {
        require(
            genArtCoreContract.adminACLAllowed(
                msg.sender,
                address(this),
                _selector
            ),
            "Only Core AdminACL allowed"
        );
        _;
    }

    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 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 projectId => auction parameters
     */
    function projectAuctionParameters(uint256 _projectId)
        external
        view
        returns (
            uint256 timestampStart,
            uint256 priceDecayHalfLifeSeconds,
            uint256 startPrice,
            uint256 basePrice
        )
    {
        ProjectConfig storage _projectConfig = projectConfig[_projectId];
        return (
            _projectConfig.timestampStart,
            _projectConfig.priceDecayHalfLifeSeconds,
            _projectConfig.startPrice,
            _projectConfig.basePrice
        );
    }

    /**
     * @notice Sets the minimum and maximum values that are settable for
     * `_priceDecayHalfLifeSeconds` across all projects.
     * @param _minimumPriceDecayHalfLifeSeconds Minimum price decay half life
     * (in seconds).
     * @param _maximumPriceDecayHalfLifeSeconds Maximum price decay half life
     * (in seconds).
     */
    function setAllowablePriceDecayHalfLifeRangeSeconds(
        uint256 _minimumPriceDecayHalfLifeSeconds,
        uint256 _maximumPriceDecayHalfLifeSeconds
    )
        external
        onlyCoreAdminACL(
            this.setAllowablePriceDecayHalfLifeRangeSeconds.selector
        )
    {
        require(
            _maximumPriceDecayHalfLifeSeconds >
                _minimumPriceDecayHalfLifeSeconds,
            "Maximum half life must be greater than minimum"
        );
        require(
            _minimumPriceDecayHalfLifeSeconds > 0,
            "Half life of zero not allowed"
        );
        minimumPriceDecayHalfLifeSeconds = _minimumPriceDecayHalfLifeSeconds;
        maximumPriceDecayHalfLifeSeconds = _maximumPriceDecayHalfLifeSeconds;
        emit AuctionHalfLifeRangeSecondsUpdated(
            _minimumPriceDecayHalfLifeSeconds,
            _maximumPriceDecayHalfLifeSeconds
        );
    }

    ////// Auction Functions
    /**
     * @notice Sets auction details for project `_projectId`.
     * @param _projectId Project ID to set auction details for.
     * @param _auctionTimestampStart Timestamp at which to start the auction.
     * @param _priceDecayHalfLifeSeconds The half life with which to decay the
     *  price (in seconds).
     * @param _startPrice Price at which to start the auction, in Wei.
     * @param _basePrice Resting price of the auction, in Wei.
     * @dev Note that it is intentionally supported here that the configured
     * price may be explicitly set to `0`.
     */
    function setAuctionDetails(
        uint256 _projectId,
        uint256 _auctionTimestampStart,
        uint256 _priceDecayHalfLifeSeconds,
        uint256 _startPrice,
        uint256 _basePrice
    ) external onlyArtist(_projectId) {
        // CHECKS
        ProjectConfig storage _projectConfig = projectConfig[_projectId];
        require(
            _projectConfig.timestampStart == 0 ||
                block.timestamp < _projectConfig.timestampStart,
            "No modifications mid-auction"
        );
        require(
            block.timestamp < _auctionTimestampStart,
            "Only future auctions"
        );
        require(
            _startPrice > _basePrice,
            "Auction start price must be greater than auction end price"
        );
        require(
            (_priceDecayHalfLifeSeconds >= minimumPriceDecayHalfLifeSeconds) &&
                (_priceDecayHalfLifeSeconds <=
                    maximumPriceDecayHalfLifeSeconds),
            "Price decay half life must fall between min and max allowable values"
        );
        // EFFECTS
        _projectConfig.timestampStart = _auctionTimestampStart.toUint64();
        _projectConfig.priceDecayHalfLifeSeconds = _priceDecayHalfLifeSeconds
            .toUint64();
        _projectConfig.startPrice = _startPrice;
        _projectConfig.basePrice = _basePrice;

        emit SetAuctionDetails(
            _projectId,
            _auctionTimestampStart,
            _priceDecayHalfLifeSeconds,
            _startPrice,
            _basePrice
        );
    }

    /**
     * @notice Resets auction details for project `_projectId`, zero-ing out all
     * relevant auction fields. Not intended to be used in normal auction
     * operation, but rather only in case of the need to halt an auction.
     * @param _projectId Project ID to set auction details for.
     */
    function resetAuctionDetails(uint256 _projectId)
        external
        onlyCoreAdminACL(this.resetAuctionDetails.selector)
    {
        ProjectConfig storage _projectConfig = projectConfig[_projectId];
        // reset to initial values
        _projectConfig.timestampStart = 0;
        _projectConfig.priceDecayHalfLifeSeconds = 0;
        _projectConfig.startPrice = 0;
        _projectConfig.basePrice = 0;

        emit ResetAuctionDetails(_projectId);
    }

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

        // _getPrice reverts if auction is unconfigured or has not started
        uint256 currentPriceInWei = _getPrice(_projectId);
        require(
            msg.value >= currentPriceInWei,
            "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
        _splitFundsETHAuction(_projectId, currentPriceInWei);
        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.
     * @param _projectId Project ID for which funds shall be split.
     * @param _currentPriceInWei Current price of token, in Wei.
     */
    function _splitFundsETHAuction(
        uint256 _projectId,
        uint256 _currentPriceInWei
    ) internal {
        if (msg.value > 0) {
            bool success_;
            // send refund to sender
            uint256 refund = msg.value - _currentPriceInWei;
            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,
                    _currentPriceInWei
                );
            // 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 price of minting a token on project `_projectId` given
     * the project's AuctionParameters and current block timestamp.
     * Reverts if auction has not yet started or auction is unconfigured.
     * @param _projectId Project ID to get price of token for.
     * @return current price of token in Wei
     * @dev This method calculates price decay using a linear interpolation
     * of exponential decay based on the artist-provided half-life for price
     * decay, `_priceDecayHalfLifeSeconds`.
     */
    function _getPrice(uint256 _projectId) private view returns (uint256) {
        ProjectConfig storage _projectConfig = projectConfig[_projectId];
        // move parameters to memory if used more than once
        uint256 _timestampStart = uint256(_projectConfig.timestampStart);
        uint256 _priceDecayHalfLifeSeconds = uint256(
            _projectConfig.priceDecayHalfLifeSeconds
        );
        uint256 _basePrice = _projectConfig.basePrice;

        require(block.timestamp > _timestampStart, "Auction not yet started");
        require(_priceDecayHalfLifeSeconds > 0, "Only configured auctions");
        uint256 decayedPrice = _projectConfig.startPrice;
        uint256 elapsedTimeSeconds;
        unchecked {
            // already checked that block.timestamp > _timestampStart above
            elapsedTimeSeconds = block.timestamp - _timestampStart;
        }
        // Divide by two (via bit-shifting) for the number of entirely completed
        // half-lives that have elapsed since auction start time.
        unchecked {
            // already required _priceDecayHalfLifeSeconds > 0
            decayedPrice >>= elapsedTimeSeconds / _priceDecayHalfLifeSeconds;
        }
        // Perform a linear interpolation between partial half-life points, to
        // approximate the current place on a perfect exponential decay curve.
        unchecked {
            // value of expression is provably always less than decayedPrice,
            // so no underflow is possible when the subtraction assignment
            // operator is used on decayedPrice.
            decayedPrice -=
                (decayedPrice *
                    (elapsedTimeSeconds % _priceDecayHalfLifeSeconds)) /
                _priceDecayHalfLifeSeconds /
                2;
        }
        if (decayedPrice < _basePrice) {
            // Price may not decay below stay `basePrice`.
            return _basePrice;
        }
        return decayedPrice;
    }

    /**
     * @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 project's auction parameters have been
     * configured on this minter
     * @return tokenPriceInWei current price of token on this minter - invalid
     * if auction 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.startPrice > 0);
        if (block.timestamp <= _projectConfig.timestampStart) {
            // Provide a reasonable value for `tokenPriceInWei` when it would
            // otherwise revert, using the starting price before auction starts.
            tokenPriceInWei = _projectConfig.startPrice;
        } else if (_projectConfig.startPrice == 0) {
            // In the case of unconfigured auction, return price of zero when
            // it would otherwise revert
            tokenPriceInWei = 0;
        } else {
            tokenPriceInWei = _getPrice(_projectId);
        }
        currencySymbol = "ETH";
        currencyAddress = address(0);
    }
}

File 2 of 8 : 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 8 : 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 8 : 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 8 : 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 8 : SafeCast.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol)

pragma solidity ^0.8.0;

/**
 * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
 * checks.
 *
 * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
 * easily result in undesired exploitation or bugs, since developers usually
 * assume that overflows raise errors. `SafeCast` restores this intuition by
 * reverting the transaction when such an operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
 * all math on `uint256` and `int256` and then downcasting.
 */
library SafeCast {
    /**
     * @dev Returns the downcasted uint224 from uint256, reverting on
     * overflow (when the input is greater than largest uint224).
     *
     * Counterpart to Solidity's `uint224` operator.
     *
     * Requirements:
     *
     * - input must fit into 224 bits
     */
    function toUint224(uint256 value) internal pure returns (uint224) {
        require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits");
        return uint224(value);
    }

    /**
     * @dev Returns the downcasted uint128 from uint256, reverting on
     * overflow (when the input is greater than largest uint128).
     *
     * Counterpart to Solidity's `uint128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     */
    function toUint128(uint256 value) internal pure returns (uint128) {
        require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits");
        return uint128(value);
    }

    /**
     * @dev Returns the downcasted uint96 from uint256, reverting on
     * overflow (when the input is greater than largest uint96).
     *
     * Counterpart to Solidity's `uint96` operator.
     *
     * Requirements:
     *
     * - input must fit into 96 bits
     */
    function toUint96(uint256 value) internal pure returns (uint96) {
        require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits");
        return uint96(value);
    }

    /**
     * @dev Returns the downcasted uint64 from uint256, reverting on
     * overflow (when the input is greater than largest uint64).
     *
     * Counterpart to Solidity's `uint64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     */
    function toUint64(uint256 value) internal pure returns (uint64) {
        require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits");
        return uint64(value);
    }

    /**
     * @dev Returns the downcasted uint32 from uint256, reverting on
     * overflow (when the input is greater than largest uint32).
     *
     * Counterpart to Solidity's `uint32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     */
    function toUint32(uint256 value) internal pure returns (uint32) {
        require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits");
        return uint32(value);
    }

    /**
     * @dev Returns the downcasted uint16 from uint256, reverting on
     * overflow (when the input is greater than largest uint16).
     *
     * Counterpart to Solidity's `uint16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     */
    function toUint16(uint256 value) internal pure returns (uint16) {
        require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits");
        return uint16(value);
    }

    /**
     * @dev Returns the downcasted uint8 from uint256, reverting on
     * overflow (when the input is greater than largest uint8).
     *
     * Counterpart to Solidity's `uint8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     */
    function toUint8(uint256 value) internal pure returns (uint8) {
        require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits");
        return uint8(value);
    }

    /**
     * @dev Converts a signed int256 into an unsigned uint256.
     *
     * Requirements:
     *
     * - input must be greater than or equal to 0.
     */
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    /**
     * @dev Returns the downcasted int128 from int256, reverting on
     * overflow (when the input is less than smallest int128 or
     * greater than largest int128).
     *
     * Counterpart to Solidity's `int128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     *
     * _Available since v3.1._
     */
    function toInt128(int256 value) internal pure returns (int128) {
        require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits");
        return int128(value);
    }

    /**
     * @dev Returns the downcasted int64 from int256, reverting on
     * overflow (when the input is less than smallest int64 or
     * greater than largest int64).
     *
     * Counterpart to Solidity's `int64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     *
     * _Available since v3.1._
     */
    function toInt64(int256 value) internal pure returns (int64) {
        require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits");
        return int64(value);
    }

    /**
     * @dev Returns the downcasted int32 from int256, reverting on
     * overflow (when the input is less than smallest int32 or
     * greater than largest int32).
     *
     * Counterpart to Solidity's `int32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     *
     * _Available since v3.1._
     */
    function toInt32(int256 value) internal pure returns (int32) {
        require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits");
        return int32(value);
    }

    /**
     * @dev Returns the downcasted int16 from int256, reverting on
     * overflow (when the input is less than smallest int16 or
     * greater than largest int16).
     *
     * Counterpart to Solidity's `int16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     *
     * _Available since v3.1._
     */
    function toInt16(int256 value) internal pure returns (int16) {
        require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits");
        return int16(value);
    }

    /**
     * @dev Returns the downcasted int8 from int256, reverting on
     * overflow (when the input is less than smallest int8 or
     * greater than largest int8).
     *
     * Counterpart to Solidity's `int8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     *
     * _Available since v3.1._
     */
    function toInt8(int256 value) internal pure returns (int8) {
        require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits");
        return int8(value);
    }

    /**
     * @dev Converts an unsigned uint256 into a signed int256.
     *
     * Requirements:
     *
     * - input must be less than or equal to maxInt256.
     */
    function toInt256(uint256 value) internal pure returns (int256) {
        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
        require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256");
        return int256(value);
    }
}

File 7 of 8 : 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 8 of 8 : 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":false,"internalType":"uint256","name":"_minimumPriceDecayHalfLifeSeconds","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maximumPriceDecayHalfLifeSeconds","type":"uint256"}],"name":"AuctionHalfLifeRangeSecondsUpdated","type":"event"},{"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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"ResetAuctionDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_auctionTimestampStart","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_priceDecayHalfLifeSeconds","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_startPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_basePrice","type":"uint256"}],"name":"SetAuctionDetails","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":"maximumPriceDecayHalfLifeSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumPriceDecayHalfLifeSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_projectId","type":"uint256"}],"name":"projectAuctionParameters","outputs":[{"internalType":"uint256","name":"timestampStart","type":"uint256"},{"internalType":"uint256","name":"priceDecayHalfLifeSeconds","type":"uint256"},{"internalType":"uint256","name":"startPrice","type":"uint256"},{"internalType":"uint256","name":"basePrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"projectConfig","outputs":[{"internalType":"bool","name":"maxHasBeenInvoked","type":"bool"},{"internalType":"uint24","name":"maxInvocations","type":"uint24"},{"internalType":"uint64","name":"timestampStart","type":"uint64"},{"internalType":"uint64","name":"priceDecayHalfLifeSeconds","type":"uint64"},{"internalType":"uint256","name":"startPrice","type":"uint256"},{"internalType":"uint256","name":"basePrice","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":"resetAuctionDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumPriceDecayHalfLifeSeconds","type":"uint256"},{"internalType":"uint256","name":"_maximumPriceDecayHalfLifeSeconds","type":"uint256"}],"name":"setAllowablePriceDecayHalfLifeRangeSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_auctionTimestampStart","type":"uint256"},{"internalType":"uint256","name":"_priceDecayHalfLifeSeconds","type":"uint256"},{"internalType":"uint256","name":"_startPrice","type":"uint256"},{"internalType":"uint256","name":"_basePrice","type":"uint256"}],"name":"setAuctionDetails","outputs":[],"stateMutability":"nonpayable","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"}]

61010060405261012c600255610e106003553480156200001e57600080fd5b506040516200197d3803806200197d833981016040819052620000419162000153565b600160009081556001600160a01b03808416608081905260a081905290831660c081905260e0819052604080516392a10f8360e01b81529051929391926392a10f83926004808401936020939290839003909101908290875af1158015620000ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d391906200018b565b6001600160a01b0316146200012e5760405162461bcd60e51b815260206004820152601860248201527f496c6c6567616c20636f6e74726163742070616972696e670000000000000000604482015260640160405180910390fd5b5050620001b0565b80516001600160a01b03811681146200014e57600080fd5b919050565b600080604083850312156200016757600080fd5b620001728362000136565b9150620001826020840162000136565b90509250929050565b6000602082840312156200019e57600080fd5b620001a98262000136565b9392505050565b60805160a05160c05160e0516117706200020d60003960006105ce015260006103f10152600081816106b1015281816107be0152818161096101528181610b0f01528181610e5501526110e0015260006102a801526117706000f3fe6080604052600436106100e05760003560e01c80619987146100e5578061b4601461010b5780632aedc28e1461011e5780632f077ee61461014057806340d1397e146101a6578063462add46146101c657806356690aaf146102065780635bc1470f1461023d578063774159c614610253578063891407c01461028357806392a10f8314610296578063c0ad212e146102e2578063c71b1b7114610302578063cd379f6e146103a9578063cf6681ea146103c9578063dd85582f146103df578063e9d1e8ac14610413578063efef39a11461010b578063f7bd4b8814610459575b600080fd5b6100f86100f33660046113ff565b610479565b6040519081526020015b60405180910390f35b6100f861011936600461142b565b61067f565b34801561012a57600080fd5b5061013e61013936600461142b565b610691565b005b34801561014c57600080fd5b5061019661015b36600461142b565b60009081526001602081905260409091208054918101546002909101546001600160401b03600160201b8404811694600160601b9094041692565b6040516101029493929190611444565b3480156101b257600080fd5b5061013e6101c136600461142b565b6107a6565b3480156101d257600080fd5b506101f66101e136600461142b565b60009081526001602052604090205460ff1690565b6040519015158152602001610102565b34801561021257600080fd5b506100f861022136600461142b565b600090815260016020526040902054610100900462ffffff1690565b34801561024957600080fd5b506100f860035481565b34801561025f57600080fd5b5061027361026e36600461142b565b6108a0565b60405161010294939291906114a5565b6100f86102913660046113ff565b61092e565b3480156102a257600080fd5b506102ca7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610102565b3480156102ee57600080fd5b5061013e6102fd3660046114df565b610941565b34801561030e57600080fd5b5061036961031d36600461142b565b600160208190526000918252604090912080549181015460029091015460ff83169262ffffff610100820416926001600160401b03600160201b8304811693600160601b909304169186565b60408051961515875262ffffff90951660208701526001600160401b039384169486019490945291166060840152608083015260a082015260c001610102565b3480156103b557600080fd5b5061013e6103c4366004611501565b610af7565b3480156103d557600080fd5b506100f860025481565b3480156103eb57600080fd5b506102ca7f000000000000000000000000000000000000000000000000000000000000000081565b34801561041f57600080fd5b5061044c6040518060400160405280600d81526020016c26b4b73a32b92220a2bc382b1960991b81525081565b604051610102919061153c565b34801561046557600080fd5b5061013e61047436600461142b565b610e3c565b60006002600054036104d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000908155828152600160205260409020805460ff16156105455760405162461bcd60e51b815260206004820152602560248201527f4d6178696d756d206e756d626572206f6620696e766f636174696f6e732072656044820152641858da195960da1b60648201526084016104c9565b600061055084610efc565b9050803410156105a25760405162461bcd60e51b815260206004820181905260248201527f4d7573742073656e64206d696e696d756d2076616c756520746f206d696e742160448201526064016104c9565b604051630d4d151360e01b81526001600160a01b038681166004830152602482018690523360448301527f00000000000000000000000000000000000000000000000000000000000000001690630d4d1513906064016020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061154f565b825490935060001962ffffff61010090920482160116620f424084060361066857815460ff191660011782555b6106728482611032565b5050600160005592915050565b600061068b3383610479565b92915050565b60405163230448b160e01b8152631576e14760e11b906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063230448b1906106ea9033903090869060040161157e565b6020604051808303816000875af1158015610709573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072d91906115c0565b6107495760405162461bcd60e51b81526004016104c9906115db565b60008281526001602081905260408083208054600160201b600160a01b03191681559182018390556002820183905551909184917f2de6b284414d2e6b72bcc8d8d4de934e3f6410660a8f677c5c978f17f9cc2a929190a2505050565b60405163a47d29cb60e01b81526004810182905281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb90602401602060405180830381865afa15801561080d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610831919061160f565b6001600160a01b0316336001600160a01b0316146108615760405162461bcd60e51b81526004016104c99061162c565b60405162461bcd60e51b81526020600482015260146024820152731058dd1a5bdb881b9bdd081cdd5c1c1bdc9d195960621b60448201526064016104c9565b600081815260016020819052604082209081015481549015159291606091839190600160201b90046001600160401b031642116108e35780600101549350610904565b80600101546000036108f85760009350610904565b61090186610efc565b93505b6040518060400160405280600381526020016208aa8960eb1b815250925060009150509193509193565b600061093a8383610479565b9392505050565b60405163230448b160e01b8152636056909760e11b906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063230448b19061099a9033903090869060040161157e565b6020604051808303816000875af11580156109b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dd91906115c0565b6109f95760405162461bcd60e51b81526004016104c9906115db565b828211610a5f5760405162461bcd60e51b815260206004820152602e60248201527f4d6178696d756d2068616c66206c696665206d7573742062652067726561746560448201526d72207468616e206d696e696d756d60901b60648201526084016104c9565b60008311610aaf5760405162461bcd60e51b815260206004820152601d60248201527f48616c66206c696665206f66207a65726f206e6f7420616c6c6f77656400000060448201526064016104c9565b6002839055600382905560408051848152602081018490527f1d5d9c9b660aace5432c6c7412456d0ad1b5ff4c6ea156a8c551ba93555ed73f910160405180910390a1505050565b60405163a47d29cb60e01b81526004810186905285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b82919061160f565b6001600160a01b0316336001600160a01b031614610bb25760405162461bcd60e51b81526004016104c99061162c565b60008681526001602052604090208054600160201b90046001600160401b03161580610bee57508054600160201b90046001600160401b031642105b610c395760405162461bcd60e51b815260206004820152601c60248201527b27379036b7b234b334b1b0ba34b7b7399036b4b216b0bab1ba34b7b760211b60448201526064016104c9565b854210610c7f5760405162461bcd60e51b81526020600482015260146024820152734f6e6c79206675747572652061756374696f6e7360601b60448201526064016104c9565b828411610cf15760405162461bcd60e51b815260206004820152603a60248201527f41756374696f6e207374617274207072696365206d7573742062652067726561604482015279746572207468616e2061756374696f6e20656e6420707269636560301b60648201526084016104c9565b6002548510158015610d0557506003548511155b610d855760405162461bcd60e51b8152602060048201526044602482018190527f50726963652064656361792068616c66206c696665206d7573742066616c6c20908201527f6265747765656e206d696e20616e64206d617820616c6c6f7761626c652076616064820152636c75657360e01b608482015260a4016104c9565b610d8e8661137b565b81546001600160401b0391909116600160201b0267ffffffffffffffff60201b19909116178155610dbe8561137b565b81546001600160401b0391909116600160601b0267ffffffffffffffff60601b19909116178155600181018490556002810183905560405187907f38b3058b75696f9e45bffa9c4b237adcde13d74c7bc1bea63e13c712d0776c7490610e2b908990899089908990611444565b60405180910390a250505050505050565b604051630ea5613f60e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630ea5613f9060240160c060405180830381865afa158015610ea4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec89190611651565b50505060009485525060016020526040909320805462ffffff9094166101000263ffffff0019909416939093179092555050565b6000818152600160205260408120805460028201546001600160401b03600160201b8304811692600160601b90041690428310610f755760405162461bcd60e51b8152602060048201526017602482015276105d58dd1a5bdb881b9bdd081e595d081cdd185c9d1959604a1b60448201526064016104c9565b60008211610fc05760405162461bcd60e51b81526020600482015260186024820152774f6e6c7920636f6e666967757265642061756374696f6e7360401b60448201526064016104c9565b600184015442849003838181610fd857610fd8611568565b0482901c9150600284858381610ff057610ff0611568565b0684028161100057611000611568565b048161100e5761100e611568565b0482039150828210156110275750909695505050505050565b509695505050505050565b34156113775760008061104583346116b0565b905080156110d55760405133908290600081818185875af1925050503d806000811461108d576040519150601f19603f3d011682016040523d82523d6000602084013e611092565b606091505b505080925050816110d55760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b60448201526064016104c9565b6000806000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638639415b8b8b6040518363ffffffff1660e01b8152600401611135929190918252602082015260400190565b60c060405180830381865afa158015611152573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117691906116d1565b9550955095509550955095506000861115611228576040516001600160a01b038616908790600081818185875af1925050503d80600081146111d4576040519150601f19603f3d011682016040523d82523d6000602084013e6111d9565b606091505b505080985050876112285760405162461bcd60e51b8152602060048201526019602482015278105c9d08109b1bd8dadcc81c185e5b595b9d0819985a5b1959603a1b60448201526064016104c9565b83156112c7576040516001600160a01b038416908590600081818185875af1925050503d8060008114611277576040519150601f19603f3d011682016040523d82523d6000602084013e61127c565b606091505b505080985050876112c75760405162461bcd60e51b8152602060048201526015602482015274105c9d1a5cdd081c185e5b595b9d0819985a5b1959605a1b60448201526064016104c9565b811561136e576040516001600160a01b038216908390600081818185875af1925050503d8060008114611316576040519150601f19603f3d011682016040523d82523d6000602084013e61131b565b606091505b5050809850508761136e5760405162461bcd60e51b815260206004820152601f60248201527f4164646974696f6e616c205061796565207061796d656e74206661696c65640060448201526064016104c9565b50505050505050505b5050565b60006001600160401b038211156113e35760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b60648201526084016104c9565b5090565b6001600160a01b03811681146113fc57600080fd5b50565b6000806040838503121561141257600080fd5b823561141d816113e7565b946020939093013593505050565b60006020828403121561143d57600080fd5b5035919050565b93845260208401929092526040830152606082015260800190565b6000815180845260005b8181101561148557602081850181015186830182015201611469565b506000602082860101526020601f19601f83011685010191505092915050565b84151581528360208201526080604082015260006114c6608083018561145f565b905060018060a01b038316606083015295945050505050565b600080604083850312156114f257600080fd5b50508035926020909101359150565b600080600080600060a0868803121561151957600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60208152600061093a602083018461145f565b60006020828403121561156157600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b805180151581146115bb57600080fd5b919050565b6000602082840312156115d257600080fd5b61093a826115ab565b6020808252601a908201527913db9b1e4810dbdc994810591b5a5b9050d308185b1b1bddd95960321b604082015260600190565b60006020828403121561162157600080fd5b815161093a816113e7565b6020808252600b908201526a13db9b1e48105c9d1a5cdd60aa1b604082015260600190565b60008060008060008060c0878903121561166a57600080fd5b8651955060208701519450611681604088016115ab565b935061168f606088016115ab565b9250608087015191506116a460a088016115ab565b90509295509295509295565b8181038181111561068b57634e487b7160e01b600052601160045260246000fd5b60008060008060008060c087890312156116ea57600080fd5b8651955060208701516116fc816113e7565b604088015160608901519196509450611714816113e7565b608088015160a0890151919450925061172c816113e7565b80915050929550929550929556fea26469706673582212203fd5680a57f269ff9c3647ec634276147f8014e190442a296e11bff6edeac82264736f6c6343000811003300000000000000000000000099a9b7c1116f9ceeb1652de04d5969cce509b069000000000000000000000000092b8f64e713d66b38522978bcf4649db14b931e

Deployed Bytecode

0x6080604052600436106100e05760003560e01c80619987146100e5578061b4601461010b5780632aedc28e1461011e5780632f077ee61461014057806340d1397e146101a6578063462add46146101c657806356690aaf146102065780635bc1470f1461023d578063774159c614610253578063891407c01461028357806392a10f8314610296578063c0ad212e146102e2578063c71b1b7114610302578063cd379f6e146103a9578063cf6681ea146103c9578063dd85582f146103df578063e9d1e8ac14610413578063efef39a11461010b578063f7bd4b8814610459575b600080fd5b6100f86100f33660046113ff565b610479565b6040519081526020015b60405180910390f35b6100f861011936600461142b565b61067f565b34801561012a57600080fd5b5061013e61013936600461142b565b610691565b005b34801561014c57600080fd5b5061019661015b36600461142b565b60009081526001602081905260409091208054918101546002909101546001600160401b03600160201b8404811694600160601b9094041692565b6040516101029493929190611444565b3480156101b257600080fd5b5061013e6101c136600461142b565b6107a6565b3480156101d257600080fd5b506101f66101e136600461142b565b60009081526001602052604090205460ff1690565b6040519015158152602001610102565b34801561021257600080fd5b506100f861022136600461142b565b600090815260016020526040902054610100900462ffffff1690565b34801561024957600080fd5b506100f860035481565b34801561025f57600080fd5b5061027361026e36600461142b565b6108a0565b60405161010294939291906114a5565b6100f86102913660046113ff565b61092e565b3480156102a257600080fd5b506102ca7f00000000000000000000000099a9b7c1116f9ceeb1652de04d5969cce509b06981565b6040516001600160a01b039091168152602001610102565b3480156102ee57600080fd5b5061013e6102fd3660046114df565b610941565b34801561030e57600080fd5b5061036961031d36600461142b565b600160208190526000918252604090912080549181015460029091015460ff83169262ffffff610100820416926001600160401b03600160201b8304811693600160601b909304169186565b60408051961515875262ffffff90951660208701526001600160401b039384169486019490945291166060840152608083015260a082015260c001610102565b3480156103b557600080fd5b5061013e6103c4366004611501565b610af7565b3480156103d557600080fd5b506100f860025481565b3480156103eb57600080fd5b506102ca7f000000000000000000000000092b8f64e713d66b38522978bcf4649db14b931e81565b34801561041f57600080fd5b5061044c6040518060400160405280600d81526020016c26b4b73a32b92220a2bc382b1960991b81525081565b604051610102919061153c565b34801561046557600080fd5b5061013e61047436600461142b565b610e3c565b60006002600054036104d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000908155828152600160205260409020805460ff16156105455760405162461bcd60e51b815260206004820152602560248201527f4d6178696d756d206e756d626572206f6620696e766f636174696f6e732072656044820152641858da195960da1b60648201526084016104c9565b600061055084610efc565b9050803410156105a25760405162461bcd60e51b815260206004820181905260248201527f4d7573742073656e64206d696e696d756d2076616c756520746f206d696e742160448201526064016104c9565b604051630d4d151360e01b81526001600160a01b038681166004830152602482018690523360448301527f000000000000000000000000092b8f64e713d66b38522978bcf4649db14b931e1690630d4d1513906064016020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061154f565b825490935060001962ffffff61010090920482160116620f424084060361066857815460ff191660011782555b6106728482611032565b5050600160005592915050565b600061068b3383610479565b92915050565b60405163230448b160e01b8152631576e14760e11b906001600160a01b037f00000000000000000000000099a9b7c1116f9ceeb1652de04d5969cce509b069169063230448b1906106ea9033903090869060040161157e565b6020604051808303816000875af1158015610709573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072d91906115c0565b6107495760405162461bcd60e51b81526004016104c9906115db565b60008281526001602081905260408083208054600160201b600160a01b03191681559182018390556002820183905551909184917f2de6b284414d2e6b72bcc8d8d4de934e3f6410660a8f677c5c978f17f9cc2a929190a2505050565b60405163a47d29cb60e01b81526004810182905281907f00000000000000000000000099a9b7c1116f9ceeb1652de04d5969cce509b0696001600160a01b03169063a47d29cb90602401602060405180830381865afa15801561080d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610831919061160f565b6001600160a01b0316336001600160a01b0316146108615760405162461bcd60e51b81526004016104c99061162c565b60405162461bcd60e51b81526020600482015260146024820152731058dd1a5bdb881b9bdd081cdd5c1c1bdc9d195960621b60448201526064016104c9565b600081815260016020819052604082209081015481549015159291606091839190600160201b90046001600160401b031642116108e35780600101549350610904565b80600101546000036108f85760009350610904565b61090186610efc565b93505b6040518060400160405280600381526020016208aa8960eb1b815250925060009150509193509193565b600061093a8383610479565b9392505050565b60405163230448b160e01b8152636056909760e11b906001600160a01b037f00000000000000000000000099a9b7c1116f9ceeb1652de04d5969cce509b069169063230448b19061099a9033903090869060040161157e565b6020604051808303816000875af11580156109b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dd91906115c0565b6109f95760405162461bcd60e51b81526004016104c9906115db565b828211610a5f5760405162461bcd60e51b815260206004820152602e60248201527f4d6178696d756d2068616c66206c696665206d7573742062652067726561746560448201526d72207468616e206d696e696d756d60901b60648201526084016104c9565b60008311610aaf5760405162461bcd60e51b815260206004820152601d60248201527f48616c66206c696665206f66207a65726f206e6f7420616c6c6f77656400000060448201526064016104c9565b6002839055600382905560408051848152602081018490527f1d5d9c9b660aace5432c6c7412456d0ad1b5ff4c6ea156a8c551ba93555ed73f910160405180910390a1505050565b60405163a47d29cb60e01b81526004810186905285907f00000000000000000000000099a9b7c1116f9ceeb1652de04d5969cce509b0696001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b82919061160f565b6001600160a01b0316336001600160a01b031614610bb25760405162461bcd60e51b81526004016104c99061162c565b60008681526001602052604090208054600160201b90046001600160401b03161580610bee57508054600160201b90046001600160401b031642105b610c395760405162461bcd60e51b815260206004820152601c60248201527b27379036b7b234b334b1b0ba34b7b7399036b4b216b0bab1ba34b7b760211b60448201526064016104c9565b854210610c7f5760405162461bcd60e51b81526020600482015260146024820152734f6e6c79206675747572652061756374696f6e7360601b60448201526064016104c9565b828411610cf15760405162461bcd60e51b815260206004820152603a60248201527f41756374696f6e207374617274207072696365206d7573742062652067726561604482015279746572207468616e2061756374696f6e20656e6420707269636560301b60648201526084016104c9565b6002548510158015610d0557506003548511155b610d855760405162461bcd60e51b8152602060048201526044602482018190527f50726963652064656361792068616c66206c696665206d7573742066616c6c20908201527f6265747765656e206d696e20616e64206d617820616c6c6f7761626c652076616064820152636c75657360e01b608482015260a4016104c9565b610d8e8661137b565b81546001600160401b0391909116600160201b0267ffffffffffffffff60201b19909116178155610dbe8561137b565b81546001600160401b0391909116600160601b0267ffffffffffffffff60601b19909116178155600181018490556002810183905560405187907f38b3058b75696f9e45bffa9c4b237adcde13d74c7bc1bea63e13c712d0776c7490610e2b908990899089908990611444565b60405180910390a250505050505050565b604051630ea5613f60e01b8152600481018290526000907f00000000000000000000000099a9b7c1116f9ceeb1652de04d5969cce509b0696001600160a01b031690630ea5613f9060240160c060405180830381865afa158015610ea4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec89190611651565b50505060009485525060016020526040909320805462ffffff9094166101000263ffffff0019909416939093179092555050565b6000818152600160205260408120805460028201546001600160401b03600160201b8304811692600160601b90041690428310610f755760405162461bcd60e51b8152602060048201526017602482015276105d58dd1a5bdb881b9bdd081e595d081cdd185c9d1959604a1b60448201526064016104c9565b60008211610fc05760405162461bcd60e51b81526020600482015260186024820152774f6e6c7920636f6e666967757265642061756374696f6e7360401b60448201526064016104c9565b600184015442849003838181610fd857610fd8611568565b0482901c9150600284858381610ff057610ff0611568565b0684028161100057611000611568565b048161100e5761100e611568565b0482039150828210156110275750909695505050505050565b509695505050505050565b34156113775760008061104583346116b0565b905080156110d55760405133908290600081818185875af1925050503d806000811461108d576040519150601f19603f3d011682016040523d82523d6000602084013e611092565b606091505b505080925050816110d55760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b60448201526064016104c9565b6000806000806000807f00000000000000000000000099a9b7c1116f9ceeb1652de04d5969cce509b0696001600160a01b0316638639415b8b8b6040518363ffffffff1660e01b8152600401611135929190918252602082015260400190565b60c060405180830381865afa158015611152573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117691906116d1565b9550955095509550955095506000861115611228576040516001600160a01b038616908790600081818185875af1925050503d80600081146111d4576040519150601f19603f3d011682016040523d82523d6000602084013e6111d9565b606091505b505080985050876112285760405162461bcd60e51b8152602060048201526019602482015278105c9d08109b1bd8dadcc81c185e5b595b9d0819985a5b1959603a1b60448201526064016104c9565b83156112c7576040516001600160a01b038416908590600081818185875af1925050503d8060008114611277576040519150601f19603f3d011682016040523d82523d6000602084013e61127c565b606091505b505080985050876112c75760405162461bcd60e51b8152602060048201526015602482015274105c9d1a5cdd081c185e5b595b9d0819985a5b1959605a1b60448201526064016104c9565b811561136e576040516001600160a01b038216908390600081818185875af1925050503d8060008114611316576040519150601f19603f3d011682016040523d82523d6000602084013e61131b565b606091505b5050809850508761136e5760405162461bcd60e51b815260206004820152601f60248201527f4164646974696f6e616c205061796565207061796d656e74206661696c65640060448201526064016104c9565b50505050505050505b5050565b60006001600160401b038211156113e35760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b60648201526084016104c9565b5090565b6001600160a01b03811681146113fc57600080fd5b50565b6000806040838503121561141257600080fd5b823561141d816113e7565b946020939093013593505050565b60006020828403121561143d57600080fd5b5035919050565b93845260208401929092526040830152606082015260800190565b6000815180845260005b8181101561148557602081850181015186830182015201611469565b506000602082860101526020601f19601f83011685010191505092915050565b84151581528360208201526080604082015260006114c6608083018561145f565b905060018060a01b038316606083015295945050505050565b600080604083850312156114f257600080fd5b50508035926020909101359150565b600080600080600060a0868803121561151957600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60208152600061093a602083018461145f565b60006020828403121561156157600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b805180151581146115bb57600080fd5b919050565b6000602082840312156115d257600080fd5b61093a826115ab565b6020808252601a908201527913db9b1e4810dbdc994810591b5a5b9050d308185b1b1bddd95960321b604082015260600190565b60006020828403121561162157600080fd5b815161093a816113e7565b6020808252600b908201526a13db9b1e48105c9d1a5cdd60aa1b604082015260600190565b60008060008060008060c0878903121561166a57600080fd5b8651955060208701519450611681604088016115ab565b935061168f606088016115ab565b9250608087015191506116a460a088016115ab565b90509295509295509295565b8181038181111561068b57634e487b7160e01b600052601160045260246000fd5b60008060008060008060c087890312156116ea57600080fd5b8651955060208701516116fc816113e7565b604088015160608901519196509450611714816113e7565b608088015160a0890151919450925061172c816113e7565b80915050929550929550929556fea26469706673582212203fd5680a57f269ff9c3647ec634276147f8014e190442a296e11bff6edeac82264736f6c63430008110033

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

00000000000000000000000099a9b7c1116f9ceeb1652de04d5969cce509b069000000000000000000000000092b8f64e713d66b38522978bcf4649db14b931e

-----Decoded View---------------
Arg [0] : _genArt721Address (address): 0x99a9B7c1116f9ceEB1652de04d5969CcE509B069
Arg [1] : _minterFilter (address): 0x092B8F64e713d66b38522978BCf4649db14b931E

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000099a9b7c1116f9ceeb1652de04d5969cce509b069
Arg [1] : 000000000000000000000000092b8f64e713d66b38522978bcf4649db14b931e


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  ]
[ 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.