Материал проверен 12 ноября 2026?
БК

ГЛАВНАЯ / ИНСТРУКЦИИ / 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 может продолжиться, что повышает риск застрявших токенов.

Где объявлены hooks

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
Порядок send

Сначала 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 и вызовами в той же транзакции.

FAQ

Частые вопросы

Что делает 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 года. Условия бирж, кошельков и блокчейн-сетей могут меняться. Перед операцией сверяйте данные в интерфейсе выбранного сервиса.