Стандарт токенів 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.
Методи
Смарт-контракти, що реалізують стандарт ERC-1363, ПОВИННІ реалізовувати всі функції в інтерфейсі ERC1363, а також інтерфейси ERC20 та ERC165.
1pragma solidity ^0.8.0;23/**4 * @title ERC13635 * @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 */1920 /**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);2829 /**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);3839 /**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);4849 /**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);5960 /**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);6869 /**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}7980interface 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}9091interface ERC165 {92 function supportsInterface(bytes4 interfaceId) external view returns (bool);93}Показати всеСмарт-контракт, який хоче приймати токени ERC-1363 через transferAndCall або transferFromAndCall, ПОВИНЕН реалізувати інтерфейс ERC1363Receiver:
1/**2 * @title ERC1363Receiver3 * @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 ERC1363Spender3 * @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}Показати все