Visión General

La gestión de colecciones está en el núcleo de CreateKit. Esta guía cubre todo lo que necesitas saber sobre la creación, configuración y gestión de colecciones NFT utilizando el protocolo BaseMint.

Estructura de Metadatos de Colección

Cada colección requiere metadatos específicos que definen sus características:

Parámetros Requeridos

name
string
El nombre de tu colección NFT (p. ej., “Bored Ape Yacht Club”)
symbol
string
El símbolo/ticker de tu colección (p. ej., “BAYC”)
creator
0x${string}
La dirección Ethereum del creador de la colección
gameOwner
0x${string}
La dirección Ethereum del propietario del juego (puede ser el mismo que el creador)

Parámetros Opcionales

maxSupply
bigint
default:"10000n"
Número máximo de tokens que pueden ser acuñados
mintPrice
bigint
default:"0n"
Precio por token en wei (usa parseEther() para valores en ETH)
maxPerWallet
bigint
default:"100n"
Máximo de tokens que pueden ser acuñados por cartera
isWhitelistEnabled
boolean
default:"false"
Si la acuñación solo para lista blanca está habilitada
startTime
bigint
default:"0n"
Timestamp Unix cuando comienza la acuñación (0 = inmediato)
endTime
bigint
default:"BigInt(Date.now() / 1000 + 86400 * 365 * 100)"
Timestamp Unix cuando termina la acuñación
tokenStandard
'ERC721' | 'ERC1155'
default:"'ERC721'"
El estándar de token a usar
chainId
number
default:"1993"
ID de cadena (1993 = B3 Testnet, 8333 = B3 Mainnet)

Creación de Colecciones

Colección Básica

Creación de Colección Básica
import { CollectionManager, b3Testnet } from '@b3dotfun/basemint'
import { createPublicClient, createWalletClient, http } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'

const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
const publicClient = createPublicClient({
  chain: b3Testnet,
  transport: http()
})

const walletClient = createWalletClient({
  chain: b3Testnet,
  transport: http(),
  account
})

const collectionManager = new CollectionManager(publicClient)

// Define colección básica
const basicCollection = {
  name: "Mi Colección de Arte",
  symbol: "MAC",
  creator: account.address,
  gameOwner: account.address,
  description: "Una colección de piezas de arte digital",
  image: "https://example.com/collection-image.png"
}

// Generar firma del creador
const creatorSignature = await collectionManager.generateCreatorSignature(
  walletClient,
  basicCollection
)

Configuración Avanzada de Colección

Configuración Avanzada de Colección
import { parseEther } from 'viem'

const advancedCollection = {
  // Requerido
  name: "Artículos de Juego Premium",
  symbol: "PGI",
  creator: account.address,
  gameOwner: "0x1234567890123456789012345678901234567890", // Propietario del juego diferente
  
  // Suministro y precios
  maxSupply: 5000n,
  mintPrice: parseEther("0.01"), // 0.01 ETH
  maxPerWallet: 5n,
  
  // Controles de tiempo
  startTime: BigInt(Math.floor(Date.now() / 1000) + 3600), // Comienza en 1 hora
  endTime: BigInt(Math.floor(Date.now() / 1000) + 86400 * 7), // Termina en 7 días
  
  // Configuración de lista blanca
  isWhitelistEnabled: true,
  whitelistMerkleRoot: "0x..." as `0x${string}`,
  
  // Metadatos
  description: "Artículos de juego exclusivos para jugadores premium",
  image: "https://example.com/premium-collection.png",
  external_url: "https://mygame.com/premium-items",
  animation_url: "https://example.com/collection-animation.mp4",
  
  // Atributos de colección
  attributes: [
    { trait_type: "Categoría", value: "Juego" },
    { trait_type: "Rareza", value: "Premium" },
    { trait_type: "Edición", value: "Primera" }
  ],
  
  // Técnico
  tokenStandard: "ERC1155" as const,
  chainId: 1993
}

Estándares de Token

CreateKit soporta tanto los estándares ERC721 como ERC1155:
const erc721Collection = {
  name: "Piezas de Arte Únicas",
  symbol: "UAP",
  creator: account.address,
  gameOwner: account.address,
  tokenStandard: "ERC721" as const,
  maxSupply: 1000n, // Cada token es único
  description: "Piezas de arte digital únicas en su tipo"
}

// Acuñación ERC721 (cantidad siempre 1)
const collection721 = collectionManager.createCollection(
  predictedAddress,
  "ERC721"
)

await collection721.mint(
  walletClient,
  1n, // Siempre 1 para ERC721
  undefined, // URI de metadatos
  mintPrice,
  proof
)

Gestión de Metadatos

Metadatos a Nivel de Colección

Metadatos de Colección
const collectionMetadata = {
  name: "Mi Colección",
  description: "Una fantástica colección de activos digitales",
  image: "https://example.com/collection-image.png",
  external_url: "https://mywebsite.com/collection",
  
  // Fondo y banner para mercados
  background_color: "ffffff",
  banner_image_url: "https://example.com/banner.png",
  
  // Atributos de colección
  attributes: [
    { trait_type: "Tema", value: "Fantasía" },
    { trait_type: "Artista", value: "Creador Digital" }
  ]
}

Metadatos a Nivel de Token

CreateKit genera automáticamente metadatos de token basados en la configuración de tu colección:
import { NFTMetadataManager, MediaType } from '@b3dotfun/basemint'

// Generar metadatos para diferentes tipos de medios
const artworkMetadata = NFTMetadataManager.generateNFTMetadata(
  collectionMetadata,
  MediaType.ARTWORK
)

const model3dMetadata = NFTMetadataManager.generateNFTMetadata(
  collectionMetadata,
  MediaType.MODEL_3D
)

const videoMetadata = NFTMetadataManager.generateNFTMetadata(
  collectionMetadata,
  MediaType.VIDEO
)

// Convertir a JSON
const metadataJson = NFTMetadataManager.generateJSON(artworkMetadata)
console.log(metadataJson)

Validación de Colección

CreateKit proporciona validación integrada para los parámetros de la colección:
Validación de Parámetros
import { validateCollectionMetadata } from '@b3dotfun/basemint'

try {
  // Validar metadatos de colección
  const validation = validateCollectionMetadata(collectionMetadata)
  
  if (!validation.isValid) {
    console.error("Errores de validación:", validation.errors)
    return
  }
  
  console.log("✅ Los metadatos de la colección son válidos")
  
  // Proceder con la generación de firma
  const signature = await collectionManager.generateCreatorSignature(
    walletClient,
    collectionMetadata
  )
} catch (error) {
  console.error("La validación falló:", error)
}

Predicción de Dirección

Una de las características clave de CreateKit es la predicción determinista de direcciones:
Predicción de Dirección
// Generar primero la firma del creador
const creatorSignature = await collectionManager.generateCreatorSignature(
  walletClient,
  collectionMetadata
)

// Predecir la dirección de la colección
const predictedAddress = collectionManager.predictCollectionAddress(
  collectionMetadata,
  creatorSignature
)

console.log(`La colección será desplegada en: ${predictedAddress}`)

// Ahora puedes usar esta dirección antes del despliegue
// para integración en mercados, visualización en el frontend, etc.

Operaciones de Gestión de Colección

Verificar el Estado de la Colección

Estado de la Colección
const collection = collectionManager.createCollection(
  predictedAddress,
  "ERC721"
)

// Verificar si la colección está desplegada
const isDeployed = await collection.isDeployed()
console.log(`Desplegada: ${isDeployed}`)

// Obtener información de la colección (solo funciona después del despliegue)
if (isDeployed) {
  const info = await collection.getCollectionInfo()
  console.log("Información de la Colección:", {
    name: info.name,
    symbol: info.symbol,
    totalSupply: info.totalSupply.toString(),
    maxSupply: info.maxSupply.toString(),
    mintPrice: info.mintPrice.toString(),
    maxPerWallet: info.maxPerWallet.toString()
  })
}

Actualizar Configuraciones de la Colección

La mayoría de los parámetros de la colección no pueden cambiarse después del despliegue. Planifica cuidadosamente la configuración de tu colección.
Gestión Post-Despliegue
// Solo ciertas operaciones son posibles después del despliegue

// Verificar el precio actual de acuñación (si se implementa precios dinámicos)
const currentPrice = await collection.getCurrentMintPrice()

// Verificar si la acuñación está actualmente activa
const isMintingActive = await collection.isMintingActive()

// Obtener el suministro restante
const remainingSupply = await collection.getRemainingSupply()

console.log({
  currentPrice: currentPrice.toString(),
  isMintingActive,
  remainingSupply: remainingSupply.toString()
})

Mejores Prácticas

1. Planificación de la Colección

Estrategia de Suministro

  • Establecer un suministro máximo apropiado basado en el caso de uso
  • Considerar la demanda futura y la escasez
  • Dejar espacio para crecimiento o ediciones especiales

Estrategia de Precios

  • Investigar colecciones similares para referencia de precios
  • Considerar los costos de gas y las tarifas de transacción
  • Planificar para diferentes condiciones del mercado

2. Calidad de Metadatos

Metadatos de Alta Calidad
const qualityCollection = {
  name: "Colección de Arte Profesional",
  symbol: "PAC",
  creator: account.address,
  gameOwner: account.address,
  
  // Descripciones de alta calidad
  description: "Una colección curada de obras de arte digital profesional que presenta temas contemporáneos y técnicas innovadoras.",
  
  // Imágenes profesionales (mínimo 640x640px)
  image: "https://example.com/high-res-collection-image.png",
  
  // Atributos completos para mejor descubrimiento
  attributes: [
    { trait_type: "Estilo de Arte", value: "Contemporáneo" },
    { trait_type: "Medio", value: "Digital" },
    { trait_type: "Verificación de Artista", value: "Verificado" },
    { trait_type: "Tipo de Edición", value: "Limitada" }
  ],
  
  // Enlaces externos para credibilidad
  external_url: "https://professionalartist.com/collection"
}

3. Consideraciones de Seguridad

Solución de Problemas

Próximos Pasos

Ahora que entiendes la gestión de colecciones, explora estos temas relacionados: