Правильная обработка bounce для защиты средств
Свяжешь bounce с учётом балансов: не потеряешь согласованность storage, когда исходящее сообщение отскочит.
Bounce и деньги
При bounce: true неуспех у получателя возвращает value отправителю. Если ты уже списал внутренний баланс пользователя и не обработал bounced, on-chain «долг» и реальные монеты разъедутся. Защита средств здесь — не «отключить bounce», а компенсировать локальное состояние.
Уязвимо: списание без bounce-ветки
Исправлено: компенсация в bounced
Как это работает
- Оптимистичная модель: сначала меняешь storage, потом шлёшь; при bounce — обратная операция.
- В
bounced<T>доступен только префикс полей (~224 бит тела) —amountиbeneficiaryставь в начале message. bounce: falseна выплате кошельку иногда осознаннен; для контракт→контракт с учётом долгов почти всегда нуженtrue+ handler.- Подробнее про лимит полей — в статье про bounce в разделе контрактов.
Частые ошибки
Глотаешь bounce пустым bounced → value вернулось, ledger не восстановился.
Важные поля после длинного префикса → в typed bounce их нет; компенсация невозможна.
Шлёшь повторный payout из bounce без лимита → риск циклов; компенсация должна быть локальной.
Что дальше
- Обработка bounce-сообщений — API
bounced<T>и лимит 224 бит - Проверка отправителя (sender) в Tact — кто имеет право инициировать payout
- Аудит-чеклист перед mainnet — сценарии bounce в тестах
Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация