Вывод Jetton: резерв, подтверждение и ledger
Crypto / FinTech · Jetton ledger
Заявка на вывод не равна отправленной транзакции. Между нажатием кнопки и подтверждением сети актив нужно зарезервировать и сохранить возможность безопасного повтора статуса.
Баланс состоит из доступной и замороженной части
В Jetton ledger доступная сумма вычисляется как общий баланс минус frozen_atomic. Сервис блокирует строку баланса и проверяет остаток перед резервированием. Резерв увеличивает замороженную часть, но не списывает общий баланс: деньги ещё находятся под обязательством системы, пока внешний сервис исполняет вывод.
Суммы хранятся в atomic units и сравниваются строковой арифметикой. Это исключает ошибку округления, которая особенно опасна для токенов с разной разрядностью.
Подтверждение и отказ — разные проводки
Когда вывод подтверждён, сервис уменьшает и общий баланс, и замороженную часть. Если вывод отклонён или не состоялся, уменьшается только резерв: актив вновь доступен пользователю. Каждая стадия создаёт запись журнала с отдельным ключом идемпотентности; повторный статус не должен породить второе списание.
Рядом с этими проводками в проекте есть сервисы сверки TON-балансов и custody snapshot. Их задача — сопоставлять внутренние обязательства с данными кошелькового контура, а не заменять журнал простой цифрой «баланс».
Что проверять при внедрении
Тестируйте подтверждение, отказ, повтор callback и конкурирующие заявки на вывод. Во всех случаях инвариант один: замороженная сумма не превышает общий баланс, а каждый сетевой результат отражается в учёте один раз.
