Ошибка: Tact — Static capacity exceeded

Причина и решение ошибки компиляции Tact «Static capacity exceeded».

Tact: «Static capacity exceeded» при компиляции

Компилятор Tact не смог уместить статически вычисленную структуру (storage / message / константу) в лимиты одной cell: слишком много бит или ссылок в фиксированной раскладке.


Причина

  • в contract storage слишком много полей подряд без упаковки в вложенные структуры;
  • большое map / много полей с широкими Int as uint256 в одном слое;
  • message с длинным фиксированным layout, который > 1023 бит;
  • попытка хранить «всё в корне» вместо дерева cell.

Воспроизводится на Tact 1.5–1.6+ при разборе storage/message layout на этапе compile.


Решение

tact (fallback highlight)
// Tact 1.6+ — дроби storage на вложенные структуры (отдельные cells)
struct Meta {
    name: String;
    url: String;
}

struct Balances {
    ton: Int as coins;
    points: Int as uint64;
}

contract Game {
    owner: Address;
    meta: Meta;       // уйдёт в ref, а не раздует корень
    balances: Balances;
    counter: Int as uint32;

    init(owner: Address) {
        self.owner = owner;
        self.meta = Meta{ name: "", url: "" };
        self.balances = Balances{ ton: 0, points: 0 };
        self.counter = 0;
    }

    receive("inc") {
        self.counter = self.counter + 1;
    }
}

Для длинных строк используй String / slice в отдельных cells, не набор Int as uint256 «под байты».


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

Проектируй storage как дерево: корень ≤1023 бит / 4 refs. После добавления полей смотри отчёт компилятора и выноси группы полей в struct, которые Tact кладёт в refs.

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