From a844136489611525726c117cb28086b854bee5c0 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Mon, 26 Jun 2023 19:27:34 +0200 Subject: wallet-core: make changes to available amount atomic W.r.t. transactions --- .../taler-wallet-core/src/operations/common.ts | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'packages/taler-wallet-core/src/operations/common.ts') diff --git a/packages/taler-wallet-core/src/operations/common.ts b/packages/taler-wallet-core/src/operations/common.ts index 37f1a2f22..52e4c4b53 100644 --- a/packages/taler-wallet-core/src/operations/common.ts +++ b/packages/taler-wallet-core/src/operations/common.ts @@ -81,6 +81,38 @@ export interface CoinsSpendInfo { allocationId: TransactionIdStr; } +export async function makeCoinsVisible( + ws: InternalWalletState, + tx: GetReadWriteAccess<{ + coins: typeof WalletStoresV1.coins; + coinAvailability: typeof WalletStoresV1.coinAvailability; + }>, + transactionId: string, +): Promise { + const coins = await tx.coins.indexes.bySourceTransactionId.getAll( + transactionId, + ); + for (const coinRecord of coins) { + if (!coinRecord.visible) { + coinRecord.visible = 1; + await tx.coins.put(coinRecord); + const ageRestriction = coinRecord.maxAge; + const car = await tx.coinAvailability.get([ + coinRecord.exchangeBaseUrl, + coinRecord.denomPubHash, + ageRestriction, + ]); + if (!car) { + logger.error("missing coin availability record"); + continue; + } + const visCount = car.visibleCoinCount ?? 0; + car.visibleCoinCount = visCount + 1; + await tx.coinAvailability.put(car); + } + } +} + export async function makeCoinAvailable( ws: InternalWalletState, tx: GetReadWriteAccess<{ @@ -195,6 +227,13 @@ export async function spendCoins( ); } coinAvailability.freshCoinCount--; + if (coin.visible) { + if (!coinAvailability.visibleCoinCount) { + logger.error("coin availability inconsistent"); + } else { + coinAvailability.visibleCoinCount--; + } + } await tx.coins.put(coin); await tx.coinAvailability.put(coinAvailability); } -- cgit v1.2.3