Lição 121: Padrão de Multi-Token ERC1155
Introdução
O ERC1155 é um padrão de multi-token na blockchain do Ethereum que permite que um único contrato gerencie múltiplos tipos de tokens. Ele possibilita a criação de tokens fungíveis, não fungíveis e semi-fungíveis dentro do mesmo contrato, tornando-se uma ferramenta poderosa para desenvolvedores no crescente espaço de NFTs e aplicações relacionadas.
Nesta lição, fornecerei uma visão geral do padrão ERC1155, abordarei suas funcionalidades principais e ilustrar sua implementação com exemplos de código.
Principais Características do ERC1155
-
Transferências em Lote: Ao contrário do ERC20 e ERC721, o ERC1155 permite o envio de múltiplos tipos de tokens (ou quantidades do mesmo tipo) em uma única transação, o que pode melhorar a eficiência e reduzir os custos de gás.
-
Gestão com um Único Contrato: É possível gerenciar vários tipos de tokens (tanto fungíveis quanto não fungíveis) usando um único contrato inteligente, simplificando o processo de desenvolvimento e implantação.
-
Gestão de Ativos Flexível: O ERC1155 permite que os desenvolvedores definam a propriedade e o suprimento para cada tipo de token, o que abre novas aplicações além dos tokens tradicionais.
Funções Principais do ERC1155
1. Criação de Tokens
Tokens podem ser criados usando a função mint
. Esta função permite que você crie novos tokens de diferentes tipos.
2. Transferência de Tokens
As funções safeTransferFrom
e safeBatchTransferFrom
permitem a transferência de tokens entre endereços, seja um de cada vez ou em lote.
3. Metadados
O ERC1155 suporta URIs de tokens, que podem ser usadas para fornecer metadados adicionais para cada tipo de token.
Implementando o ERC1155
Vamos implementar um contrato simples de token ERC1155 utilizando a biblioteca da OpenZeppelin, que fornece implementações seguras e validadas pela comunidade de vários padrões Ethereum.
Instalação
Para usar a OpenZeppelin, você precisará instalá-la em seu projeto Solidity:
npm install @openzeppelin/contracts
Exemplo de Contrato
Aqui está um exemplo de contrato ERC1155:
// 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 {
// Mapeamento de ID do token para fornecimento do token
mapping(uint256 => string) private _tokenURIs;
constructor() ERC1155("https://minhaapi.com/api/token/{id}.json") {}
function mint(
address account,
uint256 id,
uint256 amount,
bytes memory data
) public onlyOwner {
_mint(account, id, amount, data);
}
function mintBatch(
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) public onlyOwner {
_mintBatch(to, ids, amounts, data);
}
function setURI(uint256 id, string memory newuri) public onlyOwner {
_tokenURIs[id] = newuri;
}
function uri(uint256 id) public view override returns (string memory) {
return _tokenURIs[id];
}
}
Análise do Contrato
-
Herdando Funções: O contrato herda de
ERC1155
eOwnable
, oferecendo todas as funcionalidades do ERC1155 e restringindo algumas funções apenas ao proprietário do contrato. -
Construtor: O construtor inicializa a URI base que aponta para os metadados de cada tipo de token.
-
Criação de Tokens: A função
mint
permite que o proprietário crie novos tokens de um ID específico (representando diferentes ativos) para um endereço específico. A funçãomintBatch
faz o mesmo para múltiplos tokens ao mesmo tempo. -
Gestão de URI: A função
setURI
atualiza a URI de metadados para um ID de token específico. A funçãouri
recupera a URI para um token.
Usando o Contrato
Criando Tokens
Para criar um novo token, você pode chamar a função mint
a partir da conta do proprietário.
meuMultiToken.mint(msg.sender, tokenId, amount, "");
Transferindo Tokens
Para transferir tokens, você pode usar a função safeTransferFrom
:
meuMultiToken.safeTransferFrom(msg.sender, destinatario, tokenId, amount, "");
Para transferências em lote, utilize:
uint256[] memory tokenIds = new uint256[](2);
tokenIds[0] = tokenId1;
tokenIds[1] = tokenId2;
uint256[] memory amounts = new uint256[](2);
amounts[0] = amount1;
amounts[1] = amount2;
meuMultiToken.safeBatchTransferFrom(msg.sender, destinatario, tokenIds, amounts, "");
Conclusão
O padrão ERC1155 é um avanço significativo no campo dos padrões de tokens na blockchain do Ethereum. Sua capacidade de lidar com múltiplos tipos de tokens dentro de um único contrato, juntamente com as capacidades de transferências em lote, torna-o uma solução preferida para aplicações descentralizadas que buscam minimizar custos de gás e agilizar as interações.
Nesta lição, exploramos os conceitos fundamentais do ERC1155, destacamos suas principais características e construímos uma implementação simples utilizando a biblioteca da OpenZeppelin. A flexibilidade do ERC1155 abre inúmeras oportunidades para desenvolvedores que atuam em NFTs, jogos e outras áreas da tecnologia blockchain.