Aula 122: Padrões Avançados de Token
Nesta aula, vamos nos aprofundar nos padrões avançados de token no Ethereum, explorando especificamente os padrões ERC721 e ERC1155. Esses padrões vão além do token básico ERC20 e permitem que os desenvolvedores criem tokens não fungíveis (NFTs) e tokens semi-fungíveis, respectivamente. Vamos discutir suas funcionalidades, implementação e fornecer um código de exemplo para ilustrar como funcionam.
ERC721: Tokens Não Fungíveis
O padrão ERC721 permite a criação de tokens não fungíveis (NFTs), que são únicos e não podem ser trocados em uma base um-para-um. Isso torna o ERC721 ideal para ativos digitais como arte, colecionáveis e itens de jogos.
Principais Funcionalidades do ERC721
- Unicidade: Cada token possui um identificador único.
- Propriedade: Cada token pode ser possuído e transferido por diferentes usuários.
- Metadados: Os tokens podem carregar informações adicionais, como descrições e imagens.
Implementação do ERC721
Aqui está uma implementação básica de um token ERC721 em Solidity:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MeuNFT is ERC721, Ownable {
uint256 public proximoTokenId;
mapping(uint256 => string) private _tokenURIs;
constructor() ERC721("MeuNFT", "MNFT") {}
function mint(string memory uri) public onlyOwner {
uint256 tokenId = proximoTokenId;
proximoTokenId++;
_mint(msg.sender, tokenId);
_setTokenURI(tokenId, uri);
}
function _setTokenURI(uint256 tokenId, string memory uri) internal {
_tokenURIs[tokenId] = uri;
}
function tokenURI(uint256 tokenId) public view returns (string memory) {
return _tokenURIs[tokenId];
}
}
Explicação
- O contrato herda de
ERC721
eOwnable
da biblioteca OpenZeppelin. proximoTokenId
: Uma variável para rastrear o próximo ID do token a ser cunhado.mint
: Uma função que permite ao proprietário cunhar um novo NFT e definir sua URI de metadados.tokenURI
: Uma função de visualização pública que retorna a URL de metadados para um determinado token.
ERC1155: Padrão de Multi-Token
O padrão ERC1155 permite a criação de tokens fungíveis e não fungíveis dentro de um único contrato. Essa flexibilidade é especialmente útil para aplicações de jogos ou plataformas que precisam gerenciar vários tipos de ativos.
Principais Funcionalidades do ERC1155
- Transferências em Lote: A capacidade de transferir múltiplos tipos de tokens em uma única transação.
- Eficiência de Gás: Mais eficiente do que implantar vários contratos para tokens fungíveis e não fungíveis.
- Gerenciamento de URI: Suporta URIs de metadados para tokens fungíveis e não fungíveis.
Implementação do ERC1155
Aqui está uma implementação simples de um token ERC1155 em Solidity:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MeuMultiToken is ERC1155, Ownable {
uint256 public constant TOKEN_FUNGIVEL = 0;
uint256 public constant TOKEN_NAO_FUNGIVEL = 1;
constructor() ERC1155("https://api.exemplo.com/metadados/{id}.json") {}
function mintFungivel(address conta, uint256 quantidade) public onlyOwner {
_mint(conta, TOKEN_FUNGIVEL, quantidade, "");
}
function mintNaoFungivel(address conta) public onlyOwner {
_mint(conta, TOKEN_NAO_FUNGIVEL, 1, "");
}
function mintLote(address conta, uint256[] memory ids, uint256[] memory quantidades) public onlyOwner {
_mintBatch(conta, ids, quantidades, "");
}
}
Explicação
- O contrato herda de
ERC1155
eOwnable
. TOKEN_FUNGIVEL
eTOKEN_NAO_FUNGIVEL
: Constantes usadas para identificar diferentes tipos de token.mintFungivel
emintNaoFungivel
: Funções para cunhar os respectivos tipos de token.mintLote
: Permite a cunhagem de múltiplos tipos de token em uma única operação.
Conclusão
Nesta aula, exploramos padrões avançados de token, sendo o ERC721 para tokens não fungíveis e o ERC1155 para padrões de multi-token. Esses padrões expandem as possibilidades do que pode ser construído no Ethereum e possibilitam aplicações ricas em áreas como jogos, arte digital e muito mais.
Entender e utilizar esses padrões permitirá que você crie aplicações descentralizadas (DApps) diversas e inovadoras. Boa programação!