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
-
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. -
Estrutura de Royalties: Uma struct
Royalty
é definida para armazenar o endereço do destinatário e a porcentagem da taxa de royalty. -
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
.
- A função
-
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%.
- A função
-
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
.
- A função
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.