Что доказывают поля до принятия external message
ПроверкаЧто подтверждаетЧего не подтверждает
Wallet address и code/versionКакой контракт проверит requestКому дошло исходящее сообщение
seqno совпадает с storageRequest находится в ожидаемой очереди этого walletУспешную action phase
now не позже valid_untilПодпись ещё находится в своём временном окнеВключение в блок до дедлайна
Signature и wallet/subwallet ID корректныRequest предназначен этой инстанции кошелькаПолучение Jetton или TON адресатом
Что доказывают поля до принятия external message
Проверка
Wallet address и code/version
Что подтверждает
Какой контракт проверит request
Чего не подтверждает
Кому дошло исходящее сообщение
Проверка
seqno совпадает с storage
Что подтверждает
Request находится в ожидаемой очереди этого wallet
Чего не подтверждает
Успешную action phase
Проверка
now не позже valid_until
Что подтверждает
Подпись ещё находится в своём временном окне
Чего не подтверждает
Включение в блок до дедлайна
Проверка
Signature и wallet/subwallet ID корректны
Что подтверждает
Request предназначен этой инстанции кошелька
Чего не подтверждает
Получение Jetton или TON адресатом

Сначала определить wallet contract, а не гадать по приложению

Один публичный ключ может использоваться в нескольких wallet instances с разными subwallet_id, а в Wallet V5 поле wallet_id дополнительно кодирует параметры инстанции. У каждого такого контракта собственные address, state и seqno. Поэтому seqno из другого адреса или другой сети не исправляет ошибку. Полезно декодировать форму user-friendly адреса и сверить её с raw account ID, но она сама не раскрывает версию кода.

Сохраните workchain, account ID, code hash или точно определённую wallet version и результат getter `seqno` на конкретном block/LT. Для Wallet V4 подписываемая часть включает subwallet_id, valid_until и seqno; Wallet V5 использует свой signed-request layout и walletId. Не переносите exit codes или порядок полей между версиями без сверки документации и кода контракта.

Три состояния перед повтором

Диагностический алгоритм без новой подписи

  1. 1
    Зафиксировать исходник

    Сохраните BOC или точные serialized bytes, его hash, время создания и все поля signed request. Скриншота суммы недостаточно.

  2. 2
    Найти message onchain

    Ищите внешний message и транзакцию именно этого wallet address. Если запись есть, сравните hash и прочитайте transaction phases.

  3. 3
    Прочитать текущее seqno

    Берите getter из того же wallet contract. Совпадение означает лишь возможность приёма; увеличение требует найти, какой request его изменил.

  4. 4
    Сопоставить время

    Сравните valid_until с временем сети/блока, а не только с часами телефона. Истёкший request надо считать неприемлемым.

  5. 5
    Выбрать действие

    Повторяйте только идентичные bytes при текущем seqno и живом окне. Во всех остальных случаях сначала завершите onchain-диагноз.

Решение по наблюдаемому состоянию
НаблюдениеБезопасный выводСледующее действие
Message не найден; seqno прежний; valid_until живКонтракт ещё мог не принять exact requestРазрешён повтор тех же bytes через доверенный endpoint
Message не найден; valid_until истёкСтарая подпись больше не подходитНе ретранслировать; заново проверить намерение перед новой подписью
seqno выросWallet принял какой-то request этого номераНайти его transaction/trace; не создавать замену вслепую
External message найден, action/result неясенPre-admission завершён, но бизнес-результат неизвестенРазобрать compute/action и outbound messages
Два разных подписанных message претендуют на действиеЕсть риск двойного результатаОстановить автоматические retries и вручную сопоставить hashes
Решение по наблюдаемому состоянию
Наблюдение
Message не найден; seqno прежний; valid_until жив
Безопасный вывод
Контракт ещё мог не принять exact request
Следующее действие
Разрешён повтор тех же bytes через доверенный endpoint
Наблюдение
Message не найден; valid_until истёк
Безопасный вывод
Старая подпись больше не подходит
Следующее действие
Не ретранслировать; заново проверить намерение перед новой подписью
Наблюдение
seqno вырос
Безопасный вывод
Wallet принял какой-то request этого номера
Следующее действие
Найти его transaction/trace; не создавать замену вслепую
Наблюдение
External message найден, action/result неясен
Безопасный вывод
Pre-admission завершён, но бизнес-результат неизвестен
Следующее действие
Разобрать compute/action и outbound messages
Наблюдение
Два разных подписанных message претендуют на действие
Безопасный вывод
Есть риск двойного результата
Следующее действие
Остановить автоматические retries и вручную сопоставить hashes

После принятия seqno перестаёт быть доказательством перевода

Когда wallet transaction существует, дальнейший вопрос принадлежит фазам исполнения и цепочке внутренних сообщений. Успешная проверка подписи и seqno может сменить state кошелька, но исходящее действие способно не выполниться или породить отдельный bounce. Для этого читайте compute, action, aborted, fees и downstream trace — это отдельная диагностика TON-транзакции.

Для Jetton одного wallet seqno особенно мало: токен хранится в отдельном Jetton wallet и перевод разворачивается в несколько сообщений. Сверяйте canonical Jetton master, адрес вычисленного Jetton wallet и уведомление/зачисление. Если спор относится к обычному переводу, подготовьте hash, сеть, адреса и фактические суммы как доказательство перевода, не раскрывая seed-фразу или private key.

Источники

Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.

  1. TON Docs — How TON wallets work TON Docs · Проверено 22 августа 2026 г. в 10:38 GMT+5
  2. TON Docs — Wallet V4 TON Docs · Проверено 22 августа 2026 г. в 10:38 GMT+5
  3. TON Docs — Wallet V5 API TON Docs · Проверено 22 августа 2026 г. в 10:38 GMT+5
  4. TON Docs — Wallet comparison TON Docs · Проверено 22 августа 2026 г. в 10:38 GMT+5
Материал носит информационный характер и не является индивидуальной рекомендацией. Криптоактивы связаны с риском волатильности, технических сбоев, хищения и полной потери средств.