gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] branch master updated (0b044475a -> 194eeea6a)


From: gnunet
Subject: [taler-wallet-core] branch master updated (0b044475a -> 194eeea6a)
Date: Mon, 19 Feb 2024 20:07:44 +0100

This is an automated email from the git hooks/post-receive script.

dold pushed a change to branch master
in repository wallet-core.

    from 0b044475a removing deprecated reverse function
     new e1a7bf482 wallet-core: better import hygiene, cleanup withdrawals
     new 194eeea6a restructure

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 packages/taler-harness/src/bench2.ts               |  10 +-
 packages/taler-harness/src/index.ts                |   3 +-
 .../src/integrationtests/test-exchange-deposit.ts  |  14 +-
 .../src/integrationtests/test-exchange-purse.ts    |  12 +-
 .../src/integrationtests/test-wallet-dbless.ts     |  10 +-
 packages/taler-util/src/index.ts                   |   1 +
 .../src/util => taler-util/src}/timer.ts           |   0
 packages/taler-util/src/wallet-types.ts            | 106 ++++++++++
 packages/taler-wallet-core/package.json            |   3 +
 packages/taler-wallet-core/src/attention.ts        |   2 +-
 packages/taler-wallet-core/src/backup/index.ts     | 127 +-----------
 .../src/crypto/workers/crypto-dispatcher.ts        |   4 +-
 packages/taler-wallet-core/src/db.ts               |   7 +-
 packages/taler-wallet-core/src/dbless.ts           |  35 ++--
 packages/taler-wallet-core/src/deposits.ts         |  12 +-
 packages/taler-wallet-core/src/exchanges.ts        |  20 +-
 packages/taler-wallet-core/src/host-impl.node.ts   |  12 +-
 packages/taler-wallet-core/src/host-impl.qtart.ts  |   3 +-
 packages/taler-wallet-core/src/index.ts            |  43 ++--
 .../taler-wallet-core/src/internal-wallet-state.ts |   4 +-
 packages/taler-wallet-core/src/pay-merchant.ts     |  10 +-
 .../taler-wallet-core/src/pay-peer-pull-credit.ts  |   4 +-
 .../taler-wallet-core/src/pay-peer-pull-debit.ts   |   9 +-
 .../taler-wallet-core/src/pay-peer-push-credit.ts  |   6 +-
 .../taler-wallet-core/src/pay-peer-push-debit.ts   |   4 +-
 packages/taler-wallet-core/src/refresh.ts          |  10 +-
 packages/taler-wallet-core/src/shepherd.ts         |   6 +-
 packages/taler-wallet-core/src/testing.ts          |   6 +-
 packages/taler-wallet-core/src/transactions.ts     |  14 +-
 .../taler-wallet-core/src/util/coinSelection.ts    |  11 +-
 .../taler-wallet-core/src/util/denominations.ts    |   3 +-
 .../src/util/instructedAmountConversion.ts         |   9 +-
 packages/taler-wallet-core/src/wallet.ts           |  80 ++++----
 packages/taler-wallet-core/src/withdraw.ts         | 220 ++++++++++++++-------
 packages/taler-wallet-embedded/src/wallet-qjs.ts   |   2 +-
 .../src/hooks/useProviderStatus.ts                 |   3 +-
 .../src/wallet/AddBackupProvider/index.ts          |   8 +-
 .../src/wallet/AddBackupProvider/state.ts          |   7 +-
 .../src/wallet/Backup.stories.tsx                  |  15 +-
 .../src/wallet/BackupPage.tsx                      |  24 ++-
 .../src/wallet/ExchangeSelection/state.ts          |   6 +-
 .../src/wallet/ProviderDetail.stories.tsx          |   3 +-
 .../src/wallet/ProviderDetailPage.tsx              |  12 +-
 .../taler-wallet-webextension/src/wxBackend.ts     |   2 +-
 44 files changed, 477 insertions(+), 425 deletions(-)
 rename packages/{taler-wallet-core/src/util => taler-util/src}/timer.ts (100%)

diff --git a/packages/taler-harness/src/bench2.ts 
b/packages/taler-harness/src/bench2.ts
index 35c12b2d4..c85bd6a5d 100644
--- a/packages/taler-harness/src/bench2.ts
+++ b/packages/taler-harness/src/bench2.ts
@@ -26,18 +26,20 @@ import {
   Logger,
 } from "@gnu-taler/taler-util";
 import { createPlatformHttpLib } from "@gnu-taler/taler-util/http";
+import {
+  CryptoDispatcher,
+  SynchronousCryptoWorkerFactoryPlain,
+  Wallet,
+} from "@gnu-taler/taler-wallet-core";
 import {
   checkReserve,
   createTestingReserve,
-  CryptoDispatcher,
   depositCoin,
   downloadExchangeInfo,
   findDenomOrThrow,
   refreshCoin,
-  SynchronousCryptoWorkerFactoryPlain,
-  Wallet,
   withdrawCoin,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-wallet-core/dbless";
 
 /**
  * Entry point for the benchmark.
diff --git a/packages/taler-harness/src/index.ts 
b/packages/taler-harness/src/index.ts
index 0fdf3a15b..9ca297cb2 100644
--- a/packages/taler-harness/src/index.ts
+++ b/packages/taler-harness/src/index.ts
@@ -46,8 +46,6 @@ import {
   CryptoDispatcher,
   SynchronousCryptoWorkerFactoryPlain,
   WalletApiOperation,
-  downloadExchangeInfo,
-  topupReserveWithDemobank,
 } from "@gnu-taler/taler-wallet-core";
 import { deepStrictEqual } from "assert";
 import fs from "fs";
@@ -70,6 +68,7 @@ import {
 } from "./harness/helpers.js";
 import { getTestInfo, runTests } from "./integrationtests/testrunner.js";
 import { lintExchangeDeployment } from "./lint.js";
+import { downloadExchangeInfo, topupReserveWithDemobank } from 
"@gnu-taler/taler-wallet-core/dbless";
 
 const logger = new Logger("taler-harness:index.ts");
 
diff --git 
a/packages/taler-harness/src/integrationtests/test-exchange-deposit.ts 
b/packages/taler-harness/src/integrationtests/test-exchange-deposit.ts
index 8e1726aba..ca8b9e375 100644
--- a/packages/taler-harness/src/integrationtests/test-exchange-deposit.ts
+++ b/packages/taler-harness/src/integrationtests/test-exchange-deposit.ts
@@ -26,20 +26,20 @@ import {
 } from "@gnu-taler/taler-util";
 import { createPlatformHttpLib } from "@gnu-taler/taler-util/http";
 import {
-  checkReserve,
   CryptoDispatcher,
+  SynchronousCryptoWorkerFactoryPlain,
+  Wallet,
+} from "@gnu-taler/taler-wallet-core";
+import {
+  checkReserve,
   depositCoin,
   downloadExchangeInfo,
   findDenomOrThrow,
-  SynchronousCryptoWorkerFactoryPlain,
   topupReserveWithDemobank,
-  Wallet,
   withdrawCoin,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-wallet-core/dbless";
 import { GlobalTestState } from "../harness/harness.js";
-import {
-  createSimpleTestkudosEnvironmentV2,
-} from "../harness/helpers.js";
+import { createSimpleTestkudosEnvironmentV2 } from "../harness/helpers.js";
 
 /**
  * Run test for basic, bank-integrated withdrawal and payment.
diff --git a/packages/taler-harness/src/integrationtests/test-exchange-purse.ts 
b/packages/taler-harness/src/integrationtests/test-exchange-purse.ts
index c3815e1de..8ff740732 100644
--- a/packages/taler-harness/src/integrationtests/test-exchange-purse.ts
+++ b/packages/taler-harness/src/integrationtests/test-exchange-purse.ts
@@ -32,17 +32,19 @@ import {
   TalerPreciseTimestamp,
 } from "@gnu-taler/taler-util";
 import {
-  checkReserve,
   CryptoDispatcher,
-  downloadExchangeInfo,
   EncryptContractRequest,
-  findDenomOrThrow,
   SpendCoinDetails,
   SynchronousCryptoWorkerFactoryPlain,
-  topupReserveWithDemobank,
   Wallet,
-  withdrawCoin,
 } from "@gnu-taler/taler-wallet-core";
+import {
+  checkReserve,
+  downloadExchangeInfo,
+  findDenomOrThrow,
+  topupReserveWithDemobank,
+  withdrawCoin,
+} from "@gnu-taler/taler-wallet-core/dbless";
 import { GlobalTestState, harnessHttpLib } from "../harness/harness.js";
 import { createSimpleTestkudosEnvironmentV2 } from "../harness/helpers.js";
 
diff --git a/packages/taler-harness/src/integrationtests/test-wallet-dbless.ts 
b/packages/taler-harness/src/integrationtests/test-wallet-dbless.ts
index 32534f2c8..1c4c16e0f 100644
--- a/packages/taler-harness/src/integrationtests/test-wallet-dbless.ts
+++ b/packages/taler-harness/src/integrationtests/test-wallet-dbless.ts
@@ -25,17 +25,19 @@ import {
   TalerError,
 } from "@gnu-taler/taler-util";
 import {
-  checkReserve,
   CryptoDispatcher,
+  SynchronousCryptoWorkerFactoryPlain,
+  Wallet,
+} from "@gnu-taler/taler-wallet-core";
+import {
+  checkReserve,
   depositCoin,
   downloadExchangeInfo,
   findDenomOrThrow,
   refreshCoin,
-  SynchronousCryptoWorkerFactoryPlain,
   topupReserveWithDemobank,
-  Wallet,
   withdrawCoin,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-wallet-core/dbless";
 import { GlobalTestState, harnessHttpLib } from "../harness/harness.js";
 import { createSimpleTestkudosEnvironmentV2 } from "../harness/helpers.js";
 
diff --git a/packages/taler-util/src/index.ts b/packages/taler-util/src/index.ts
index edc9c4ff2..ec5b85d29 100644
--- a/packages/taler-util/src/index.ts
+++ b/packages/taler-util/src/index.ts
@@ -50,6 +50,7 @@ export * from "./taler-crypto.js";
 export * from "./taler-types.js";
 export * from "./taleruri.js";
 export * from "./time.js";
+export * from "./timer.js";
 export * from "./transaction-test-data.js";
 export * from "./transactions-types.js";
 export * from "./url.js";
diff --git a/packages/taler-wallet-core/src/util/timer.ts 
b/packages/taler-util/src/timer.ts
similarity index 100%
rename from packages/taler-wallet-core/src/util/timer.ts
rename to packages/taler-util/src/timer.ts
diff --git a/packages/taler-util/src/wallet-types.ts 
b/packages/taler-util/src/wallet-types.ts
index 4e3e8ac30..5293fcd55 100644
--- a/packages/taler-util/src/wallet-types.ts
+++ b/packages/taler-util/src/wallet-types.ts
@@ -3074,3 +3074,109 @@ export interface RetryLoopOpts {
    */
   stopWhenDone?: boolean;
 }
