Как ограничить списание Mina диапазоном неотрицательного UInt64

Вычитание в конечном поле всегда даёт элемент поля. Для беззнакового баланса нужна проверяемая целочисленная арифметика, исключающая обход ограничения через модуль поля.

Проверьте первую недопустимую сумму

Запишите баланс в четыре единицы и попробуйте снять пять. Проверяемое вычитание UInt64.sub в o1js обнаруживает выход ниже нуля. Добавьте в тесты успешное списание четырёх и попытку зачисления сверх UInt64.MAXINT. До вычисления нового баланса свяжите исходное значение с реальным состоянием счёта.

const available = UInt64.from(4);
const requested = UInt64.from(5);
const remaining = available.sub(requested);

Проверьте преобразования на границе

Разбирайте внешние суммы как точные целые в минимальных единицах и избегайте потерь при переводе в JavaScript Number. Проверка диапазона не исправит округление, произошедшее до входа в схему. Сверьте представления суммы при подписании, показе десятичной дроби и фактическом списании контрактом.

Источники