IBoosterDropV2

The IBoosterDropV2 interface defines the NFT contract that handles minting, opening, and selling booster packs.

// SPDX-License-Identifier: BUSL-1.1
// Copyright (C) 2025 Beb, Inc. All Rights Reserved
pragma solidity ^0.8.27;

/**
 * @title IBoosterDropV2
 * @dev Interface for the BoosterDropV2 contract
 */
interface IBoosterDropV2 {
    // Rarity level constants
    // uint8 public constant RARITY_COMMON = 1;
    // uint8 public constant RARITY_RARE = 2;
    // uint8 public constant RARITY_EPIC = 3;
    // uint8 public constant RARITY_LEGENDARY = 4;

    struct SequenceRequest {
        uint256 batchId;
        address recipient;
    }

    struct Rarity {
        uint8 rarity;
        uint256 randomValue;
        bytes32 tokenSpecificRandomness;
    }

    // Market type enum (should match IBoosterTokenV2's enum)
    enum MarketType {
        BONDING_CURVE,
        UNISWAP_POOL
    }

    // Events
    event RandomnessRequested(address indexed requester, uint256 batchId, uint64 sequenceNumber);
    event RandomnessFulfilled(uint64 sequsenceNumber, bytes32 randomNumber);
    event BoosterDropsMinted(address indexed minter, uint256 amount, uint256 startTokenId, uint256 endTokenId);
    event BoosterDropTransfer(address indexed from, address indexed to, uint256 tokenId);
    event BoosterDropSold(address indexed burner, uint256 tokenId, uint8 rarity, uint256 offerAmount);
    event BoosterDropSoldBatch(address indexed burner, uint256[] tokenIds, uint8[] rarities, uint256 finalOfferAmount);
    event BoosterDropOpened(address indexed from, uint256[] tokenIds, uint256 batchId);
    event RarityAssigned(uint256 batchId, bytes32 randomNumber);
    event EntropyAddressUpdated(address newEntropyAddress);
    event EntropyProviderUpdated(address newProvider);


    // Initialize parameters struct
    struct InitializeParams {
        address owner;
        string nftName;
        string nftSymbol;
        address tokenAddress;
        string baseURI;
        uint256 tokensPerMint;
        uint256 commonOffer;
        uint256 rareOffer;
        uint256 epicOffer;
        uint256 legendaryOffer;
        address entropyAddress;
    }

    /**
     * @notice Initializes the contract
     * @param params All initialization parameters
     */
    function initialize(InitializeParams memory params) external;

    /**
     * @notice Mint multiple booster box NFTs with ETH
     * @param amount Number of NFTs to mint
     */
    function mint(uint256 amount) external payable;

    /**
     * @notice Mint multiple booster box NFTs with ETH
     * @param amount Number of NFTs to mint
     * @param recipient Address to receive the NFTs
     * @param referrer Address of the referrer
     * @param originReferrer Address of the origin referrer
     */
    function mint(uint256 amount, address recipient, address referrer, address originReferrer) external payable;

    /**
     * @notice Mint multiple booster box NFTs with tokens directly
     * @param amount Number of NFTs to mint
     */
    function mintWithToken(uint256 amount) external payable;

    /**
     * @notice Sells NFT to contract and claims token offers based on rarity
     * @param tokenId Token ID to sell
     */
    function sellAndClaimOffer(uint256 tokenId) external;

    /**
     * @notice Get the token amount needed to mint a specific number of NFTs
     * @param amount Number of NFTs to mint
     * @return tokenAmount Total tokens required
     */
    function getMintPrice(uint256 amount) external view returns (uint256);

    /**
     * @notice Get the token amount needed to sell a specific number of NFTs
     * @param amount Number of NFTs to sell
     * @return tokenAmount Total eth returned
     */
    function getSellPrice(uint256 amount) external view returns (uint256);

    /**
     * @notice Get the token amount needed per NFT mint
     * @return The token amount per mint
     */
    function tokensPerMint() external view returns (uint256);

    /**
     * @notice Get the offer amount for a common rarity NFT
     * @return The common offer amount
     */
    function COMMON_OFFER() external view returns (uint256);

    /**
     * @notice Get the offer amount for a rare rarity NFT
     * @return The rare offer amount
     */
    function RARE_OFFER() external view returns (uint256);

    /**
     * @notice Get the offer amount for an epic rarity NFT
     * @return The epic offer amount
     */
    function EPIC_OFFER() external view returns (uint256);

    /**
     * @notice Get the offer amount for a legendary rarity NFT
     * @return The legendary offer amount
     */
    function LEGENDARY_OFFER() external view returns (uint256);

    /**
     * @notice Get the booster token contract address
     * @return The booster token address
     */
    function boosterTokenAddress() external view returns (address);

    /**
     * @notice Get the entropy address
     */
    function entropyAddress() external view returns (address);

    /**
     * @notice Get the entropy provider
     */
    function entropyProvider() external view returns (address);

    /**
     * @notice Get the entropy fee
     */
    function getEntropyFee() external view returns (uint256);
}

IBoosterTokenV2

The IBoosterTokenV2 interface defines the memecoin contract that handles token trading, bonding curves, and Uniswap graduation.

// SPDX-License-Identifier: BUSL-1.1
// Copyright (C) 2025 Beb, Inc. All Rights Reserved
pragma solidity ^0.8.27;

