ГЛАВНАЯ / ИНСТРУКЦИИ / ERC-3156 FLASH LOAN: LENDER, RECEIVER И ПРОВЕРКА CALLBACK
ERC-3156 flash loan: lender, receiver и проверка callback
ERC-3156 стандартизирует интерфейс flash loan для одного актива. Его полезно разбирать отдельно от общей идеи атомарного займа: здесь важны конкретные роли, проверка обратного вызова и возможность кредитора забрать сумму с комиссией до завершения транзакции.
Lender, receiver и initiator могут быть разными адресами
Lender предоставляет flashLoan и вызывает принимающий контракт receiver. Initiator – тот, кто вызвал flashLoan у кредитора. В callback msg.sender является вызывающим контрактом, поэтому проверка только параметра initiator не подтверждает, что сообщение пришло от настоящего lender.
Receiver должен реализовать onFlashLoan. Он получает управление на время обратного вызова и выполняет предусмотренную логику с заёмными средствами. Название ERC-3156 не означает, что любой известный протокол использует именно этот интерфейс: у площадок бывают собственные API и условия. Сначала подтвердите совместимость конкретного контракта.
| Элемент | Роль | Проверка |
|---|---|---|
| Lender | Выдаёт актив и организует возврат | Адрес и реализация |
| Receiver | Получает callback | Ожидаемая функция и ограничения |
| Initiator | Начинает запрос flashLoan | Разрешён ли такой инициатор |
| msg.sender в callback | Непосредственный вызывающий | Совпадает ли с доверенным lender |
MaxFlashLoan и flashFee не заменяют проверку исполнения
maxFlashLoan(token) показывает доступный предел для указанного актива по интерфейсу lender. Для неподдерживаемого токена стандарт предусматривает ноль. flashFee(token, amount) возвращает дополнительную плату для суммы, а для неподдерживаемого актива должен завершаться ошибкой. Нельзя считать нулевую комиссию универсальным свойством flash loan.
После выдачи суммы кредитор передаёт в onFlashLoan параметры initiator, token, amount, fee и data. Сумма и произвольные данные должны относиться к ожидаемому запросу. Учебный пример с amount = 1000 и fee = 2 требует подготовить 1002 базовые единицы того же token; это не тариф реального сервиса.
- сеть и token установлены до запроса;
- предельная сумма и fee прочитаны у нужного lender;
- единицы соответствуют decimals токена;
- параметры callback совпадают с ожидаемыми.
Аргументам onFlashLoan нельзя доверять только из-за имени функции
Посторонний контракт может вызвать открытый callback и передать собственные token, amount, fee или data. Receiver должен удостовериться в источнике вызова и допустимом инициаторе до обработки данных и выдачи разрешений. Иначе автоматический approve способен создать право расходования, не соответствующее настоящему займу.
Стандартный успешный ответ callback – заданный keccak256-хэш строки ERC3156FlashBorrower.onFlashLoan, который проверяет lender. Но правильное возвращаемое значение само по себе не подтверждает доверенность отправителя для receiver и не доказывает прибыльность действий. Это разные стороны проверки.
Кредитор должен получить amount + fee, иначе операция откатывается
В модели ERC-3156 после callback lender забирает amount + fee у receiver либо откатывает операцию. Принимающая сторона должна иметь средства и предоставить достаточный allowance для предусмотренного возврата. Одного наличия суммы на балансе может быть недостаточно, если кредитор не может выполнить расходование.
При ошибке стратегия и выдача займа не завершаются как успешная операция, однако исполненная reverted-транзакция всё равно может расходовать gas. Проверяйте receipt, возврат и конечные остатки, а не только успешный ответ промежуточного вызова. В рабочей интеграции нужны также защита от повторного входа, контроль сторонних контрактов и корректная обработка особенностей токена; стандарт интерфейса не заменяет аудит.
- amount плюс fee доступны к возврату;
- allowance выдан ожидаемому lender;
- вся транзакция проверена по receipt;
- прибыль не предполагается из-за атомарности;
- расходы gas учтены и при неуспехе.
Частые вопросы
ERC-3156 охватывает все flash loan API?
Нет. Это конкретный стандарт; протокол может предоставлять иной интерфейс.
Initiator и receiver обязаны совпадать?
Нет. Нужно отдельно установить и проверить их роли.
Правильный callback означает, что займ возвращён?
Нет. После callback должен успешно завершиться возврат amount + fee.
Достаточно иметь деньги на балансе receiver?
Нужно также обеспечить предусмотренное разрешение для возврата кредитору.
Revert делает попытку бесплатной?
Нет. Если транзакция исполнялась в сети, gas может быть потрачен.
Чек-лист: erc-3156 flash loan: lender, receiver и проверка callback
- совместимость ERC-3156 подтверждена;
- lender и token проверены;
- receiver ожидаемый;
- msg.sender и initiator контролируются отдельно;
- fee и единицы суммы понятны;
- возврат и allowance обеспечены;
- проверен конечный receipt и расходы.
Материал подготовлен редакцией сайта и проверен 25 октября 2026 года. Условия бирж, кошельков и блокчейн-сетей могут меняться. Перед операцией сверяйте данные в интерфейсе выбранного сервиса.