Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0xB3d64505ee3c33DE1Fcb4972B10CE27617930Ab6
Balance 0 ETH
Nonce 1
Code Size 5421 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

5421 bytes
0x608060405260043610610147575f3560e01c80638ab1d681116100b3578063b5cfe31b1161006d578063b5cfe31b1461038d578063b6935501146103ac578063cd85cdb5146103cb578063d56d229d146103df578063dc53fd92146103fe578063e43252d714610413575f5ffd5b80638ab1d681146102b85780638da5cb5b146102d75780639b19251a1461030e578063a611708e1461033c578063abbb5a551461035b578063afdf61341461036e575f5ffd5b806339b7ec291161010457806339b7ec29146102055780633ccfd60b1461022457806351fb012d1461023857806355f804b3146102615780635d82cf6e146102805780637e4831d31461029f575f5ffd5b8063045fb8881461014b578063052d9e7e1461016c5780631a8bd2da1461018b5780632a8e407b1461019f5780632db6fa36146101be57806335c6aaf8146101dd575b5f5ffd5b348015610156575f5ffd5b5061016a610165366004611220565b610432565b005b348015610177575f5ffd5b5061016a61018636600461125f565b610509565b348015610196575f5ffd5b5061016a61057b565b3480156101aa575f5ffd5b5061016a6101b93660046112a0565b610642565b3480156101c9575f5ffd5b5061016a6101d8366004611220565b610757565b3480156101e8575f5ffd5b506101f260045481565b6040519081526020015b60405180910390f35b348015610210575f5ffd5b5061016a61021f3660046112b9565b610819565b34801561022f575f5ffd5b5061016a6108ba565b348015610243575f5ffd5b506005546102519060ff1681565b60405190151581526020016101fc565b34801561026c575f5ffd5b5061016a61027b366004611301565b6109d0565b34801561028b575f5ffd5b5061016a61029a36600461136f565b610aa7565b3480156102aa575f5ffd5b506007546102519060ff1681565b3480156102c3575f5ffd5b5061016a6102d23660046112a0565b610b06565b3480156102e2575f5ffd5b506002546102f6906001600160a01b031681565b6040516001600160a01b0390911681526020016101fc565b348015610319575f5ffd5b506102516103283660046112a0565b60066020525f908152604090205460ff1681565b348015610347575f5ffd5b5061016a61035636600461136f565b610b78565b61016a61036936600461136f565b610bd7565b348015610379575f5ffd5b5061016a61038836600461136f565b610e13565b348015610398575f5ffd5b5061016a6103a736600461125f565b610ee0565b3480156103b7575f5ffd5b5061016a6103c636600461125f565b610f9f565b3480156103d6575f5ffd5b5061016a611047565b3480156103ea575f5ffd5b506001546102f6906001600160a01b031681565b348015610409575f5ffd5b506101f260035481565b34801561041e575f5ffd5b5061016a61042d3660046112a0565b61110c565b6002546001600160a01b031633146104655760405162461bcd60e51b815260040161045c90611386565b60405180910390fd5b805f5b818110156104ca575f60065f868685818110610486576104866113a9565b905060200201602081019061049b91906112a0565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101610468565b507fd84b89880f906bd81af2c707bdc1a2fea817b2d20bb48f4ea44eabfcd7ac398883836040516104fc929190611403565b60405180910390a1505050565b6002546001600160a01b031633146105335760405162461bcd60e51b815260040161045c90611386565b6005805460ff19168215159081179091556040519081527f1cf28b997975c7be355bcef74f2f5019aa48253bc1e54b3c8b002471865fdba8906020015b60405180910390a150565b6002546001600160a01b031633146105a55760405162461bcd60e51b815260040161045c90611386565b6105ad611181565b60015f9054906101000a90046001600160a01b03166001600160a01b0316631a8bd2da6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156105f9575f5ffd5b505af115801561060b573d5f5f3e3d5ffd5b50506040517fd76d4045ba8d223490b9c6a5657cfdaa2316ac28a5a65274870bfe66a33ea0c492505f9150a161064060015f55565b565b6002546001600160a01b0316331461066c5760405162461bcd60e51b815260040161045c90611386565b610674611181565b6001600160a01b0381166106be5760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b2103732bb9037bbb732b960791b604482015260640161045c565b60015460405163f2fde38b60e01b81526001600160a01b0383811660048301529091169063f2fde38b906024015f604051808303815f87803b158015610702575f5ffd5b505af1158015610714573d5f5f3e3d5ffd5b50506040516001600160a01b03841692507f6269a619dd8f1193c4960a38065f85d27f21c7cb77ffeaa1581415f4d519763c91505f90a261075460015f55565b50565b6002546001600160a01b031633146107815760405162461bcd60e51b815260040161045c90611386565b805f5b818110156107e757600160065f8686858181106107a3576107a36113a9565b90506020020160208101906107b891906112a0565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101610784565b507fd4f375d5f3851606081ae3203ce97273e1f52835355dfbb0b0739a7ccf7ff15583836040516104fc929190611403565b6002546001600160a01b031633146108435760405162461bcd60e51b815260040161045c90611386565b61084b611181565b6001546040516339b7ec2960e01b81526001600160a01b03909116906339b7ec299061087f9086908690869060040161141e565b5f604051808303815f87803b158015610896575f5ffd5b505af11580156108a8573d5f5f3e3d5ffd5b505050506108b560015f55565b505050565b6002546001600160a01b031633146108e45760405162461bcd60e51b815260040161045c90611386565b6108ec611181565b47806109315760405162461bcd60e51b81526020600482015260146024820152734e6f2066756e647320746f20776974686472617760601b604482015260640161045c565b6002546040515f916001600160a01b03169083908381818185875af1925050503d805f811461097b576040519150601f19603f3d011682016040523d82523d5f602084013e610980565b606091505b50509050806109c55760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b604482015260640161045c565b505061064060015f55565b6002546001600160a01b031633146109fa5760405162461bcd60e51b815260040161045c90611386565b610a02611181565b6001546040516355f804b360e01b81526001600160a01b03909116906355f804b390610a349085908590600401611441565b5f604051808303815f87803b158015610a4b575f5ffd5b505af1158015610a5d573d5f5f3e3d5ffd5b505050507f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad8282604051610a92929190611441565b60405180910390a1610aa360015f55565b5050565b6002546001600160a01b03163314610ad15760405162461bcd60e51b815260040161045c90611386565b60038190556040518181527f6267c2c470a7940d276500728ecd2ad64aed9043ea1a307826e7613adff1f20f90602001610570565b6002546001600160a01b03163314610b305760405162461bcd60e51b815260040161045c90611386565b6001600160a01b0381165f81815260066020526040808220805460ff19169055517f535611fb62fa2a833988f283b779e417e996813e44046f521d76c17b5943b08c9190a250565b6002546001600160a01b03163314610ba25760405162461bcd60e51b815260040161045c90611386565b60048190556040518181527fa099db76bfe45aed42fd5d0753ef45c663a92745c5b265059e1fdd56efca4d4990602001610570565b610bdf611181565b60075460ff1615610c265760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b604482015260640161045c565b5f8111610c755760405162461bcd60e51b815260206004820152601960248201527f5175616e74697479206d75737420626520706f73697469766500000000000000604482015260640161045c565b60035460055460ff168015610c985750335f9081526006602052604090205460ff165b15610ca257506004545b610cac818361146f565b341015610cf25760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b604482015260640161045c565b5f8267ffffffffffffffff811115610d0c57610d0c611498565b604051908082528060200260200182016040528015610d35578160200160208202803683370190505b5090505f5b83811015610d755733828281518110610d5557610d556113a9565b6001600160a01b0390921660209283029190910190910152600101610d3a565b5060015460405163d67b06c160e01b81526001600160a01b039091169063d67b06c190610da69084906004016114ac565b5f604051808303815f87803b158015610dbd575f5ffd5b505af1158015610dcf573d5f5f3e3d5ffd5b50506040518581523392507fe5ca015deab1dfaaa052d6ac40799471cf83b21c4a6aac78906389b8f21b3d64915060200160405180910390a2505061075460015f55565b6002546001600160a01b03163314610e3d5760405162461bcd60e51b815260040161045c90611386565b610e45611181565b600154604051632bf7d84d60e21b8152600481018390526001600160a01b039091169063afdf6134906024015f604051808303815f87803b158015610e88575f5ffd5b505af1158015610e9a573d5f5f3e3d5ffd5b505050507fa70551d77839af8d46672cc5a1e4fc3a1b08e9e3cc87239c10d705a80baf938c81604051610ecf91815260200190565b60405180910390a161075460015f55565b6002546001600160a01b03163314610f0a5760405162461bcd60e51b815260040161045c90611386565b610f12611181565b60015460405163b5cfe31b60e01b815282151560048201526001600160a01b039091169063b5cfe31b906024015f604051808303815f87803b158015610f56575f5ffd5b505af1158015610f68573d5f5f3e3d5ffd5b505050507f705ccf061eece93f15c7c062eb64445c1942f1d89ea221d376bbc3475dde657f81604051610ecf911515815260200190565b6002546001600160a01b03163314610fc95760405162461bcd60e51b815260040161045c90611386565b610fd1611181565b6007805460ff19168215801591909117909155611015576040517fd7d248ba47bac931be252275aff92303dd610ca36c92c05dbac783fde1662a0e905f90a161103e565b6040517fd76d4045ba8d223490b9c6a5657cfdaa2316ac28a5a65274870bfe66a33ea0c4905f90a15b61075460015f55565b6002546001600160a01b031633146110715760405162461bcd60e51b815260040161045c90611386565b611079611181565b60015f9054906101000a90046001600160a01b03166001600160a01b031663cd85cdb56040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156110c5575f5ffd5b505af11580156110d7573d5f5f3e3d5ffd5b50506040517fd7d248ba47bac931be252275aff92303dd610ca36c92c05dbac783fde1662a0e92505f9150a161064060015f55565b6002546001600160a01b031633146111365760405162461bcd60e51b815260040161045c90611386565b6001600160a01b0381165f81815260066020526040808220805460ff19166001179055517f4f783c179409b4127238bc9c990bc99b9a651666a0d20b51d6c42849eb88466d9190a250565b60025f54036111d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161045c565b60025f55565b5f5f83601f8401126111e8575f5ffd5b50813567ffffffffffffffff8111156111ff575f5ffd5b6020830191508360208260051b8501011115611219575f5ffd5b9250929050565b5f5f60208385031215611231575f5ffd5b823567ffffffffffffffff811115611247575f5ffd5b611253858286016111d8565b90969095509350505050565b5f6020828403121561126f575f5ffd5b8135801515811461127e575f5ffd5b9392505050565b80356001600160a01b038116811461129b575f5ffd5b919050565b5f602082840312156112b0575f5ffd5b61127e82611285565b5f5f5f604084860312156112cb575f5ffd5b833567ffffffffffffffff8111156112e1575f5ffd5b6112ed868287016111d8565b909790965060209590950135949350505050565b5f5f60208385031215611312575f5ffd5b823567ffffffffffffffff811115611328575f5ffd5b8301601f81018513611338575f5ffd5b803567ffffffffffffffff81111561134e575f5ffd5b85602082840101111561135f575f5ffd5b6020919091019590945092505050565b5f6020828403121561137f575f5ffd5b5035919050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b8183526020830192505f815f5b848110156113f9576001600160a01b036113e383611285565b16865260209586019591909101906001016113ca565b5093949350505050565b602081525f6114166020830184866113bd565b949350505050565b604081525f6114316040830185876113bd565b9050826020830152949350505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b808202811582820484141761149257634e487b7160e01b5f52601160045260245ffd5b92915050565b634e487b7160e01b5f52604160045260245ffd5b602080825282518282018190525f918401906040840190835b818110156114ec5783516001600160a01b03168352602093840193909201916001016114c5565b50909594505050505056fea2646970667358221220b83880be24a3f005c9237faa26fa8dc357d457f387a2bb91df374ac11b06de7564736f6c634300081c0033

