DreamEssenceNode.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/common/ERC2981.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";

contract DreamEssenceNode is ERC721, ERC2981, Ownable, Pausable {
    using Strings for uint256;

    uint96 private _nextTokenId;
    uint96 public constant MAX_SUPPLY = 10000;
    uint256 public mintPrice = 0.01 ether;  // Default mint price: 0.01 ETH
    
    constructor() 
        ERC721("DreamEssenceNode", "DREAM") 
        Ownable(msg.sender)
    {
        _setDefaultRoyalty(msg.sender, 250); // 2.5% royalty
    }

    // Efficient batch minting
    function mint(uint96 quantity) public payable whenNotPaused {
        require(quantity > 0 && quantity <= 20, "Invalid quantity");
        require(msg.value >= mintPrice * quantity, "Insufficient payment");
        require(_nextTokenId + quantity <= MAX_SUPPLY, "Would exceed max supply");

        uint96 startTokenId = _nextTokenId;
        unchecked {
            for(uint96 i = 0; i < quantity; i++) {
                _safeMint(msg.sender, startTokenId + i);
            }
            _nextTokenId = startTokenId + quantity;
        }
    }

    // Allow owner to withdraw funds
    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No balance to withdraw");
        
        (bool success, ) = msg.sender.call{value: balance}("");
        require(success, "Transfer failed");
    }

    // Allow owner to update mint price
    function setMintPrice(uint256 newPrice) external onlyOwner {
        mintPrice = newPrice;
    }

    // Emergency pause/unpause
    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }

    // Required override
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, ERC2981)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}