Padrão Multi-Token ERC-1155
Última atualização da página: 22 de outubro de 2025
Introdução
Uma interface padrão para contratos que gerenciam vários tipos de tokens. Um único contrato implementado pode incluir qualquer combinação de tokens fungíveis, tokens não fungíveis ou outras configurações (por exemplo, tokens semifungíveis).
O que se entende por padrão Multi-Token?
A ideia é simples e trata-se de criar uma interface de contratos inteligentes que possa representar e controlar qualquer número de tipos de token, fungíveis ou não fungíveis. Dessa forma, o token ERC-1155 pode executar as mesmas funções de um token ERC-20 e ERC-721, e até mesmo de ambos ao mesmo tempo. Ele melhora a funcionalidade de ambos os padrões ERC-20 e ERC-721, tornando-os mais eficientes e corrigindo erros óbvios de implementação.
O token ERC-1155 é descrito em detalhes na EIP-1155 (opens in a new tab).
Pré-requisitos
Para entender melhor esta página, recomendamos que você leia primeiro sobre os padrões de token, o ERC-20 e o ERC-721.
Funções e características do ERC-1155:
- Transferência em lote: transfira vários ativos em uma única chamada.
- Saldo em lote: obtenha os saldos de vários ativos em uma única chamada.
- Aprovação em lote: aprove todos os tokens para um endereço.
- Hooks: hook para recebimento de tokens.
- Suporte a NFT: se o fornecimento for de apenas 1, trate-o como um NFT.
- Regras de transferência segura: conjunto de regras para transferência segura.
Transferências em lote
As transferências em lote funcionam de forma muito semelhante às transferências regulares do ERC-20. Vejamos a função transferFrom regular do ERC-20:
1// ERC-202function transferFrom(address from, address to, uint256 value) external returns (bool);34// ERC-11555function safeBatchTransferFrom(6 address _from,7 address _to,8 uint256[] calldata _ids,9 uint256[] calldata _values,10 bytes calldata _data11) external;Exibir tudoA única diferença no ERC-1155 é que passamos os valores como um array e também passamos um array de ‘ids’. Por exemplo, dados ids=[3, 6, 13] e values=[100, 200, 5], as transferências resultantes serão
- Transferir 100 tokens com o id 3 de
_frompara_to. - Transferir 200 tokens com o id 6 de
_frompara_to. - Transferir 5 tokens com o id 13 de
_frompara_to.
No ERC-1155, só temos transferFrom, não transfer. Para usá-lo como um transfer regular, basta definir o endereço de origem como o endereço que está chamando a função.
Saldo em lote
A respectiva chamada balanceOf do ERC-20 também tem sua função parceira com suporte a lote. Como lembrete, esta é a versão do ERC-20:
1// ERC-202function balanceOf(address owner) external view returns (uint256);34// ERC-11555function balanceOfBatch(6 address[] calldata _owners,7 uint256[] calldata _ids8) external view returns (uint256[] memory);Ainda mais simples para a chamada de saldo, podemos recuperar saldos múltiplos em uma única chamada. Passamos a matriz de proprietários, seguida pela matriz dos IDs dos tokens.
Por exemplo, dados _ids=[3, 6, 13] e _owners=[0xbeef..., 0x1337..., 0x1111...], o valor de retorno será
1[2 balanceOf(0xbeef...),3 balanceOf(0x1337...),4 balanceOf(0x1111...)5]Aprovação em lote
1// ERC-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Exibir tudoAs aprovações são um pouco diferentes do ERC-20. Em vez de aprovar valores específicos, você define um operador como aprovado ou não aprovado através do setApprovalForAll.
A leitura do status atual pode ser feita através do isApprovedForAll. Como você pode ver, é uma operação de tudo ou nada. Você não pode definir quantos tokens aprovar ou mesmo quais classes de token.
Isto é intencionalmente concebido pensando na simplicidade. Você só pode aprovar tudo para um endereço.
Hook de recebimento
1function onERC1155BatchReceived(2 address _operator,3 address _from,4 uint256[] calldata _ids,5 uint256[] calldata _values,6 bytes calldata _data7) external returns(bytes4);Com o suporte da EIP-165 (opens in a new tab), o ERC-1155 suporta hooks de recebimento apenas para contratos inteligentes. A função de hook deve retornar um valor mágico predefinido de 4 bytes que é dado como:
1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))Quando o contrato de recebimento devolve este valor, assume-se que o contrato aceita a transferência e sabe como lidar com os tokens ERC-1155. Ótimo, nenhum token bloqueados em um contrato!
Suporte a NFT
Quando a oferta é apenas uma, o token é essencialmente um token não-fungível (NFT, pela sigla em inglês) E como é padrão para o ERC-721, você pode definir um URL de metadados. A URL pode ser lida e modificada pelos clientes, veja aqui (opens in a new tab).
Regra de transferência segura
Já abordamos algumas regras de transferência segura nas explicações anteriores. Mas vamos analisar as regras mais importantes:
- O chamador deve ser aprovado para gastar os tokens do endereço
_fromou o chamador deve ser igual a_from. - A chamada de transferência deve ser revertida caso
- O endereço
_toé 0. - O comprimento de
_idsnão é o mesmo que o comprimento de_values. - qualquer um dos saldos dos detentores de tokens em
_idsfor menor que as respectivas quantias em_valuesenviadas ao destinatário. - ocorra qualquer outro erro.
- O endereço
Nota: Todas as funções em lote, incluindo o hook, também existem como versões sem lote. Isto é feito para fins de eficiência do gás, já que é provável que a transferência de apenas um ativo continue sendo a maneira habitualmente mais utilizada. Por simplificar as explicações, as deixamos de lado, incluindo as regras de transferência segura. Os nomes são idênticos, basta eliminar a palavra "lote".