Bounceable и non-bounceable адреса TON: в чём разница
Bounceable-адрес в TON — запись адреса с флагом, который просит вернуть перевод отправителю, если смарт-контракт получателя не смог его обработать.
В TON каждый кошелёк — это смарт-контракт, а у его адреса есть несколько форм записи. «Сырая» форма выглядит как 0: и шестнадцатеричная строка. Пользователям обычно показывают user-friendly форму в base64, в которую зашиты флаги: bounceable или non-bounceable, основная или тестовая сеть, а также контрольная сумма. Bounceable-адреса в основной сети обычно начинаются с EQ, non-bounceable — с UQ. Важно понимать: это один и тот же аккаунт, просто с разной «инструкцией» для отправителя.
Флаг bounce определяет, что произойдёт при ошибке. Если перевод отправлен с флагом bounce, а контракт получателя не развёрнут или завершился с ошибкой, сеть вернёт средства отправителю за вычетом комиссий. Без флага средства останутся на адресе получателя даже в этом случае. Для контрактов и бирж bounce полезен — он защищает от отправки на неверный контракт.
Проблема возникает с новыми кошельками. Кошелёк, на который ещё ни разу не приходили средства, не инициализирован: контракт не развёрнут. Если отправить на него TON по bounceable-адресу, перевод отскочит обратно. Поэтому для обычных кошельков пользователей рекомендуется non-bounceable формат (UQ…), и современные кошельки показывают по умолчанию именно его.
Типичные ошибки: продавец считает EQ- и UQ-адреса разными и не находит платёж, разработчик сравнивает адреса как строки вместо приведения к сырой форме, клиент отправляет средства на тестовый адрес из основной сети. Надёжный подход — разбирать адрес библиотекой TON и сравнивать сырую форму.
В Moonvex каждому платежу в TON выдаётся отдельный адрес, поэтому комментарий указывать не нужно, а платёж сопоставляется автоматически.