Вывод Jetton: резерв, подтверждение и ledger

Crypto / FinTech · Jetton ledger

Заявка на вывод не равна отправленной транзакции. Между нажатием кнопки и подтверждением сети актив нужно зарезервировать и сохранить возможность безопасного повтора статуса.

Баланс состоит из доступной и замороженной части

В Jetton ledger доступная сумма вычисляется как общий баланс минус frozen_atomic. Сервис блокирует строку баланса и проверяет остаток перед резервированием. Резерв увеличивает замороженную часть, но не списывает общий баланс: деньги ещё находятся под обязательством системы, пока внешний сервис исполняет вывод.

Суммы хранятся в atomic units и сравниваются строковой арифметикой. Это исключает ошибку округления, которая особенно опасна для токенов с разной разрядностью.

Подтверждение и отказ — разные проводки

Когда вывод подтверждён, сервис уменьшает и общий баланс, и замороженную часть. Если вывод отклонён или не состоялся, уменьшается только резерв: актив вновь доступен пользователю. Каждая стадия создаёт запись журнала с отдельным ключом идемпотентности; повторный статус не должен породить второе списание.

Рядом с этими проводками в проекте есть сервисы сверки TON-балансов и custody snapshot. Их задача — сопоставлять внутренние обязательства с данными кошелькового контура, а не заменять журнал простой цифрой «баланс».

Что проверять при внедрении

Тестируйте подтверждение, отказ, повтор callback и конкурирующие заявки на вывод. Во всех случаях инвариант один: замороженная сумма не превышает общий баланс, а каждый сетевой результат отражается в учёте один раз.

Полный кейс P2P-платформы → · О казначействе TON →