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:
- Transferencia por lotes: transfiere múltiples activos en una sola llamada.
- Saldo por lotes: obtiene los saldos de múltiples activos en una sola llamada.
- Aprobación por lotes: aprueba todos los tokens para una dirección.
- Hooks: hook para recibir tokens.
- Soporte para NFT: si el suministro es solo 1, se trata como un NFT.
- Reglas de transferencia segura: conjunto de reglas para una transferencia segura.
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:
// ERC-20
function transferFrom(address from, address to, uint256 value) external returns (bool);
// ERC-1155
function safeBatchTransferFrom(
address _from,
address _to,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external;
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:
- 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 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
// ERC-1155
function setApprovalForAll(
address _operator,
bool _approved
) external;
function isApprovedForAll(
address _owner,
address _operator
) external view returns (bool);
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:
- El llamador debe estar aprobado para gastar los tokens de la dirección
_fromo el llamador debe ser igual a_from. - La llamada de transferencia debe revertir si:
- La dirección
_toes 0. - La longitud de
_idsno es la misma que la longitud de_values. - Cualquiera de los saldos de los titulares para los tokens en
_idses menor que las cantidades respectivas en_valuesenviadas al destinatario. - Ocurre cualquier otro error.
- La dirección
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'.