Ошибка: Exit code 33 — Invalid Sequence Number

Причина и решение ошибки exit code 33 (неверный seqno) при отправке транзакции из кошелька TON.

Exit code 33 — Invalid Sequence Number

В стандартных кошельках (V3/V4) код 33 значит: seqno в подписанном external-сообщении не совпадает с seqno, хранящимся в контракте кошелька. Транзакция отклонена как replay или устаревшая.


Причина

Кошелёк принимает external-сообщение только с текущим seqno. После успешного исполнения контракт увеличивает seqno на 1. Типичные сценарии:

  • два клиента взяли один и тот же seqno и оба отправили tx — пройдёт только первая;
  • ты прочитал seqno, но между чтением и отправкой уже прошла другая транзакция;
  • в сообщение попал захардкоженный или stale seqno.

Это кастомный throw_unless(33, …) кошелька, не action-phase код TVM «action list too long».


Решение

typescript
// @ton/ton ^15, @ton/core ^0
import { TonClient, WalletContractV4, internal } from "@ton/ton";
import { mnemonicToPrivateKey } from "@ton/crypto";

const client = new TonClient({ endpoint: "https://toncenter.com/api/v2/jsonRPC" });
const key = await mnemonicToPrivateKey(mnemonic.split(" "));
const wallet = WalletContractV4.create({ workchain: 0, publicKey: key.publicKey });
const opened = client.open(wallet);

// Всегда читай seqno непосредственно перед подписью
const seqno = await opened.getSeqno();

await opened.sendTransfer({
  seqno,
  secretKey: key.secretKey,
  messages: [
    internal({
      to: "EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N",
      value: "0.05",
      body: "hello",
    }),
  ],
});

// Следующую tx отправляй только после подтверждения предыдущей
await new Promise<void>((resolve) => {
  const t = setInterval(async () => {
    const next = await opened.getSeqno();
    if (next > seqno) {
      clearInterval(t);
      resolve();
    }
  }, 1500);
});

Как избежать в будущем

Один writer на кошелёк: читай seqno → подписывай → жди инкремента → только потом следующая tx. Не кэшируй seqno между сессиями и не параллель отправки с одним кошельком.

Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация