Saltar al contenido principal
Change page

Estándar multitoken ERC-1155

Introducción

Una interfaz estándar para contratos que gestionan múltiples tipos de tokens. Un único contrato implementado puede incluir cualquier combinación de tokens fungibles, tokens no fungibles u otras configuraciones (por ejemplo, tokens semifungibles).

¿Qué significa estándar multitoken?

La idea es simple y busca crear una interfaz de contrato inteligente que pueda representar y controlar cualquier cantidad de tipos de tokens fungibles y no fungibles. De esta manera, el token ERC-1155 puede realizar las mismas funciones que un token ERC-20 y ERC-721, e incluso ambos al mismo tiempo. Mejora la funcionalidad de los estándares ERC-20 y ERC-721, haciéndolo más eficiente y corrigiendo errores de implementación evidentes.

El token ERC-1155 se describe completamente en el EIP-1155 (opens in a new tab).

Requisitos previos

Para comprender mejor esta página, le recomendamos que primero lea sobre los estándares de tokens, ERC-20 y ERC-721.

Funciones y características de ERC-1155:

Transferencias por lotes

La transferencia por lotes funciona de manera muy similar a las transferencias regulares de ERC-20. Veamos la función transferFrom regular de ERC-20:

La única diferencia en ERC-1155 es que pasamos los valores como una matriz (array) y también pasamos una matriz de identificadores (ids). Por ejemplo, dados ids=[3, 6, 13] y values=[100, 200, 5], las transferencias resultantes serán:

  1. Transferir 100 tokens con el id 3 de _from a _to.
  2. Transferir 200 tokens con el id 6 de _from a _to.
  3. Transferir 5 tokens con el id 13 de _from a _to.

En ERC-1155 solo tenemos transferFrom, no hay transfer. Para usarlo como un transfer regular, simplemente establezca la dirección de origen (from) a la dirección que está llamando a la función.

Saldo por lotes

La respectiva llamada balanceOf de ERC-20 también tiene su función asociada con soporte por lotes. Como recordatorio, esta es la versión de 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);

Aún más simple para la llamada de saldo, podemos recuperar múltiples saldos en una sola llamada. Pasamos la matriz de propietarios, seguida de la matriz de identificadores de tokens.

Por ejemplo, dados _ids=[3, 6, 13] y _owners=[0xbeef..., 0x1337..., 0x1111...], el valor de retorno será:

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

Aprobación por lotes

Las aprobaciones son ligeramente diferentes a las de ERC-20. En lugar de aprobar cantidades específicas, se establece un operador como aprobado o no aprobado a través de setApprovalForAll.

La lectura del estado actual se puede hacer a través de isApprovedForAll. Como puede ver, es una operación de todo o nada. No puede definir cuántos tokens aprobar ni siquiera qué clase de token.

Esto está diseñado intencionalmente teniendo en cuenta la simplicidad. Solo puede aprobar todo para una dirección.

Hook de recepción

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

Dado el soporte de EIP-165 (opens in a new tab), ERC-1155 admite hooks de recepción solo para contratos inteligentes. La función del hook debe devolver un valor mágico predefinido de bytes4 que se da como:

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

Cuando el contrato receptor devuelve este valor, se asume que el contrato acepta la transferencia y sabe cómo manejar los tokens ERC-1155. ¡Genial, no más tokens atascados en un contrato!

Soporte para NFT

Cuando el suministro es solo uno, el token es esencialmente un token no fungible (NFT). Y como es estándar para ERC-721, puede definir una URL de metadatos. La URL puede ser leída y modificada por los clientes, consulte aquí (opens in a new tab).

Regla de transferencia segura

Ya hemos mencionado algunas reglas de transferencia segura en las explicaciones anteriores. Pero veamos la más importante de las reglas:

  1. El llamador debe estar aprobado para gastar los tokens de la dirección _from o el llamador debe ser igual a _from.
  2. La llamada de transferencia debe revertir si:
    1. La dirección _to es 0.
    2. La longitud de _ids no es la misma que la longitud de _values.
    3. Cualquiera de los saldos de los titulares para los tokens en _ids es menor que las cantidades respectivas en _values enviadas al destinatario.
    4. Ocurre cualquier otro error.

Nota: Todas las funciones por lotes, incluido el hook, también existen como versiones sin lotes. Esto se hace por eficiencia de gas, considerando que transferir solo un activo probablemente seguirá siendo la forma más utilizada. Las hemos omitido por simplicidad en las explicaciones, incluidas las reglas de transferencia segura. Los nombres son idénticos, solo hay que eliminar la palabra 'Batch'.

Más información