Ошибка: Exit code 38 — Not enough extra-currencies

Причина и решение ошибки exit code 38 при нехватке extra-currencies в исходящем сообщении TON.

Exit code 38 — Not enough extra-currencies

Action phase: в исходящем сообщении указаны extra-currencies, которых нет на балансе аккаунта в нужном количестве. Это не jetton (TEP-74) и не «просто TON».


Причина

  • в CurrencyCollection попал словарь extra-currencies с ненулевыми суммами;
  • аккаунт никогда не получал эти currency id, либо баланс уже потрачен;
  • ошибка сериализации: вместо «только nanoton» в value записали лишний dict;
  • путаница с jetton — jetton balance живёт в отдельном jetton-wallet, не в extra-currencies.

Решение

func (fallback highlight)
;; FunC — отправляй только Toncoin, без extra-currencies dict
() send_tons(slice to, int amount) impure inline {
    ;; flags: ihr_disabled, bounce, bounced, src=addr_none
    var msg = begin_cell()
        .store_uint(0x18, 6)
        .store_slice(to)
        .store_grams(amount)
        .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) ;; пустой extra dict + пустое body
        .end_cell();
    send_raw_message(msg, 3); ;; pay fees separately, ignore errors
}
typescript
// @ton/core ^0.59 — value как coins, без other currencies
import { internal, toNano } from "@ton/core";

const message = internal({
  to: dest,
  value: toNano("0.1"), // только Toncoin
  // не передавай extracurrency-словари, если не работаешь с ними явно
});

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

В 99% dApp нужны только Toncoin + jetton/NFT по стандартам TEP. Extra-currencies не трогай, пока протокол явно их не требует. Если код упал на 38 — ищи, где в builder попал ненулевой currency dict.

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