Ошибка: Exit code 37 — недостаточно Gram

Причина и решение ошибки exit code 37 (недостаточно Gram) на action phase в TON.

Exit code 37 — недостаточно Gram

Action phase не смог выполнить исходящее действие: на аккаунте не хватает Gram на value сообщения и/или комиссии. Compute phase мог пройти успешно — падение именно при отправке.


Причина

  • value исходящего сообщения больше баланса после gas compute phase;
  • SendMode оставляет на балансе меньше, чем нужно для fees;
  • контракт шлёт несколько сообщений, сумма value + fees > остатка;
  • забыли учесть storage fee и forward fee.

Решение

tact (fallback highlight)
// Tact 1.6+
message Transfer {
    queryId: Int as uint64;
    amount: Int as coins;
}

contract Vault {
    balance: Int as coins;

    receive(msg: Transfer) {
        // Оставляем запас на газ и storage — не отправляй весь баланс
        require(myBalance() > msg.amount + ton("0.05"), "Not enough GRAM");

        send(SendParameters {
            to: sender(),
            value: msg.amount,
            mode: SendPayGasSeparately, // fees отдельно от value
            bounce: true,
            body: "refund".asComment(),
        });
    }
}
typescript
// @ton/core ^0.59 — проверка до отправки с кошелька
import { toNano } from "@ton/core";

const balance = await client.getBalance(wallet.address);
const sendAmount = toNano("0.5");
const feeReserve = toNano("0.05");

if (balance < sendAmount + feeReserve) {
  throw new Error("Not enough GRAM for value + fees");
}

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

Перед send считай value + forward_fee + gas_reserve. В тестах (@ton/sandbox) логируй баланс до/после и не используй SendRemainingBalance, если контракту ещё нужны средства на следующие вызовы.

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