Перейти до основного контенту
Change page

Стандарт токенів ERC-1363, що підлягають оплаті

Останні оновлення сторінки: 4 квітня 2025 р.

Вступ

Що таке ERC-1363?

ERC-1363 — це розширений інтерфейс для токенів ERC-20, який підтримує виконання спеціальної логіки в контракті отримувача після переказів або в контракті витрачальника після схвалень, і все це в межах однієї транзакції.

Відмінності від ERC-20

Стандартні операції ERC-20, такі як transfer, transferFrom і approve, не дозволяють виконувати код у контракті отримувача або витрачальника без окремої транзакції. Це ускладнює розробку інтерфейсу користувача та сповільнює впровадження, оскільки користувачі повинні чекати, поки буде виконано першу транзакцію, а потім надсилати другу. Вони також повинні двічі платити за газ.

ERC-1363 дає змогу взаємозамінним токенам легше виконувати дії та працювати без використання будь-якого позаланцюгового слухача. Це дозволяє здійснювати зворотний виклик для контракту отримувача або витрачальника після переказу або схвалення в межах однієї транзакції.

Передумови

Щоб краще зрозуміти цю сторінку, радимо спочатку прочитати про:

Основна частина

ERC-1363 представляє стандартний API для токенів ERC-20 для взаємодії зі смарт-контрактами після transfer, transferFrom або approve.

Цей стандарт надає базову функціональність для переказу токенів, а також дозволяє схвалювати токени, щоб їх могла витратити інша третя сторона в ланцюжку, а потім здійснити зворотний виклик для контракту отримувача або витрачальника.

Існує багато запропонованих способів використання смарт-контрактів, які можуть приймати зворотні виклики ERC-20.

Наприклад:

  • Краудсейли: надіслані токени запускають миттєвий розподіл винагороди.
  • Сервіси: оплата активує доступ до сервісу за один крок.
  • Рахунки-фактури: токени автоматично оплачують рахунки-фактури.
  • Підписки: схвалення річного тарифу активує підписку в межах платежу за перший місяць.

З цих причин його спочатку назвали «Токен для оплати».

Поведінка зворотного виклику ще більше розширює його корисність, забезпечуючи безперебійну взаємодію, наприклад:

  • Стейкінг: передані токени запускають автоматичне блокування в стейкінговому контракті.
  • Голосування: отримані токени реєструють голоси в системі управління.
  • Обмін: схвалення токенів активує логіку обміну за один крок.

Токени ERC-1363 можна використовувати для певних утиліт у всіх випадках, які вимагають виконання зворотного виклику після отримання переказу або схвалення. ERC-1363 також корисний для уникнення втрати або блокування токенів у смарт-контрактах шляхом перевірки здатності отримувача обробляти токени.

На відміну від інших пропозицій щодо розширення ERC-20, ERC-1363 не перевизначає методи ERC-20 transfer та transferFrom і визначає ідентифікатори інтерфейсів, які мають бути реалізовані, зберігаючи зворотну сумісність з ERC-20.

З EIP-1363opens in a new tab:

Методи

Смарт-контракти, що реалізують стандарт ERC-1363, ПОВИННІ реалізовувати всі функції в інтерфейсі ERC1363, а також інтерфейси ERC20 та ERC165.

