Стандарт оплачиваемых токенов 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-1363 (opens in a new tab):
Методы
Умные контракты, реализующие стандарт 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}Показать все