SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
09.12.2024

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

  1. Importações e Configuração:

    • Importamos as classes ERC721, Address e Ownable da biblioteca de contratos OpenZeppelin para construir nosso contrato NFT.
  2. Estrutura Royalty:

    • Criamos uma estrutura Royalty para representar o destinatário dos royalties e o percentual a ser pago.
  3. Mapeamento para Royalties:

    • Armazenamos royalties para cada token NFT usando um mapeamento de IDs de token para estruturas Royalty.
  4. 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.
  5. Obtendo Informações de Royalties:

    • A função getRoyaltyInfo retorna o endereço do destinatário e o percentual para o tokenId especificado.
  6. 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.

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.

Video

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

Thank you for voting!