Estándar multitoken ERC-1155
Última edición: @Andrea00P(opens in a new tab), 15 de agosto de 2023
Introducción
Una interfaz para contratos que administran múltiples tipos de tokens. Un solo contrato implementado podría incluir cualquier combinación de tokens fungibles, tokens no fungibles u otras configuraciones (por ejemplo, tokens semifungibles).
¿Qué se entiende por estándar multitoken?
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 esta manera, los tokens ERC-1155 pueden hacer las mismas funciones que los tokens ERC-20 y los tokens 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 completamente en EIP-1155(opens in a new tab).
Requisitos previos
Para una mejor comprensión de esta página, recomendamos que primero lea acerca de los estándares de token, ERC-20 y ERC-721.
Características y funciones de ERC-1155:
- Transferencia en lotes: transfiera múltiples activos en una sola llamada.
- Saldos en lote: obtenga saldos de multiples activos en una sola llamada.
- Aprobación en lote: apruebe todos los tokens en una dirección.
- Hooks: reciba hooks de tokens.
- Compatibilidad con NFT: si el suministro solo es 1, trátelo como un NFT.
- Reglas de transferencia segura: conjunto de reglas para una transferencia segura.
Transferencias en lote
Las tranferencias en lote funcionan de manera muy similar a las transferencias regulares ERC-20. Veamos la funcion regular transferFrom
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;Mostrar todoCopiar
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, en el caso de ids=[3, 6, 13]
y values=[100, 200, 5]
, la transferencia resultante será
- Transferir 100 tokens con el ID 3 de
_from
a_to
. - Transferir 200 tokens con el ID 6 de
_from
a_to
. - Transferir 5 tokens con el ID 13 de
_from
a_to
.
En ERC-1155 solo tenemos transferFrom
, no transfer
. Para usarlo como una transferencia
normal, solo hay que poner en la dirección de origen la dirección que llama a la función.
Saldos en lote
La respectiva llamada de ERC-20 balanceOf
también tiene su función socia 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);Copiar
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, para _ids=[3, 6, 13]
y _owners=[0xbeef..., 0x1337..., 0x1111...]
, el valor para mostrar será
1[2 balanceOf(0xbeef...),3 balanceOf(0x1337...),4 balanceOf(0x1111...)5]Copiar
Aprobación en 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 todoCopiar
Las aprobaciones son ligeramente diferentes a las de ERC-20. En lugar de aprobar cantidades especificas, establece un operador en aprobado o no aprobado mediante setApprovalForAll
.
La lectura del estado actual puede realizarse con 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);Copiar
Dada la compatibilidad con EIP-165(opens in a new tab), ERC-1155 admite hooks de recepción para contratos inteligentes solamente. La función hook debe devolver un valor mágico predefinido bytes4 que es dado como:
1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))Copiar
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 clientes, ver 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:
- El llamante debe ser aprobado para gastar los tokens para la dirección
_from
o el llamante debe ser igual a_from
. - La llamada de transferencia debe revertirse si
- la dirección
_to
es 0. - la longitud de
_ids
no es igual a la longitud de_values
. - cualquier balance(s) del tenedor(es) del token(s) en
_ids
es menor(es) que el monto (los montos) respectivo(s) en_values
enviado al destinatario. - ocurre cualquier otro error.
- la dirección
Nota: Todas las funciones de lote, incluyendo hook, también existen como versiones sin lote. 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").