Gerenciamento de NFTs
Pré-requisitos de acesso
- Permissão (módulo):
manageToken - Licença/Feature:
MANAGE_NFTS - Contêiner do menu: TOKENIZAÇÃO → grupo Tokenização → Gerenciar NFTs
O que é / quando usar
Catálogo de NFTs / ativos tokenizados (imóveis, certificados, colecionáveis, pacotes). Aqui o operador cria, edita, visualiza e desativa NFTs, atribui-os a uma coleção e a uma categoria, define preço e moedas aceitas, configura comissões de carteiras, sorteia e envia (distribui) NFTs para usuários.
A criação de uma NFT exige que a coleção e a categoria já existam.
Pré-condições
- Permissão:
manageToken(dupla — enum CPM + módulo dinâmico no DB). - Licença/Feature:
MANAGE_NFTS. - Dependências: a Coleção precisa existir (Coleções); a Categoria precisa existir e permitir criação de produto (
allow_product_creation = true, em Categoria de NFTs).
Passo a passo (listagem)
- Acesse o menu Tokenização → Gerenciar NFTs.
- Busque por nome (busca com debounce) e filtre por coleção.
- Pelos ícones de cada linha: sorteio (roleta), enviar (distribuir), editar, visualizar e excluir.
- Use Criar NFT para abrir o formulário.
Filtros e colunas
| Filtro / Coluna | O que mostra | Origem do dado |
|---|---|---|
| Busca por nome | Filtra por name (server-side, paginado) | getAllAssets({ name, collectionId, limit, offset }) |
| Coleção | Filtra por collectionId | getCollections() |
| Nome / Tipo / Valor | Identificação, tipo (NFT) e preço atual em tokens | TokenController (assets) |
| Ações | Roleta, enviar, editar, visualizar, excluir | — |
Formulário de Criar / Editar NFT
O formulário é dividido em grupos (Catálogo, Comercial, Configurações) com seções. Em criação, a seção "Informações adicionais" fica bloqueada (só liberada em edição/visualização).
Seção: Geral (obrigatória)
| Campo | O que é | Obrigatório? | Efeito no sistema/backend |
|---|---|---|---|
| Coleção | Coleção à qual a NFT pertence | Sim | collection.id. Define o contrato/padrão on-chain (ERC-721 ou regulado). |
| Categoria | Categoria do ativo | Sim | category_id — só categorias com allow_product_creation. |
| Nome | Nome do ativo | Sim | name. |
| Descrição | Descrição | Sim | description. |
| Quantidade | Quantidade de itens a emitir | Sim | quantity. |
| Características | Pares chave/valor livres ou por template | Não | characteristics[]. |
Seção: Precificação (obrigatória)
| Campo | O que é | Obrigatório? | Efeito no sistema/backend |
|---|---|---|---|
| Preço | Valor do ativo na moeda fiduciária | Sim* | price (BigNumber). *Pode ser dispensado com skipPrice. |
| Moedas aceitas | Tokens aceitos como pagamento (checkbox por token) | Não | payment_types[]. |
| Permite split | Distribui o pagamento entre os tokens marcados | Não | allow_split + percentual por token (paymentPrice). A soma deve fechar 100%. |
| Tipo de transação / Taxa | Imposto/taxa da transação (Percentual ou Absoluto) | Não | taxType (A/P) + transactionTax. |
Seção: Mídia (obrigatória)
| Campo | O que é | Obrigatório? | Efeito no sistema/backend |
|---|---|---|---|
| Fotos | Imagens do ativo | Sim | photos[] (ao menos uma). |
Seção: Carteiras / Comissões (opcional)
| Campo | O que é | Obrigatório? | Efeito no sistema/backend |
|---|---|---|---|
| Carteira + comissão | Carteiras que recebem comissão da venda | Não | wallets_commission[] = { id, commission }. |
Seção: Publicação (configurações)
Reúne os toggles de comportamento da NFT e os campos de token vinculado/liquidez. A referência completa de cada toggle está em Referência de configurações (toggles).
Campos não-toggle desta seção:
| Campo | O que é | Obrigatório? | Efeito no sistema/backend |
|---|---|---|---|
| Token vinculado para distribuições futuras | Token usado em distribuições/claims feitas a partir do NFT | Não | tokenClaimId. Define qual token o holder recebe quando o NFT distribui valor. |
| Token de liquidez para distribuições futuras | Token de liquidez oferecido como alternativa de recebimento | Não | liquidityToken. Habilita a opção de o holder escolher receber em fiat/token (ver block_liquidity_option). |
| Status interno | Status operacional usado internamente para o NFT | Não | status. Não exibido ao usuário final. |
Seção: Informações adicionais (só em edição)
projectUrl, projectDescription, projectCustomHtml e contract — informações de projeto e endereço de contrato.
Referência de configurações (toggles)
A NFT possui 8 toggles distribuídos entre as seções Precificação (allow_split) e Publicação (os demais). Todos são booleanos e gravados na entidade assets do TokenController. A tabela abaixo cobre 100% deles.
| Rótulo (tela) | Campo (ngModel) | O que faz (efeito no backend) | Quando usar |
|---|---|---|---|
| Publicar NFT imediatamente | asset.enabled | Publica a NFT nas plataformas (Midas-Web/Trade) e a inclui nas listagens de catálogo. Desligado, a NFT existe mas fica oculta dos usuários. A "exclusão" da NFT na listagem também é um soft-delete que zera este campo (enabled = false + disabled = now). | Ligue quando a oferta estiver pronta para o público. Deixe desligado em rascunhos/pré-lançamento. |
| Bloquear venda | asset.block_sell | Trava a venda primária. Em market.core.handler, a reserva de compra lança erro (NFT sale is blocked) quando block_sell = true, exceto chamadas administrativas (isAdminCall). É travado automaticamente na Queima de NFTs (snapshot em nft_burn_operation.previous_block_sell para reversão manual). | Para encerrar a venda primária de uma oferta (esgotada, suspensa, em recall) sem excluir a NFT. |
| Bloquear revenda | asset.block_resell | Impede o mercado secundário: no app do holder (Midas-Web card-list), as ações de revenda, leilão e split ficam ocultas quando block_resell = true. Também é travado em conjunto com block_sell durante a Queima de NFTs (snapshot em previous_block_resell). | NFTs não-revendáveis: ingressos nominais, cotas com lock-up, ativos regulados que não podem circular. |
| Somente pacote | asset.only_package | Remove a NFT do catálogo avulso: a query de listagem pública (AssetsDAO) adiciona only_package = false, então a NFT só aparece/é vendida dentro de um Pacote de NFTs. A tela de detalhe do produto também oculta o checkout avulso. Admin e perfil de coleção continuam vendo. | Quando a NFT só deve ser adquirida embutida num pacote, nunca isoladamente. |
| Gerenciar acesso | asset.handle_access | Trata a NFT como controle de acesso/credencial: ao concluir a compra, o market.core.handler cria um user token de acesso no CPM para o comprador (e remove o do vendedor na revenda). A NFT passa a aparecer na lista de "access assets" do admin. | Ingressos, assinaturas, áreas restritas — qualquer NFT que conceda um direito de acesso atrelado à posse. |
| Bloquear preferência de liquidez | asset.block_liquidity_option | Congela a escolha de forma de recebimento das distribuições: changeDistributionType (assets.core.handler) lança erro quando true, e no app do holder os ícones de "receber em fiat/token" ficam desabilitados. Atua junto com o Token de liquidez configurado. | Quando a forma de liquidez já está definida pela oferta e o holder não pode mais alterná-la. |
| Remover do Informe de Rendimentos (IRPF) | asset.block_from_irpf | Exclui a NFT do relatório de IRPF: o irpf.snapshot.handler e o gerador de informe filtram (!block_from_irpf) tanto o snapshot-base quanto o snapshot-final, removendo o ativo das linhas de rendimento. | Ativos que não devem entrar no Informe de Rendimentos do usuário (ex.: itens não tributáveis, utilitários internos). |
| Permite Split de NFTs | asset.allow_split | Dois efeitos: (1) na Precificação, habilita distribuir o pagamento entre vários tokens aceitos (percentual por token, soma = 100%); (2) no app do holder, libera a ação de fracionar (split) a NFT na revenda — o ícone de split só aparece com allow_split = true, block_resell = false e price > 0. | Quando a NFT pode ser fracionada e/ou paga com rateio entre múltiplos tokens. |
Relação com a Queima de NFTs
block_sell e block_resell não são apenas configuração manual: a Queima de NFTs liga os dois automaticamente na mesma transação atômica do header da queima, gravando os valores anteriores em nft_burn_operation.previous_block_sell / previous_block_resell para permitir reversão manual. Travar a NFT em T0 impede compra e revenda enquanto o watcher processa a baixa on-chain (sink wallet ou burn nativo).
Efeitos não-óbvios
block_selltem exceção de admin: chamadas comisAdminCallignoram o bloqueio — o operador ainda consegue distribuir/vender pela administração mesmo com a venda pública travada.only_packagenão some para admin: a NFT continua visível para administradores e no perfil da coleção; o filtroonly_package = falsesó vale para o catálogo público do usuário.allow_splité dois recursos num toggle: controla tanto o rateio de pagamento (Precificação) quanto a permissão de fracionar a NFT no mercado secundário.
Ações e modais
- Criar / Editar: modal de confirmação (bottom sheet). A criação envia o payload completo (
createAssets); a edição envia o subconjunto editável (editAssets). - Sorteio (roleta): abre a roleta de sorteio — todos os usuários que possuem aquela NFT participam; ao girar, é exibido o e-mail do ganhador e o ID da NFT.
- Relatório de NFT: na tela de sorteio, exporta a lista de usuários com indicação de quem possui a NFT (e-mail, nome, telefone, data de cadastro, status da conta).
- Enviar (distribuir) NFT: modal de distribuição — o admin envia a NFT para usuários específicos.
- Excluir: desativação lógica (
enabled = false+disabled = now), preservando histórico.
Regras de negócio / cuidados
Atenção
- Coleção e categoria são pré-requisitos — sem elas o save não habilita.
- Mint exclusivo do job (crowdfunding): para ativos de crowdfunding, a emissão e a queima de NFTs ocorrem apenas pelo job de crowdfunding. A distribuição financeira não emite NFT, e o
TKN_OWNERnão emite nem revende — isso garante a invariante captado == NFTs por construção. block_sell/block_reselltravam venda primária e secundária; são também acionados automaticamente no fluxo de Queima de NFTs.
Irreversível
- A emissão (mint) de NFTs on-chain não tem rollback. Confira coleção, categoria e quantidade antes de confirmar.
- Valores financeiros: preço, comissões e taxas são BigNumber — sem arredondamento.
- Status APPROVED: distribuições/envios em nome de um usuário exigem o usuário-alvo com
status === 'APPROVED'.
Exemplos
Cenário 1 — NFT de imóvel tokenizado com comissão de carteira
- Geral: coleção "Imóveis SP", categoria "Imóveis", nome, descrição, quantidade
100. - Precificação: preço
R$ 1.000,00; moedas aceitas:BRLX. Tipo Percentual, taxa2%. - Carteiras: adicionar a carteira do parceiro com
commission = 5. - Mídia: fotos do imóvel.
- Publicação: Publicar anúncio ligado, Bloquear revenda conforme a regra da oferta.
- Salvar. Resultado: 100 cotas-NFT publicadas, com comissão de 5% à carteira do parceiro.
Cenário 2 — NFT de acesso (ingresso) não-revendável
- Geral: coleção "Eventos", categoria "Ingressos", quantidade conforme lotação.
- Publicação: ligar Gerenciar acesso e Bloquear revenda.
- Precificação: preço do ingresso; moeda aceita conforme a operação.
- Salvar. Resultado: NFT funciona como ingresso, sem mercado secundário.