Lição 276: Implementando Royalties em NFTs
Nos últimos anos, os Tokens Não Fungíveis (NFTs) revolucionaram a forma como pensamos sobre posse em arte digital e colecionáveis. Um dos principais avanços associados aos NFTs é o conceito de royalties, permitindo que criadores recebam uma porcentagem das vendas sempre que seu trabalho é revendido. Esta lição se concentrará em como implementar royalties em NFTs baseados em Ethereum usando a linguagem de programação Solidity.
O Que São Royalties?
Royalties são uma forma pela qual os criadores ganham uma comissão com as vendas secundárias de suas obras de arte ou conteúdo. Isso é essencial para artistas e criadores que desejam um suporte contínuo gerado pela venda de seus tokens, em vez de apenas um pagamento único.
ERC-721 e Royalties
O padrão ERC-721 é o padrão mais comum para NFTs na Ethereum. Embora o padrão ERC-721 em si não inclua suporte para royalties, podemos estender a implementação básica para incluir a lógica de royalties.
Exemplo de Implementação Básica
Primeiro, certifique-se de ter a configuração necessária para escrever e implantar contratos em Solidity. Abaixo está uma implementação simplificada de um contrato ERC-721 com suporte a royalties.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract RoyaltyNFT is ERC721, Ownable {
using Address for address;
struct Royalty {
address destinatário;
uint256 percentual; // percentual em pontos base (1 ponto base = 0,01%)
}
mapping(uint256 => Royalty) private _royalties;
constructor() ERC721("RoyaltyNFT", "RNFT") {}
function mintNFT(address para, uint256 tokenId, address destinatárioRoyalty, uint256 percentualRoyalty) public onlyOwner {
require(percentualRoyalty <= 10000, "Percentual de royalty excede o limite"); // max 100%
_mint(para, tokenId);
_setRoyalty(tokenId, destinatárioRoyalty, percentualRoyalty);
}
function _setRoyalty(uint256 tokenId, address destinatário, uint256 percentual) internal {
_royalties[tokenId] = Royalty(destinatário, percentual);
}
function getRoyaltyInfo(uint256 tokenId) public view returns (address destinatário, uint256 percentual) {
Royalty memory royalty = _royalties[tokenId];
return (royalty.destinatário, royalty.percentual);
}
// Esta função pode ser chamada quando o NFT for vendido
function calcularRoyalty(uint256 tokenId, uint256 preçoVenda) external view returns (uint256) {
Royalty memory royalty = _royalties[tokenId];
return (preçoVenda * royalty.percentual) / 10000; // Utilize pontos base para o cálculo
}
}
Explicação do Código
-
Importações e Configuração:
- Importamos as classes
ERC721
,Address
eOwnable
da biblioteca de contratos OpenZeppelin para construir nosso contrato NFT.
- Importamos as classes
-
Estrutura Royalty:
- Criamos uma estrutura
Royalty
para representar o destinatário dos royalties e o percentual a ser pago.
- Criamos uma estrutura
-
Mapeamento para Royalties:
- Armazenamos royalties para cada token NFT usando um mapeamento de IDs de token para estruturas
Royalty
.
- Armazenamos royalties para cada token NFT usando um mapeamento de IDs de token para estruturas
-
Função de Mintagem:
- A função
mintNFT
permite que o proprietário crie um NFT e defina as informações de royalties ao mesmo tempo.
- A função
-
Obtendo Informações de Royalties:
- A função
getRoyaltyInfo
retorna o endereço do destinatário e o percentual para o tokenId especificado.
- A função
-
Calculando Royalties:
- A função
calcularRoyalty
calcula o valor do royalty com base no preço de venda e no percentual especificado para aquele token.
- A função
Vendendo e Pagando Royalties
Em um cenário do mundo real, quando o NFT é vendido, você normalmente integraria isso a um contrato de marketplace ou a uma função de contrato inteligente responsável pelo processamento das vendas. Essa função deve gerenciar o pagamento ao vendedor e incluir a lógica de pagamento dos royalties ao criador original a partir da receita da venda.
Exemplo de Transferência e Pagamento de Royalties
Aqui está como você poderia implementar uma função de transferência que também leva em consideração os pagamentos de royalties durante uma venda.
function transferNFT(address de, address para, uint256 tokenId, uint256 preçoVenda) public {
// Transferir o NFT
transferFrom(de, para, tokenId);
// Calcular royalties
uint256 valorRoyalty = calcularRoyalty(tokenId, preçoVenda);
// Transferir royalty para o criador original
payable(_royalties[tokenId].destinatário).transfer(valorRoyalty);
}
Conclusão
Implementar royalties em seus contratos NFT permite que artistas e criadores de conteúdo recebam uma compensação contínua com as vendas secundárias. Este guia forneceu uma compreensão fundamental de como integrar royalties usando o padrão ERC-721 com Solidity. À medida que o ecossistema blockchain evolui, é importante manter-se atualizado com as melhores práticas e padrões que fortalecem a economia criadora.