commit 66835ab57e8c1710532a3cb9f622b9077e902047
parent 732cf258e3fce3dfb2c5e323e4038a533b2d5788
Author: Florian Dold <dold@taler.net>
Date: Mon, 20 Jul 2026 13:58:59 +0200
util: throw on subtraction of denormalized amounts
Diffstat:
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/packages/taler-util/src/amounts.test.ts b/packages/taler-util/src/amounts.test.ts
@@ -57,6 +57,12 @@ test("amount subtraction (saturation)", (t) => {
assert.ok(!res.saturated);
});
+test("Amounts.sub throws instead of silently underflowing on a denormalized fraction", (t) => {
+ assert.throws(() =>
+ Amounts.sub(jAmt(10, 0, "EUR"), jAmt(2, 250000000, "EUR")),
+ );
+});
+
test("amount comparison", (t) => {
assert.strictEqual(Amounts.cmp(jAmt(1, 0, "EUR"), jAmt(1, 0, "EUR")), 0);
assert.strictEqual(Amounts.cmp(jAmt(1, 1, "EUR"), jAmt(1, 0, "EUR")), 1);
diff --git a/packages/taler-util/src/amounts.ts b/packages/taler-util/src/amounts.ts
@@ -374,7 +374,9 @@ export class Amounts {
value--;
fraction += amountFractionalBase;
}
- console.assert(fraction >= bJ.fraction);
+ if (fraction < bJ.fraction) {
+ throw Error("assertion failed: fraction underflow in Amounts.sub");
+ }
fraction -= bJ.fraction;
if (value < bJ.value) {
return { amount: { currency, value: 0, fraction: 0 }, saturated: true };