Lição: 278: NFTs Componíveis (ERC998)
Os NFTs componíveis, definidos pelo padrão ERC998, representam uma evolução significativa no campo dos Tokens Não Fungíveis (NFTs). Diferente dos NFTs tradicionais (como aqueles definidos pelo ERC721), que são ativos digitais únicos, os NFTs componíveis permitem a criação de ativos digitais complexos e hierárquicos que podem possuir outros NFTs e tokens fungíveis. Isso possibilita a criação de ativos digitais mais dinâmicos e interconectados, promovendo um novo paradigma para aplicações criativas.
O que é o ERC998?
O ERC998 é uma extensão do padrão ERC721 que permite que os NFTs sejam componíveis. Isso significa que um único NFT pode representar não apenas a si mesmo, mas também possuir outros NFTs ou tokens fungíveis. Essa composição expande os potenciais casos de uso para NFTs em jogos, mundos virtuais e arte digital.
Principais Características do ERC998
- Hierarquia de Propriedade: Um NFT ERC998 pode possuir múltiplos tokens ERC721 e ERC20, permitindo a criação de estruturas de ativos complexas.
- Transferibilidade: É possível transferir um NFT ERC998 e seus ativos compostos em uma única transação.
- Composição Dinâmica: Os ativos componíveis podem ser modificados ao longo do tempo, permitindo que criadores e usuários construam ativos digitais personalizados e em evolução.
Implementação do ERC998
Estrutura Básica
Aqui está uma implementação simplificada de um contrato compatível com o ERC998 em Solidity. Este exemplo abordará os aspectos fundamentais de posse de tokens ERC721 e ERC20.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
contract ComposableNFT is ERC721 {
using SafeMath for uint256;
// Mapeamento de tokenId para ERC721s e ERC20s possuídos
mapping(uint256 => uint256[]) private _ownedERC721Tokens;
mapping(uint256 => mapping(address => uint256)) private _ownedERC20Tokens;
constructor(string memory name, string memory symbol) ERC721(name, symbol) {}
// Função para criar um novo NFT Componível
function mint(uint256 tokenId) public {
_mint(msg.sender, tokenId);
}
// Função para possuir um token ERC721
function ownERC721(uint256 tokenId, address erc721Contract, uint256 erc721TokenId) external {
require(ownerOf(tokenId) == msg.sender, "Você não é o proprietário do NFT Componível");
// Transfere o token ERC721 para este contrato
IERC721(erc721Contract).transferFrom(msg.sender, address(this), erc721TokenId);
_ownedERC721Tokens[tokenId].push(erc721TokenId);
}
// Função para possuir tokens ERC20
function ownERC20(uint256 tokenId, address erc20Contract, uint256 amount) external {
require(ownerOf(tokenId) == msg.sender, "Você não é o proprietário do NFT Componível");
// Transfere os tokens ERC20 para este contrato
IERC20(erc20Contract).transferFrom(msg.sender, address(this), amount);
_ownedERC20Tokens[tokenId][erc20Contract] = _ownedERC20Tokens[tokenId][erc20Contract].add(amount);
}
// Função para acessar tokens ERC721 possuídos
function getOwnedERC721Tokens(uint256 tokenId) external view returns (uint256[] memory) {
return _ownedERC721Tokens[tokenId];
}
// Função para acessar saldo de tokens ERC20 possuídos
function getOwnedERC20Balance(uint256 tokenId, address erc20Contract) external view returns (uint256) {
return _ownedERC20Tokens[tokenId][erc20Contract];
}
// Opcional: Adicionar funções para transferir ativos possuídos
}
Explicação dos Elementos Chave
- Mintando NFTs Componíveis: A função
mint
permite que os usuários criem novos NFTs Componíveis. - Possuindo Tokens ERC721: A função
ownERC721
permite que o proprietário do NFT Componível transfira tokens ERC721 para a propriedade do Componível. - Possuindo Tokens ERC20: A função
ownERC20
permite o armazenamento de tokens ERC20 como parte do NFT Componível. - Recuperando Ativos Possuídos: Funções como
getOwnedERC721Tokens
egetOwnedERC20Balance
permitem que os usuários verifiquem quais ativos são possuídos por um NFT Componível específico.
Casos de Uso
1. Jogos
Em jogos, um NFT de personagem pode possuir múltiplos NFTs de equipamentos (como armas, armaduras) e moeda (tokens ERC20). O personagem pode ser transferido como uma única entidade, incluindo todos os seus pertences.
2. Colecionáveis
Artistas podem criar um NFT master que possui uma coleção de peças de arte digital. Os colecionadores podem comprar o NFT master para adquirir todos os seus componentes.
3. Imóveis Virtuais
Em mundos virtuais, um NFT de terreno poderia possuir edifícios (ERC721) e moedas virtuais, permitindo estruturas de propriedade mais complexas.
Conclusão
Os NFTs Componíveis (ERC998) fornecem uma estrutura robusta para a construção de ativos digitais complexos que podem conter outros NFTs e tokens fungíveis. Ao aproveitar esse padrão, os desenvolvedores podem criar aplicações e ecossistemas imersivos, aprimorando as experiências dos usuários no mundo digital. Com os avanços contínuos nesta área, as possibilidades para NFTs Componíveis são vastas, prometendo aplicações inovadoras que enriquecem o cenário dinâmico da propriedade digital.