1pragma solidity ^0.8.0;
2
3/**
4 * @title ERC1363
5 * @dev Розширений інтерфейс для токенів ERC-20, що підтримує виконання коду в контракті отримувача
6 * після `transfer` або `transferFrom`, або коду в контракті витрачальника після `approve`, в одній транзакції.
7 */
8interface ERC1363 is ERC20, ERC165 {
9 /*
10 * ПРИМІТКА: ідентифікатор ERC-165 для цього інтерфейсу – 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 Переміщує токени кількістю `value` з рахунку того, хто викликає, до `to`
22 * а потім викликає `ERC1363Receiver::onTransferReceived` на `to`.
23 * @param to Адреса, на яку передаються токени.
24 * @param value Кількість токенів, що будуть передані.
25 * @return Логічне значення, що вказує на успішне завершення операції, якщо не виникає помилка.
26 */
27 function transferAndCall(address to, uint256 value) external returns (bool);
28
29 /**
30 * @dev Переміщує токени кількістю `value` з рахунку того, хто викликає, до `to`
31 * а потім викликає `ERC1363Receiver::onTransferReceived` на `to`.
32 * @param to Адреса, на яку передаються токени.
33 * @param value Кількість токенів, що будуть передані.
34 * @param data Додаткові дані без зазначеного формату, що надсилаються у виклику до `to`.
35 * @return Логічне значення, що вказує на успішне завершення операції, якщо не виникає помилка.
36 */
37 function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
38
39 /**
40 * @dev Переміщує токени кількістю `value` з `from` до `to` за допомогою механізму допуску
41 * а потім викликає `ERC1363Receiver::onTransferReceived` на `to`.
42 * @param from Адреса, з якої надсилаються токени.
43 * @param to Адреса, на яку передаються токени.
44 * @param value Кількість токенів, що будуть передані.
45 * @return Логічне значення, що вказує на успішне завершення операції, якщо не виникає помилка.
46 */
47 function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
48
49 /**
50 * @dev Переміщує токени кількістю `value` з `from` до `to` за допомогою механізму допуску
51 * а потім викликає `ERC1363Receiver::onTransferReceived` на `to`.
52 * @param from Адреса, з якої надсилаються токени.
53 * @param to Адреса, на яку передаються токени.
54 * @param value Кількість токенів, що будуть передані.
55 * @param data Додаткові дані без зазначеного формату, що надсилаються у виклику до `to`.
56 * @return Логічне значення, що вказує на успішне завершення операції, якщо не виникає помилка.
57 */
58 function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
59
60 /**
61 * @dev Встановлює токени кількістю `value` як допуск `spender` для токенів того, хто викликає
62 * а потім викликає `ERC1363Spender::onApprovalReceived` на `spender`.
63 * @param spender Адреса, яка витрачатиме кошти.
64 * @param value Кількість токенів, що будуть витрачені.
65 * @return Логічне значення, що вказує на успішне завершення операції, якщо не виникає помилка.
66 */
67 function approveAndCall(address spender, uint256 value) external returns (bool);
68
69 /**
70 * @dev Встановлює токени кількістю `value` як допуск `spender` для токенів того, хто викликає
71 * а потім викликає `ERC1363Spender::onApprovalReceived` на `spender`.
72 * @param spender Адреса, яка витрачатиме кошти.
73 * @param value Кількість токенів, що будуть витрачені.
74 * @param data Додаткові дані без зазначеного формату, що надсилаються у виклику до `spender`.
75 * @return Логічне значення, що вказує на успішне завершення операції, якщо не виникає помилка.
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}
Показати все

Смарт-контракт, який хоче приймати токени ERC-1363 через transferAndCall або transferFromAndCall, ПОВИНЕН реалізувати інтерфейс ERC1363Receiver:

1/**
2 * @title ERC1363Receiver
3 * @dev Інтерфейс для будь-якого контракту, який хоче підтримувати `transferAndCall` або `transferFromAndCall` з контрактів токенів ERC-1363.
4 */
5interface ERC1363Receiver {
6 /**
7 * @dev Щоразу, коли токени ERC-1363 передаються в цей контракт через `ERC1363::transferAndCall` або `ERC1363::transferFromAndCall`
8 * від `operator` з `from`, ця функція викликається.
9 *
10 * ПРИМІТКА: щоб прийняти передачу, вона має повернути
11 * `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))`
12 * (тобто 0x88a7ca5c, або власний селектор функцій).
13 *
14 * @param operator Адреса, яка викликала функцію `transferAndCall` або `transferFromAndCall`.
15 * @param from Адреса, з якої передаються токени.
16 * @param value Кількість переданих токенів.
17 * @param data Додаткові дані без зазначеного формату.
18 * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` якщо передача дозволена, якщо не виникає помилка.
19 */
20 function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4);
21}
Показати все

Смарт-контракт, який хоче приймати токени ERC-1363 через approveAndCall, ПОВИНЕН реалізувати інтерфейс ERC1363Spender:

1/**
2 * @title ERC1363Spender
3 * @dev Інтерфейс для будь-якого контракту, який хоче підтримувати `approveAndCall` з контрактів токенів ERC-1363.
4 */
5interface ERC1363Spender {
6 /**
7 * @dev Щоразу, коли `owner` токенів ERC-1363 схвалює цей контракт через `ERC1363::approveAndCall`
8 * щоб витратити свої токени, ця функція викликається.
9 *
10 * ПРИМІТКА: щоб прийняти схвалення, вона має повернути
11 * `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`
12 * (тобто 0x7b04a2d0, або власний селектор функцій).
13 *
14 * @param owner Адреса, яка викликала функцію `approveAndCall` і раніше володіла токенами.
15 * @param value Кількість токенів, що будуть витрачені.
16 * @param data Додаткові дані без зазначеного формату.
17 * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`, якщо схвалення дозволено, якщо не виникає помилка.
18 */
19 function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4);
20}
Показати все

Для подальшого читання

Чи була ця стаття корисною?