Почему ячейка TON переполняется, когда в ней ещё есть свободные биты

Сериализатор записал четыре ссылки на дочерние ячейки и остановился на пятой. Подсчёт байтов тела здесь мало помогает: у ячейки есть отдельный лимит на ссылки.

Проверьте оба остатка в построителе

Пример для @ton/core создаёт обычную ячейку и один лист. Четыре ссылки на этот же лист занимают четыре позиции. После записи трёхбитного числа ещё свободны 1020 бит, но места для ссылок больше нет. Проверка одного availableBits пропустила бы недопустимую операцию.

import { beginCell } from "@ton/core";
const leaf = beginCell().storeUint(1, 1).endCell();
const b = beginCell().storeUint(7, 3);
for (let i = 0; i < 4; i++) b.storeRef(leaf);
console.log(b.availableBits, b.availableRefs);

Согласуйте разбиение с получателем

В собственной схеме можно поместить несколько потомков в отдельную ячейку и научить декодер переходить по ссылке. Проверьте пустой и полностью заполненный набор. При реализации заданной TL-B схемы соблюдайте описанную в ней вложенность и признаки хранения по ссылке. Перенос поля в новую ячейку меняет сериализацию и может нарушить ранее вычисленные подписи или адреса.

docs.ton.org TON cell layout