SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
09.12.2024

Lição 277: Usando o Padrão de Royalties EIP-2981

Nesta lição, vamos explorar o padrão EIP-2981, que fornece uma maneira padronizada de implementar pagamentos de royalties para NFTs na blockchain Ethereum. Este padrão permite que os criadores definam royalties de uma forma que os marketplaces possam facilmente interpretar e fazer cumprir.

O que é EIP-2981?

EIP-2981 é uma Proposta de Melhoria do Ethereum que especifica um padrão universal de royalties para NFTs. Ele permite que os criadores de NFTs especifiquem um valor de royalty (uma porcentagem de cada venda) que será enviado a eles sempre que seu NFT for vendido em mercados secundários. Isso é importante para garantir que artistas e criadores recebam uma compensação justa pelo seu trabalho, mesmo após a venda inicial.

Interface de Informações de Royalties

O principal componente do EIP-2981 é a interface IERC2981. Ela inclui um único método royaltyInfo que retorna o valor do royalty e o destinatário com base no preço de venda:

interface IERC2981 {
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

Exemplo de Implementação

Vamos criar um contrato simples de NFT ERC721 que implementa o padrão de royalties EIP-2981. Utilizaremos a implementação de ERC721 da OpenZeppelin para este propósito.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/interfaces/IERC2981.sol";

contract MyNFT is ERC721Enumerable, Ownable, IERC2981 {
    // Mapeamento do ID do token para informações de royalties
    struct Royalty {
        address receiver;
        uint96 feeNumerator; // A taxa é representada em pontos base (1/100)
    }

    mapping(uint256 => Royalty) private _royalties;

    constructor() ERC721("MyNFT", "MNFT") {}

    // Função de mintagem para criar novos NFTs
    function mint(uint256 tokenId, address royaltyReceiver, uint96 feeNumerator) external onlyOwner {
        _mint(msg.sender, tokenId);
        _setRoyalty(tokenId, royaltyReceiver, feeNumerator);
    }

    // Configurar informações de royalties para um token específico
    function _setRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal {
        require(receiver != address(0), "Destinatário inválido");
        require(feeNumerator <= 10000, "Taxa de royalty excede 10000 pontos base");

        _royalties[tokenId] = Royalty(receiver, feeNumerator);
    }

    // Implementando a função royaltyInfo da IERC2981
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        Royalty memory royalty = _royalties[tokenId];
        royaltyAmount = (salePrice * royalty.feeNumerator) / 10000;
        return (royalty.receiver, royaltyAmount);
    }
}

Explicação do Código

  1. Coleção de NFTs: Criamos um contrato simples de NFT ERC721 chamado MyNFT, que inclui funcionalidades para mintar tokens e definir informações de royalties.

  2. Estrutura de Royalties: Uma struct Royalty é definida para armazenar o endereço do destinatário e a porcentagem da taxa de royalty.

  3. Função de Mintagem:

    • A função mint permite que o proprietário crie um novo NFT.
    • Ela recebe o ID do token, endereço do destinatário e a porcentagem da taxa como parâmetros e chama a função interna _setRoyalty.
  4. Configuração de Royalties:

    • A função _setRoyalty armazena as informações de royalties no mapeamento _royalties.
    • Ela verifica se o endereço do destinatário é válido e garante que a taxa não exceda 100%.
  5. Informações de Royalties:

    • A função royaltyInfo retorna o endereço do destinatário do royalty e o valor calculado do royalty para um determinado ID de token e preço de venda usando a fórmula (salePrice * feeNumerator) / 10000.

Testando a Função de Royalties

Uma vez que o contrato esteja implantado, você pode testar a funcionalidade de royalties mintando um NFT e simulando uma venda. Aqui está um exemplo simples de como verificar as informações de royalties:

// Exemplo: Verificando informações de royalties para o token ID 1 e um preço de venda de 1 ether

address receiver;
uint256 royaltyAmount;

// Supondo que o token ID 1 tenha sido mintado com uma taxa de royalty de 500 (5%)
(receiver, royaltyAmount) = myNFT.royaltyInfo(1, 1 ether);

// receiver deve ser o endereço definido durante a mintagem
// royaltyAmount deve ser 0.05 ether (500 / 10000 * 1 ether)

Conclusão

O EIP-2981 fornece uma maneira robusta e confiável para os criadores de NFTs receberem royalties contínuos de vendas secundárias. Ao implementar a interface IERC2981 em seus contratos inteligentes de NFT, você pode garantir que sua estrutura de royalties seja respeitada em marketplaces e plataformas compatíveis.

Nesta lição, você aprendeu como integrar o padrão de royalties EIP-2981 em um contrato NFT ERC721, o que não apenas protege os direitos dos criadores, mas também os motiva a continuar produzindo arte digital e ativos valiosos.

Did you like this article? Rate it from 1 to 5:

Thank you for voting!