Ошибка: FunC — cannot compute при чтении cell

Причина и решение ошибки FunC «cannot compute» при чтении или константном разборе cell.

FunC: «cannot compute» при чтении cell

Компилятор FunC (или fift-константный контекст) не смог статически вычислить выражение с cell/slice: значение известно только в runtime, а код требует compile-time константу.


Причина

  • load_uint / разбор cell в const / глобальной инициализации;
  • asm или встроенная функция помечена как вычислимая только в runtime;
  • #include / константный hash от данных, которые ещё не зафиксированы;
  • попытка cell_hash(...) над неконстантным builder на этапе compile.

Решение

func (fallback highlight)
;; Плохо: константный разбор «живой» cell на этапе compile
;; const int x = cs~load_uint(32);  ;; → cannot compute

;; Хорошо: читай cell в runtime внутри recv / method
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
    int op = in_msg_body~load_uint(32);
    int query_id = in_msg_body~load_uint(64);
    ;; дальше — обычная runtime-логика
}

;; Константы задавай литералами или asm-константами, не через parse
const int OP_TRANSFER = 0xf8a7ea5;

Если нужен hash кода/data при деплое — считай его в TypeScript (Cell.hash()) и передавай в контракт аргументом, а не пытайся «вычислить» в FunC const-секции из динамической cell.

typescript
// @ton/core ^0.59
import { beginCell } from "@ton/core";

const data = beginCell().storeUint(1, 32).endCell();
const hash = data.hash(); // Buffer — уже вне FunC compiler

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

В FunC разделяй: const = литералы и простые арифметические константы; parse cell = только в impure runtime-функциях. Если компилятор пишет cannot compute — вынеси выражение из const-контекста.

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