WEB3DEV

Cover image for Extensões do ERC721
Diogo Jorge
Diogo Jorge

Posted on • Atualizado em

Extensões do ERC721

No meu post anterior, descrevi as extensões do padrão de token mais usado — ERC20. Agora é hora do segundo padrão de token mais popular - ERC721. Todas as extensões vêm da biblioteca OpenZeppelin.

Image description


Sumário

1 . As principais interfaces
..... . ERC721Metadata
..... . ERC721Enumerable
..... . ERC721Full
..... . IERC721Receptor

2 . Extensões
..... . ERC721Burnable
..... . ERC721Consecutive
..... . ERC721Pausable
..... . ERC721Royalty
..... . ERC721URIStorage
..... . ERC721Votes

3 . Interface adicional mais usada


As principais interfaces

A principal e também a única interface obrigatória é a ERC721, que é a implementação mais simples do padrão ERC721. Exceto isso, há duas implementações principais: ERC721Metadata e ERC721Enumerable. Às interfaces mais importantes, poderíamos também considerar a IERC721Receiver, que é diferente das demais que mencionei.

ERC721Metadata

Essa interface nos permite adicionar o nome e o símbolo aos nossos tokens. Além disso, implementa uma função pública tokenURI, que concatena a base Uri e tokenId. Assim, podemos anexar algumas informações off-chain ao nosso NFT.

ERC721Enumerable

Cada token cunhado tem seu próprio tokenId uint256 exclusivo. Geralmente, tokenId aumenta de zero e é fácil descobrir qual token é mais antigo. Mas não é uma regra. O tokenId pode ser definido por um mecanismo totalmente aleatório. Portanto, essa interface cria a partir de todas as listas de tokenIds que aumentam de zero. Além disso, além de uma lista para todos os tokens, existe a criação de uma lista para cada proprietário de tokens. Esta solução facilita a vida do usuário.

ERC721Full

A interface que está conectada a ERC721, ERC721Metadata e ERC721Enumerable. O token criado por este implemento é um token com todos os recursos.

IERC721Receptor

A interface que deve ser implementada por contratos que desejam oferecer suporte à função safeTransfer do ERC721. Ao usar o safeTransfer, minimizamos o risco de os tokens ficarem bloqueados em qualquer contrato inteligente para sempre. Como funciona? Se o destino de safeTransfer for o contrato, a função chamará IERC721Receiver.onERC721Received e a função chamada deverá retornar o valor igual a bytes4(keccak256("onERC721Received(endereço,endereço,uint256,bytes)")). Caso contrário, a transação será revertida. Ao usar esta solução, não enviaremos tokens para o contrato que não for criado para lidar com ERC721.

Extensões

Além das interfaces principais, a biblioteca OpenZeppelin nos dá acesso a contratos de recursos adicionais, que estendem o ERC721 mais simples.

ERC721Burnable

O nome dessa extensão é a pista, o que ela faz — queimar os tokens. Para ser mais preciso, se implementarmos essa extensão, poderemos destruir irreversivelmente um token específico. A função para isso é pública e chamada de burn. O único requisito para usá-la é que o msg.sender deve ser o proprietário do token que deseja queimar, ou ele deve ser aprovado para este contrato.

ERC721Consecutive

Essa extensão permite cunhar grandes lotes de token, mas apenas durante a construção do contrato. Por padrão, o limite superior da quantidade de lote é de 5.000 tokens. Quando o lote é cunhado, o endereço da conta que possuirá esses tokens não é verificado pelo aspecto da implementação do IERC721Receiver. Além disso, essa extensão muda mais uma coisa — no construtor não podemos usar a tradicional função mint, para criar um único token. Esta função podemos usar somente quando a função construtora for totalmente executada.

ERC721Pausable

Esta extensão implementa ao contrato padrão ERC721 o mecanismo de parada de emergência, que pode ser acionado por um endereço autorizado. É feito adicionando dois novos modificadores: whenNotPaused, whenPaused e modificando a função _beforeTokenTransfer do ERC721. Esta modificação pausa o trabalho do _transfer, _mint e _burn.

Essa extensão é útil no cenário em que desejamos interromper toda a transferência de tokens durante o processo de avaliação ou quando for encontrado um bug crítico no código. É apenas um grande botão vermelho de emergência, que pausa o funcionamento de tudo.

ERC721Royalty

Implementação do ERC2981 (NFT Royalty Standard). Quando o NFT estiver à venda, a cada venda o criador recebe uma porcentagem do preço de venda - essa porcentagem é chamada de royalties. Infelizmente, cada mercado tinha seu próprio sistema de royalties, portanto, quando o NFT era vendido em outro mercado, o criador não recebia dinheiro. Para padronizar esse aspecto do NFT foi criado o ERC2981. Este ERC especifica uma maneira de sinalizar as informações de royalties. Mas só padroniza a forma de salvar essas informações, portanto, não força os pagamentos dos marketplaces. Com isso, existe a expectativa de que os marketplaces paguem voluntariamente royalties junto com as vendas. No momento, essa extensão não é muito popular, e muitas vezes os marketplaces não querem pagar royalties.

ERC721URIStorage

Como dito no parágrafo ERC721Metadata, poderíamos adicionar a variável string ao token específico. Mas essa string é sempre a concatenação do URI base e do tokenId. Essa solução é eficiente em termos de gás, porque o URI de cada token não precisa ser armazenado na cadeia. Mas o problema é quando o URI que gostaríamos de adicionar não está conectado com o tokenId ou quando tokens diferentes precisam de URI base diferentes. Para resolver este problema, poderíamos usar esta extensão. Ela nos permite armazenar um URI específico na cadeia.

ERC721Votes

Esta extensão permite usar o ERC721 para votar e criar um dos elementos do próprio sistema de governança. Um token é igual a 1 unidade de voto. Esta extensão permite votação e delegação de alguém para isso. O aspecto importante dessa extensão é que o token não conta como voto até que seja delegado, porque o voto deve ser rastreado. É uma restrição muito popular, que podemos encontrar, por exemplo, na extensão ERC20Votes.

Interface adicional mais usada

Muitos contratos inteligentes que mencionei neste post usam um contrato - ERC165. Portanto, acho que devemos possuir algumas informações sobre isso, mesmo que não seja a extensão ERC721. Durante minhas pesquisas encontrei um ótimo post sobre o ERC165, e tenho certeza que não vou explicar melhor, então aqui está o link. Acho que vale muito a pena lê-lo.

Espero que você ache este post útil. Se você tiver alguma ideia de como eu poderia melhorar minhas postagens, me avise. Estou sempre pronto para aprender. Você pode se conectar comigo em LinkedIn e Telegram.

Se você quiser conversar comigo sobre este ou qualquer outro tópico que escrevi, fique à vontade. Estou aberto a conversas.

Feliz aprendizado!

Este artigo foi escrito por Eszymi e traduzido por Diogo Jorge. O artigo original pode ser encontrado aqui.

Latest comments (0)