WEB3DEV

Cover image for ERC-2981: Aprofundando-se no Padrão de Royalties de NFTs e Como Ele Pode Ser Implementado Adequadamente
Paulo Gio
Paulo Gio

Posted on

ERC-2981: Aprofundando-se no Padrão de Royalties de NFTs e Como Ele Pode Ser Implementado Adequadamente

https://miro.medium.com/v2/resize:fit:1100/0*2VMxOzNVtmLeTmBb

Foto de Nenad Novaković no Unsplash

Entendendo Royalties de NFTs

Imagine um mundo onde os criadores se beneficiam de seu trabalho anos após sua conclusão. Um mundo no qual eles podem se concentrar apenas em fazer o que amam porque recebem financiamento adequado. Como consumidores, poderíamos apoiar com confiança nossos criadores favoritos. Que pensamento empolgante! Com a tecnologia revolucionária da Ethereum, isso agora é possível por meio do que é conhecido como tokens não fungíveis (NFTs). Os NFTs permitem a possibilidade de royalties contínuos para os criadores. Com isso, cada vez que um NFT é trocado entre colecionadores, o criador do NFT retém uma parcela dessa troca monetária. Este conceito conquistou o mundo porque permite o financiamento contínuo dos criadores. Então, como esses royalties são realmente aplicados? Vamos mergulhar nisso.

A Necessidade do ERC-2981

No início, as implementações de royalties existiam apenas no nível do mercado. No entanto, logo se tornou aparente que isso criou um problema. Cada mercado tinha sua própria implementação única de royalties que não era facilmente compatível ou utilizável por outros mercados. Como resultado, os artistas só receberiam seus respectivos pagamentos em um mercado específico e em nenhum outro. Logo ficou evidente que precisávamos de:

"Uma maneira padronizada de recuperar informações de pagamento de royalties para tokens não fungíveis (Burkes et al.)."

Surge o ERC-2981: um padrão de token revolucionário que aborda essa preocupação. Nesta exploração, investigaremos como implementar adequadamente esse padrão para que possamos recompensar os criadores de NFTs em muitos mercados diferentes.

O Poder da Simplicidade no ERC-2981

O ERC-2981 tem um design simples para permitir que outros construam com base neste padrão, melhorando vastamente o panorama dos NFTs.

"Este ERC deve ser considerado um bloco básico, eficiente em termos de gás, para mais inovações em pagamentos de royalties de NFTs (Burkes e et al.)."

Além disso, a simplicidade facilita a adoção deste padrão pelos mercados de NFTs e pelos desenvolvedores ao incorporá-lo em seu código. Essa abordagem estratégica não apenas incentiva a implementação rápida, mas também prepara o terreno para um ecossistema de possibilidades criativas que tem o potencial de revolucionar o mundo dos NFTs.

Especificações Técnicas

Agora, embora o design simples deste padrão permita uma fácil implementação, ainda devemos cumprir certas especificações para conformidade:

  1. O padrão de royalties ERC-2981 exige duas funções: royaltyInfo() e a função supportsInterface() do IERC165, conforme visto abaixo.

O código a seguir é retirado diretamente do ERC-2981: NFT Royalty Standard:

gistfile1.sol

pragma solidity ^0.6.0;
import "./IERC165.sol";

///
/// @dev Interface para o Padrão de Royalty NFT
///
interface IERC2981 is IERC165 {
    /// bytes ERC165 para adicionar ao array de interface - definido no contrato pai
    /// implementando este padrão
    ///
    /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
    /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
    /// _registerInterface(_INTERFACE_ID_ERC2981);

    /// @notice Chamado com o preço de venda para determinar quanto royalty
    //          é devido e para quem.
    /// @param _tokenId - o ativo NFT consultado para informações de royalty
    /// @param _salePrice - o preço de venda do ativo NFT especificado por _tokenId
    /// @return receiver - endereço de quem deve receber o pagamento do royalty
    /// @return royaltyAmount - o valor do pagamento do royalty para _salePrice
    function royaltyInfo(
        uint256 _tokenId,
        uint256 _salePrice
    ) external view returns (
        address receiver,
        uint256 royaltyAmount
    );
}

interface IERC165 {
    /// @notice Consulta se um contrato implementa uma interface
    /// @param interfaceID O identificador da interface, conforme especificado no ERC-165
    /// @dev A identificação da interface é especificada no ERC-165. Esta função
    ///  usa menos de 30,000 de gás.
    /// @return `true` se o contrato implementar `interfaceID` e
    ///  `interfaceID` não for 0xffffffff, `false` caso contrário
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
Enter fullscreen mode Exit fullscreen mode
  1. O royaltyAmount (valor do royalty) deve ser calculado como uma porcentagem do _salePrice (preço de venda).

