Ir al contenido principal
Change page

Estándar de token de pago ERC-1363

Última actualización de la página: 4 de abril de 2025

Introducción

¿Qué es ERC-1363?

ERC-1363 es una interfaz de extensión para tokens ERC-20 que permite ejecutar una lógica personalizada en un contrato receptor después de las transferencias, o en un contrato gastador después de las aprobaciones, todo dentro de una única transacción.

Diferencias con ERC-20

Las operaciones estándar de ERC-20 como transfer, transferFrom y approve, no permiten la ejecución de código en el contrato receptor o gastador sin una transacción separada. Esto introduce complejidad en el desarrollo de la interfaz de usuario y fricción en la adopción porque los usuarios deben esperar a que se ejecute la primera transacción y luego enviar la segunda. También deben pagar el GAS dos veces.

ERC-1363 hace que los tokens fungibles sean capaces de realizar acciones más fácilmente y de funcionar sin el uso de ningún oyente fuera de la cadena. Permite realizar una llamada de retorno («callback») en un contrato receptor o gastador, después de una transferencia o una aprobación, en una única transacción.

Requisitos previos

Para comprender mejor esta página, le recomendamos que primero lea sobre:

Cuerpo

ERC-1363 introduce una API estándar para que los tokens ERC-20 interactúen con contratos inteligentes después de transfer, transferFrom o approve.

Este estándar proporciona una funcionalidad básica para transferir tokens, además de permitir que los tokens se aprueben para que puedan ser gastados por un tercero en la cadena, y luego realizar una llamada de retorno («callback») en el contrato receptor o gastador.

Existen muchos usos propuestos para los contratos inteligentes que pueden aceptar las llamadas de retorno («callbacks») de ERC-20.

Algunos ejemplos podrían ser:

  • Ventas colectivas: los tokens enviados activan la asignación instantánea de recompensas.
  • Servicios: el pago activa el acceso al servicio en un solo paso.
  • Facturas: los tokens liquidan las facturas automáticamente.
  • Suscripciones: la aprobación de la tarifa anual activa la suscripción con el pago del primer mes.

Por estas razones, se le denominó originalmente «token de pago».

El comportamiento de la llamada de retorno («callback») amplía aún más su utilidad, permitiendo interacciones fluidas como:

  • Staking: los tokens transferidos activan el bloqueo automático en un contrato de staking.
  • Votación: los tokens recibidos registran los votos en un sistema de gobernanza.
  • Intercambio (swapping): las aprobaciones de tokens activan la lógica de intercambio en un solo paso.

Los tokens ERC-1363 pueden utilizarse para utilidades específicas en todos los casos que requieran la ejecución de una llamada de retorno («callback») después de recibir una transferencia o una aprobación. ERC-1363 también es útil para evitar la pérdida o el bloqueo de tokens en los contratos inteligentes al verificar la capacidad del destinatario para gestionar los tokens.

A diferencia de otras propuestas de extensión de ERC-20, ERC-1363 no anula los métodos transfer y transferFrom de ERC-20 y define los ID de las interfaces que se deben implementar, manteniendo la compatibilidad con versiones anteriores de ERC-20.

De EIP-1363opens in a new tab:

Métodos

Los contratos inteligentes que implementan el estándar ERC-1363 DEBEN implementar todas las funciones de la interfaz ERC1363, así como las interfaces ERC20 y ERC165.

