Como um NFT pode possuir outros NFTs: Guia Completo
Os tokens não-fungíveis (NFTs) revolucionaram a forma como ativos digitais são representados e negociados. Mas você sabia que um NFT pode ser proprietário de outros NFTs? Essa capacidade abre um leque de possibilidades para jogos, arte digital, metaversos e muito mais. Neste artigo aprofundado, exploramos o conceito, a tecnologia subjacente, os padrões de tokenização, casos de uso e como você pode criar seu próprio NFT compósito.
Principais Pontos
- Entenda os padrões ERC‑721, ERC‑1155 e ERC‑998.
- Saiba como os metadados podem referenciar outros NFTs.
- Descubra casos reais de NFTs compostos em jogos e arte.
- Aprenda passo a passo a criar um NFT que possua outros NFTs.
O que são NFTs?
Um NFT (Non‑Fungible Token) é um token criptográfico único registrado em uma blockchain, que representa a propriedade de um ativo digital ou físico. Diferente das criptomoedas tradicionais, que são fungíveis (um Bitcoin é igual a outro), cada NFT possui identificadores exclusivos que garantem sua singularidade.
Principais padrões de token
Na Ethereum, os padrões mais usados são:
- ERC‑721: O padrão original para NFTs. Cada token tem um ID único e metadados associados.
- ERC‑1155: Permite a criação de tokens semi‑fungíveis, combinando NFTs e tokens fungíveis em um único contrato.
- ERC‑998: Um padrão projetado especificamente para NFTs compostos, onde um token pode possuir outros tokens.
Conceito de NFT possuindo NFTs
Um NFT compósito (ou “composable NFT”) é um token que detém a propriedade de outros NFTs. Essa relação de “pai‑filho” é registrada diretamente no contrato inteligente, permitindo que o token principal gerencie, transfira ou até mesmo destrua os tokens subordinados.
Tokenização hierárquica
Imagine um avatar em um jogo que possui equipamentos (espada, escudo, capa). Cada equipamento pode ser um NFT independente, mas o avatar — também um NFT — pode “possuir” esses itens. Quando o avatar é vendido, todos os equipamentos são transferidos junto, preservando a lógica de propriedade.
Como a propriedade é registrada
O contrato do NFT compósito armazena um mapeamento (mapping) de IDs de tokens filhos. Quando um token filho é transferido para o contrato, ele passa a ser controlado pelo token pai. O contrato pode expor funções como transferChild(uint256 parentId, address to, uint256 childId) para mover itens individuais.
Implementação prática
Existem duas abordagens principais para criar NFTs que possuam outros NFTs:
1. Uso do padrão ERC‑998
O ERC‑998 define duas variantes:
- ERC‑998 “Composable”: Um token pode possuir tanto NFTs quanto tokens fungíveis.
- ERC‑998 “Top‑Down”: Um token pai contém uma lista de tokens filhos, permitindo consultas de propriedade em camada.
O contrato implementa funções como ownerOfChild(uint256 childId) e childrenOf(uint256 parentId), facilitando a navegação na hierarquia.
2. Metadados que referenciam outros NFTs
Mesmo sem usar ERC‑998, é possível criar uma relação “virtual” armazenando URIs de outros NFTs nos metadados JSON. Essa abordagem depende de convenções fora da blockchain e, portanto, não oferece garantias de propriedade automática.
Casos de uso reais
A seguir, alguns exemplos onde NFTs compostos já estão em produção:
Jogos blockchain
Projetos como The Sandbox e Axie Infinity utilizam NFTs para representar personagens e itens. Um personagem (NFT) pode possuir equipamentos (outros NFTs), permitindo que todo o “inventário” seja transferido como um único pacote.
Arte digital
Artistas têm criado coleções “meta‑art” onde uma obra principal contém “fragmentos” ou “camadas” adicionais, cada um representado como NFT. Ao comprar a obra principal, o colecionador recebe automaticamente todos os fragmentos associados.
Real Estate virtual
Plataformas de metaverso, como Decentraland, vendem terrenos como NFTs. Um terreno pode “possuir” construções, decorações e direitos de uso que são NFTs independentes, facilitando a negociação de pacotes completos.
Desafios e considerações de segurança
Embora a tokenização hierárquica ofereça flexibilidade, ela também traz complexidade:
Consumo de gás
Operações que envolvem múltiplos tokens (por exemplo, transferir um NFT com 10 itens) podem consumir grandes quantidades de gás, elevando custos para usuários. Estratégias de otimização incluem batch transfers e uso de contratos de camada‑2.
Auditoria de contratos
Contratos ERC‑998 são mais complexos que ERC‑721 simples. É essencial passar por auditorias de segurança independentes para evitar vulnerabilidades como re‑entrância ou perda de tokens filhos.
Interoperabilidade
Nem todas as plataformas de mercado suportam NFTs compostos. Ao listar um NFT que possui outros tokens, verifique se a exchange ou marketplace reconhece o padrão ERC‑998. Caso contrário, os tokens filhos podem ficar “presos” no contrato.
Como criar seu próprio NFT compósito
A seguir, um guia passo a passo para desenvolvedores que desejam implantar um NFT que possua outros NFTs na Ethereum ou em redes compatíveis (Polygon, Arbitrum).
Passo 1 – Configurar o ambiente
- Instale Node.js (v18 ou superior) e o gerenciador de pacotes
npmouyarn. - Crie um projeto com
hardhatoutruffle. - Adicione as dependências:
@openzeppelin/contractseerc998(biblioteca open‑source).
Passo 2 – Implementar o contrato
Exemplo simplificado usando OpenZeppelin e ERC‑998:
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "erc998/contracts/ERC998TopDown.sol";
contract AvatarComposable is ERC998TopDown {
constructor() ERC721("Avatar", "AVT") ERC998TopDown() {}
// Mint do avatar (token pai)
function mintAvatar(address to, uint256 tokenId) external {
_mint(to, tokenId);
}
// Adiciona um item (NFT filho) ao avatar
function equipItem(uint256 avatarId, address itemContract, uint256 itemId) external {
// Transferir o item para este contrato
IERC721(itemContract).transferFrom(msg.sender, address(this), itemId);
// Registrar como filho
_addChild(avatarId, itemContract, itemId);
}
// Remove e devolve o item ao proprietário
function unequipItem(uint256 avatarId, address itemContract, uint256 itemId) external {
require(ownerOf(avatarId) == msg.sender, "Somente dono do avatar");
_removeChild(avatarId, itemContract, itemId);
IERC721(itemContract).transferFrom(address(this), msg.sender, itemId);
}
}
Passo 3 – Deploy na testnet
- Configure a rede (por exemplo, Sepolia) no arquivo
hardhat.config.js. - Execute
npx hardhat run scripts/deploy.js --network sepolia. - Teste as funções
mintAvatar,equipItemeunequipItemusandohardhat consoleou um front‑end simples.
Passo 4 – Integração com Front‑end
Utilize ethers.js ou web3.js para conectar a carteira do usuário (MetaMask). Exiba a lista de itens do avatar chamando childrenOf(avatarId) e atualize a UI em tempo real.
Passo 5 – Publicação e Listagem
Depois de auditorar o contrato, publique na mainnet (Ethereum ou Polygon) e registre o endereço no OpenSea ou outro marketplace que suporte ERC‑998. Forneça documentação clara sobre como os itens são transferidos junto ao avatar.
Conclusão
Os NFTs compostos representam a próxima evolução da tokenização, permitindo que ativos digitais sejam agrupados, negociados e gerenciados como unidades únicas. Ao adotar padrões como ERC‑998, desenvolvedores podem criar experiências ricas em jogos, arte e metaversos, ao mesmo tempo em que enfrentam desafios de gás, segurança e interoperabilidade. Com as ferramentas corretas e boas práticas de auditoria, você pode começar a construir seu próprio ecossistema de NFTs que possuam outros NFTs e se posicionar na vanguarda da inovação blockchain.