Как ограничить списание Mina диапазоном неотрицательного UInt64
Вычитание в конечном поле всегда даёт элемент поля. Для беззнакового баланса нужна проверяемая целочисленная арифметика, исключающая обход ограничения через модуль поля.
Проверьте первую недопустимую сумму
Запишите баланс в четыре единицы и попробуйте снять пять. Проверяемое вычитание UInt64.sub в o1js обнаруживает выход ниже нуля. Добавьте в тесты успешное списание четырёх и попытку зачисления сверх UInt64.MAXINT. До вычисления нового баланса свяжите исходное значение с реальным состоянием счёта.
const available = UInt64.from(4);
const requested = UInt64.from(5);
const remaining = available.sub(requested);
Проверьте преобразования на границе
Разбирайте внешние суммы как точные целые в минимальных единицах и избегайте потерь при переводе в JavaScript Number. Проверка диапазона не исправит округление, произошедшее до входа в схему. Сверьте представления суммы при подписании, показе десятичной дроби и фактическом списании контрактом.