+
+/**
+ * Information about one provider.
+ *
+ * We don't store the account key here,
+ * as that's derived from the wallet root key.
+ */
+export interface ProviderInfo {
+  active: boolean;
+  syncProviderBaseUrl: string;
+  name: string;
+  terms?: BackupProviderTerms;
+  /**
+   * Last communication issue with the provider.
+   */
+  lastError?: TalerErrorDetail;
+  lastSuccessfulBackupTimestamp?: TalerPreciseTimestamp;
+  lastAttemptedBackupTimestamp?: TalerPreciseTimestamp;
+  paymentProposalIds: string[];
+  backupProblem?: BackupProblem;
+  paymentStatus: ProviderPaymentStatus;
+}
+
+export interface BackupProviderTerms {
+  supportedProtocolVersion: string;
+  annualFee: AmountString;
+  storageLimitInMegabytes: number;
+}
+
+export type BackupProblem =
+  | BackupUnreadableProblem
+  | BackupConflictingDeviceProblem;
+
+export interface BackupUnreadableProblem {
+  type: "backup-unreadable";
+}
+
+export interface BackupConflictingDeviceProblem {
+  type: "backup-conflicting-device";
+  otherDeviceId: string;
+  myDeviceId: string;
+  backupTimestamp: AbsoluteTime;
+}
+
+export type ProviderPaymentStatus =
+  | ProviderPaymentTermsChanged
+  | ProviderPaymentPaid
+  | ProviderPaymentInsufficientBalance
+  | ProviderPaymentUnpaid
+  | ProviderPaymentPending;
+
+export enum ProviderPaymentType {
+  Unpaid = "unpaid",
+  Pending = "pending",
+  InsufficientBalance = "insufficient-balance",
+  Paid = "paid",
+  TermsChanged = "terms-changed",
+}
+
+export interface ProviderPaymentUnpaid {
+  type: ProviderPaymentType.Unpaid;
+}
+
+export interface ProviderPaymentInsufficientBalance {
+  type: ProviderPaymentType.InsufficientBalance;
+  amount: AmountString;
+}
+
+export interface ProviderPaymentPending {
+  type: ProviderPaymentType.Pending;
+  talerUri?: string;
+}
+
+export interface ProviderPaymentPaid {
+  type: ProviderPaymentType.Paid;
+  paidUntil: AbsoluteTime;
+}
+
+export interface ProviderPaymentTermsChanged {
+  type: ProviderPaymentType.TermsChanged;
+  paidUntil: AbsoluteTime;
+  oldTerms: BackupProviderTerms;
+  newTerms: BackupProviderTerms;
+}
+
+// FIXME: Does not really belong here, move to sync API
+export interface SyncTermsOfServiceResponse {
+  // maximum backup size supported
+  storage_limit_in_megabytes: number;
+
+  // Fee for an account, per year.
+  annual_fee: AmountString;
+
+  // protocol version supported by the server,
+  // for now always "0.0".
+  version: string;
+}
+
+// FIXME: Does not really belong here, move to sync API
+export const codecForSyncTermsOfServiceResponse =
+  (): Codec<SyncTermsOfServiceResponse> =>
+    buildCodecForObject<SyncTermsOfServiceResponse>()
+      .property("storage_limit_in_megabytes", codecForNumber())
+      .property("annual_fee", codecForAmountString())
+      .property("version", codecForString())
+      .build("SyncTermsOfServiceResponse");
diff --git a/packages/taler-wallet-core/package.json 
b/packages/taler-wallet-core/package.json
index 7427609e5..48c3600ee 100644
--- a/packages/taler-wallet-core/package.json
+++ b/packages/taler-wallet-core/package.json
@@ -39,6 +39,9 @@
     },
     "./remote": {
       "default": "./lib/remote.js"
+    },
+    "./dbless": {
+      "default": "./lib/dbless.js"
     }
   },
   "imports": {
diff --git a/packages/taler-wallet-core/src/attention.ts 
b/packages/taler-wallet-core/src/attention.ts
index 3be1f7197..6893af010 100644
--- a/packages/taler-wallet-core/src/attention.ts
+++ b/packages/taler-wallet-core/src/attention.ts
@@ -28,7 +28,7 @@ import {
   UserAttentionsRequest,
   UserAttentionsResponse,
 } from "@gnu-taler/taler-util";
-import { timestampPreciseFromDb, timestampPreciseToDb } from "./index.js";
+import { timestampPreciseFromDb, timestampPreciseToDb } from "./db.js";
 import { InternalWalletState } from "./internal-wallet-state.js";
 
 const logger = new Logger("operations/attention.ts");
diff --git a/packages/taler-wallet-core/src/backup/index.ts 
b/packages/taler-wallet-core/src/backup/index.ts
index 13bf95026..919e92c5a 100644
--- a/packages/taler-wallet-core/src/backup/index.ts
+++ b/packages/taler-wallet-core/src/backup/index.ts
@@ -26,7 +26,6 @@
  */
 import {
   AbsoluteTime,
-  AmountString,
   AttentionType,
   BackupRecovery,
   Codec,
@@ -34,11 +33,12 @@ import {
   HttpStatusCode,
   Logger,
   PreparePayResult,
+  ProviderInfo,
+  ProviderPaymentStatus,
   RecoveryLoadRequest,
   RecoveryMergeStrategy,
   TalerError,
   TalerErrorCode,
-  TalerErrorDetail,
   TalerPreciseTimestamp,
   URL,
   buildCodecForObject,
@@ -46,12 +46,11 @@ import {
   bytesToString,
   canonicalJson,
   canonicalizeBaseUrl,
-  codecForAmountString,
   codecForBoolean,
   codecForConstString,
   codecForList,
-  codecForNumber,
   codecForString,
+  codecForSyncTermsOfServiceResponse,
   codecOptional,
   decodeCrock,
   durationFromSpec,
@@ -71,11 +70,16 @@ import {
   readTalerErrorResponse,
 } from "@gnu-taler/taler-util/http";
 import { gunzipSync, gzipSync } from "fflate";
+import { addAttentionRequest, removeAttentionRequest } from "../attention.js";
+import {
+  TaskIdentifiers,
+  TaskRunResult,
+  TaskRunResultType,
+} from "../common.js";
 import {
   BackupProviderRecord,
   BackupProviderState,
   BackupProviderStateTag,
-  BackupProviderTerms,
   ConfigRecord,
   ConfigRecordKey,
   WalletBackupConfState,
@@ -84,17 +88,8 @@ import {
   timestampPreciseToDb,
 } from "../db.js";
 import { InternalWalletState } from "../internal-wallet-state.js";
-import {
-  checkDbInvariant,
-  checkLogicInvariant,
-} from "../util/invariants.js";
-import { addAttentionRequest, removeAttentionRequest } from "../attention.js";
-import {
-  TaskIdentifiers,
-  TaskRunResult,
-  TaskRunResultType,
-} from "../common.js";
 import { preparePayForUri } from "../pay-merchant.js";
+import { checkDbInvariant, checkLogicInvariant } from "../util/invariants.js";
 
 const logger = new Logger("operations/backup.ts");
 
@@ -496,26 +491,6 @@ export async function runBackupCycle(
   }
 }
 
-export interface SyncTermsOfServiceResponse {
-  // maximum backup size supported
-  storage_limit_in_megabytes: number;
-
-  // Fee for an account, per year.
-  annual_fee: AmountString;
-
-  // protocol version supported by the server,
-  // for now always "0.0".
-  version: string;
-}
-
-export const codecForSyncTermsOfServiceResponse =
-  (): Codec<SyncTermsOfServiceResponse> =>
-    buildCodecForObject<SyncTermsOfServiceResponse>()
-      .property("storage_limit_in_megabytes", codecForNumber())
-      .property("annual_fee", codecForAmountString())
-      .property("version", codecForString())
-      .build("SyncTermsOfServiceResponse");
-
 export interface AddBackupProviderRequest {
   backupProviderBaseUrl: string;
 
@@ -664,94 +639,12 @@ export async function restoreFromRecoverySecret(): 
Promise<void> {
   return;
 }
 
-/**
- * Information about one provider.
- *
- * We don't store the account key here,
- * as that's derived from the wallet root key.
- */
-export interface ProviderInfo {
-  active: boolean;
-  syncProviderBaseUrl: string;
-  name: string;
-  terms?: BackupProviderTerms;
-  /**
-   * Last communication issue with the provider.
-   */
-  lastError?: TalerErrorDetail;
-  lastSuccessfulBackupTimestamp?: TalerPreciseTimestamp;
-  lastAttemptedBackupTimestamp?: TalerPreciseTimestamp;
-  paymentProposalIds: string[];
-  backupProblem?: BackupProblem;
-  paymentStatus: ProviderPaymentStatus;
-}
-
-export type BackupProblem =
-  | BackupUnreadableProblem
-  | BackupConflictingDeviceProblem;
-
-export interface BackupUnreadableProblem {
-  type: "backup-unreadable";
-}
-
-export interface BackupUnreadableProblem {
-  type: "backup-unreadable";
-}
-
-export interface BackupConflictingDeviceProblem {
-  type: "backup-conflicting-device";
-  otherDeviceId: string;
-  myDeviceId: string;
-  backupTimestamp: AbsoluteTime;
-}
-
-export type ProviderPaymentStatus =
-  | ProviderPaymentTermsChanged
-  | ProviderPaymentPaid
-  | ProviderPaymentInsufficientBalance
-  | ProviderPaymentUnpaid
-  | ProviderPaymentPending;
-
 export interface BackupInfo {
   walletRootPub: string;
   deviceId: string;
   providers: ProviderInfo[];
 }
 
-export enum ProviderPaymentType {
-  Unpaid = "unpaid",
-  Pending = "pending",
-  InsufficientBalance = "insufficient-balance",
-  Paid = "paid",
-  TermsChanged = "terms-changed",
-}
-
-export interface ProviderPaymentUnpaid {
-  type: ProviderPaymentType.Unpaid;
-}
-
-export interface ProviderPaymentInsufficientBalance {
-  type: ProviderPaymentType.InsufficientBalance;
-  amount: AmountString;
-}
-
-export interface ProviderPaymentPending {
-  type: ProviderPaymentType.Pending;
-  talerUri?: string;
-}
-
-export interface ProviderPaymentPaid {
-  type: ProviderPaymentType.Paid;
-  paidUntil: AbsoluteTime;
-}
-
-export interface ProviderPaymentTermsChanged {
-  type: ProviderPaymentType.TermsChanged;
-  paidUntil: AbsoluteTime;
-  oldTerms: BackupProviderTerms;
-  newTerms: BackupProviderTerms;
-}
-
 async function getProviderPaymentInfo(
   ws: InternalWalletState,
   provider: BackupProviderRecord,
diff --git a/packages/taler-wallet-core/src/crypto/workers/crypto-dispatcher.ts 
b/packages/taler-wallet-core/src/crypto/workers/crypto-dispatcher.ts
index 83897f331..f86163723 100644
--- a/packages/taler-wallet-core/src/crypto/workers/crypto-dispatcher.ts
+++ b/packages/taler-wallet-core/src/crypto/workers/crypto-dispatcher.ts
@@ -27,10 +27,12 @@ import {
   j2s,
   Logger,
   openPromise,
+  performanceNow,
   TalerError,
   TalerErrorCode,
+  timer,
+  TimerHandle,
 } from "@gnu-taler/taler-util";
-import { performanceNow, timer, TimerHandle } from "../../util/timer.js";
 import { nullCrypto, TalerCryptoInterface } from "../cryptoImplementation.js";
 import { CryptoWorker } from "./cryptoWorkerInterface.js";
 
diff --git a/packages/taler-wallet-core/src/db.ts 
b/packages/taler-wallet-core/src/db.ts
index 12801194f..33f962339 100644
--- a/packages/taler-wallet-core/src/db.ts
+++ b/packages/taler-wallet-core/src/db.ts
@@ -34,6 +34,7 @@ import {
   AmountString,
   Amounts,
   AttentionInfo,
+  BackupProviderTerms,
   Codec,
   CoinEnvelope,
   CoinPublicKeyString,
@@ -1625,12 +1626,6 @@ export type BackupProviderState =
       tag: BackupProviderStateTag.Retrying;
     };
 
-export interface BackupProviderTerms {
-  supportedProtocolVersion: string;
-  annualFee: AmountString;
-  storageLimitInMegabytes: number;
-}
-
 export interface BackupProviderRecord {
   /**
    * Base URL of the provider.
diff --git a/packages/taler-wallet-core/src/dbless.ts 
b/packages/taler-wallet-core/src/dbless.ts
index 968d3b958..1d2ebe9db 100644
--- a/packages/taler-wallet-core/src/dbless.ts
+++ b/packages/taler-wallet-core/src/dbless.ts
@@ -29,29 +29,26 @@ import {
   AbsoluteTime,
   AgeRestriction,
   AmountJson,
-  Amounts,
   AmountString,
+  Amounts,
+  DenominationPubKey,
+  ExchangeBatchDepositRequest,
+  ExchangeBatchWithdrawRequest,
+  ExchangeMeltRequest,
+  ExchangeProtocolVersion,
+  Logger,
   TalerCorebankApiClient,
+  UnblindedSignature,
   codecForAny,
   codecForBankWithdrawalOperationPostResponse,
   codecForBatchDepositSuccess,
   codecForExchangeMeltResponse,
   codecForExchangeRevealResponse,
-  codecForWithdrawResponse,
-  DenominationPubKey,
+  codecForExchangeWithdrawBatchResponse,
   encodeCrock,
-  ExchangeBatchDepositRequest,
-  ExchangeMeltRequest,
-  ExchangeProtocolVersion,
-  ExchangeWithdrawRequest,
   getRandomBytes,
   hashWire,
-  Logger,
   parsePaytoUri,
-  UnblindedSignature,
-  ExchangeBatchWithdrawRequest,
-  ExchangeWithdrawBatchResponse,
-  codecForExchangeWithdrawBatchResponse,
 } from "@gnu-taler/taler-util";
 import {
   HttpRequestLibrary,
@@ -59,16 +56,12 @@ import {
 } from "@gnu-taler/taler-util/http";
 import { TalerCryptoInterface } from "./crypto/cryptoImplementation.js";
 import { DenominationRecord } from "./db.js";
-import {
-  ExchangeInfo,
-  ExchangeKeysDownloadResult,
-  isWithdrawableDenom,
-} from "./index.js";
+import { ExchangeInfo, downloadExchangeInfo } from "./exchanges.js";
 import { assembleRefreshRevealRequest } from "./refresh.js";
-import {
-  getBankStatusUrl,
-  getBankWithdrawalInfo,
-} from "./withdraw.js";
+import { isWithdrawableDenom } from "./util/denominations.js";
+import { getBankStatusUrl, getBankWithdrawalInfo } from "./withdraw.js";
+
+export { downloadExchangeInfo };
 
 const logger = new Logger("dbless.ts");
 
diff --git a/packages/taler-wallet-core/src/deposits.ts 
b/packages/taler-wallet-core/src/deposits.ts
index b6cfa7aae..906503430 100644
--- a/packages/taler-wallet-core/src/deposits.ts
+++ b/packages/taler-wallet-core/src/deposits.ts
@@ -78,25 +78,24 @@ import {
   constructTaskIdentifier,
   spendCoins,
 } from "./common.js";
-import { DepositElementStatus, DepositGroupRecord } from "./db.js";
-import { getExchangeWireDetailsInTx } from "./exchanges.js";
 import {
+  DepositElementStatus,
+  DepositGroupRecord,
   DepositOperationStatus,
   DepositTrackingInfo,
   KycPendingInfo,
   RefreshOperationStatus,
-  createRefreshGroup,
-  getCandidateWithdrawalDenomsTx,
-  getTotalRefreshCost,
   timestampPreciseToDb,
   timestampProtocolToDb,
-} from "./index.js";
+} from "./db.js";
+import { getExchangeWireDetailsInTx } from "./exchanges.js";
 import { InternalWalletState } from "./internal-wallet-state.js";
 import {
   extractContractData,
   generateDepositPermissions,
   getTotalPaymentCost,
 } from "./pay-merchant.js";
+import { createRefreshGroup, getTotalRefreshCost } from "./refresh.js";
 import {
   constructTransactionIdentifier,
   notifyTransition,
@@ -105,6 +104,7 @@ import {
 import { assertUnreachable } from "./util/assertUnreachable.js";
 import { selectPayCoinsNew } from "./util/coinSelection.js";
 import { checkDbInvariant, checkLogicInvariant } from "./util/invariants.js";
+import { getCandidateWithdrawalDenomsTx } from "./withdraw.js";
 
 /**
  * Logger.
diff --git a/packages/taler-wallet-core/src/exchanges.ts 
b/packages/taler-wallet-core/src/exchanges.ts
index 0f080b871..2c15691aa 100644
--- a/packages/taler-wallet-core/src/exchanges.ts
+++ b/packages/taler-wallet-core/src/exchanges.ts
@@ -104,28 +104,28 @@ import {
   DenominationRecord,
   DenominationVerificationStatus,
   ExchangeDetailsRecord,
-  ExchangeEntryRecord,
-  WalletStoresV1,
-} from "./db.js";
-import {
   ExchangeEntryDbRecordStatus,
   ExchangeEntryDbUpdateStatus,
+  ExchangeEntryRecord,
   WalletDbReadOnlyTransaction,
   WalletDbReadWriteTransaction,
-  createRefreshGroup,
-  createTimeline,
-  isWithdrawableDenom,
-  selectBestForOverlappingDenominations,
-  selectMinimumFee,
+  WalletStoresV1,
   timestampAbsoluteFromDb,
   timestampOptionalPreciseFromDb,
   timestampPreciseFromDb,
   timestampPreciseToDb,
   timestampProtocolFromDb,
   timestampProtocolToDb,
-} from "./index.js";
+} from "./db.js";
 import { InternalWalletState } from "./internal-wallet-state.js";
 import { DbReadOnlyTransaction } from "./query.js";
+import { createRefreshGroup } from "./refresh.js";
+import {
+  createTimeline,
+  isWithdrawableDenom,
+  selectBestForOverlappingDenominations,
+  selectMinimumFee,
+} from "./util/denominations.js";
 import { checkDbInvariant } from "./util/invariants.js";
 import { WALLET_EXCHANGE_PROTOCOL_VERSION } from "./versions.js";
 
diff --git a/packages/taler-wallet-core/src/host-impl.node.ts 
b/packages/taler-wallet-core/src/host-impl.node.ts
index 622ea742e..a0c739f45 100644
--- a/packages/taler-wallet-core/src/host-impl.node.ts
+++ b/packages/taler-wallet-core/src/host-impl.node.ts
@@ -25,22 +25,20 @@
 import type { IDBFactory } from "@gnu-taler/idb-bridge";
 // eslint-disable-next-line no-duplicate-imports
 import {
+  AccessStats,
   BridgeIDBFactory,
   MemoryBackend,
   createSqliteBackend,
   shimIndexedDB,
 } from "@gnu-taler/idb-bridge";
-import { AccessStats } from "@gnu-taler/idb-bridge";
-import { Logger } from "@gnu-taler/taler-util";
+import { createNodeSqlite3Impl } from 
"@gnu-taler/idb-bridge/node-sqlite3-bindings";
+import { Logger, SetTimeoutTimerAPI } from "@gnu-taler/taler-util";
+import { createPlatformHttpLib } from "@gnu-taler/taler-util/http";
 import * as fs from "fs";
 import { NodeThreadCryptoWorkerFactory } from 
"./crypto/workers/nodeThreadWorker.js";
 import { SynchronousCryptoWorkerFactoryPlain } from 
"./crypto/workers/synchronousWorkerFactoryPlain.js";
-import { openTalerDatabase } from "./index.js";
-import { createPlatformHttpLib } from "@gnu-taler/taler-util/http";
-import { SetTimeoutTimerAPI } from "./util/timer.js";
-import { Wallet } from "./wallet.js";
 import { DefaultNodeWalletArgs, makeTempfileId } from "./host-common.js";
-import { createNodeSqlite3Impl } from 
"@gnu-taler/idb-bridge/node-sqlite3-bindings";
+import { Wallet } from "./wallet.js";
 
 const logger = new Logger("host-impl.node.ts");
 
diff --git a/packages/taler-wallet-core/src/host-impl.qtart.ts 
b/packages/taler-wallet-core/src/host-impl.qtart.ts
index 0fc346b44..329e491bf 100644
--- a/packages/taler-wallet-core/src/host-impl.qtart.ts
+++ b/packages/taler-wallet-core/src/host-impl.qtart.ts
@@ -36,12 +36,11 @@ import {
   createSqliteBackend,
   shimIndexedDB,
 } from "@gnu-taler/idb-bridge";
-import { Logger } from "@gnu-taler/taler-util";
+import { Logger, SetTimeoutTimerAPI } from "@gnu-taler/taler-util";
 import { createPlatformHttpLib } from "@gnu-taler/taler-util/http";
 import { qjsOs, qjsStd } from "@gnu-taler/taler-util/qtart";
 import { SynchronousCryptoWorkerFactoryPlain } from 
"./crypto/workers/synchronousWorkerFactoryPlain.js";
 import { DefaultNodeWalletArgs, makeTempfileId } from "./host-common.js";
-import { SetTimeoutTimerAPI } from "./util/timer.js";
 import { Wallet } from "./wallet.js";
 
 const logger = new Logger("host-impl.qtart.ts");
diff --git a/packages/taler-wallet-core/src/index.ts 
b/packages/taler-wallet-core/src/index.ts
index 2b619be69..d0de16ccd 100644
--- a/packages/taler-wallet-core/src/index.ts
+++ b/packages/taler-wallet-core/src/index.ts
@@ -18,40 +18,27 @@
  * Module entry point for the wallet when used as a node module.
  */
 
-// Util functionality
-export * from "./query.js";
-
-export * from "./versions.js";
-
-export * from "./db.js";
-
-// Crypto and crypto workers
-// export * from "./crypto/workers/nodeThreadWorker.js";
+export * from "./crypto/cryptoImplementation.js";
+export * from "./crypto/cryptoTypes.js";
 export {
   CryptoDispatcher,
   CryptoWorkerFactory,
 } from "./crypto/workers/crypto-dispatcher.js";
 export type { CryptoWorker } from "./crypto/workers/cryptoWorkerInterface.js";
-
-export { InternalWalletState } from "./internal-wallet-state.js";
+export { SynchronousCryptoWorkerFactoryPlain } from 
"./crypto/workers/synchronousWorkerFactoryPlain.js";
+export * from "./host-common.js";
+export * from "./host.js";
+export * from "./versions.js";
 export * from "./wallet-api-types.js";
 export * from "./wallet.js";
 
-export * from "./backup/index.js";
+export { createPairTimeline } from "./util/denominations.js";
 
-export * from "./exchanges.js";
-
-export * from "./refresh.js";
-export * from "./withdraw.js";
-
-export * from "./dbless.js";
-
-export * from "./crypto/cryptoImplementation.js";
-export * from "./crypto/cryptoTypes.js";
-
-export * from "./util/denominations.js";
-export * from "./util/timer.js";
-
-export { SynchronousCryptoWorkerFactoryPlain } from 
"./crypto/workers/synchronousWorkerFactoryPlain.js";
-export * from "./host-common.js";
-export * from "./host.js";
+// FIXME: Should these really be exported?!
+export {
+  WalletStoresV1,
+  deleteTalerDatabase,
+  exportDb,
+  importDb,
+} from "./db.js";
+export { DbAccess } from "./query.js";
diff --git a/packages/taler-wallet-core/src/internal-wallet-state.ts 
b/packages/taler-wallet-core/src/internal-wallet-state.ts
index 255019d23..d55b12269 100644
--- a/packages/taler-wallet-core/src/internal-wallet-state.ts
+++ b/packages/taler-wallet-core/src/internal-wallet-state.ts
@@ -32,6 +32,7 @@
 import { IDBFactory } from "@gnu-taler/idb-bridge";
 import {
   DenominationInfo,
+  TimerGroup,
   TransactionState,
   WalletNotification,
 } from "@gnu-taler/taler-util";
@@ -43,9 +44,8 @@ import {
   WalletDbReadWriteTransaction,
   WalletStoresV1,
 } from "./db.js";
-import { TaskScheduler } from "./shepherd.js";
 import { DbAccess } from "./query.js";
-import { TimerGroup } from "./util/timer.js";
+import { TaskScheduler } from "./shepherd.js";
 import { WalletConfig } from "./wallet-api-types.js";
 
 export const EXCHANGE_COINS_LOCK = "exchange-coins-lock";
diff --git a/packages/taler-wallet-core/src/pay-merchant.ts 
b/packages/taler-wallet-core/src/pay-merchant.ts
index 325bc24a8..15de0571c 100644
--- a/packages/taler-wallet-core/src/pay-merchant.ts
+++ b/packages/taler-wallet-core/src/pay-merchant.ts
@@ -114,21 +114,18 @@ import {
   DenominationRecord,
   PurchaseRecord,
   PurchaseStatus,
-  RefundReason,
-  WalletStoresV1,
-} from "./db.js";
-import {
-  getCandidateWithdrawalDenomsTx,
   RefundGroupRecord,
   RefundGroupStatus,
   RefundItemRecord,
   RefundItemStatus,
+  RefundReason,
   timestampPreciseToDb,
   timestampProtocolFromDb,
   timestampProtocolToDb,
   WalletDbReadOnlyTransaction,
   WalletDbReadWriteTransaction,
-} from "./index.js";
+  WalletStoresV1,
+} from "./db.js";
 import {
   EXCHANGE_COINS_LOCK,
   InternalWalletState,
@@ -147,6 +144,7 @@ import {
 import { assertUnreachable } from "./util/assertUnreachable.js";
 import { PreviousPayCoins, selectPayCoinsNew } from "./util/coinSelection.js";
 import { checkDbInvariant } from "./util/invariants.js";
+import { getCandidateWithdrawalDenomsTx } from "./withdraw.js";
 
 /**
  * Logger.
diff --git a/packages/taler-wallet-core/src/pay-peer-pull-credit.ts 
b/packages/taler-wallet-core/src/pay-peer-pull-credit.ts
index 03bc5a4b9..d862a3b3a 100644
--- a/packages/taler-wallet-core/src/pay-peer-pull-credit.ts
+++ b/packages/taler-wallet-core/src/pay-peer-pull-credit.ts
@@ -66,11 +66,11 @@ import {
   PeerPullPaymentCreditStatus,
   WithdrawalGroupStatus,
   WithdrawalRecordType,
-  fetchFreshExchange,
   timestampOptionalPreciseFromDb,
   timestampPreciseFromDb,
   timestampPreciseToDb,
-} from "./index.js";
+} from "./db.js";
+import { fetchFreshExchange } from "./exchanges.js";
 import { InternalWalletState } from "./internal-wallet-state.js";
 import {
   codecForExchangePurseStatus,
diff --git a/packages/taler-wallet-core/src/pay-peer-pull-debit.ts 
b/packages/taler-wallet-core/src/pay-peer-pull-debit.ts
index 1d6cb3d18..0b4f49ce2 100644
--- a/packages/taler-wallet-core/src/pay-peer-pull-debit.ts
+++ b/packages/taler-wallet-core/src/pay-peer-pull-debit.ts
@@ -74,21 +74,20 @@ import {
   spendCoins,
 } from "./common.js";
 import {
-  DbReadWriteTransaction,
-  InternalWalletState,
   PeerPullDebitRecordStatus,
   PeerPullPaymentIncomingRecord,
   RefreshOperationStatus,
-  StoreNames,
   WalletStoresV1,
-  createRefreshGroup,
   timestampPreciseToDb,
-} from "./index.js";
+} from "./db.js";
+import { InternalWalletState } from "./internal-wallet-state.js";
 import {
   codecForExchangePurseStatus,
   getTotalPeerPaymentCost,
   queryCoinInfosForSelection,
 } from "./pay-peer-common.js";
+import { DbReadWriteTransaction, StoreNames } from "./query.js";
+import { createRefreshGroup } from "./refresh.js";
 import {
   constructTransactionIdentifier,
   notifyTransition,
diff --git a/packages/taler-wallet-core/src/pay-peer-push-credit.ts 
b/packages/taler-wallet-core/src/pay-peer-push-credit.ts
index 0795b0c5c..ed1e09495 100644
--- a/packages/taler-wallet-core/src/pay-peer-push-credit.ts
+++ b/packages/taler-wallet-core/src/pay-peer-push-credit.ts
@@ -60,9 +60,7 @@ import {
   TransactionContext,
   constructTaskIdentifier,
 } from "./common.js";
-import { fetchFreshExchange } from "./exchanges.js";
 import {
-  InternalWalletState,
   KycPendingInfo,
   KycUserType,
   PeerPushCreditStatus,
@@ -70,7 +68,9 @@ import {
   WithdrawalGroupStatus,
   WithdrawalRecordType,
   timestampPreciseToDb,
-} from "./index.js";
+} from "./db.js";
+import { fetchFreshExchange } from "./exchanges.js";
+import { InternalWalletState } from "./internal-wallet-state.js";
 import {
   codecForExchangePurseStatus,
   getMergeReserveInfo,
diff --git a/packages/taler-wallet-core/src/pay-peer-push-debit.ts 
b/packages/taler-wallet-core/src/pay-peer-push-debit.ts
index ec1a37a31..355418601 100644
--- a/packages/taler-wallet-core/src/pay-peer-push-debit.ts
+++ b/packages/taler-wallet-core/src/pay-peer-push-debit.ts
@@ -61,17 +61,17 @@ import {
   PeerPushDebitRecord,
   PeerPushDebitStatus,
   RefreshOperationStatus,
-  createRefreshGroup,
   timestampPreciseToDb,
   timestampProtocolFromDb,
   timestampProtocolToDb,
-} from "./index.js";
+} from "./db.js";
 import { InternalWalletState } from "./internal-wallet-state.js";
 import {
   codecForExchangePurseStatus,
   getTotalPeerPaymentCost,
   queryCoinInfosForSelection,
 } from "./pay-peer-common.js";
+import { createRefreshGroup } from "./refresh.js";
 import {
   constructTransactionIdentifier,
   notifyTransition,
diff --git a/packages/taler-wallet-core/src/refresh.ts 
b/packages/taler-wallet-core/src/refresh.ts
index f139208be..4c3bb493a 100644
--- a/packages/taler-wallet-core/src/refresh.ts
+++ b/packages/taler-wallet-core/src/refresh.ts
@@ -81,18 +81,15 @@ import {
   CoinSourceType,
   DenominationRecord,
   RefreshCoinStatus,
+  RefreshGroupPerExchangeInfo,
   RefreshGroupRecord,
   RefreshOperationStatus,
-} from "./db.js";
-import { fetchFreshExchange } from "./exchanges.js";
-import {
-  getCandidateWithdrawalDenomsTx,
-  RefreshGroupPerExchangeInfo,
   RefreshSessionRecord,
   timestampPreciseToDb,
   WalletDbReadOnlyTransaction,
   WalletDbReadWriteTransaction,
-} from "./index.js";
+} from "./db.js";
+import { fetchFreshExchange } from "./exchanges.js";
 import {
   EXCHANGE_COINS_LOCK,
   InternalWalletState,
@@ -104,6 +101,7 @@ import {
 import { assertUnreachable } from "./util/assertUnreachable.js";
 import { selectWithdrawalDenominations } from "./util/coinSelection.js";
 import { checkDbInvariant } from "./util/invariants.js";
+import { getCandidateWithdrawalDenomsTx } from "./withdraw.js";
 
 const logger = new Logger("refresh.ts");
 
diff --git a/packages/taler-wallet-core/src/shepherd.ts 
b/packages/taler-wallet-core/src/shepherd.ts
index 2352c844f..d6fc604e8 100644
--- a/packages/taler-wallet-core/src/shepherd.ts
+++ b/packages/taler-wallet-core/src/shepherd.ts
@@ -49,14 +49,14 @@ import {
   parseTaskIdentifier,
 } from "./common.js";
 import { CryptoApiStoppedError } from "./crypto/workers/crypto-dispatcher.js";
-import { processDepositGroup } from "./deposits.js";
-import { updateExchangeFromUrlHandler } from "./exchanges.js";
 import {
   OPERATION_STATUS_ACTIVE_FIRST,
   OPERATION_STATUS_ACTIVE_LAST,
   WalletDbAllStoresReadOnlyTransaction,
   timestampAbsoluteFromDb,
-} from "./index.js";
+} from "./db.js";
+import { processDepositGroup } from "./deposits.js";
+import { updateExchangeFromUrlHandler } from "./exchanges.js";
 import { InternalWalletState } from "./internal-wallet-state.js";
 import { processPurchase } from "./pay-merchant.js";
 import { processPeerPullCredit } from "./pay-peer-pull-credit.js";
diff --git a/packages/taler-wallet-core/src/testing.ts 
b/packages/taler-wallet-core/src/testing.ts
index 38b2471e3..8192bacfd 100644
--- a/packages/taler-wallet-core/src/testing.ts
+++ b/packages/taler-wallet-core/src/testing.ts
@@ -56,12 +56,10 @@ import {
   HttpRequestLibrary,
   readSuccessResponseJsonOrThrow,
 } from "@gnu-taler/taler-util/http";
-import { getRefreshesForTransaction } from "./index.js";
-import { InternalWalletState } from "./internal-wallet-state.js";
-import { checkLogicInvariant } from "./util/invariants.js";
 import { getBalances } from "./balance.js";
 import { createDepositGroup } from "./deposits.js";
 import { fetchFreshExchange } from "./exchanges.js";
+import { InternalWalletState } from "./internal-wallet-state.js";
 import {
   confirmPay,
   preparePayForUri,
@@ -77,7 +75,9 @@ import {
   preparePeerPushCredit,
 } from "./pay-peer-push-credit.js";
 import { initiatePeerPushDebit } from "./pay-peer-push-debit.js";
+import { getRefreshesForTransaction } from "./refresh.js";
 import { getTransactionById, getTransactions } from "./transactions.js";
+import { checkLogicInvariant } from "./util/invariants.js";
 import { acceptWithdrawalFromUri } from "./withdraw.js";
 
 const logger = new Logger("operations/testing.ts");
diff --git a/packages/taler-wallet-core/src/transactions.ts 
b/packages/taler-wallet-core/src/transactions.ts
index 8c6c3f5aa..2050abac2 100644
--- a/packages/taler-wallet-core/src/transactions.ts
+++ b/packages/taler-wallet-core/src/transactions.ts
@@ -58,12 +58,15 @@ import {
 import {
   DepositElementStatus,
   DepositGroupRecord,
+  OPERATION_STATUS_ACTIVE_FIRST,
+  OPERATION_STATUS_ACTIVE_LAST,
   OperationRetryRecord,
   PeerPullCreditRecord,
   PeerPullDebitRecordStatus,
   PeerPullPaymentIncomingRecord,
   PeerPushCreditStatus,
   PeerPushDebitRecord,
+  PeerPushDebitStatus,
   PeerPushPaymentIncomingRecord,
   PurchaseRecord,
   PurchaseStatus,
@@ -71,6 +74,9 @@ import {
   RefreshOperationStatus,
   RefundGroupRecord,
   RewardRecord,
+  timestampPreciseFromDb,
+  timestampProtocolFromDb,
+  WalletDbReadOnlyTransaction,
   WithdrawalGroupRecord,
   WithdrawalGroupStatus,
   WithdrawalRecordType,
@@ -84,14 +90,6 @@ import {
   ExchangeWireDetails,
   getExchangeWireDetailsInTx,
 } from "./exchanges.js";
-import {
-  OPERATION_STATUS_ACTIVE_FIRST,
-  OPERATION_STATUS_ACTIVE_LAST,
-  PeerPushDebitStatus,
-  timestampPreciseFromDb,
-  timestampProtocolFromDb,
-  WalletDbReadOnlyTransaction,
-} from "./index.js";
 import { InternalWalletState } from "./internal-wallet-state.js";
 import {
   computePayMerchantTransactionActions,
diff --git a/packages/taler-wallet-core/src/util/coinSelection.ts 
b/packages/taler-wallet-core/src/util/coinSelection.ts
index f33891c88..88dd08f63 100644
--- a/packages/taler-wallet-core/src/util/coinSelection.ts
+++ b/packages/taler-wallet-core/src/util/coinSelection.ts
@@ -54,18 +54,15 @@ import {
   TalerProtocolTimestamp,
   UnblindedSignature,
 } from "@gnu-taler/taler-util";
-import { DenominationRecord } from "../db.js";
-import {
-  getExchangeWireDetailsInTx,
-  isWithdrawableDenom,
-  WalletDbReadOnlyTransaction,
-} from "../index.js";
-import { InternalWalletState } from "../internal-wallet-state.js";
 import {
   getMerchantPaymentBalanceDetails,
   getPeerPaymentBalanceDetailsInTx,
 } from "../balance.js";
 import { getAutoRefreshExecuteThreshold } from "../common.js";
+import { DenominationRecord, WalletDbReadOnlyTransaction } from "../db.js";
+import { getExchangeWireDetailsInTx } from "../exchanges.js";
+import { InternalWalletState } from "../internal-wallet-state.js";
+import { isWithdrawableDenom } from "./denominations.js";
 import { checkDbInvariant, checkLogicInvariant } from "./invariants.js";
 
 const logger = new Logger("coinSelection.ts");
diff --git a/packages/taler-wallet-core/src/util/denominations.ts 
b/packages/taler-wallet-core/src/util/denominations.ts
index db6e69956..9557c078a 100644
--- a/packages/taler-wallet-core/src/util/denominations.ts
+++ b/packages/taler-wallet-core/src/util/denominations.ts
@@ -27,8 +27,7 @@ import {
   TalerProtocolTimestamp,
   TimePoint,
 } from "@gnu-taler/taler-util";
-import { DenominationRecord } from "../db.js";
-import { timestampProtocolFromDb } from "../index.js";
+import { DenominationRecord, timestampProtocolFromDb } from "../db.js";
 
 /**
  * Given a list of denominations with the same value and same period of time:
diff --git a/packages/taler-wallet-core/src/util/instructedAmountConversion.ts 
b/packages/taler-wallet-core/src/util/instructedAmountConversion.ts
index c4a2f2d5c..f01dc4e21 100644
--- a/packages/taler-wallet-core/src/util/instructedAmountConversion.ts
+++ b/packages/taler-wallet-core/src/util/instructedAmountConversion.ts
@@ -30,12 +30,9 @@ import {
   parsePaytoUri,
   strcmp,
 } from "@gnu-taler/taler-util";
-import {
-  DenominationRecord,
-  InternalWalletState,
-  getExchangeWireDetailsInTx,
-  timestampProtocolFromDb,
-} from "../index.js";
+import { DenominationRecord, timestampProtocolFromDb } from "../db.js";
+import { getExchangeWireDetailsInTx } from "../exchanges.js";
+import { InternalWalletState } from "../internal-wallet-state.js";
 import { CoinInfo } from "./coinSelection.js";
 import { checkDbInvariant } from "./invariants.js";
 
diff --git a/packages/taler-wallet-core/src/wallet.ts 
b/packages/taler-wallet-core/src/wallet.ts
index 8b24fdc11..63b7ca4f2 100644
--- a/packages/taler-wallet-core/src/wallet.ts
+++ b/packages/taler-wallet-core/src/wallet.ts
@@ -51,6 +51,8 @@ import {
   TalerErrorCode,
   TalerUriAction,
   TestingWaitTransactionRequest,
+  TimerAPI,
+  TimerGroup,
   TransactionState,
   TransactionType,
   ValidateIbanResponse,
@@ -132,32 +134,6 @@ import {
   validateIban,
 } from "@gnu-taler/taler-util";
 import type { HttpRequestLibrary } from "@gnu-taler/taler-util/http";
-import { TalerCryptoInterface } from "./crypto/cryptoImplementation.js";
-import {
-  CryptoDispatcher,
-  CryptoWorkerFactory,
-} from "./crypto/workers/crypto-dispatcher.js";
-import {
-  CoinSourceType,
-  ConfigRecordKey,
-  DenominationRecord,
-  WalletDbReadOnlyTransaction,
-  WalletDbReadWriteTransaction,
-  WalletStoresV1,
-  clearDatabase,
-  exportDb,
-  importDb,
-  openStoredBackupsDatabase,
-  openTalerDatabase,
-} from "./db.js";
-import { DevExperimentHttpLib, applyDevExperiment } from 
"./dev-experiments.js";
-import {
-  CancelFn,
-  InternalWalletState,
-  MerchantInfo,
-  NotificationListener,
-  RecoupOperations,
-} from "./internal-wallet-state.js";
 import {
   getUserAttentions,
   getUserAttentionsUnreadCount,
@@ -176,12 +152,31 @@ import {
   setWalletDeviceId,
 } from "./backup/index.js";
 import { getBalanceDetail, getBalances } from "./balance.js";
+import { TalerCryptoInterface } from "./crypto/cryptoImplementation.js";
+import {
+  CryptoDispatcher,
+  CryptoWorkerFactory,
+} from "./crypto/workers/crypto-dispatcher.js";
+import {
+  CoinSourceType,
+  ConfigRecordKey,
+  DenominationRecord,
+  WalletDbReadOnlyTransaction,
+  WalletDbReadWriteTransaction,
+  WalletStoresV1,
+  clearDatabase,
+  exportDb,
+  importDb,
+  openStoredBackupsDatabase,
+  openTalerDatabase,
+} from "./db.js";
 import {
   computeDepositTransactionStatus,
   createDepositGroup,
   generateDepositGroupTxId,
   prepareDepositGroup,
 } from "./deposits.js";
+import { DevExperimentHttpLib, applyDevExperiment } from 
"./dev-experiments.js";
 import {
   acceptExchangeTermsOfService,
   addPresetExchangeEntry,
@@ -193,6 +188,13 @@ import {
   listExchanges,
   lookupExchangeByUri,
 } from "./exchanges.js";
+import {
+  CancelFn,
+  InternalWalletState,
+  MerchantInfo,
+  NotificationListener,
+  RecoupOperations,
+} from "./internal-wallet-state.js";
 import {
   computePayMerchantTransactionState,
   computeRefundTransactionState,
@@ -224,12 +226,11 @@ import {
   computePeerPushDebitTransactionState,
   initiatePeerPushDebit,
 } from "./pay-peer-push-debit.js";
+import { DbAccess } from "./query.js";
 import { createRecoupGroup } from "./recoup.js";
-import {
-  computeRefreshTransactionState,
-  forceRefresh,
-} from "./refresh.js";
+import { computeRefreshTransactionState, forceRefresh } from "./refresh.js";
 import { computeRewardTransactionStatus } from "./reward.js";
+import { TaskScheduler } from "./shepherd.js";
 import {
   runIntegrationTest,
   runIntegrationTest2,
@@ -252,14 +253,6 @@ import {
   retryTransaction,
   suspendTransaction,
 } from "./transactions.js";
-import {
-  acceptWithdrawalFromUri,
-  computeWithdrawalTransactionStatus,
-  createManualWithdrawal,
-  getExchangeWithdrawalInfo,
-  getWithdrawalDetailsForUri,
-} from "./withdraw.js";
-import { TaskScheduler } from "./shepherd.js";
 import { assertUnreachable } from "./util/assertUnreachable.js";
 import {
   convertDepositAmount,
@@ -269,8 +262,6 @@ import {
   getMaxPeerPushAmount,
 } from "./util/instructedAmountConversion.js";
 import { checkDbInvariant } from "./util/invariants.js";
-import { DbAccess } from "./query.js";
-import { TimerAPI, TimerGroup } from "./util/timer.js";
 import {
   WALLET_BANK_CONVERSION_API_PROTOCOL_VERSION,
   WALLET_BANK_INTEGRATION_PROTOCOL_VERSION,
@@ -286,6 +277,13 @@ import {
   WalletCoreApiClient,
   WalletCoreResponseType,
 } from "./wallet-api-types.js";
+import {
+  acceptWithdrawalFromUri,
+  computeWithdrawalTransactionStatus,
+  createManualWithdrawal,
+  getExchangeWithdrawalInfo,
+  getWithdrawalDetailsForUri,
+} from "./withdraw.js";
 
 const logger = new Logger("wallet.ts");
 
@@ -608,7 +606,7 @@ async function handlePrepareWithdrawExchange(
 
 /**
  * Response returned from the pending operations API.
- * 
+ *
  * @deprecated this is a placeholder for the response type of a deprecated 
wallet-core request.
  */
 export interface PendingOperationsResponse {
diff --git a/packages/taler-wallet-core/src/withdraw.ts 
b/packages/taler-wallet-core/src/withdraw.ts
index 7e9b295bd..4979b2623 100644
--- a/packages/taler-wallet-core/src/withdraw.ts
+++ b/packages/taler-wallet-core/src/withdraw.ts
@@ -14,6 +14,11 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
+/**
+ * @fileoverview Implementation of Taler withdrawals, both
+ * bank-integrated and manual.
+ */
+
 /**
  * Imports.
  */
@@ -26,6 +31,7 @@ import {
   AmountLike,
   AmountString,
   Amounts,
+  AsyncFlag,
   BankWithdrawDetails,
   CancellationToken,
   CoinStatus,
@@ -105,11 +111,14 @@ import {
   KycPendingInfo,
   PlanchetRecord,
   PlanchetStatus,
+  WalletDbReadOnlyTransaction,
+  WalletDbReadWriteTransaction,
   WalletStoresV1,
   WgInfo,
   WithdrawalGroupRecord,
   WithdrawalGroupStatus,
   WithdrawalRecordType,
+  timestampPreciseToDb,
 } from "./db.js";
 import {
   ReadyExchangeSummary,
@@ -119,12 +128,6 @@ import {
   listExchanges,
   markExchangeUsed,
 } from "./exchanges.js";
-import {
-  WalletDbReadOnlyTransaction,
-  WalletDbReadWriteTransaction,
-  isWithdrawableDenom,
-  timestampPreciseToDb,
-} from "./index.js";
 import { InternalWalletState } from "./internal-wallet-state.js";
 import { DbAccess } from "./query.js";
 import {
@@ -137,6 +140,7 @@ import {
   selectForcedWithdrawalDenominations,
   selectWithdrawalDenominations,
 } from "./util/coinSelection.js";
+import { isWithdrawableDenom } from "./util/denominations.js";
 import { checkDbInvariant, checkLogicInvariant } from "./util/invariants.js";
 import {
   WALLET_BANK_INTEGRATION_PROTOCOL_VERSION,
@@ -628,7 +632,7 @@ export async function getCandidateWithdrawalDenomsTx(
   exchangeBaseUrl: string,
   currency: string,
 ): Promise<DenominationRecord[]> {
-  // FIXME: Use denom groups instead of querying all denominations!
+  // FIXME(https://bugs.taler.net/n/8446): Use denom groups instead of 
querying all denominations!
   const allDenoms =
     await tx.denominations.indexes.byExchangeBaseUrl.getAll(exchangeBaseUrl);
   return allDenoms
@@ -730,10 +734,11 @@ interface WithdrawalBatchResult {
   batchResp: ExchangeWithdrawBatchResponse;
 }
 
-enum AmlStatus {
-  normal = 0,
-  pending = 1,
-  fronzen = 2,
+// FIXME: Move to exchange API types
+enum ExchangeAmlStatus {
+  Normal = 0,
+  Pending = 1,
+  Frozen = 2,
 }
 
 /**
@@ -818,7 +823,7 @@ async function handleKycRequired(
     method: "GET",
   });
   let kycUrl: string;
-  let amlStatus: AmlStatus | undefined;
+  let amlStatus: ExchangeAmlStatus | undefined;
   if (
     kycStatusRes.status === HttpStatusCode.Ok ||
     // FIXME: NoContent is not expected 
https://docs.taler.net/core/api-exchange.html#post--purses-$PURSE_PUB-merge
@@ -872,11 +877,11 @@ async function handleKycRequired(
           };
           wg2.kycUrl = kycUrl;
           wg2.status =
-            amlStatus === AmlStatus.normal || amlStatus === undefined
+            amlStatus === ExchangeAmlStatus.Normal || amlStatus === undefined
               ? WithdrawalGroupStatus.PendingKyc
-              : amlStatus === AmlStatus.pending
+              : amlStatus === ExchangeAmlStatus.Pending
                 ? WithdrawalGroupStatus.PendingAml
-                : amlStatus === AmlStatus.fronzen
+                : amlStatus === ExchangeAmlStatus.Frozen
                   ? WithdrawalGroupStatus.SuspendedAml
                   : assertUnreachable(amlStatus);
 
@@ -1333,7 +1338,7 @@ async function queryReserve(
  *
  * Used to store some cached info during a withdrawal operation.
  */
-export interface WithdrawalGroupContext {
+interface WithdrawalGroupContext {
   numPlanchets: number;
   planchetsFinished: Set<string>;
 
@@ -1659,19 +1664,11 @@ export async function processWithdrawalGroup(
 
   switch (withdrawalGroup.status) {
     case WithdrawalGroupStatus.PendingRegisteringBank:
-      await processReserveBankStatus(ws, withdrawalGroupId);
-      // FIXME: This will get called by the main task loop, why call it here?!
-      return await processWithdrawalGroup(
-        ws,
-        withdrawalGroupId,
-        cancellationToken,
-      );
-    case WithdrawalGroupStatus.PendingQueryingStatus: {
+      return await processReserveBankStatus(ws, withdrawalGroupId);
+    case WithdrawalGroupStatus.PendingQueryingStatus:
       return queryReserve(ws, withdrawalGroupId, cancellationToken);
-    }
-    case WithdrawalGroupStatus.PendingWaitConfirmBank: {
+    case WithdrawalGroupStatus.PendingWaitConfirmBank:
       return await processReserveBankStatus(ws, withdrawalGroupId);
-    }
     case WithdrawalGroupStatus.PendingAml:
       // FIXME: Handle this case, withdrawal doesn't support AML yet.
       return TaskRunResult.backoff();
@@ -1768,29 +1765,34 @@ export async function getExchangeWithdrawalInfo(
   logger.trace("computing earliest deposit expiration");
 
   let earliestDepositExpiration: TalerProtocolTimestamp | undefined;
-  for (let i = 0; i < selectedDenoms.selectedDenoms.length; i++) {
-    const ds = selectedDenoms.selectedDenoms[i];
-    // FIXME: Do in one transaction!
-    const denom = await ws.db.runReadOnlyTx(["denominations"], async (tx) => {
-      return ws.getDenomInfo(ws, tx, exchangeBaseUrl, ds.denomPubHash);
-    });
-    checkDbInvariant(!!denom);
-    hasDenomWithAgeRestriction =
-      hasDenomWithAgeRestriction || denom.denomPub.age_mask > 0;
-    const expireDeposit = denom.stampExpireDeposit;
-    if (!earliestDepositExpiration) {
-      earliestDepositExpiration = expireDeposit;
-      continue;
-    }
-    if (
-      AbsoluteTime.cmp(
-        AbsoluteTime.fromProtocolTimestamp(expireDeposit),
-        AbsoluteTime.fromProtocolTimestamp(earliestDepositExpiration),
-      ) < 0
-    ) {
-      earliestDepositExpiration = expireDeposit;
+
+  await ws.db.runReadOnlyTx(["denominations"], async (tx) => {
+    for (let i = 0; i < selectedDenoms.selectedDenoms.length; i++) {
+      const ds = selectedDenoms.selectedDenoms[i];
+      const denom = await ws.getDenomInfo(
+        ws,
+        tx,
+        exchangeBaseUrl,
+        ds.denomPubHash,
+      );
+      checkDbInvariant(!!denom);
+      hasDenomWithAgeRestriction =
+        hasDenomWithAgeRestriction || denom.denomPub.age_mask > 0;
+      const expireDeposit = denom.stampExpireDeposit;
+      if (!earliestDepositExpiration) {
+        earliestDepositExpiration = expireDeposit;
+        continue;
+      }
+      if (
+        AbsoluteTime.cmp(
+          AbsoluteTime.fromProtocolTimestamp(expireDeposit),
+          AbsoluteTime.fromProtocolTimestamp(earliestDepositExpiration),
+        ) < 0
+      ) {
+        earliestDepositExpiration = expireDeposit;
+      }
     }
-  }
+  });
 
   checkLogicInvariant(!!earliestDepositExpiration);
 
@@ -2192,13 +2194,7 @@ async function processReserveBankStatus(
   // Bank still needs to know our reserve info
   if (!status.selection_done) {
     await registerReserveWithBank(ws, withdrawalGroupId);
-    return await processReserveBankStatus(ws, withdrawalGroupId);
-  }
-
-  // FIXME: Why do we do this?!
-  if (withdrawalGroup.status === WithdrawalGroupStatus.PendingRegisteringBank) 
{
-    await registerReserveWithBank(ws, withdrawalGroupId);
-    return await processReserveBankStatus(ws, withdrawalGroupId);
+    return TaskRunResult.progress();
   }
 
   const transitionInfo = await ws.db.runReadWriteTx(
@@ -2479,6 +2475,14 @@ export async function internalCreateWithdrawalGroup(
   return res.withdrawalGroup;
 }
 
+/**
+ * Accept a bank-integrated withdrawal.
+ *
+ * Before returning, the wallet tries to register the reserve with the bank.
+ *
+ * Thus after this call returns, the withdrawal operation can be confirmed
+ * with the bank.
+ */
 export async function acceptWithdrawalFromUri(
   ws: InternalWalletState,
   req: {
@@ -2560,11 +2564,10 @@ export async function acceptWithdrawalFromUri(
 
   const ctx = new WithdrawTransactionContext(ws, withdrawalGroupId);
 
-  const transactionId = ctx.transactionId;
+  // FIXME: Do we wait here until the reserve is registered with the bank?
+
+  await waitWithdrawalRegistered(ws, ctx);
 
-  // We do this here, as the reserve should be registered before we return,
-  // so that we can redirect the user to the bank's status page.
-  await processReserveBankStatus(ws, withdrawalGroupId);
   const processedWithdrawalGroup = await getWithdrawalGroupRecordTx(ws.db, {
     withdrawalGroupId,
   });
@@ -2582,10 +2585,93 @@ export async function acceptWithdrawalFromUri(
   return {
     reservePub: withdrawalGroup.reservePub,
     confirmTransferUrl: withdrawInfo.confirmTransferUrl,
-    transactionId,
+    transactionId: ctx.transactionId,
   };
 }
 
+async function internalWaitWithdrawalRegistered(
+  ws: InternalWalletState,
+  ctx: WithdrawTransactionContext,
+  withdrawalNotifFlag: AsyncFlag,
+): Promise<void> {
+  while (true) {
+    const { withdrawalRec, retryRec } = await ws.db.runReadOnlyTx(
+      ["withdrawalGroups", "operationRetries"],
+      async (tx) => {
+        return {
+          withdrawalRec: await tx.withdrawalGroups.get(ctx.withdrawalGroupId),
+          retryRec: await tx.operationRetries.get(ctx.taskId),
+        };
+      },
+    );
+
+    if (!withdrawalRec) {
+      throw Error("withdrawal not found anymore");
+    }
+
+    switch (withdrawalRec.status) {
+      case WithdrawalGroupStatus.FailedBankAborted:
+        throw TalerError.fromDetail(
+          TalerErrorCode.WALLET_WITHDRAWAL_OPERATION_ABORTED_BY_BANK,
+          {},
+        );
+      case WithdrawalGroupStatus.PendingKyc:
+      case WithdrawalGroupStatus.PendingAml:
+      case WithdrawalGroupStatus.PendingQueryingStatus:
+      case WithdrawalGroupStatus.PendingReady:
+      case WithdrawalGroupStatus.Done:
+      case WithdrawalGroupStatus.PendingWaitConfirmBank:
+        return;
+      case WithdrawalGroupStatus.PendingRegisteringBank:
+        break;
+      default: {
+        if (retryRec) {
+          if (retryRec.lastError) {
+            throw TalerError.fromUncheckedDetail(retryRec.lastError);
+          } else {
+            throw Error("withdrawal unexpectedly pending");
+          }
+        }
+      }
+    }
+
+    await withdrawalNotifFlag.wait();
+    withdrawalNotifFlag.reset();
+  }
+}
+
+async function waitWithdrawalRegistered(
+  ws: InternalWalletState,
+  ctx: WithdrawTransactionContext,
+): Promise<void> {
+  // FIXME: We should use Symbol.dispose magic here for cleanup!
+
+  const withdrawalNotifFlag = new AsyncFlag();
+  // Raise exchangeNotifFlag whenever we get a notification
+  // about our exchange.
+  const cancelNotif = ws.addNotificationListener((notif) => {
+    if (
+      notif.type === NotificationType.TransactionStateTransition &&
+      notif.transactionId === ctx.transactionId
+    ) {
+      logger.info(`raising update notification: ${j2s(notif)}`);
+      withdrawalNotifFlag.raise();
+    }
+  });
+
+  try {
+    const res = await internalWaitWithdrawalRegistered(
+      ws,
+      ctx,
+      withdrawalNotifFlag,
+    );
+    logger.info("done waiting for ready exchange");
+    return res;
+  } finally {
+    cancelNotif();
+  }
+}
+
 async function fetchAccount(
   ws: InternalWalletState,
   instructedAmount: AmountJson,
@@ -2669,7 +2755,7 @@ async function fetchWithdrawalAccountInfo(
     reservePub?: string;
   },
 ): Promise<WithdrawalExchangeAccountDetails[]> {
-  const { exchange, instructedAmount } = req;
+  const { exchange } = req;
   const withdrawalAccounts: WithdrawalExchangeAccountDetails[] = [];
   for (let acct of exchange.wireInfo.accounts) {
     const acctInfo = await fetchAccount(
@@ -2732,10 +2818,10 @@ export async function createManualWithdrawal(
     reserveKeyPair,
   });
 
-  const withdrawalGroupId = withdrawalGroup.withdrawalGroupId;
-  const ctx = new WithdrawTransactionContext(ws, withdrawalGroupId);
-
-  const transactionId = ctx.transactionId;
+  const ctx = new WithdrawTransactionContext(
+    ws,
+    withdrawalGroup.withdrawalGroupId,
+  );
 
   const exchangePaytoUris = await ws.db.runReadOnlyTx(
     ["withdrawalGroups", "exchanges", "exchangeDetails"],
@@ -2750,6 +2836,6 @@ export async function createManualWithdrawal(
     reservePub: withdrawalGroup.reservePub,
     exchangePaytoUris: exchangePaytoUris,
     withdrawalAccountsList: withdrawalAccountsList,
-    transactionId,
+    transactionId: ctx.transactionId,
   };
 }
diff --git a/packages/taler-wallet-embedded/src/wallet-qjs.ts 
b/packages/taler-wallet-embedded/src/wallet-qjs.ts
index 0fbcd7583..029cf2120 100644
--- a/packages/taler-wallet-embedded/src/wallet-qjs.ts
+++ b/packages/taler-wallet-embedded/src/wallet-qjs.ts
@@ -40,6 +40,7 @@ import {
   getErrorDetailFromException,
   j2s,
   openPromise,
+  performanceNow,
   setGlobalLogLevelFromString,
 } from "@gnu-taler/taler-util";
 import { createPlatformHttpLib } from "@gnu-taler/taler-util/http";
@@ -49,7 +50,6 @@ import {
   Wallet,
   WalletApiOperation,
   createNativeWalletHost2,
-  performanceNow,
 } from "@gnu-taler/taler-wallet-core";
 
 setGlobalLogLevelFromString("trace");
diff --git a/packages/taler-wallet-webextension/src/hooks/useProviderStatus.ts 
b/packages/taler-wallet-webextension/src/hooks/useProviderStatus.ts
index ca2054931..e2ba5b285 100644
--- a/packages/taler-wallet-webextension/src/hooks/useProviderStatus.ts
+++ b/packages/taler-wallet-webextension/src/hooks/useProviderStatus.ts
@@ -14,7 +14,8 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-import { ProviderInfo, WalletApiOperation } from 
"@gnu-taler/taler-wallet-core";
+import { ProviderInfo } from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import { useEffect, useState } from "preact/hooks";
 import { useBackendContext } from "../context/backend.js";
 
diff --git 
a/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/index.ts 
b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/index.ts
index e0b79e060..daa6b425d 100644
--- a/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/index.ts
+++ b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/index.ts
@@ -14,8 +14,10 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-import { TalerErrorDetail } from "@gnu-taler/taler-util";
-import { SyncTermsOfServiceResponse } from "@gnu-taler/taler-wallet-core";
+import {
+  SyncTermsOfServiceResponse,
+  TalerErrorDetail,
+} from "@gnu-taler/taler-util";
 import { ErrorAlertView } from "../../components/CurrentAlerts.js";
 import { Loading } from "../../components/Loading.js";
 import { ErrorAlert } from "../../context/alert.js";
@@ -24,7 +26,7 @@ import {
   TextFieldHandler,
   ToggleHandler,
 } from "../../mui/handlers.js";
-import { compose, StateViewMap } from "../../utils/index.js";
+import { StateViewMap, compose } from "../../utils/index.js";
 import { useComponentState } from "./state.js";
 import { ConfirmProviderView, SelectProviderView } from "./views.js";
 
diff --git 
a/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/state.ts 
b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/state.ts
index cf35abac7..e6d46a626 100644
--- a/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/state.ts
+++ b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/state.ts
@@ -14,11 +14,12 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-import { canonicalizeBaseUrl, Codec } from "@gnu-taler/taler-util";
 import {
+  canonicalizeBaseUrl,
+  Codec,
   codecForSyncTermsOfServiceResponse,
-  WalletApiOperation,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import { useEffect, useState } from "preact/hooks";
 import { useAlertContext } from "../../context/alert.js";
 import { useBackendContext } from "../../context/backend.js";
diff --git a/packages/taler-wallet-webextension/src/wallet/Backup.stories.tsx 
b/packages/taler-wallet-webextension/src/wallet/Backup.stories.tsx
index ae160a30c..cc7c9af67 100644
--- a/packages/taler-wallet-webextension/src/wallet/Backup.stories.tsx
+++ b/packages/taler-wallet-webextension/src/wallet/Backup.stories.tsx
@@ -19,19 +19,18 @@
  * @author Sebastian Javier Marchano (sebasjm)
  */
 
-import { ProviderPaymentType } from "@gnu-taler/taler-wallet-core";
-import { addDays } from "date-fns";
-import {
-  BackupView as TestedComponent,
-  ShowRecoveryInfo,
-} from "./BackupPage.js";
-import * as tests from "@gnu-taler/web-util/testing";
 import {
   AbsoluteTime,
   AmountString,
+  ProviderPaymentType,
   TalerPreciseTimestamp,
-  TalerProtocolTimestamp,
 } from "@gnu-taler/taler-util";
+import * as tests from "@gnu-taler/web-util/testing";
+import { addDays } from "date-fns";
+import {
+  ShowRecoveryInfo,
+  BackupView as TestedComponent,
+} from "./BackupPage.js";
 
 export default {
   title: "backup",
diff --git a/packages/taler-wallet-webextension/src/wallet/BackupPage.tsx 
b/packages/taler-wallet-webextension/src/wallet/BackupPage.tsx
index b460d9f88..0a39b2777 100644
--- a/packages/taler-wallet-webextension/src/wallet/BackupPage.tsx
+++ b/packages/taler-wallet-webextension/src/wallet/BackupPage.tsx
@@ -16,15 +16,13 @@
 
 import {
   AbsoluteTime,
-  stringifyRestoreUri
-} from "@gnu-taler/taler-util";
-import {
   ProviderInfo,
   ProviderPaymentPaid,
   ProviderPaymentStatus,
   ProviderPaymentType,
-  WalletApiOperation,
-} from "@gnu-taler/taler-wallet-core";
+  stringifyRestoreUri,
+} from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import { useTranslationContext } from "@gnu-taler/web-util/browser";
 import {
   differenceInMonths,
@@ -324,12 +322,12 @@ function daysUntil(d: AbsoluteTime): string {
       duration?.years
         ? "years"
         : duration?.months
-        ? "months"
-        : duration?.days
-        ? "days"
-        : duration.hours
-        ? "hours"
-        : "minutes",
+          ? "months"
+          : duration?.days
+            ? "days"
+            : duration.hours
+              ? "hours"
+              : "minutes",
     ],
   });
   return `${str}`;
@@ -352,6 +350,6 @@ function getStatusPaidOrder(
   return a.paidUntil.t_ms === "never"
     ? -1
     : b.paidUntil.t_ms === "never"
-    ? 1
-    : a.paidUntil.t_ms - b.paidUntil.t_ms;
+      ? 1
+      : a.paidUntil.t_ms - b.paidUntil.t_ms;
 }
diff --git 
a/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/state.ts 
b/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/state.ts
index b1cbbc2b2..db88dc94e 100644
--- a/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/state.ts
+++ b/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/state.ts
@@ -16,13 +16,13 @@
 
 import { DenomOperationMap, FeeDescription } from "@gnu-taler/taler-util";
 import {
-  createPairTimeline,
   WalletApiOperation,
+  createPairTimeline,
 } from "@gnu-taler/taler-wallet-core";
+import { useTranslationContext } from "@gnu-taler/web-util/browser";
 import { useState } from "preact/hooks";
 import { alertFromError, useAlertContext } from "../../context/alert.js";
 import { useBackendContext } from "../../context/backend.js";
-import { useTranslationContext } from "@gnu-taler/web-util/browser";
 import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js";
 import { Props, State } from "./index.js";
 
@@ -151,7 +151,7 @@ export function useComponentState({
     };
   }
 
-  //this may be expensive, useMemo
+  // this may be expensive, useMemo
   const coinOperationTimeline: DenomOperationMap<FeeDescription[]> = {
     deposit: createPairTimeline(
       selected.denomFees.deposit,
diff --git 
a/packages/taler-wallet-webextension/src/wallet/ProviderDetail.stories.tsx 
b/packages/taler-wallet-webextension/src/wallet/ProviderDetail.stories.tsx
index f81a86b9d..d4ee09b89 100644
--- a/packages/taler-wallet-webextension/src/wallet/ProviderDetail.stories.tsx
+++ b/packages/taler-wallet-webextension/src/wallet/ProviderDetail.stories.tsx
@@ -22,10 +22,9 @@
 import {
   AbsoluteTime,
   AmountString,
+  ProviderPaymentType,
   TalerPreciseTimestamp,
-  TalerProtocolTimestamp,
 } from "@gnu-taler/taler-util";
-import { ProviderPaymentType } from "@gnu-taler/taler-wallet-core";
 import * as tests from "@gnu-taler/web-util/testing";
 import { ProviderView as TestedComponent } from "./ProviderDetailPage.js";
 
diff --git 
a/packages/taler-wallet-webextension/src/wallet/ProviderDetailPage.tsx 
b/packages/taler-wallet-webextension/src/wallet/ProviderDetailPage.tsx
index 19ae39106..5bd90c69b 100644
--- a/packages/taler-wallet-webextension/src/wallet/ProviderDetailPage.tsx
+++ b/packages/taler-wallet-webextension/src/wallet/ProviderDetailPage.tsx
@@ -15,22 +15,22 @@
  */
 
 import * as utils from "@gnu-taler/taler-util";
-import { AbsoluteTime } from "@gnu-taler/taler-util";
 import {
+  AbsoluteTime,
   ProviderInfo,
   ProviderPaymentStatus,
   ProviderPaymentType,
-  WalletApiOperation,
-} from "@gnu-taler/taler-wallet-core";
-import { Fragment, h, VNode } from "preact";
+} from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
+import { useTranslationContext } from "@gnu-taler/web-util/browser";
+import { Fragment, VNode, h } from "preact";
 import { ErrorAlertView } from "../components/CurrentAlerts.js";
 import { ErrorMessage } from "../components/ErrorMessage.js";
 import { Loading } from "../components/Loading.js";
-import { PaymentStatus, SmallLightText } from "../components/styled/index.js";
 import { Time } from "../components/Time.js";
+import { PaymentStatus, SmallLightText } from "../components/styled/index.js";
 import { alertFromError } from "../context/alert.js";
 import { useBackendContext } from "../context/backend.js";
-import { useTranslationContext } from "@gnu-taler/web-util/browser";
 import { useAsyncAsHook } from "../hooks/useAsyncAsHook.js";
 import { Button } from "../mui/Button.js";
 
diff --git a/packages/taler-wallet-webextension/src/wxBackend.ts 
b/packages/taler-wallet-webextension/src/wxBackend.ts
index fb07b72a5..70db60eca 100644
--- a/packages/taler-wallet-webextension/src/wxBackend.ts
+++ b/packages/taler-wallet-webextension/src/wxBackend.ts
@@ -27,6 +27,7 @@ import {
   LogLevel,
   Logger,
   OpenedPromise,
+  SetTimeoutTimerAPI,
   TalerErrorCode,
   getErrorDetailFromException,
   makeErrorDetail,
@@ -37,7 +38,6 @@ import {
 import { HttpRequestLibrary } from "@gnu-taler/taler-util/http";
 import {
   DbAccess,
-  SetTimeoutTimerAPI,
   SynchronousCryptoWorkerFactoryPlain,
   Wallet,
   WalletOperations,

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]