1pragma solidity ^0.8.0;
2
3/**
4 * @título ERC1363
5 * @dev Una interfaz de extensión para tokens ERC-20 que permite ejecutar código en un contrato receptor
6 * después de `transfer` o `transferFrom`, o código en un contrato gastador después de `approve`, en una sola transacción.
7 */
8interface ERC1363 is ERC20, ERC165 {
9 /*
10 * NOTA: el identificador de ERC-165 para esta interfaz es 0xb0202a11.
11 * 0xb0202a11 ===
12 * bytes4(keccak256('transferAndCall(address,uint256)')) ^
13 * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
14 * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
15 * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
16 * bytes4(keccak256('approveAndCall(address,uint256)')) ^
17 * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
18 */
19
20 /**
21 * @dev Mueve una cantidad de tokens de `valor` de la cuenta del remitente a `to`
22 * y luego llama a `ERC1363Receiver::onTransferReceived` en `to`.
23 * @param to La dirección a la que se están transfiriendo los tokens.
24 * @param value La cantidad de tokens que se van a transferir.
25 * @return Un valor booleano que indica que la operación se ha realizado correctamente a menos que se produzca una excepción.
26 */
27 function transferAndCall(address to, uint256 value) external returns (bool);
28
29 /**
30 * @dev Mueve una cantidad de tokens de `valor` de la cuenta del remitente a `to`
31 * y luego llama a `ERC1363Receiver::onTransferReceived` en `to`.
32 * @param to La dirección a la que se están transfiriendo los tokens.
33 * @param value La cantidad de tokens que se van a transferir.
34 * @param data Datos adicionales sin formato específico, enviados en la llamada a `to`.
35 * @return Un valor booleano que indica que la operación se ha realizado correctamente a menos que se produzca una excepción.
36 */
37 function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
38
39 /**
40 * @dev Mueve una cantidad de tokens de `valor` de `from` a `to` utilizando el mecanismo de asignación
41 * y luego llama a `ERC1363Receiver::onTransferReceived` en `to`.
42 * @param from La dirección desde la que se envían los tokens.
43 * @param to La dirección a la que se están transfiriendo los tokens.
44 * @param value La cantidad de tokens que se van a transferir.
45 * @return Un valor booleano que indica que la operación se ha realizado correctamente a menos que se produzca una excepción.
46 */
47 function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
48
49 /**
50 * @dev Mueve una cantidad de tokens de `valor` de `from` a `to` utilizando el mecanismo de asignación
51 * y luego llama a `ERC1363Receiver::onTransferReceived` en `to`.
52 * @param from La dirección desde la que se envían los tokens.
53 * @param to La dirección a la que se están transfiriendo los tokens.
54 * @param value La cantidad de tokens que se van a transferir.
55 * @param data Datos adicionales sin formato específico, enviados en la llamada a `to`.
56 * @return Un valor booleano que indica que la operación se ha realizado correctamente a menos que se produzca una excepción.
57 */
58 function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
59
60 /**
61 * @dev Establece una cantidad de tokens de `valor` como la asignación de `spender` sobre los tokens del remitente
62 * y luego llama a `ERC1363Spender::onApprovalReceived` en `spender`.
63 * @param spender La dirección que gastará los fondos.
64 * @param value La cantidad de tokens que se van a gastar.
65 * @return Un valor booleano que indica que la operación se ha realizado correctamente a menos que se produzca una excepción.
66 */
67 function approveAndCall(address spender, uint256 value) external returns (bool);
68
69 /**
70 * @dev Establece una cantidad de tokens de `valor` como la asignación de `spender` sobre los tokens del remitente
71 * y luego llama a `ERC1363Spender::onApprovalReceived` en `spender`.
72 * @param spender La dirección que gastará los fondos.
73 * @param value La cantidad de tokens que se van a gastar.
74 * @param data Datos adicionales sin formato específico, enviados en la llamada a `spender`.
75 * @return Un valor booleano que indica que la operación se ha realizado correctamente a menos que se produzca una excepción.
76 */
77 function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
78}
79
80interface ERC20 {
81 event Transfer(address indexed from, address indexed to, uint256 value);
82 event Approval(address indexed owner, address indexed spender, uint256 value);
83 function transfer(address to, uint256 value) external returns (bool);
84 function transferFrom(address from, address to, uint256 value) external returns (bool);
85 function approve(address spender, uint256 value) external returns (bool);
86 function totalSupply() external view returns (uint256);
87 function balanceOf(address account) external view returns (uint256);
88 function allowance(address owner, address spender) external view returns (uint256);
89}
90
91interface ERC165 {
92 function supportsInterface(bytes4 interfaceId) external view returns (bool);
93}
Mostrar todo

Un contrato inteligente que quiera aceptar tokens ERC-1363 a través de transferAndCall o transferFromAndCall DEBE implementar la interfaz ERC1363Receiver:

1/**
2 * @título ERC1363Receiver
3 * @dev Interfaz para cualquier contrato que quiera admitir `transferAndCall` o `transferFromAndCall` desde contratos de token ERC-1363.
4 */
5interface ERC1363Receiver {
6 /**
7 * @dev Cada vez que los tokens ERC-1363 se transfieren a este contrato a través de `ERC1363::transferAndCall` o `ERC1363::transferFromAndCall`
8 * por parte del `operator` desde `from`, se llama a esta función.
9 *
10 * NOTA: Para aceptar la transferencia, esto debe devolver
11 * `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))`
12 * (es decir, 0x88a7ca5c, o su propio selector de funciones).
13 *
14 * @param operator La dirección que llamó a la función `transferAndCall` o `transferFromAndCall`.
15 * @param from La dirección desde la que se transfieren los tokens.
16 * @param value La cantidad de tokens transferidos.
17 * @param data Datos adicionales sin formato específico.
18 * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` si se permite la transferencia, a menos que se produzca una excepción.
19 */
20 function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4);
21}
Mostrar todo

Un contrato inteligente que quiera aceptar tokens ERC-1363 a través de approveAndCall DEBE implementar la interfaz ERC1363Spender:

1/**
2 * @título ERC1363Spender
3 * @dev Interfaz para cualquier contrato que quiera admitir `approveAndCall` desde contratos de token ERC-1363.
4 */
5interface ERC1363Spender {
6 /**
7 * @dev Cada vez que un `propietario` de tokens ERC-1363 aprueba este contrato a través de `ERC1363::approveAndCall`
8 * para gastar sus tokens, se llama a esta función.
9 *
10 * NOTA: Para aceptar la aprobación, debe devolver
11 * `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`
12 * (es decir, 0x7b04a2d0, o su propio selector de funciones).
13 *
14 * @param owner La dirección que llamó a la función `approveAndCall` y que anteriormente poseía los tokens.
15 * @param value La cantidad de tokens que se van a gastar.
16 * @param data Datos adicionales sin formato específico.
17 * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` si se permite la aprobación, a menos que se produzca una excepción.
18 */
19 function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4);
20}
Mostrar todo

Lecturas adicionales

¿Le ha resultado útil este artículo?