Pular para o conteúdo principal
Change page

Padrão de Múltiplos Tokens ERC-1155

Introdução

Uma interface padrão para contratos que gerenciam múltiplos tipos de tokens. Um único contrato implantado 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 significa Padrão de Múltiplos Tokens?

A ideia é simples e busca criar uma interface de contrato inteligente que possa representar e controlar qualquer número de tipos de tokens fungíveis e não fungíveis. Dessa forma, o token ERC-1155 pode executar as mesmas funções que um token ERC-20 e ERC-721, e até mesmo ambos ao mesmo tempo. Ele melhora a funcionalidade dos padrões ERC-20 e ERC-721, tornando-o mais eficiente e corrigindo erros óbvios de implementação.

O token ERC-1155 é totalmente descrito no EIP-1155 (opens in a new tab).

Pré-requisitos

Para entender melhor esta página, recomendamos que você leia primeiro sobre padrões de token, ERC-20 e ERC-721.

Funções e Recursos do ERC-1155:

Transferências em Lote

A transferência em lote funciona de forma muito semelhante às transferências regulares do ERC-20. Vamos dar uma olhada na função transferFrom regular do ERC-20:

A ú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

  1. Transferência de 100 tokens com id 3 de _from para _to.
  2. Transferência de 200 tokens com id 6 de _from para _to.
  3. Transferência de 5 tokens com id 13 de _from para _to.

No ERC-1155, temos apenas transferFrom, sem transfer. Para usá-lo como um transfer regular, basta definir o endereço de origem para 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:

// ERC-20
function balanceOf(address owner) external view returns (uint256);

// ERC-1155
function balanceOfBatch(
    address[] calldata _owners,
    uint256[] calldata _ids
) external view returns (uint256[] memory);

Ainda mais simples para a chamada de saldo, podemos recuperar múltiplos saldos em uma única chamada. Passamos o array de proprietários, seguido pelo array de ids de token.

Por exemplo, dados _ids=[3, 6, 13] e _owners=[0xbeef..., 0x1337..., 0x1111...], o valor de retorno será

[
    balanceOf(0xbeef...),
    balanceOf(0x1337...),
    balanceOf(0x1111...)
]

Aprovação em Lote

As aprovações são um pouco diferentes do ERC-20. Em vez de aprovar quantias específicas, você define um operador como aprovado ou não aprovado via setApprovalForAll.

A leitura do status atual pode ser feita via isApprovedForAll. Como você pode ver, é uma operação de tudo ou nada. Você não pode definir quantos tokens aprovar ou mesmo qual classe de token.

Isso foi intencionalmente projetado com a simplicidade em mente. Você só pode aprovar tudo para um endereço.

Hook de Recebimento

function onERC1155BatchReceived(
    address _operator,
    address _from,
    uint256[] calldata _ids,
    uint256[] calldata _values,
    bytes calldata _data
) external returns(bytes4);

Dado o suporte ao 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 bytes4 que é dado como:

bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))

Quando o contrato receptor retorna esse valor, presume-se que o contrato aceita a transferência e sabe como lidar com os tokens ERC-1155. Ótimo, chega de tokens presos em um contrato!

Suporte a NFT

Quando a oferta é de apenas um, o token é essencialmente um token não fungível (NFT). E como é padrão para o ERC-721, você pode definir uma URL de metadados. A URL pode ser lida e modificada por 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 dar uma olhada na mais importante das regras:

  1. O chamador deve ser aprovado para gastar os tokens para o endereço _from ou o chamador deve ser igual a _from.
  2. A chamada de transferência deve reverter se
    1. O endereço _to for 0.
    2. O comprimento de _ids não for o mesmo que o comprimento de _values.
    3. Qualquer um dos saldos do(s) detentor(es) para o(s) token(s) em _ids for menor que a(s) respectiva(s) quantia(s) em _values enviada(s) ao destinatário.
    4. Ocorrer qualquer outro erro.

Nota: Todas as funções em lote, incluindo o hook, também existem como versões sem lote. Isso é feito para eficiência de gás, considerando que transferir apenas um ativo provavelmente ainda será a maneira mais comumente usada. Nós as deixamos de fora por simplicidade nas explicações, incluindo as regras de transferência segura. Os nomes são idênticos, basta remover o 'Batch'.

Leitura adicional