ГЛАВНАЯ / ИНСТРУКЦИИ / ERC-777 HOOKS: КАКИЕ ВЫЗОВЫ ПРОИСХОДЯТ ПРИ ОТПРАВКЕ ТОКЕНА
ERC-777 hooks: какие вызовы происходят при отправке токена
ERC-777 добавляет callback при списании и зачислении токенов. Зарегистрированный sender implementer получает tokensToSend до изменения балансов, а recipient implementer – tokensReceived после обновления. Оба hook могут отклонить операцию через revert. Регистрация адресов-обработчиков хранится в ERC-1820. Важная деталь: native ERC-777 send к контракту без receiver hook откатывается, тогда как совместимый ERC-20 transfer может продолжиться, что повышает риск застрявших токенов.
ERC-1820 связывает адрес пользователя с контрактом-обработчиком
Адрес держателя или получателя может зарегистрировать implementer интерфейса ERC777TokensSender или ERC777TokensRecipient в общем ERC-1820 registry. Реализация hook может находиться в другом контракте, поэтому не ищите функцию только по адресу EOA. Перед анализом установите сеть registry, целевой address и действующее значение implementer.
Sender hook получает operator, from, to, amount, data и operatorData перед уменьшением баланса. Recipient hook получает соответствующие поля после зачисления. Hook видит msg.sender токен-контракт; он может быть не тем адресом, который интерфейс показывает как сервис или dApp.
- tokensToSend расположен до изменения баланса
- tokensReceived проверен после изменения
- revert hook учтён
| Hook | Момент вызова | Что может сделать |
|---|---|---|
| tokensToSend | До списания | Проверить или отклонить отправку |
| tokensReceived | После зачисления | Принять, обработать или отклонить токены |
| ERC-1820 | Вызов через registry | Найти зарегистрированный implementer |
Сначала sender callback, затем balance update и recipient callback
Стандарт задаёт порядок для send: если sender зарегистрировал hook, токен вызывает tokensToSend до изменения состояния; затем уменьшает баланс отправителя и увеличивает баланс получателя; после этого вызывает tokensReceived, если получатель зарегистрировал обработчик. Поэтому balanceOf внутри sender hook видит состояние до перевода, а внутри recipient hook – после изменения.
Hook может revert и отменить всю операцию. Изменение балансов и последующие события откатываются вместе с транзакцией. Перед чтением результата проверьте receipt, причину revert и фактические логи; не считайте вызов sender callback доказательством успешного зачисления.
- ERC-1820 implementer проверен
- send отделён от ERC-20 transfer
- получатель оценён на совместимость
Native send и ERC-20 transfer имеют разные требования к получателю
ERC-777 send и mint к контрактному адресу требуют зарегистрированного recipient hook; иначе операция должна завершиться ошибкой. Это защищает от некоторых случайных переводов в контракт, который не умеет принимать этот стандарт.
Совместимый ERC-20 transfer или transferFrom может продолжиться, если контракт-получатель не зарегистрировал tokensReceived. Такая совместимость нужна старым интеграциям, но токены могут оказаться заблокированы в получателе. Поэтому выясняйте не только token symbol, но и вызванную функцию, наличие hook и правила контракта назначения.
- callback включён в модель reentrancy
- Sent и Transfer не посчитаны дважды
- остаточный баланс сверён
Hook – внешний вызов, а Sent и Transfer могут описывать одну операцию
Оба hooks – вызовы внешнего кода. При разработке интеграции анализируйте их как точки передачи управления: не полагайтесь на промежуточный баланс, сохраняйте согласованность инвариантов и тестируйте повторный вход. Sender callback запускается до обновления состояния, поэтому вызывающий контракт особенно внимательно проверяет свои учётные данные до вызова токена.
Совместимый ERC-777-контракт может выдавать события Sent и Transfer для одного движения. Индексатор, который одновременно считает оба события отдельными переводами, задвоит сумму. Выберите один стандартный event family для конкретного токена, сверяйте контракт и сопоставляйте логи с balance changes, mint, burn и вызовами в той же транзакции.
Частые вопросы
Что делает tokensToSend?
Уведомляет отправителя о списании до изменения баланса; зарегистрированный обработчик может отклонить операцию.
Когда вызывается tokensReceived?
После обновления баланса получателя при ERC-777 send или mint, если hook зарегистрирован.
Обязателен ли ERC-1820?
ERC-777 использует registry ERC-1820, чтобы найти implementer hooks для адресов.
Почему ERC-20 transfer может не вызвать откат без hook?
Для совместимости ERC-20-пути стандарт рекомендует продолжить перевод; на несовместимом контракте это может заблокировать токены.
Sent и Transfer – два перевода?
Нет. В совместимом token contract оба события могут относиться к одному движению; индексатор не должен суммировать их дважды.
Чек-лист: erc-777 hooks: какие вызовы происходят при отправке токена
- сеть, token contract и вызываемый метод установлены;
- implementer sender и recipient проверены в ERC-1820;
- порядок hooks и изменения балансов установлен;
- возможный revert любого hook учтён;
- native send отличён от ERC-20 transfer;
- внешние callback включены в анализ reentrancy;
- Sent и Transfer не посчитаны дважды;
- receipt и итоговые balances проверены.
Материал подготовлен редакцией сайта и проверен 12 ноября 2026 года. Условия бирж, кошельков и блокчейн-сетей могут меняться. Перед операцией сверяйте данные в интерфейсе выбранного сервиса.