Verified Source Code Partial Match

Compiler: v0.8.28+commit.7893614a EVM: cancun Optimization: Yes (200 runs)
BatchMintProxy.sol 271 lines
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.28;

/**
 * @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() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// File: NewProxy.sol


pragma solidity ^0.8.28;


interface INFTMintingContract {
    function batchMint(address[] calldata recipients) external;
    function batchMintMultiple(address[] calldata recipients, uint256 quantity) external;
    function pauseMint() external;
    function unpauseMint() external;
    function setBaseURI(string calldata newBaseURI) external;
    function setMarketplaceListingEnabled(bool enabled) external;
    function setMaxMintPerWallet(uint256 newMaxMintPerWallet) external;
    function transferOwnership(address newOwner) external;
    function totalSupply() external view returns (uint256);
}

contract BatchMintProxy is ReentrancyGuard {
    INFTMintingContract public nftContract;
    address public owner;

    // Tiered mint prices (in wei)
    uint256 public publicMintPrice;
    uint256 public whitelistMintPrice;

    // Whitelist functionality.
    bool public whitelistEnabled;
    mapping(address => bool) public whitelist;

    // Mint pause control for the proxy.
    bool public mintPaused;

    // ========== Events ==========
    event MintMultiple(address indexed user, uint256 quantity);
    event OwnershipReturned(address indexed newOwner);
    event PublicMintPriceUpdated(uint256 newPrice);
    event WhitelistMintPriceUpdated(uint256 newPrice);
    event WhitelistStatusChanged(bool enabled);
    event AddressWhitelisted(address indexed addr);
    event AddressRemovedFromWhitelist(address indexed addr);
    event BatchAddressesWhitelisted(address[] addrs);
    event BatchAddressesRemoved(address[] addrs);
    event MintPaused();
    event MintUnpaused();
    event BaseURIUpdated(string newBaseURI);
    event MarketplaceListingStatusChanged(bool enabled);
    event MaxMintPerWalletUpdated(uint256 newMaxMintPerWallet);

    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }

    constructor(address _nftContractAddress, uint256 _publicMintPrice, uint256 _whitelistMintPrice) {
        nftContract = INFTMintingContract(_nftContractAddress);
        owner = msg.sender;
        publicMintPrice = _publicMintPrice;
        whitelistMintPrice = _whitelistMintPrice;
        // By default, whitelist enforcement is off and minting is not paused.
        whitelistEnabled = false;
        mintPaused = false;
    }

    /**
     * @notice Allows a user to mint multiple NFTs in one transaction.
     * The required ETH is calculated as:
     * - quantity * whitelistMintPrice if whitelist is enabled and the user is whitelisted,
     * - otherwise quantity * publicMintPrice.
     * @param quantity The number of NFTs the user wishes to mint.
     */
    function mintMultiple(uint256 quantity) external payable nonReentrant {
        require(!mintPaused, "Minting is paused"); // New check on the proxy level.
        require(quantity > 0, "Quantity must be positive");

        uint256 price = publicMintPrice;
        if (whitelistEnabled && whitelist[msg.sender]) {
            price = whitelistMintPrice;
        }
        require(msg.value >= quantity * price, "Insufficient payment");

        // Build an array with the caller's address repeated 'quantity' times.
        address[] memory recipients = new address[](quantity);
        for (uint256 i = 0; i < quantity; i++) {
            recipients[i] = msg.sender;
        }
        nftContract.batchMint(recipients);
        emit MintMultiple(msg.sender, quantity);
    }

    // ========== Administrative Wrapper Functions ==========
    function batchMintMultiple(address[] calldata recipients, uint256 quantity) external onlyOwner nonReentrant {
        nftContract.batchMintMultiple(recipients, quantity);
    }

    function pauseMint() external onlyOwner nonReentrant {
        nftContract.pauseMint();
        emit MintPaused();
    }

    function unpauseMint() external onlyOwner nonReentrant {
        nftContract.unpauseMint();
        emit MintUnpaused();
    }

    function setBaseURI(string calldata newBaseURI) external onlyOwner nonReentrant {
        nftContract.setBaseURI(newBaseURI);
        emit BaseURIUpdated(newBaseURI);
    }

    function setMarketplaceListingEnabled(bool enabled) external onlyOwner nonReentrant {
        nftContract.setMarketplaceListingEnabled(enabled);
        emit MarketplaceListingStatusChanged(enabled);
    }

    function setMaxMintPerWallet(uint256 newMaxMintPerWallet) external onlyOwner nonReentrant {
        nftContract.setMaxMintPerWallet(newMaxMintPerWallet);
        emit MaxMintPerWalletUpdated(newMaxMintPerWallet);
    }

    // Tiered pricing and whitelist management wrappers.
    function setPublicMintPrice(uint256 newPrice) external onlyOwner {
        publicMintPrice = newPrice;
        emit PublicMintPriceUpdated(newPrice);
    }

    function setWhitelistMintPrice(uint256 newPrice) external onlyOwner {
        whitelistMintPrice = newPrice;
        emit WhitelistMintPriceUpdated(newPrice);
    }

    function setWhitelistEnabled(bool enabled) external onlyOwner {
        whitelistEnabled = enabled;
        emit WhitelistStatusChanged(enabled);
    }

    function addToWhitelist(address _addr) external onlyOwner {
        whitelist[_addr] = true;
        emit AddressWhitelisted(_addr);
    }

    function removeFromWhitelist(address _addr) external onlyOwner {
        whitelist[_addr] = false;
        emit AddressRemovedFromWhitelist(_addr);
    }

    function batchAddToWhitelist(address[] calldata addrs) external onlyOwner {
        uint256 len = addrs.length;
        for (uint256 i = 0; i < len; i++) {
            whitelist[addrs[i]] = true;
        }
        emit BatchAddressesWhitelisted(addrs);
    }

    function batchRemoveFromWhitelist(address[] calldata addrs) external onlyOwner {
        uint256 len = addrs.length;
        for (uint256 i = 0; i < len; i++) {
            whitelist[addrs[i]] = false;
        }
        emit BatchAddressesRemoved(addrs);
    }

    // ========== Ownership & Withdraw Wrappers ==========
    function returnOwnership(address newOwner) external onlyOwner nonReentrant {
        require(newOwner != address(0), "Invalid new owner");
        nftContract.transferOwnership(newOwner);
        emit OwnershipReturned(newOwner);
    }

    function withdraw() external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        require(balance > 0, "No funds to withdraw");
        (bool success, ) = payable(owner).call{value: balance}("");
        require(success, "Withdrawal failed");
    }

    // ========== Proxy Mint Pause Control ==========
    /**
     * @notice Sets the proxy minting pause state.
     * @param paused True to pause minting; false to unpause.
     */
    function setMintPaused(bool paused) external onlyOwner nonReentrant {
        mintPaused = paused;
        if (paused) {
            emit MintPaused();
        } else {
            emit MintUnpaused();
        }
    }
}

