taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

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:
Mpackages/taler-util/src/amounts.test.ts | 6++++++
Mpackages/taler-util/src/amounts.ts | 4+++-
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 };