  2. Como esse padrão permite o uso de qualquer unidade de troca, o royaltyAmount retornado não deve ser um valor fixo.

Para se aprofundar mais nessas especificações, consulte a EIP.

Implementando o ERC-2981: Uma Abordagem Segura com o OpenZeppelin

Felizmente para os desenvolvedores, implementar esse padrão de token é tão fácil quanto importar o contrato ERC-2981 do OpenZeppelin. Ao fazer isso, os desenvolvedores estão automaticamente cumprindo todas as especificações necessárias.

Aqui está um processo fácil de três etapas para implementar o padrão de royalty em um contrato inteligente NFT ERC-1155 (NOTA: essas etapas também funcionam para contratos inteligentes ERC-721):

  1. Importe o contrato ERC-2981 do OpenZeppelin e herde suas funções com a palavra-chave is.
import "@openzeppelin/contracts/token/common/ERC2981.sol";

contract RoyaltyContract is ERC1155, ERC1155Supply, ERC2981 {
Enter fullscreen mode Exit fullscreen mode
  1. Chame a função _setDefaultRoyalty(address receiver, uint96 feeNumerator), herdada do contrato ERC-2981, no construtor para definir as informações de royalty na implantação ou crie uma função para definir essas informações mais tarde.
constructor(
        string memory initialUri, 
        uint96 feeNumerator,
        address receiver,
        string memory _name, 
        string memory _symbol
        ) ERC1155(initialUri) {
        _setDefaultRoyalty(receiver, feeNumerator);
        name = _name;
        symbol = _symbol;
    }

//Opcional. Se implementar esta função, garanta o controle de acesso, como onlyOwner
function setDefaultRoyalty(address _receiver, uint96 _feeNumerator) public onlyOwner {
      _setDefaultRoyalty(_receiver, _feeNumerator);
  }
Enter fullscreen mode Exit fullscreen mode
  1. Ao usar o contrato ERC-2981 do OpenZeppelin enquanto também herda os contratos ERC-1155 ou ERC-721 deles, um problema como este pode surgir:
TypeError: Derived contract must override function "supportsInterface." Two or more base classes define function with same name and parameter types.

//TypeError: O contrato derivado deve substituir a função "supportsInterface". Duas ou mais classes base definem a função com o mesmo nome e tipos de parâmetro.
Enter fullscreen mode Exit fullscreen mode

Este erro ocorre porque o ERC-2981 substitui a função supportsInterface() e os contratos ERC-1155 e ERC-721 também fazem isso. A solução é substituir a função novamente no contrato inteligente do NFT.

function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
Enter fullscreen mode Exit fullscreen mode
  • A função supportsInterface é substituída especificando os contratos substituídos como ERC1155 e ERC2981.
  • A chamada super.supportsInterface(interfaceId) garante que a função funcione conforme esperado, delegando para a implementação nos contratos pai.

Ao criar um contrato ERC-721, substitua o ERC1155 por ERC721.

function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
Enter fullscreen mode Exit fullscreen mode

E é isso!

Seguir essas três etapas resultará em um NFT compatível com o ERC-2981. O contrato abaixo é um exemplo de como isso seria em um contrato inteligente ERC-1155:

Ao usar o contrato ERC-2981 do OpenZeppelin, temos uma abordagem segura para cumprir o padrão de royalties de NFTs.

Conclusão

A evolução do cenário dos NFTs levou a modelos de negócios inovadores, como os royalties contínuos de NFTs. Esses royalties continuam a apoiar criadores de todos os tipos enquanto suas criações existirem na blockchain. No entanto, a distribuição desses royalties era determinada no nível do mercado, levando a inconsistências entre diferentes mercados. Consequentemente, surgiu a necessidade do ERC-2981, que possibilitou o financiamento contínuo desses criadores. Vamos continuar a apoiar este padrão de token através de sua aplicação prática. O contrato ERC-2981 do OpenZeppelin, testado em combate, facilita e torna confiável esse processo. Acima de tudo, também contribui para o sucesso do padrão de royalties de NFT e leva à sua adoção generalizada entre diversos mercados.

Citações

Zach Burks (@vexycats), James Morgan (@jamesmorgan), Blaine Malone (@blmalone), James Seibel (@seibelj), “ERC-2981: NFT Royalty Standard,” Ethereum Improvement Proposals, no. 2981, September 2020. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2981.

Morgan, James. “EIP-2981 — Simple and Effective Royalty Standards for All.” Medium, 9 Dec. 2022, medium.com/@james.morgan/eip-2981-simple-and-effective-royalty-standards-for-all-dbd0b761a0f0.

Obrigado por dedicar tempo para ler este artigo. Ao implementar pessoalmente este padrão de token em meus projetos, me deparei com problemas que poderiam ter sido facilmente evitados se eu tivesse um recurso confiável para seguir. Se você achou o texto valioso, conecte-se comigo nas seguintes plataformas:

Seu engajamento e feedback são muito apreciados.

Artigo original publicado por Wyatt Chamberlin. Traduzido por Paulinho Giovannini.

Latest comments (0)