diff options
Diffstat (limited to 'packages/taler-wallet-core/src/balance.ts')
-rw-r--r-- | packages/taler-wallet-core/src/balance.ts | 153 |
1 files changed, 94 insertions, 59 deletions
diff --git a/packages/taler-wallet-core/src/balance.ts b/packages/taler-wallet-core/src/balance.ts index 67ce73d41..76e604324 100644 --- a/packages/taler-wallet-core/src/balance.ts +++ b/packages/taler-wallet-core/src/balance.ts @@ -57,6 +57,7 @@ import { assertUnreachable, BalanceFlag, BalancesResponse, + checkDbInvariant, GetBalanceDetailRequest, j2s, Logger, @@ -350,13 +351,15 @@ export async function getBalancesInsideTransaction( await tx.withdrawalGroups.indexes.byStatus .iter(keyRangeActive) - .forEachAsync(async (wgRecord) => { - const currency = Amounts.currencyOf(wgRecord.denomsSel.totalCoinValue); - switch (wgRecord.status) { + .forEachAsync(async (wg) => { + switch (wg.status) { case WithdrawalGroupStatus.AbortedBank: case WithdrawalGroupStatus.AbortedExchange: case WithdrawalGroupStatus.FailedAbortingBank: case WithdrawalGroupStatus.FailedBankAborted: + case WithdrawalGroupStatus.AbortedOtherWallet: + case WithdrawalGroupStatus.AbortedUserRefused: + case WithdrawalGroupStatus.DialogProposed: case WithdrawalGroupStatus.Done: // Does not count as pendingIncoming return; @@ -371,34 +374,59 @@ export async function getBalancesInsideTransaction( // Pending, but no special flag. break; case WithdrawalGroupStatus.SuspendedKyc: - case WithdrawalGroupStatus.PendingKyc: - await balanceStore.setFlagIncomingKyc( - currency, - wgRecord.exchangeBaseUrl, + case WithdrawalGroupStatus.PendingKyc: { + checkDbInvariant( + wg.denomsSel !== undefined, + "wg in kyc state should have been initialized", ); + const currency = Amounts.currencyOf(wg.denomsSel.totalCoinValue); + await balanceStore.setFlagIncomingKyc(currency, wg.exchangeBaseUrl); break; + } case WithdrawalGroupStatus.PendingAml: - case WithdrawalGroupStatus.SuspendedAml: - await balanceStore.setFlagIncomingAml( - currency, - wgRecord.exchangeBaseUrl, + case WithdrawalGroupStatus.SuspendedAml: { + checkDbInvariant( + wg.denomsSel !== undefined, + "wg in aml state should have been initialized", ); + const currency = Amounts.currencyOf(wg.denomsSel.totalCoinValue); + await balanceStore.setFlagIncomingAml(currency, wg.exchangeBaseUrl); break; - case WithdrawalGroupStatus.PendingRegisteringBank: - case WithdrawalGroupStatus.PendingWaitConfirmBank: + } + case WithdrawalGroupStatus.PendingRegisteringBank: { + if (wg.denomsSel && wg.exchangeBaseUrl) { + const currency = Amounts.currencyOf(wg.denomsSel.totalCoinValue); + await balanceStore.setFlagIncomingConfirmation( + currency, + wg.exchangeBaseUrl, + ); + } + break; + } + case WithdrawalGroupStatus.PendingWaitConfirmBank: { + checkDbInvariant( + wg.denomsSel !== undefined, + "wg in confirmed state should have been initialized", + ); + const currency = Amounts.currencyOf(wg.denomsSel.totalCoinValue); await balanceStore.setFlagIncomingConfirmation( currency, - wgRecord.exchangeBaseUrl, + wg.exchangeBaseUrl, ); break; + } default: - assertUnreachable(wgRecord.status); + assertUnreachable(wg.status); + } + if (wg.denomsSel && wg.exchangeBaseUrl) { + // only inform pending incoming if amount and exchange has been selected + const currency = Amounts.currencyOf(wg.denomsSel.totalCoinValue); + await balanceStore.addPendingIncoming( + currency, + wg.exchangeBaseUrl, + wg.denomsSel.totalCoinValue, + ); } - await balanceStore.addPendingIncoming( - currency, - wgRecord.exchangeBaseUrl, - wgRecord.denomsSel.totalCoinValue, - ); }); await tx.peerPushDebit.indexes.byStatus @@ -407,7 +435,7 @@ export async function getBalancesInsideTransaction( switch (ppdRecord.status) { case PeerPushDebitStatus.AbortingDeletePurse: case PeerPushDebitStatus.SuspendedAbortingDeletePurse: - case PeerPushDebitStatus.SuspendedReady: + case PeerPushDebitStatus.PendingReady: case PeerPushDebitStatus.SuspendedReady: case PeerPushDebitStatus.PendingCreatePurse: case PeerPushDebitStatus.SuspendedCreatePurse: { @@ -472,19 +500,21 @@ export async function getBalances( logger.trace("starting to compute balance"); const wbal = await wex.db.runReadWriteTx( - [ - "coinAvailability", - "coins", - "depositGroups", - "exchangeDetails", - "exchanges", - "globalCurrencyAuditors", - "globalCurrencyExchanges", - "purchases", - "refreshGroups", - "withdrawalGroups", - "peerPushDebit", - ], + { + storeNames: [ + "coinAvailability", + "coins", + "depositGroups", + "exchangeDetails", + "exchanges", + "globalCurrencyAuditors", + "globalCurrencyExchanges", + "purchases", + "refreshGroups", + "withdrawalGroups", + "peerPushDebit", + ], + }, async (tx) => { return getBalancesInsideTransaction(wex, tx); }, @@ -557,13 +587,15 @@ export async function getPaymentBalanceDetails( req: PaymentRestrictionsForBalance, ): Promise<PaymentBalanceDetails> { return await wex.db.runReadOnlyTx( - [ - "coinAvailability", - "refreshGroups", - "exchanges", - "exchangeDetails", - "denominations", - ], + { + storeNames: [ + "coinAvailability", + "refreshGroups", + "exchanges", + "exchangeDetails", + "denominations", + ], + }, async (tx) => { return getPaymentBalanceDetailsInTx(wex, tx, req); }, @@ -729,25 +761,28 @@ export async function getBalanceDetail( ): Promise<PaymentBalanceDetails> { const exchanges: { exchangeBaseUrl: string; exchangePub: string }[] = []; const wires = new Array<string>(); - await wex.db.runReadOnlyTx(["exchanges", "exchangeDetails"], async (tx) => { - const allExchanges = await tx.exchanges.iter().toArray(); - for (const e of allExchanges) { - const details = await getExchangeWireDetailsInTx(tx, e.baseUrl); - if (!details || req.currency !== details.currency) { - continue; - } - details.wireInfo.accounts.forEach((a) => { - const payto = parsePaytoUri(a.payto_uri); - if (payto && !wires.includes(payto.targetType)) { - wires.push(payto.targetType); + await wex.db.runReadOnlyTx( + { storeNames: ["exchanges", "exchangeDetails"] }, + async (tx) => { + const allExchanges = await tx.exchanges.iter().toArray(); + for (const e of allExchanges) { + const details = await getExchangeWireDetailsInTx(tx, e.baseUrl); + if (!details || req.currency !== details.currency) { + continue; } - }); - exchanges.push({ - exchangePub: details.masterPublicKey, - exchangeBaseUrl: e.baseUrl, - }); - } - }); + details.wireInfo.accounts.forEach((a) => { + const payto = parsePaytoUri(a.payto_uri); + if (payto && !wires.includes(payto.targetType)) { + wires.push(payto.targetType); + } + }); + exchanges.push({ + exchangePub: details.masterPublicKey, + exchangeBaseUrl: e.baseUrl, + }); + } + }, + ); return await getPaymentBalanceDetails(wex, { currency: req.currency, |