All vibe.market contracts are deployed on Base. Each booster pack collection has its own contract addresses for the LTC (Liquid Trading Card) (BoosterDropV2) and token (BoosterTokenV2).Source availability: The core vibe.market booster contracts are now source-available in wieldlabs/contracts. This includes BoosterDropV2, BoosterTokenV2, BoosterDeployerFactoryV2, BoosterBondingCurveV2, BoosterCardSeedUtils, and the canonical interfaces under the licenses in each source file.We also continue to run security scanning via Almanax.
Contract Interfaces
View the complete smart contract interfaces
Source-Available Contracts
View the canonical vibe.market contract sources on GitHub
4. Selling LTCs (Liquid Trading Cards) for Token Offers
Sell both opened and unopened packs back to the contract.
// Sell single LTC (Liquid Trading Card) (opened or unopened)await boosterDrop.sellAndClaimOffer(tokenId);// Batch sell multiple LTCs (Liquid Trading Cards)const tokenIds = [1, 2, 3];await boosterDrop.sellAndClaimOfferBatch(tokenIds);// Exchange values are examples only - actual values vary by collection:// Unopened packs example: 80,000-100,000 tokens (80-100% of mint cost) [100% for packs created after August 1st, 2025]// Opened packs examples based on rarity:// - Common: 20,000 tokens (example)// - Rare: 120,000 tokens (example)// - Epic: 420,000 tokens (example)// - Legendary: 3,000,000 tokens (example)// - Mythic: 10,000,000 tokens (example)// Note: This optional exchange feature may not be available for all collections
We deployed the following source-available contract at 0x002aaaa42354bf8f09f9924977bf0c531933f999
that allows you to query wear and foil onchain from getTokenRarity using tokenSpecificRandomness. 0.5% of cards are standard foil, and 0.05% of cards are prize foil. Wear is distributed between 0 and 1.
// IBoosterCardSeedUtils contract address on Baseconst SEED_UTILS_ADDRESS = "0x002aaaa42354bf8f09f9924977bf0c531933f999";// Connect to the BoosterCardSeedUtils contractconst seedUtils = new ethers.Contract( SEED_UTILS_ADDRESS, IBoosterCardSeedUtils_ABI, provider);// Get rarity info from a card (must be opened)const tokenId = 123; // Your opened pack token IDconst rarityInfo = await boosterDrop.getTokenRarity(tokenId);// Use tokenSpecificRandomness as the seed for wear & foilconst seed = rarityInfo.tokenSpecificRandomness;// Get wear value (string with 10 decimal places, e.g., "0.1234567890")const wear = await seedUtils.wearFromSeed(seed);console.log("Card wear:", wear);// Get foil type (returns "Prize", "Standard", or "Normal")const foilType = await seedUtils.getFoilMappingFromSeed(seed);console.log("Card foil:", foilType);// Get both wear and foil in a single callconst cardData = await seedUtils.getCardSeedData(seed);console.log({ wear: cardData.wear, // e.g., "0.0123456789" foilType: cardData.foilType, // e.g., "Normal", "Standard", or "Prize"});// Example: Process multiple cards to get their wear & foilconst userCards = [101, 102, 103]; // Token IDs of opened packsconst cardDetails = [];for (const tokenId of userCards) { try { const rarityInfo = await boosterDrop.getTokenRarity(tokenId); const [wear, foilType] = await seedUtils.getCardSeedData( rarityInfo.tokenSpecificRandomness ); cardDetails.push({ tokenId, rarity: rarityInfo.rarity, wear, foilType, // Use wear for game mechanics condition: parseFloat(wear) < 0.05 ? "Pristine" : parseFloat(wear) < 0.2 ? "Mint" : parseFloat(wear) < 0.45 ? "Lightly Played" : parseFloat(wear) < 0.75 ? "Moderately Played" : "Heavily Played", }); } catch (error) { console.log(`Token ${tokenId} is unopened or invalid`); }}// Build game features based on foil & wearconst prizeCards = cardDetails.filter((c) => c.foilType === "Prize");const mintConditionCards = cardDetails.filter((c) => parseFloat(c.wear) < 0.05);
Cards in a pack are mapped to specific random value ranges based on their randomValue. When a pack is opened, the on-chain randomness generates a value between 0-999,999 returned in randomValue from getTokenRarity().Example Random Value Mapping:
Note: All numerical values in code examples are for illustration purposes only. Actual values, fees, and percentages are determined by a collection’s smart contracts and may vary significantly. These digital collectibles are intended solely for personal enjoyment and entertainment.
Gas Optimization: Batch operations when possible (e.g., opening multiple packs at once)
Slippage Protection: Always use minPayoutSize when selling tokens
Referral System: Include referral addresses to earn trading fees (example: 1% of trades, which might be 20% of a 7.5% total fee)
Market State: Check if market is on bonding curve or Uniswap before trading
Entropy Fees: Opening packs requires a small ETH fee for Pyth Network randomness (example: ~$0.01)
Token Offers: The optional LTC (Liquid Trading Card) exchange feature mints new tokens when available - this feature is not guaranteed and varies by collection