Read Contract

mintPaused 0x7e4831d3 → bool
nftContract 0xd56d229d → address
owner 0x8da5cb5b → address
publicMintPrice 0xdc53fd92 → uint256
whitelist 0x9b19251a → bool
whitelistEnabled 0x51fb012d → bool
whitelistMintPrice 0x35c6aaf8 → uint256

Write Contract 17 functions

These functions modify contract state and require a wallet transaction to execute.

addToWhitelist 0xe43252d7
address _addr
batchAddToWhitelist 0x2db6fa36
address[] addrs
batchMintMultiple 0x39b7ec29
address[] recipients
uint256 quantity
batchRemoveFromWhitelist 0x045fb888
address[] addrs
mintMultiple 0xabbb5a55
uint256 quantity
pauseMint 0xcd85cdb5
No parameters
removeFromWhitelist 0x8ab1d681
address _addr
returnOwnership 0x2a8e407b
address newOwner
setBaseURI 0x55f804b3
string newBaseURI
setMarketplaceListingEnabled 0xb5cfe31b
bool enabled
setMaxMintPerWallet 0xafdf6134
uint256 newMaxMintPerWallet
setMintPaused 0xb6935501
bool paused
setPublicMintPrice 0x5d82cf6e
uint256 newPrice
setWhitelistEnabled 0x052d9e7e
bool enabled
setWhitelistMintPrice 0xa611708e
uint256 newPrice
unpauseMint 0x1a8bd2da
No parameters
withdraw 0x3ccfd60b
No parameters

Recent Transactions

No transactions found for this address