Обработка bounce-сообщений
Обработаешь bounce в Tact: rolled-back состояние, bounced<T> и лимит 224 бит полезной нагрузки.
Bounce
Если внутреннее сообщение с bounce: true падает у получателя (нет кода, throw, нехватка газа), сеть возвращает отправителю bounce-сообщение. Без обработчика bounced ты потеряешь и эффект у получателя, и согласованность своего storage.
Откат баланса при bounce
Как это работает
- Оптимистичное обновление: сначала меняешь своё состояние, потом шлёшь сообщение; при bounce — компенсируешь.
bounced<CreditNotification>— специальный тип: доступны только префикс полей в пределах ~224 бит тела.bounce: trueобязателен, если хочешь узнать об ошибке у контрагента.- Fallback
bounced(raw: Slice)ловит типы без отдельного typed-handler. - Пустой
receive()по-прежнему нужен для деплоя; bounce на него не заменяет.
Частые ошибки
Положил важное поле после «длинного» префикса в message → в bounced<T> его не будет; проектируй порядок полей под bounce.
Шлёшь с bounce: false «чтобы дешевле» → ошибка у получателя съедает value без компенсации у отправителя.
В bounce снова шлёшь наружу без лимита → риск цепочек и повторных расходов; компенсация должна быть локальной и простой.
Что дальше
- Взаимодействие контракт-контракт — связка send + bounce
- Обработчики сообщений (receive) в Tact — чем
bouncedотличается отreceive - Тестирование контракта в sandbox: unit-тесты — как прогнать bounce-ветку в
@ton/sandbox
Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация