Перейти к основному содержанию
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-1363 (opens 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}
Показать все

Дополнительные материалы

Была ли эта статья полезной?