/**
 * @title IBoosterTokenV2
 * @dev Interface for the BoosterTokenV2 contract with graduation mechanism
 */
interface IBoosterTokenV2 {
    // Enum for market type
    enum MarketType {
        BONDING_CURVE,
        UNISWAP_POOL
    }

    // Events
    event OfferMinted(address indexed recipient, uint256 amount);
    event LiquiditySetup(address indexed pool, uint256 ethAmount, uint256 tokenAmount);
    event PositionFeesCollected(uint256 indexed positionId, uint256 amount0, uint256 amount1);
    event TokensPurchased(address indexed buyer, uint256 amount, uint256 ethPaid);
    event TokensSold(address indexed seller, address indexed recipient, uint256 amount, uint256 ethReceived);
    event UniswapPositionConfigured(address positionManager, address swapRouter, uint256 positionId);
    event TokensSold(address indexed from, uint256 amount);
    event MarketGraduated(address indexed nftAddress, address indexed tokenAddress, address indexed pool, uint256 ethAmount, uint256 tokenAmount, uint256 positionId);
    event BoosterTokenFeesDispersed(uint256 ownerFee, uint256 protocolFee, address owner, address protocolFeeRecipient, uint256 referrerFee, uint256 originReferrerFee, address referrer, address originReferrer);
    event BoosterTokenTransfer(address indexed from, address indexed to, uint256 value, uint256 balanceOfFrom, uint256 balanceOfTo, uint256 totalSupply);

    /**
     * @notice Initialize the BoosterTokenV2 contract
     * @param owner The owner of the token contract
     * @param name The name of the token
     * @param symbol The symbol of the token
     * @param dropAddress The address of the NFT drop contract
     * @param factoryAddress The address of the factory contract
     * @param uniswapV3Factory The address of the Uniswap V3 factory
     * @param uniswapV3PositionManager The address of the Uniswap V3 position manager
     * @param uniswapV3SwapRouter The address of the Uniswap V3 swap router
     * @param wethAddress The address of WETH
     * @param bondingCurveAddress The address of the bonding curve contract
     * @param protocolFeeRecipient The address of the protocol fee recipient
     */
    function initialize(
        address owner,
        string memory name,
        string memory symbol,
        address dropAddress,
        address factoryAddress,
        address uniswapV3Factory,
        address uniswapV3PositionManager,
        address uniswapV3SwapRouter,
        address wethAddress,
        address bondingCurveAddress,
        address protocolFeeRecipient
    ) external;

    /**
     * @notice Get current market type (BONDING_CURVE or UNISWAP_POOL)
     * @return The current market type
     */
    function marketType() external view returns (MarketType);

    /**
     * @notice Buy tokens with ETH
     * @param tokenAmount Amount of tokens to buy
     * @param recipient Address to receive the tokens
     */
    function buy(uint256 tokenAmount, address recipient) external payable;

    /**
     * @notice Buy tokens with ETH
     * @param tokenAmount Amount of tokens to buy
     * @param recipient Address to receive the tokens
     * @param referrer The address of the referrer
     * @param originReferrer The address of the origin referrer
     */
    function buy(uint256 tokenAmount, address recipient, address referrer, address originReferrer) external payable;

    /**
     * @notice Sell tokens for ETH
     * @param tokensToSell The number of tokens to sell
     * @param recipient The address to receive the ETH payout
     * @param minPayoutSize The minimum ETH payout to prevent slippage
     * @param referrer The address of the referrer
     * @param originReferrer The address of the origin referrer
     */
    function sell(
        uint256 tokensToSell,
        address recipient,
        uint256 minPayoutSize,
        address referrer,
        address originReferrer
    ) external returns (uint256);

    /**
     * @notice Sell tokens for ETH (only available after graduation)
     * @param tokensToSell The number of tokens to sell
     * @param recipient The address to receive the ETH payout
     * @param minPayoutSize The minimum ETH payout to prevent slippage
     * @return Amount of ETH received
     */
    function sell(
        uint256 tokensToSell,
        address recipient,
        uint256 minPayoutSize
    ) external returns (uint256);

    /**
     * @notice Sells tokens from the specified address to the contract
     * @param from The address to sell tokens from
     * @param amount The amount of tokens to sell
     */
    function sellTokens(address from, uint256 amount) external;

    /**
     * @notice Mints tokens as offers for selling NFTs
     * @param recipient The address to receive the tokens
     * @param amount The amount of tokens to mint
     */
    function mintOffer(address recipient, uint256 amount) external;

    /**
     * @notice Get quote for buying tokens with ETH using bonding curve
     * @param ethAmount Amount of ETH to spend
     * @return Token amount that can be purchased
     */
    function getEthBuyQuote(uint256 ethAmount) external view returns (uint256);

    /**
     * @notice Get quote for buying tokens with a specified token amount
     * @param tokenAmount Amount of tokens to purchase
     * @return ETH amount needed
     */
    function getTokenBuyQuote(uint256 tokenAmount) external view returns (uint256);

    /**
     * @notice Get quote for selling tokens for ETH using bonding curve
     * @param tokenAmount Amount of tokens to sell
     * @return ETH amount received
     */
    function getTokenSellQuote(uint256 tokenAmount) external view returns (uint256);

    /**
     * @notice Get the address of the bonding curve contract
     * @return The bonding curve address
     */
    function bondingCurve() external view returns (address);

    function poolAddress() external view returns (address);
}