Bounce Message
Автоматический возврат сообщения и приложенных к нему TON отправителю, если контракт-получатель не смог обработать сообщение. Включается флагом bounce.
Синонимы: bounce, бонс, обратное сообщение
Bounce Message — это сообщение, которое сеть TON автоматически возвращает отправителю, если контракт-получатель не смог обработать его внутреннее сообщение. Bounce — это страховка: TON, посланные «не туда», не теряются безвозвратно.
Как срабатывает
Bounce включается, если выполнены оба условия:
- У исходного internal-message установлен bounce-флаг (
bounce=true). По умолчанию кошельки шлют переводы сbounce=true, кроме случая отправки на ещё не задеплоенный адрес. - Compute-phase получателя упала с ошибкой (любой ненулевой exit code) или контракт по адресу не существует / заморожен.
В этом случае сеть формирует обратное сообщение: оно несёт остаток приложенных TON (минус комиссии) и небольшое тело с информацией об ошибке. Отправитель получает его в новой транзакции.
Тело bounce-сообщения
Bounce-сообщение начинается с opcode 0xFFFFFFFF (сигнал, что это bounce) и содержит первые 256 бит тела исходного сообщения. Этого обычно достаточно, чтобы понять, какой запрос вернулся: opcode и query_id.
Когда отправлять без bounce
В двух типичных случаях кошельки отключают bounce:
- Перевод на новый адрес. Wallet-контракт получателя ещё не задеплоен — bounce приведёт к потере gas. Адреса на новый контракт обычно показываются в формате
UQ...(non-bounceable). - Простой перевод TON между пользователями. Если получатель — кошелёк, а не контракт-приложение, bounce не нужен.
Для DeFi-операций bounce почти всегда включён: лучше потратить gas на возврат, чем потерять деньги, если контракт упал.
Что важно знать
Bounce не возвращает 100% приложенных TON. Из суммы вычитаются: gas compute-phase получателя (даже если она упала), forward-fee на сам bounce, plus storage-fee. Поэтому для очень маленьких сумм bounce может быть невыгоден.