Gestión de NFTs
Requisitos previos de acceso
- Permiso (módulo):
manageToken - Licencia/Feature:
MANAGE_NFTS - Contenedor del menú: TOKENIZACIÓN → grupo Tokenización → Gestionar NFTs
Qué es / cuándo usar
Catálogo de NFTs / activos tokenizados (bienes raíces, certificados, coleccionables, paquetes). Aquí el operador crea, edita, visualiza y desactiva NFTs, los asigna a una colección y a una categoría, define el precio y las monedas aceptadas, configura comisiones de billeteras, sortea y envía (distribuye) NFTs a usuarios.
La creación de un NFT exige que la colección y la categoría ya existan.
Requisitos previos
- Permiso:
manageToken(doble — enum CPM + módulo dinámico en la BD). - Licencia/Feature:
MANAGE_NFTS. - Dependencias: la Colección debe existir (Colecciones); la Categoría debe existir y permitir la creación de producto (
allow_product_creation = true, en Categoría de NFTs).
Paso a paso (listado)
- Acceda al menú Tokenización → Gestionar NFTs.
- Busque por nombre (búsqueda con debounce) y filtre por colección.
- Use los íconos de cada fila: sorteo (ruleta), enviar (distribuir), editar, visualizar y eliminar.
- Use Crear NFT para abrir el formulario.
Filtros y columnas
| Filtro / Columna | Qué muestra | Origen del dato |
|---|---|---|
| Búsqueda por nombre | Filtra por name (server-side, paginado) | getAllAssets({ name, collectionId, limit, offset }) |
| Colección | Filtra por collectionId | getCollections() |
| Nombre / Tipo / Valor | Identificación, tipo (NFT) y precio actual en tokens | TokenController (assets) |
| Acciones | Ruleta, enviar, editar, visualizar, eliminar | — |
Formulario de Crear / Editar NFT
El formulario está dividido en grupos (Catálogo, Comercial, Configuraciones) con secciones. En creación, la sección "Información adicional" permanece bloqueada (solo disponible en edición/visualización).
Sección: General (obligatoria)
| Campo | Qué es | ¿Obligatorio? | Efecto en el sistema/backend |
|---|---|---|---|
| Colección | Colección a la que pertenece el NFT | Sí | collection.id. Define el contrato/estándar on-chain (ERC-721 o regulado). |
| Categoría | Categoría del activo | Sí | category_id — solo categorías con allow_product_creation. |
| Nombre | Nombre del activo | Sí | name. |
| Descripción | Descripción | Sí | description. |
| Cantidad | Cantidad de ítems a emitir | Sí | quantity. |
| Características | Pares clave/valor libres o por plantilla | No | characteristics[]. |
Sección: Precios (obligatoria)
| Campo | Qué es | ¿Obligatorio? | Efecto en el sistema/backend |
|---|---|---|---|
| Precio | Valor del activo en moneda fiduciaria | Sí* | price (BigNumber). *Puede omitirse con skipPrice. |
| Monedas aceptadas | Tokens aceptados como pago (checkbox por token) | No | payment_types[]. |
| Permite split | Distribuye el pago entre los tokens marcados | No | allow_split + porcentaje por token (paymentPrice). La suma debe totalizar 100%. |
| Tipo de transacción / Tasa | Impuesto/tasa de la transacción (Porcentual o Absoluto) | No | taxType (A/P) + transactionTax. |
Sección: Medios (obligatoria)
| Campo | Qué es | ¿Obligatorio? | Efecto en el sistema/backend |
|---|---|---|---|
| Fotos | Imágenes del activo | Sí | photos[] (al menos una). |
Sección: Billeteras / Comisiones (opcional)
| Campo | Qué es | ¿Obligatorio? | Efecto en el sistema/backend |
|---|---|---|---|
| Billetera + comisión | Billeteras que reciben comisión de la venta | No | wallets_commission[] = { id, commission }. |
Sección: Publicación (configuraciones)
Agrupa los toggles de comportamiento del NFT y los campos de token vinculado/liquidez. La referencia completa de cada toggle está en Referencia de configuraciones (toggles).
Campos no-toggle de esta sección:
| Campo | Qué es | ¿Obligatorio? | Efecto en el sistema/backend |
|---|---|---|---|
| Token vinculado para distribuciones futuras | Token usado en distribuciones/claims realizados desde el NFT | No | tokenClaimId. Define qué token recibe el tenedor cuando el NFT distribuye valor. |
| Token de liquidez para distribuciones futuras | Token de liquidez ofrecido como alternativa de recepción | No | liquidityToken. Habilita la opción de que el tenedor elija recibir en fiat/token (ver block_liquidity_option). |
| Estado interno | Estado operacional usado internamente para el NFT | No | status. No se muestra al usuario final. |
Sección: Información adicional (solo en edición)
projectUrl, projectDescription, projectCustomHtml y contract — información del proyecto y dirección del contrato.
Referencia de configuraciones (toggles)
El NFT posee 8 toggles distribuidos entre las secciones Precios (allow_split) y Publicación (los demás). Todos son booleanos y se almacenan en la entidad assets del TokenController. La tabla a continuación cubre el 100% de ellos.
| Etiqueta (pantalla) | Campo (ngModel) | Qué hace (efecto en el backend) | Cuándo usar |
|---|---|---|---|
| Publicar NFT inmediatamente | asset.enabled | Publica el NFT en las plataformas (Midas-Web/Trade) y lo incluye en los listados de catálogo. Desactivado, el NFT existe pero permanece oculto para los usuarios. La "eliminación" del NFT en el listado también es un soft-delete que borra este campo (enabled = false + disabled = now). | Activar cuando la oferta esté lista para el público. Dejar desactivado en borradores/prelanzamiento. |
| Bloquear venta | asset.block_sell | Bloquea la venta primaria. En market.core.handler, la reserva de compra lanza un error (NFT sale is blocked) cuando block_sell = true, excepto en llamadas administrativas (isAdminCall). Se bloquea automáticamente en Quema de NFTs (snapshot en nft_burn_operation.previous_block_sell para reversión manual). | Para cerrar la venta primaria de una oferta (agotada, suspendida, en recall) sin eliminar el NFT. |
| Bloquear reventa | asset.block_resell | Impide el mercado secundario: en la app del tenedor (Midas-Web card-list), las acciones de reventa, subasta y split quedan ocultas cuando block_resell = true. También se bloquea junto con block_sell durante la Quema de NFTs (snapshot en previous_block_resell). | NFTs no revendibles: entradas nominales, cuotas con lock-up, activos regulados que no pueden circular. |
| Solo paquete | asset.only_package | Elimina el NFT del catálogo individual: la consulta de listado público (AssetsDAO) agrega only_package = false, por lo que el NFT solo aparece/se vende dentro de un Paquete de NFTs. La pantalla de detalle del producto también oculta el checkout individual. Los administradores y el perfil de colección siguen viéndolo. | Cuando el NFT solo debe adquirirse incluido en un paquete, nunca de forma individual. |
| Gestionar acceso | asset.handle_access | Trata el NFT como control de acceso/credencial: al concluir la compra, market.core.handler crea un token de acceso de usuario en el CPM para el comprador (y elimina el del vendedor en la reventa). El NFT pasa a aparecer en la lista de "access assets" del administrador. | Entradas, suscripciones, áreas restringidas — cualquier NFT que otorgue un derecho de acceso vinculado a la posesión. |
| Bloquear preferencia de liquidez | asset.block_liquidity_option | Congela la elección de la forma de recepción de las distribuciones: changeDistributionType (assets.core.handler) lanza un error cuando es true, y en la app del tenedor los íconos de "recibir en fiat/token" quedan deshabilitados. Actúa junto con el Token de liquidez configurado. | Cuando la forma de liquidez ya está definida por la oferta y el tenedor no puede cambiarla. |
| Excluir del Informe de Renta (IRPF) | asset.block_from_irpf | Excluye el NFT del informe de IRPF: el irpf.snapshot.handler y el generador de informe filtran (!block_from_irpf) tanto el snapshot base como el snapshot final, eliminando el activo de las líneas de rendimiento. | Activos que no deben figurar en el Informe de Renta del usuario (p. ej.: ítems no tributables, utilidades internas). |
| Permite Split de NFTs | asset.allow_split | Dos efectos: (1) en Precios, habilita distribuir el pago entre varios tokens aceptados (porcentaje por token, suma = 100%); (2) en la app del tenedor, habilita la acción de fraccionar (split) el NFT en la reventa — el ícono de split solo aparece con allow_split = true, block_resell = false y price > 0. | Cuando el NFT puede fraccionarse y/o pagarse con prorrateo entre múltiples tokens. |
Relación con la Quema de NFTs
block_sell y block_resell no son solo configuración manual: la Quema de NFTs activa los dos automáticamente en la misma transacción atómica del encabezado de la quema, almacenando los valores anteriores en nft_burn_operation.previous_block_sell / previous_block_resell para permitir la reversión manual. Bloquear el NFT en T0 impide la compra y reventa mientras el watcher procesa la liquidación on-chain (sink wallet o quema nativa).
Efectos no evidentes
block_selltiene excepción de administrador: las llamadas conisAdminCallignoran el bloqueo — el operador aún puede distribuir/vender desde la administración incluso con la venta pública bloqueada.only_packageno desaparece para el admin: el NFT sigue siendo visible para los administradores y en el perfil de la colección; el filtroonly_package = falsesolo aplica al catálogo público del usuario.allow_splites dos funciones en un toggle: controla tanto el prorrateo de pago (Precios) como el permiso de fraccionar el NFT en el mercado secundario.
Acciones y modales
- Crear / Editar: modal de confirmación (bottom sheet). La creación envía el payload completo (
createAssets); la edición envía el subconjunto editable (editAssets). - Sorteo (ruleta): abre la ruleta de sorteo — todos los usuarios que poseen ese NFT participan; al girar, se muestra el correo electrónico del ganador y el ID del NFT.
- Informe de NFT: en la pantalla de sorteo, exporta la lista de usuarios con indicación de quién posee el NFT (correo electrónico, nombre, teléfono, fecha de registro, estado de la cuenta).
- Enviar (distribuir) NFT: modal de distribución — el administrador envía el NFT a usuarios específicos.
- Eliminar: desactivación lógica (
enabled = false+disabled = now), preservando el historial.
Reglas de negocio / precauciones
Atención
- Colección y categoría son requisitos previos — sin ellas el guardado no se habilita.
- Mint exclusivo del job (crowdfunding): para activos de crowdfunding, la emisión y la quema de NFTs ocurren solo mediante el job de crowdfunding. La distribución financiera no emite NFT, y el
TKN_OWNERno emite ni revende — esto garantiza la invariante captado == NFTs por construcción. block_sell/block_resellbloquean la venta primaria y secundaria; también se activan automáticamente en el flujo de Quema de NFTs.
Irreversible
- La emisión (mint) de NFTs on-chain no tiene rollback. Verifique la colección, la categoría y la cantidad antes de confirmar.
- Valores financieros: precio, comisiones y tasas son BigNumber — sin redondeo.
- Estado APPROVED: las distribuciones/envíos en nombre de un usuario requieren que el usuario destinatario tenga
status === 'APPROVED'.
Ejemplos
Escenario 1 — NFT de bien raíz tokenizado con comisión de billetera
- General: colección "Imóveis SP", categoría "Imóveis", nombre, descripción, cantidad
100. - Precios: precio
R$ 1.000,00; monedas aceptadas:BRLX. Tipo Porcentual, tasa2%. - Billeteras: agregar la billetera del socio con
commission = 5. - Medios: fotos del inmueble.
- Publicación: Publicar anuncio activado, Bloquear reventa según la regla de la oferta.
- Guardar. Resultado: 100 cuotas-NFT publicadas, con comisión del 5% a la billetera del socio.
Escenario 2 — NFT de acceso (entrada) no revendible
- General: colección "Eventos", categoría "Ingressos", cantidad según aforo.
- Publicación: activar Gestionar acceso y Bloquear reventa.
- Precios: precio de la entrada; moneda aceptada según la operación.
- Guardar. Resultado: el NFT funciona como entrada, sin mercado secundario.