6 minutos
Categorize Marketplaces de NFT com Enums
Use Enums para deixar o seu código mais limpo e menos vulnerável a erros. Veja um exemplo do uso deste em marketplaces de NFT.
O que são Enums?
Enums, ou tipos de enumeração, são um tipo de dados específico que permite definir um conjunto de valores específicos permitidos.
Exemplo de Enums no seu Schema
Se estiver a construir um subgraph para rastrear o histórico de posse de tokens em um mercado, cada token pode passar por posses diferentes, como OriginalOwner
, SecondOwner
, e ThirdOwner
. Ao usar enums, é possível definir essas posses específicas, o que garante que só são nomeados valores predefinidos.
É possível definir enums no seu schema; assim definidos, a representação de string dos valores de enum podem ser usados para configurar um campo de enum numa entidade.
Com base no exemplo acima, uma definição de enum no seu schema pode ficar assim:
1enum TokenStatus {2 OriginalOwner3 SecondOwner4 ThirdOwner5}
Ou seja, quando usar o tipo TokenStatus
no seu schema, a expectativa é de que seja exatamente um dos valores predefinidos: OriginalOwner
, SecondOwner
, ou ThirdOwner
, assim garantindo a consistência e validez.
Para saber mais sobre enums, veja Como Criar um Subgraph e a documentação da GraphQL.
Vantagens de Usar Enums
- Clareza: Enums dão nomes significativos a valores, facilitando a navegação de dados.
- Validação: Enums aplicam definições rígidas de valor, assim evitando entradas inválidas de dados.
- Manutenibilidade: Enums permitem mudar ou adicionar novas categorias de maneira concentrada.
Sem Enums
Se escolher definir o tipo como um string em vez de usar um Enum, seu código poderá ficar assim:
1type Token @entity {2 id: ID!3 tokenId: BigInt!4 owner: Bytes! # Proprietário do token5 tokenStatus: String! # Campo de string para rastrear o estado do token6 timestamp: BigInt!7}
Neste schema, TokenStatus
é um string simples sem valores permitidos específicos.
Por que isto é um problema?
- Não há restrições sobre valores
TokenStatus
, então qualquer string pode ser nomeado por acidente. Assim, fica difícil garantir que só estados válidos — comoOriginalOwner
,SecondOwner
, ouThirdOwner
— serão configurados. - É fácil fazer erros de digitação, como
Orgnalowner
em vez deOriginalOwner
, o que faria os dados, e queries em potencial, não confiáveis.
Com Enums
Em vez de nomear strings livres, é possível definir um enum para TokenStatus
com valores específicos: OriginalOwner
, SecondOwner
, ou ThirdOwner
. Usar um enum garante o uso de valores permitidos, e mais nenhum.
Enums provém segurança de dados, minimizam os riscos de erros de digitação, e garantem resultados consistentes e confiáveis.
Como Definir Enums para Marketplaces de NFT
Nota: o guia a seguir usa o contrato inteligente de NFTs CryptoCoven.
Para definir enums para os vários mercados com apoio a troca de NFTs, use o seguinte no seu schema de subgraph:
1# Enum para Marketplaces com que o contrato CryptoCoven interagiu(provavelmente Troca/Mint)2enum Marketplace {3 OpenSeaV1 # Representa o comércio de um NFT CryptoCoven no marketplace4 OpenSeaV2 # Representa o comércio de um NFT CryptoCoven no marketplace OpenSeaV25 SeaPort # Representa o comércio de um NFT CryptoCoven no marketplace SeaPort6 LooksRare # Representa o comércio de um NFT CryptoCoven no marketplace LookRare7 # ...e outros marketplaces8}
Como Usar Enums para Marketplaces de NFT
Quando definidos, os enums podem ser usados no seu subgraph para categorizar transações ou eventos.
Por exemplo: ao registrar vendas de NFT, é possível usar o enum para especificar o marketplace envolvido na ação.
Como Implementar uma Função para Marketplaces de NFT
Veja como implementar uma função para resgatar o nome de um marketplace do enum, como string:
1export function getMarketplaceName(marketplace: Marketplace): string {2 // Usando comandos if-else para mapear o valor do enum para um string3 if (marketplace === Marketplace.OpenSeaV1) {4 return 'OpenSeaV1' // Se o marketplace for OpenSea, retornar sua representação de string5 } else if (marketplace === Marketplace.OpenSeaV2) {6 return 'OpenSeaV2'7 } else if (marketplace === Marketplace.SeaPort) {8 return 'SeaPort' // Se o marketplace for SeaPort, retornar sua representação de string9 } else if (marketplace === Marketplace.LooksRare) {10 return 'LooksRare' // Se o marketplace for LooksRare, retornar sua representação de string11 // ... e outros marketplaces12 }13}
Melhores Práticas para o Uso de Enums
- Nomes Consistentes: Deixe o seu código mais legível; use nomes mais claros e descritivos para valores de enum.
- Gestão Centralizada: Mantenha enums num único arquivo para ficar mais consistente. Assim, os enums ficam mais fáceis de atualizar, garantindo uma fonte única e verdadeira de dados.
- Documentação: Adicione comentários a enums para esclarecer o seu propósito e uso.
Como Usar Enums em Queries
Enums em queries ajudam a melhorar a qualidade de dados e deixam os seus resultados mais fáceis de interpretar. Eles funcionam como filtros e elementos de resposta, assim garantindo a consistência e reduzindo erros em valores de marketplace.
Detalhes
- Filtros com Enums: Enums fornecem filtros claros, permitindo a inclusão ou exclusão clara de marketplaces específicos.
- Enums em Respostas: Enums garantem que só marketplaces reconhecidos sejam retornados, trazendo resultados consistentes e precisos.
Exemplos de Query
Query 1: Conta com Mais Interações de Marketplace em NFT
Este query faz o seguinte:
- Encontra a conta com mais interações únicas com marketplaces de NFT, ótimo para analisar atividade entre marketplaces.
- O campo de marketplaces usa o enum de marketplace, garantindo valores consistentes e validados na resposta.
1{2 accounts(first: 1, orderBy: uniqueMarketplacesCount, orderDirection: desc) {3 id4 sendCount5 receiveCount6 totalSpent7 uniqueMarketplacesCount8 marketplaces {9 marketplace # Este campo retorna o valor de enum representando o marketplace10 }11 }12}
Respostas
Esta resposta fornece detalhes de conta e uma lista de interações singulares de marketplace com valores de enum, para mais clareza:
1{2 "data": {3 "accounts": [4 {5 "id": "0xb3abc96cb9a61576c03c955d75b703a890a14aa0",6 "sendCount": "44",7 "receiveCount": "44",8 "totalSpent": "1197500000000000000",9 "uniqueMarketplacesCount": "7",10 "marketplaces": [11 {12 "marketplace": "OpenSeaV1"13 },14 {15 "marketplace": "OpenSeaV2"16 },17 {18 "marketplace": "GenieSwap"19 },20 {21 "marketplace": "CryptoCoven"22 },23 {24 "marketplace": "Unknown"25 },26 {27 "marketplace": "LooksRare"28 },29 {30 "marketplace": "NFTX"31 }32 ]33 }34 ]35 }36}
Query 2: Marketplace mais ativo para transações do CryptoCoven
Este query faz o seguinte:
- Identifica o marketplace com maior volume de transações do CryptoCoven.
- Usa o enum de marketplace para garantir que só tipos válidos de marketplace apareçam na resposta, deixando os seus dados mais confiáveis e consistentes.
1{2 marketplaceInteractions(first: 1, orderBy: transactionCount, orderDirection: desc) {3 marketplace4 transactionCount5 }6}
Resultado 2
A resposta esperada inclui o marketplace e a contagem correspondente de transações, usando o enum para indicar o tipo de marketplace:
1{2 "data": {3 "marketplaceInteractions": [4 {5 "marketplace": "Unknown",6 "transactionCount": "222"7 }8 ]9 }10}
Query 3: Interações de Marketplace com Altos Números de Transação
Este query faz o seguinte:
- Resgata os quatro marketplaces com maior número de transações acima de 100, excluindo marketplaces “desconhecidos”.
- Usa enums como filtros para garantir que só tipos válidos de marketplace sejam incluídos, deixando a resposta mais precisa.
1{2 marketplaceInteractions(3 first: 44 orderBy: transactionCount5 orderDirection: desc6 where: { transactionCount_gt: "100", marketplace_not: "Unknown" }7 ) {8 marketplace9 transactionCount10 }11}
Resultado 3
O retorno esperado inclui os marketplaces que cumprem os critérios, cada um representado por um valor enum:
1{2 "data": {3 "marketplaceInteractions": [4 {5 "marketplace": "NFTX",6 "transactionCount": "201"7 },8 {9 "marketplace": "OpenSeaV1",10 "transactionCount": "148"11 },12 {13 "marketplace": "CryptoCoven",14 "transactionCount": "117"15 },16 {17 "marketplace": "OpenSeaV1",18 "transactionCount": "111"19 }20 ]21 }22}
Outros Recursos
Para mais informações, veja o repositório deste guia.