Ir al contenido principal
Change page

Estándar multitoken ERC-1155

Última actualización de la página: 22 de octubre de 2025

Introducción

Una interfaz para contratos que administran múltiples tipos de tokens. Un único contrato desplegado puede incluir cualquier combinación de tokens fungibles, tokens no fungibles u otras configuraciones (p. ej., tokens semifungibles).

¿Qué se entiende por estándar de múltiples tokens?

La idea es simple y busca crear una interfaz de contrato inteligente que pueda representar y controlar cualquier cantidad y tipo de token fungible y no fungible. De este modo, el token ERC-1155 puede realizar las mismas funciones que un token ERC-20 y un token ERC-721, e incluso ambas al mismo tiempo. Mejora el funcionamiento de los estándares ERC-20 y ERC-721, haciéndolos más eficientes y corrigiendo errores obvios de implementación.

El token ERC-1155 se describe en su totalidad en el EIP-1155opens in a new tab.

Requisitos previos

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

Funciones y características del ERC-1155:

Transferencias por lotes

Las tranferencias en lote funcionan de manera muy similar a las transferencias regulares ERC-20. Echemos un vistazo a la función transferFrom del ERC-20 normal:

1// ERC-20
2function transferFrom(address from, address to, uint256 value) external returns (bool);
3
4// ERC-1155
5function safeBatchTransferFrom(
6 address _from,
7 address _to,
8 uint256[] calldata _ids,
9 uint256[] calldata _values,
10 bytes calldata _data
11) external;
Mostrar todo

La unica diferencia en ERC-1155 es que nosotros pasamos los valores en forma de array y tambien pasamos un array de ID. 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 el ERC-1155 solo tenemos transferFrom, no transfer. Para utilizarla como una transfer normal, simplemente establezca la dirección de origen en la dirección que llama a la función.

Saldo por lotes

La respectiva llamada balanceOf del ERC-20 también tiene su función homóloga con soporte para lotes. Como recordatorio, esta es la versión de ERC-20:

1// ERC-20
2function balanceOf(address owner) external view returns (uint256);
3
4// ERC-1155
5function balanceOfBatch(
6 address[] calldata _owners,
7 uint256[] calldata _ids
8) 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 matríz de propietarios, seguida de la matríz de identificadores de token.

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

1[
2 balanceOf(0xbeef...),
3 balanceOf(0x1337...),
4 balanceOf(0x1111...)
5]

Aprobación por lotes

1// ERC-1155
2function setApprovalForAll(
3 address _operator,
4 bool _approved
5) external;
6
7function isApprovedForAll(
8 address _owner,
9 address _operator
10) external view returns (bool);
Mostrar todo

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 puede hacerse a través de isApprovedForAll. Como puede ver, es una operación de todo o nada. No puede definir cuántos tokens aprobar ni qué clase de token.

Esto se diseñó así intencionalmente pensando en la simplicidad. Solamente puede aprobar todo para una dirección.

Hook de recepción

1function onERC1155BatchReceived(
2 address _operator,
3 address _from,
4 uint256[] calldata _ids,
5 uint256[] calldata _values,
6 bytes calldata _data
7) external returns(bytes4);

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

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

Cuando el contrato de recepción muestra este valor, asumimos que el contrato acepta la transferencia y sabe cómo manejar los tokens ERC-1155. ¡Genial, no más tokens estancados en un contrato!

Compatibilidad con NFT

Cuando el suministro es solo 1, 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, véase aquíopens in a new tab.

Regla de transferencia segura

Ya hemos hablado un poco acerca de algunas reglas de transferencia segura en explicaciones anteriores. Pero veamos las reglas más importantes:

  1. Quien realiza la llamada debe tener la aprobación para gastar los tokens de la dirección _from o debe ser el mismo que _from.
  2. La llamada de transferencia debe revertirse si
    1. La dirección _to es 0.
    2. la longitud de _ids no es la misma que la de _values.
    3. alguno de los saldos del(los) poseedor(es) para el(los) token(s) en _ids es inferior a la(s) cantidad(es) respectiva(s) en _values enviada(s) al destinatario.
    4. ocurre cualquier otro error.

Nota: todas las funciones por lotes, incluido el hook, también existen en versiones sin lotes. Esto se hace para la eficiencia del gas, considerando que la transferencia de un solo activo probablemente siga siendo la manera más comúnmente utilizada. Las hemos dejado de lado para mayor simplicidad en las explicaciones, incluidas las reglas de transferencia segura. Los nombres son identicos, solo quite el lote ("Batch").

Lecturas adicionales

¿Le ha resultado útil este artículo?