taler-typescript-core

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

commit c3d09f9f95db54ae3fa460909e043e949b0578f1
parent 218ca3a7893a38d61896cd1894a75f4e04887379
Author: Florian Dold <dold@taler.net>
Date:   Wed, 22 Jul 2026 10:48:15 +0200

wallet: keep a denomination without a family absent on sqlite

The column is nullable and both the write path and the IndexedDB backend treat
the field as optional, but reading it back on sqlite produced 0, a serial that
AUTOINCREMENT never assigns.

Diffstat:
Mpackages/taler-wallet-core/src/db-common.ts | 7++++++-
Mpackages/taler-wallet-core/src/dbtx-indexeddb.ts | 7+++++--
Mpackages/taler-wallet-core/src/dbtx-sqlite.ts | 6+++++-
3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/packages/taler-wallet-core/src/db-common.ts b/packages/taler-wallet-core/src/db-common.ts @@ -2784,7 +2784,12 @@ export interface WalletDenomination { fees: DenomFees; - denominationFamilySerial: number; + /** + * Family the denomination belongs to. + * + * Absent for denominations stored before the family was known. + */ + denominationFamilySerial?: number; /** * Validity start date of the denomination. diff --git a/packages/taler-wallet-core/src/dbtx-indexeddb.ts b/packages/taler-wallet-core/src/dbtx-indexeddb.ts @@ -1675,9 +1675,12 @@ export class IdbWalletTransaction implements WalletDbTransaction { if (!first.hasValue) { return undefined; } + // Denominations without a family are not part of the index. + const firstSerial = first.value.denominationFamilySerial; if ( - first.value.denominationFamilySerial < denominationFamilySerial || - (first.value.denominationFamilySerial === denominationFamilySerial && + firstSerial == null || + firstSerial < denominationFamilySerial || + (firstSerial === denominationFamilySerial && first.value.stampExpireWithdraw < minStampExpireWithdraw) ) { cursor.continue([denominationFamilySerial, minStampExpireWithdraw]); diff --git a/packages/taler-wallet-core/src/dbtx-sqlite.ts b/packages/taler-wallet-core/src/dbtx-sqlite.ts @@ -928,7 +928,11 @@ export class SqliteWalletTransaction implements WalletDbTransaction { exchangeMasterPub: dbToCrock(row.exchange_master_pub), currency: str(row.currency), value: dbAmount(row.value), - denominationFamilySerial: num(row.denomination_family_serial), + ...(row.denomination_family_serial != null + ? { + denominationFamilySerial: num(row.denomination_family_serial), + } + : undefined), stampStart: dbTimestamp(row.stamp_start), stampExpireWithdraw: dbTimestamp(row.stamp_expire_withdraw), stampExpireDeposit: dbTimestamp(row.stamp_expire_deposit),