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:
- Transferencia por lotes: transfiera múltiples activos en una sola llamada.
- Saldo por lotes: obtenga los saldos de múltiples activos en una sola llamada.
- Aprobación por lotes: apruebe todos los tokens para una dirección.
- Hooks: hook de recepción de tokens.
- Compatibilidad con NFT: si el suministro es de solo 1, trátelo como un NFT.
- Reglas de transferencia segura: conjunto de reglas para una transferencia segura.
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-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;Mostrar todoLa 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
- Transferir 100 tokens con el id 3 de
_froma_to. - Transferir 200 tokens con el id 6 de
_froma_to. - Transferir 5 tokens con el id 13 de
_froma_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-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);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-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Mostrar todoLas 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 _data7) 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:
- Quien realiza la llamada debe tener la aprobación para gastar los tokens de la dirección
_fromo debe ser el mismo que_from. - La llamada de transferencia debe revertirse si
- La dirección
_toes 0. - la longitud de
_idsno es la misma que la de_values. - alguno de los saldos del(los) poseedor(es) para el(los) token(s) en
_idses inferior a la(s) cantidad(es) respectiva(s) en_valuesenviada(s) al destinatario. - ocurre cualquier otro error.
- La dirección
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").