diff options
Diffstat (limited to 'packages/taler-wallet-core')
28 files changed, 223 insertions, 217 deletions
| diff --git a/packages/taler-wallet-core/src/operations/state.ts b/packages/taler-wallet-core/src/common.ts index ee7ceb8af..cbbbb1e32 100644 --- a/packages/taler-wallet-core/src/operations/state.ts +++ b/packages/taler-wallet-core/src/common.ts @@ -22,18 +22,18 @@ import {    BalancesResponse,    Logger,  } from "@gnu-taler/taler-util"; -import { CryptoApi, CryptoWorkerFactory } from "../crypto/workers/cryptoApi.js"; -import { WalletStoresV1 } from "../db.js"; -import { PendingOperationsResponse } from "../pending-types.js"; -import { AsyncOpMemoMap, AsyncOpMemoSingle } from "../util/asyncMemo.js"; -import { HttpRequestLibrary } from "../util/http"; +import { CryptoApi, CryptoWorkerFactory } from "./crypto/workers/cryptoApi.js"; +import { ExchangeDetailsRecord, ExchangeRecord, WalletStoresV1 } from "./db.js"; +import { PendingOperationsResponse } from "./pending-types.js"; +import { AsyncOpMemoMap, AsyncOpMemoSingle } from "./util/asyncMemo.js"; +import { HttpRequestLibrary } from "./util/http.js";  import {    AsyncCondition,    OpenedPromise,    openPromise, -} from "../util/promiseUtils.js"; -import { DbAccess } from "../util/query.js"; -import { TimerGroup } from "../util/timer.js"; +} from "./util/promiseUtils.js"; +import { DbAccess, GetReadOnlyAccess } from "./util/query.js"; +import { TimerGroup } from "./util/timer.js";  type NotificationListener = (n: WalletNotification) => void; @@ -42,6 +42,38 @@ const logger = new Logger("state.ts");  export const EXCHANGE_COINS_LOCK = "exchange-coins-lock";  export const EXCHANGE_RESERVES_LOCK = "exchange-reserves-lock"; +export interface TrustInfo { +  isTrusted: boolean; +  isAudited: boolean; +} + +/** + * Interface for exchange-related operations. + */ +export interface ExchangeOperations { +  // FIXME:  Should other operations maybe always use +  // updateExchangeFromUrl? +  getExchangeDetails( +    tx: GetReadOnlyAccess<{ +      exchanges: typeof WalletStoresV1.exchanges; +      exchangeDetails: typeof WalletStoresV1.exchangeDetails; +    }>, +    exchangeBaseUrl: string, +  ): Promise<ExchangeDetailsRecord | undefined>; +  getExchangeTrust( +    ws: InternalWalletState, +    exchangeInfo: ExchangeRecord, +  ): Promise<TrustInfo>; +  updateExchangeFromUrl( +    ws: InternalWalletState, +    baseUrl: string, +    forceNow?: boolean, +  ): Promise<{ +    exchange: ExchangeRecord; +    exchangeDetails: ExchangeDetailsRecord; +  }>; +} +  /**   * Internal state of the wallet.   */ @@ -64,6 +96,8 @@ export class InternalWalletState {    initCalled: boolean = false; +  exchangeOps: ExchangeOperations; +    /**     * Promises that are waiting for a particular resource.     */ diff --git a/packages/taler-wallet-core/src/operations/errors.ts b/packages/taler-wallet-core/src/errors.ts index d788405ff..d788405ff 100644 --- a/packages/taler-wallet-core/src/operations/errors.ts +++ b/packages/taler-wallet-core/src/errors.ts diff --git a/packages/taler-wallet-core/src/headless/NodeHttpLib.ts b/packages/taler-wallet-core/src/headless/NodeHttpLib.ts index 4d0411081..525ac8557 100644 --- a/packages/taler-wallet-core/src/headless/NodeHttpLib.ts +++ b/packages/taler-wallet-core/src/headless/NodeHttpLib.ts @@ -27,7 +27,7 @@ import {  } from "../util/http";  import { RequestThrottler } from "../util/RequestThrottler";  import Axios, { AxiosResponse } from "axios"; -import { OperationFailedError, makeErrorDetails } from "../operations/errors"; +import { OperationFailedError, makeErrorDetails } from "../errors";  import { URL } from "../util/url";  import { Logger } from "@gnu-taler/taler-util";  import { bytesToString } from "../crypto/talerCrypto"; diff --git a/packages/taler-wallet-core/src/headless/helpers.ts b/packages/taler-wallet-core/src/headless/helpers.ts index 8125ef6b0..c05d60497 100644 --- a/packages/taler-wallet-core/src/headless/helpers.ts +++ b/packages/taler-wallet-core/src/headless/helpers.ts @@ -35,7 +35,7 @@ import { Logger } from "@gnu-taler/taler-util";  import { SynchronousCryptoWorkerFactory } from "../crypto/workers/synchronousWorker";  import type { IDBFactory } from "@gnu-taler/idb-bridge";  import { WalletNotification } from "@gnu-taler/taler-util"; -import { InternalWalletState } from "../operations/state.js"; +import { InternalWalletState } from "../common.js";  const logger = new Logger("headless/helpers.ts"); diff --git a/packages/taler-wallet-core/src/index.ts b/packages/taler-wallet-core/src/index.ts index 995af438d..850ee3a16 100644 --- a/packages/taler-wallet-core/src/index.ts +++ b/packages/taler-wallet-core/src/index.ts @@ -19,7 +19,7 @@   */  // Errors -export * from "./operations/errors.js"; +export * from "./errors.js";  // Util functionality  export { URL } from "./util/url.js"; @@ -34,7 +34,7 @@ export {    DefaultNodeWalletArgs,  } from "./headless/helpers.js"; -export * from "./operations/versions.js"; +export * from "./versions.js";  export * from "./db.js"; @@ -48,6 +48,6 @@ export * from "./crypto/talerCrypto.js";  export * from "./pending-types.js";  export * from "./util/debugFlags.js"; -export { InternalWalletState } from "./operations/state.js"; +export { InternalWalletState } from "./common.js";  export * from "./wallet-api-types.js";  export * from "./wallet.js"; diff --git a/packages/taler-wallet-core/src/operations/README.md b/packages/taler-wallet-core/src/operations/README.md new file mode 100644 index 000000000..32e2fbfc8 --- /dev/null +++ b/packages/taler-wallet-core/src/operations/README.md @@ -0,0 +1,7 @@ +# Wallet Operations + +This folder contains the implementations for all wallet operations that operate on the wallet state. + +To avoid cyclic dependencies, these files must **not** reference each other.  Instead, other operations should only be accessed via injected dependencies. + +Avoiding cyclic dependencies is important for module bundlers.
\ No newline at end of file diff --git a/packages/taler-wallet-core/src/operations/backup/export.ts b/packages/taler-wallet-core/src/operations/backup/export.ts index 4eab9d5ee..42cc9b651 100644 --- a/packages/taler-wallet-core/src/operations/backup/export.ts +++ b/packages/taler-wallet-core/src/operations/backup/export.ts @@ -49,7 +49,7 @@ import {    BackupRefreshSession,    BackupExchangeDetails,  } from "@gnu-taler/taler-util"; -import { InternalWalletState } from "../state.js"; +import { InternalWalletState } from "../../common.js";  import { provideBackupState, getWalletBackupState } from "./state";  import { Amounts, getTimestampNow } from "@gnu-taler/taler-util";  import { diff --git a/packages/taler-wallet-core/src/operations/backup/import.ts b/packages/taler-wallet-core/src/operations/backup/import.ts index 1caa508ff..ce4d14f1e 100644 --- a/packages/taler-wallet-core/src/operations/backup/import.ts +++ b/packages/taler-wallet-core/src/operations/backup/import.ts @@ -51,7 +51,7 @@ import { j2s } from "@gnu-taler/taler-util";  import { checkDbInvariant, checkLogicInvariant } from "../../util/invariants";  import { Logger } from "@gnu-taler/taler-util";  import { initRetryInfo } from "../../util/retries.js"; -import { InternalWalletState } from "../state.js"; +import { InternalWalletState } from "../../common.js";  import { provideBackupState } from "./state.js";  import { makeEventId, TombstoneTag } from "../transactions.js";  import { getExchangeDetails } from "../exchanges.js"; diff --git a/packages/taler-wallet-core/src/operations/backup/index.ts b/packages/taler-wallet-core/src/operations/backup/index.ts index 2cc056721..8a0aad560 100644 --- a/packages/taler-wallet-core/src/operations/backup/index.ts +++ b/packages/taler-wallet-core/src/operations/backup/index.ts @@ -24,7 +24,7 @@  /**   * Imports.   */ -import { InternalWalletState } from "../state.js"; +import { InternalWalletState } from "../../common.js";  import {    AmountString,    BackupRecovery, diff --git a/packages/taler-wallet-core/src/operations/backup/state.ts b/packages/taler-wallet-core/src/operations/backup/state.ts index bb540d5af..3a7311d14 100644 --- a/packages/taler-wallet-core/src/operations/backup/state.ts +++ b/packages/taler-wallet-core/src/operations/backup/state.ts @@ -23,7 +23,7 @@ import {  } from "../../db.js";  import { checkDbInvariant } from "../../util/invariants.js";  import { GetReadOnlyAccess } from "../../util/query.js"; -import { InternalWalletState } from "../state.js"; +import { InternalWalletState } from "../../common.js";  export async function provideBackupState(    ws: InternalWalletState, diff --git a/packages/taler-wallet-core/src/operations/balance.ts b/packages/taler-wallet-core/src/operations/balance.ts index 4dba6beb7..298893920 100644 --- a/packages/taler-wallet-core/src/operations/balance.ts +++ b/packages/taler-wallet-core/src/operations/balance.ts @@ -23,12 +23,11 @@ import {    Amounts,    Logger,  } from "@gnu-taler/taler-util"; -  import { CoinStatus, WalletStoresV1 } from "../db.js";  import { GetReadOnlyAccess } from "../util/query.js"; -import { InternalWalletState } from "./state.js"; +import { InternalWalletState } from "../common.js"; -const logger = new Logger("withdraw.ts"); +const logger = new Logger("operations/balance.ts");  interface WalletBalance {    available: AmountJson; diff --git a/packages/taler-wallet-core/src/operations/currencies.ts b/packages/taler-wallet-core/src/operations/currencies.ts deleted file mode 100644 index e591b50c0..000000000 --- a/packages/taler-wallet-core/src/operations/currencies.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* - This file is part of GNU Taler - (C) 2021 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE.  See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/> - */ - -/** - * Imports. - */ -import { ExchangeRecord } from "../db.js"; -import { Logger } from "@gnu-taler/taler-util"; -import { getExchangeDetails } from "./exchanges.js"; -import { InternalWalletState } from "./state.js"; - -const logger = new Logger("currencies.ts"); - -export interface TrustInfo { -  isTrusted: boolean; -  isAudited: boolean; -} - -/** - * Check if and how an exchange is trusted and/or audited. - */ -export async function getExchangeTrust( -  ws: InternalWalletState, -  exchangeInfo: ExchangeRecord, -): Promise<TrustInfo> { -  let isTrusted = false; -  let isAudited = false; - -  return await ws.db -    .mktx((x) => ({ -      exchanges: x.exchanges, -      exchangeDetails: x.exchangeDetails, -      exchangesTrustStore: x.exchangeTrust, -      auditorTrust: x.auditorTrust, -    })) -    .runReadOnly(async (tx) => { -      const exchangeDetails = await getExchangeDetails( -        tx, -        exchangeInfo.baseUrl, -      ); - -      if (!exchangeDetails) { -        throw Error(`exchange ${exchangeInfo.baseUrl} details not available`); -      } -      const exchangeTrustRecord = await tx.exchangesTrustStore.indexes.byExchangeMasterPub.get( -        exchangeDetails.masterPublicKey, -      ); -      if ( -        exchangeTrustRecord && -        exchangeTrustRecord.uids.length > 0 && -        exchangeTrustRecord.currency === exchangeDetails.currency -      ) { -        isTrusted = true; -      } - -      for (const auditor of exchangeDetails.auditors) { -        const auditorTrustRecord = await tx.auditorTrust.indexes.byAuditorPub.get( -          auditor.auditor_pub, -        ); -        if (auditorTrustRecord && auditorTrustRecord.uids.length > 0) { -          isAudited = true; -          break; -        } -      } - -      return { isTrusted, isAudited }; -    }); -} diff --git a/packages/taler-wallet-core/src/operations/deposits.ts b/packages/taler-wallet-core/src/operations/deposits.ts index c376ae8e0..5051fd32a 100644 --- a/packages/taler-wallet-core/src/operations/deposits.ts +++ b/packages/taler-wallet-core/src/operations/deposits.ts @@ -14,19 +14,10 @@   GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>   */ -import { kdf } from "../crypto/primitives/kdf.js"; -import { -  encodeCrock, -  getRandomBytes, -  stringToBytes, -} from "../crypto/talerCrypto.js"; -import { selectPayCoins } from "../util/coinSelection.js"; -import { canonicalJson } from "@gnu-taler/taler-util"; -import { readSuccessResponseJsonOrThrow } from "../util/http.js"; -import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries.js";  import {    Amounts,    buildCodecForObject, +  canonicalJson,    Codec,    codecForString,    codecForTimestamp, @@ -36,6 +27,7 @@ import {    CreateDepositGroupResponse,    durationFromSpec,    getTimestampNow, +  Logger,    NotificationType,    parsePaytoUri,    TalerErrorDetails, @@ -45,7 +37,20 @@ import {    TrackDepositGroupRequest,    TrackDepositGroupResponse,  } from "@gnu-taler/taler-util"; -import { URL } from "../util/url"; +import { InternalWalletState } from "../common.js"; +import { kdf } from "../crypto/primitives/kdf.js"; +import { +  encodeCrock, +  getRandomBytes, +  stringToBytes, +} from "../crypto/talerCrypto.js"; +import { DepositGroupRecord } from "../db.js"; +import { guardOperationException } from "../errors.js"; +import { selectPayCoins } from "../util/coinSelection.js"; +import { readSuccessResponseJsonOrThrow } from "../util/http.js"; +import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries.js"; +import { URL } from "../util/url.js"; +import { getExchangeDetails } from "./exchanges.js";  import {    applyCoinSpend,    extractContractData, @@ -54,12 +59,6 @@ import {    getEffectiveDepositAmount,    getTotalPaymentCost,  } from "./pay.js"; -import { InternalWalletState } from "./state.js"; -import { Logger } from "@gnu-taler/taler-util"; -import { DepositGroupRecord } from "../db.js"; - -import { guardOperationException } from "./errors.js"; -import { getExchangeDetails } from "./exchanges.js";  /**   * Logger. diff --git a/packages/taler-wallet-core/src/operations/exchanges.ts b/packages/taler-wallet-core/src/operations/exchanges.ts index c8dfcbc17..65cc8f5e9 100644 --- a/packages/taler-wallet-core/src/operations/exchanges.ts +++ b/packages/taler-wallet-core/src/operations/exchanges.ts @@ -20,6 +20,7 @@  import {    Amounts,    Auditor, +  canonicalizeBaseUrl,    codecForExchangeKeysJson,    codecForExchangeWireJson,    compare, @@ -30,6 +31,7 @@ import {    ExchangeWireJson,    getTimestampNow,    isTimestampExpired, +  j2s,    Logger,    NotificationType,    parsePaytoUri, @@ -38,38 +40,37 @@ import {    TalerErrorDetails,    Timestamp,  } from "@gnu-taler/taler-util"; +import { decodeCrock, encodeCrock, hash } from "../crypto/talerCrypto.js"; +import { CryptoApi } from "../crypto/workers/cryptoApi.js";  import {    DenominationRecord,    DenominationStatus, +  ExchangeDetailsRecord,    ExchangeRecord, +  WalletStoresV1,    WireFee, -  ExchangeDetailsRecord,    WireInfo, -  WalletStoresV1,  } from "../db.js"; -import { j2s, canonicalizeBaseUrl } from "@gnu-taler/taler-util"; -import { updateRetryInfoTimeout, initRetryInfo } from "../util/retries.js"; -import { -  makeErrorDetails, -  guardOperationException, -  OperationFailedError, -} from "./errors.js"; -import { createRecoupGroup, processRecoupGroup } from "./recoup.js"; -import { InternalWalletState } from "./state.js"; -import { -  WALLET_CACHE_BREAKER_CLIENT_VERSION, -  WALLET_EXCHANGE_PROTOCOL_VERSION, -} from "./versions.js";  import {    getExpiryTimestamp,    HttpRequestLibrary,    readSuccessResponseJsonOrThrow,    readSuccessResponseTextOrThrow,  } from "../util/http.js"; -import { CryptoApi } from "../crypto/workers/cryptoApi.js";  import { DbAccess, GetReadOnlyAccess } from "../util/query.js"; -import { decodeCrock, encodeCrock, hash } from "../crypto/talerCrypto.js"; +import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries.js";  import { URL } from "../util/url.js"; +import { +  guardOperationException, +  makeErrorDetails, +  OperationFailedError, +} from "../errors.js"; +import { createRecoupGroup, processRecoupGroup } from "./recoup.js"; +import { InternalWalletState, TrustInfo } from "../common.js"; +import { +  WALLET_CACHE_BREAKER_CLIENT_VERSION, +  WALLET_EXCHANGE_PROTOCOL_VERSION, +} from "../versions.js";  const logger = new Logger("exchanges.ts"); @@ -605,3 +606,54 @@ export async function getExchangePaytoUri(    }    throw Error("no matching exchange account found");  } + +/** + * Check if and how an exchange is trusted and/or audited. + */ +export async function getExchangeTrust( +  ws: InternalWalletState, +  exchangeInfo: ExchangeRecord, +): Promise<TrustInfo> { +  let isTrusted = false; +  let isAudited = false; + +  return await ws.db +    .mktx((x) => ({ +      exchanges: x.exchanges, +      exchangeDetails: x.exchangeDetails, +      exchangesTrustStore: x.exchangeTrust, +      auditorTrust: x.auditorTrust, +    })) +    .runReadOnly(async (tx) => { +      const exchangeDetails = await getExchangeDetails( +        tx, +        exchangeInfo.baseUrl, +      ); + +      if (!exchangeDetails) { +        throw Error(`exchange ${exchangeInfo.baseUrl} details not available`); +      } +      const exchangeTrustRecord = await tx.exchangesTrustStore.indexes.byExchangeMasterPub.get( +        exchangeDetails.masterPublicKey, +      ); +      if ( +        exchangeTrustRecord && +        exchangeTrustRecord.uids.length > 0 && +        exchangeTrustRecord.currency === exchangeDetails.currency +      ) { +        isTrusted = true; +      } + +      for (const auditor of exchangeDetails.auditors) { +        const auditorTrustRecord = await tx.auditorTrust.indexes.byAuditorPub.get( +          auditor.auditor_pub, +        ); +        if (auditorTrustRecord && auditorTrustRecord.uids.length > 0) { +          isAudited = true; +          break; +        } +      } + +      return { isTrusted, isAudited }; +    }); +} diff --git a/packages/taler-wallet-core/src/operations/pay.ts b/packages/taler-wallet-core/src/operations/pay.ts index c62ad0f25..6d185cae8 100644 --- a/packages/taler-wallet-core/src/operations/pay.ts +++ b/packages/taler-wallet-core/src/operations/pay.ts @@ -68,7 +68,7 @@ import {    getRetryDuration,  } from "../util/retries.js";  import { getTotalRefreshCost, createRefreshGroup } from "./refresh.js"; -import { InternalWalletState, EXCHANGE_COINS_LOCK } from "./state.js"; +import { InternalWalletState, EXCHANGE_COINS_LOCK } from "../common.js";  import { ContractTermsUtil } from "../util/contractTerms.js";  import { getExchangeDetails } from "./exchanges.js";  import { GetReadWriteAccess } from "../util/query.js"; @@ -98,7 +98,7 @@ import {    makeErrorDetails,    OperationFailedAndReportedError,    OperationFailedError, -} from "./errors.js"; +} from "../errors.js";  import { URL } from "../util/url.js";  /** diff --git a/packages/taler-wallet-core/src/operations/pending.ts b/packages/taler-wallet-core/src/operations/pending.ts index 8201e8cb9..fff64739c 100644 --- a/packages/taler-wallet-core/src/operations/pending.ts +++ b/packages/taler-wallet-core/src/operations/pending.ts @@ -29,7 +29,7 @@ import {    ReserveType,  } from "../pending-types.js";  import { getTimestampNow, Timestamp } from "@gnu-taler/taler-util"; -import { InternalWalletState } from "./state.js"; +import { InternalWalletState } from "../common.js";  import { getBalancesInsideTransaction } from "./balance.js";  import { GetReadOnlyAccess } from "../util/query.js"; diff --git a/packages/taler-wallet-core/src/operations/recoup.ts b/packages/taler-wallet-core/src/operations/recoup.ts index 938422d3b..402111129 100644 --- a/packages/taler-wallet-core/src/operations/recoup.ts +++ b/packages/taler-wallet-core/src/operations/recoup.ts @@ -48,10 +48,10 @@ import { readSuccessResponseJsonOrThrow } from "../util/http.js";  import { Logger } from "@gnu-taler/taler-util";  import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries.js";  import { URL } from "../util/url.js"; -import { guardOperationException } from "./errors.js"; +import { guardOperationException } from "../errors.js";  import { createRefreshGroup, processRefreshGroup } from "./refresh.js";  import { getReserveRequestTimeout, processReserve } from "./reserves.js"; -import { InternalWalletState } from "./state.js"; +import { InternalWalletState } from "../common.js";  import { GetReadWriteAccess } from "../util/query.js";  const logger = new Logger("operations/recoup.ts"); diff --git a/packages/taler-wallet-core/src/operations/refresh.ts b/packages/taler-wallet-core/src/operations/refresh.ts index 3c81362ce..06d735645 100644 --- a/packages/taler-wallet-core/src/operations/refresh.ts +++ b/packages/taler-wallet-core/src/operations/refresh.ts @@ -52,9 +52,9 @@ import {    timestampMin,  } from "@gnu-taler/taler-util";  import { URL } from "../util/url.js"; -import { guardOperationException } from "./errors.js"; +import { guardOperationException } from "../errors.js";  import { updateExchangeFromUrl } from "./exchanges.js"; -import { EXCHANGE_COINS_LOCK, InternalWalletState } from "./state.js"; +import { EXCHANGE_COINS_LOCK, InternalWalletState } from "../common.js";  import {    isWithdrawableDenom,    selectWithdrawalDenominations, diff --git a/packages/taler-wallet-core/src/operations/refund.ts b/packages/taler-wallet-core/src/operations/refund.ts index 6ef55e535..09006b811 100644 --- a/packages/taler-wallet-core/src/operations/refund.ts +++ b/packages/taler-wallet-core/src/operations/refund.ts @@ -23,12 +23,7 @@  /**   * Imports.   */ -import { InternalWalletState } from "./state.js"; -import { guardOperationException } from "./errors.js";  import { -  getTimestampNow, -  timestampAddDuration, -  TalerErrorDetails,    AbortingCoin,    AbortRequest,    AmountJson, @@ -37,29 +32,34 @@ import {    codecForAbortResponse,    codecForMerchantOrderRefundPickupResponse,    CoinPublicKey, +  getTimestampNow, +  Logger,    MerchantCoinRefundFailureStatus,    MerchantCoinRefundStatus,    MerchantCoinRefundSuccessStatus,    NotificationType,    parseRefundUri,    RefreshReason, +  TalerErrorCode, +  TalerErrorDetails, +  timestampAddDuration,  } from "@gnu-taler/taler-util"; -import { Logger } from "@gnu-taler/taler-util"; -import { readSuccessResponseJsonOrThrow } from "../util/http.js"; -import { URL } from "../util/url.js"; -import { updateRetryInfoTimeout, initRetryInfo } from "../util/retries.js"; -import { checkDbInvariant } from "../util/invariants.js"; -import { TalerErrorCode } from "@gnu-taler/taler-util";  import { -  PurchaseRecord, -  CoinStatus, -  RefundState,    AbortStatus, +  CoinStatus, +  PurchaseRecord,    RefundReason, +  RefundState,    WalletStoresV1,  } from "../db.js"; -import { getTotalRefreshCost, createRefreshGroup } from "./refresh.js"; +import { readSuccessResponseJsonOrThrow } from "../util/http.js"; +import { checkDbInvariant } from "../util/invariants.js";  import { GetReadWriteAccess } from "../util/query.js"; +import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries.js"; +import { URL } from "../util/url.js"; +import { guardOperationException } from "../errors.js"; +import { createRefreshGroup, getTotalRefreshCost } from "./refresh.js"; +import { InternalWalletState } from "../common.js";  const logger = new Logger("refund.ts"); diff --git a/packages/taler-wallet-core/src/operations/reserves.ts b/packages/taler-wallet-core/src/operations/reserves.ts index 998fbf3e0..dde71f040 100644 --- a/packages/taler-wallet-core/src/operations/reserves.ts +++ b/packages/taler-wallet-core/src/operations/reserves.ts @@ -47,13 +47,14 @@ import {    getRetryDuration,    updateRetryInfoTimeout,  } from "../util/retries.js"; -import { guardOperationException, OperationFailedError } from "./errors.js"; +import { guardOperationException, OperationFailedError } from "../errors.js";  import {    updateExchangeFromUrl,    getExchangePaytoUri,    getExchangeDetails, +  getExchangeTrust,  } from "./exchanges.js"; -import { InternalWalletState } from "./state.js"; +import { InternalWalletState } from "../common.js";  import {    updateWithdrawalDenoms,    getCandidateWithdrawalDenoms, @@ -62,7 +63,6 @@ import {    processWithdrawGroup,    getBankWithdrawalInfo,  } from "./withdraw.js"; -import { getExchangeTrust } from "./currencies.js";  import { encodeCrock, getRandomBytes } from "../crypto/talerCrypto.js";  import { Logger } from "@gnu-taler/taler-util";  import { diff --git a/packages/taler-wallet-core/src/operations/testing.ts b/packages/taler-wallet-core/src/operations/testing.ts index ce3a47f36..8a0c20200 100644 --- a/packages/taler-wallet-core/src/operations/testing.ts +++ b/packages/taler-wallet-core/src/operations/testing.ts @@ -34,7 +34,7 @@ import {    PreparePayResultType,  } from "@gnu-taler/taler-util";  import { createTalerWithdrawReserve } from "./reserves.js"; -import { InternalWalletState } from "./state.js"; +import { InternalWalletState } from "../common.js";  import { URL } from "../util/url.js";  import { confirmPay, preparePayForUri } from "./pay.js";  import { getBalances } from "./balance.js"; diff --git a/packages/taler-wallet-core/src/operations/tip.ts b/packages/taler-wallet-core/src/operations/tip.ts index d82331632..1da2c887a 100644 --- a/packages/taler-wallet-core/src/operations/tip.ts +++ b/packages/taler-wallet-core/src/operations/tip.ts @@ -40,9 +40,9 @@ import {  import { j2s } from "@gnu-taler/taler-util";  import { checkDbInvariant, checkLogicInvariant } from "../util/invariants.js";  import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries.js"; -import { guardOperationException, makeErrorDetails } from "./errors.js"; +import { guardOperationException, makeErrorDetails } from "../errors.js";  import { updateExchangeFromUrl } from "./exchanges.js"; -import { InternalWalletState } from "./state.js"; +import { InternalWalletState } from "../common.js";  import {    getExchangeWithdrawalInfo,    updateWithdrawalDenoms, diff --git a/packages/taler-wallet-core/src/operations/transactions.ts b/packages/taler-wallet-core/src/operations/transactions.ts index 5836a6ee3..82cfec551 100644 --- a/packages/taler-wallet-core/src/operations/transactions.ts +++ b/packages/taler-wallet-core/src/operations/transactions.ts @@ -17,7 +17,7 @@  /**   * Imports.   */ -import { InternalWalletState } from "./state.js"; +import { InternalWalletState } from "../common.js";  import {    WalletRefundItem,    RefundState, diff --git a/packages/taler-wallet-core/src/operations/withdraw.ts b/packages/taler-wallet-core/src/operations/withdraw.ts index 3400238ed..6cf20259c 100644 --- a/packages/taler-wallet-core/src/operations/withdraw.ts +++ b/packages/taler-wallet-core/src/operations/withdraw.ts @@ -17,65 +17,56 @@  /**   * Imports.   */ +import * as LibtoolVersion from "@gnu-taler/taler-util";  import {    AmountJson,    Amounts, +  BankWithdrawDetails, +  codecForTalerConfigResponse, +  codecForWithdrawOperationStatusResponse, +  codecForWithdrawResponse, +  compare,    durationFromSpec, +  ExchangeListItem, +  getDurationRemaining, +  getTimestampNow, +  Logger, +  NotificationType,    parseWithdrawUri, +  TalerErrorCode, +  TalerErrorDetails,    Timestamp, +  timestampCmp, +  timestampSubtractDuraction, +  WithdrawResponse, +  WithdrawUriInfoResponse,  } from "@gnu-taler/taler-util";  import { -  DenominationRecord, -  DenominationStatus, -  CoinStatus,    CoinRecord,    CoinSourceType, +  CoinStatus, +  DenominationRecord,    DenominationSelectionInfo, -  PlanchetRecord, +  DenominationStatus,    DenomSelectionState, -  ExchangeRecord,    ExchangeDetailsRecord, +  ExchangeRecord, +  PlanchetRecord,  } from "../db.js"; -import { -  BankWithdrawDetails, -  TalerErrorDetails, -  ExchangeListItem, -  WithdrawUriInfoResponse, -} from "@gnu-taler/taler-util"; -import { -  codecForWithdrawOperationStatusResponse, -  codecForWithdrawResponse, -  WithdrawResponse, -  codecForTalerConfigResponse, -} from "@gnu-taler/taler-util"; -import { InternalWalletState } from "./state.js"; -import { Logger } from "@gnu-taler/taler-util"; -import { getExchangeDetails, updateExchangeFromUrl } from "./exchanges.js"; -import { -  WALLET_EXCHANGE_PROTOCOL_VERSION, -  WALLET_BANK_INTEGRATION_PROTOCOL_VERSION, -} from "./versions.js"; - -import * as LibtoolVersion from "@gnu-taler/taler-util"; +import { walletCoreDebugFlags } from "../util/debugFlags.js"; +import { readSuccessResponseJsonOrThrow } from "../util/http.js"; +import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries.js"; +import { URL } from "../util/url.js";  import {    guardOperationException,    makeErrorDetails,    OperationFailedError, -} from "./errors.js"; -import { NotificationType } from "@gnu-taler/taler-util"; +} from "../errors.js"; +import { InternalWalletState } from "../common.js";  import { -  getTimestampNow, -  getDurationRemaining, -  timestampCmp, -  timestampSubtractDuraction, -} from "@gnu-taler/taler-util"; -import { readSuccessResponseJsonOrThrow } from "../util/http.js"; -import { URL } from "../util/url.js"; -import { TalerErrorCode } from "@gnu-taler/taler-util"; -import { updateRetryInfoTimeout, initRetryInfo } from "../util/retries.js"; -import { compare } from "@gnu-taler/taler-util"; -import { walletCoreDebugFlags } from "../util/debugFlags.js"; -import { getExchangeTrust } from "./currencies.js"; +  WALLET_BANK_INTEGRATION_PROTOCOL_VERSION, +  WALLET_EXCHANGE_PROTOCOL_VERSION, +} from "../versions.js";  /**   * Logger for this file. @@ -690,7 +681,7 @@ export async function updateWithdrawalDenoms(        exchangeDetails: x.exchangeDetails,      }))      .runReadOnly(async (tx) => { -      return getExchangeDetails(tx, exchangeBaseUrl); +      return ws.exchangeOps.getExchangeDetails(tx, exchangeBaseUrl);      });    if (!exchangeDetails) {      logger.error("exchange details not available"); @@ -816,7 +807,10 @@ async function processWithdrawGroupImpl(      return;    } -  await updateExchangeFromUrl(ws, withdrawalGroup.exchangeBaseUrl); +  await ws.exchangeOps.updateExchangeFromUrl( +    ws, +    withdrawalGroup.exchangeBaseUrl, +  );    const numTotalCoins = withdrawalGroup.denomsSel.selectedDenoms      .map((x) => x.count) @@ -910,10 +904,10 @@ export async function getExchangeWithdrawalInfo(    baseUrl: string,    amount: AmountJson,  ): Promise<ExchangeWithdrawDetails> { -  const { exchange, exchangeDetails } = await updateExchangeFromUrl( -    ws, -    baseUrl, -  ); +  const { +    exchange, +    exchangeDetails, +  } = await ws.exchangeOps.updateExchangeFromUrl(ws, baseUrl);    await updateWithdrawalDenoms(ws, baseUrl);    const denoms = await getCandidateWithdrawalDenoms(ws, baseUrl);    const selectedDenoms = selectWithdrawalDenominations(amount, denoms); @@ -922,7 +916,10 @@ export async function getExchangeWithdrawalInfo(      exchangeWireAccounts.push(account.payto_uri);    } -  const { isTrusted, isAudited } = await getExchangeTrust(ws, exchange); +  const { isTrusted, isAudited } = await ws.exchangeOps.getExchangeTrust( +    ws, +    exchange, +  );    let earliestDepositExpiration =      selectedDenoms.selectedDenoms[0].denom.stampExpireDeposit; @@ -1009,7 +1006,7 @@ export async function getWithdrawalDetailsForUri(      // FIXME: right now the exchange gets permanently added,      // we might want to only temporarily add it.      try { -      await updateExchangeFromUrl(ws, info.suggestedExchange); +      await ws.exchangeOps.updateExchangeFromUrl(ws, info.suggestedExchange);      } catch (e) {        // We still continued if it failed, as other exchanges might be available.        // We don't want to fail if the bank-suggested exchange is broken/offline. @@ -1029,7 +1026,7 @@ export async function getWithdrawalDetailsForUri(      .runReadOnly(async (tx) => {        const exchangeRecords = await tx.exchanges.iter().toArray();        for (const r of exchangeRecords) { -        const details = await getExchangeDetails(tx, r.baseUrl); +        const details = await ws.exchangeOps.getExchangeDetails(tx, r.baseUrl);          if (details) {            exchanges.push({              exchangeBaseUrl: details.exchangeBaseUrl, diff --git a/packages/taler-wallet-core/src/pending-types.ts b/packages/taler-wallet-core/src/pending-types.ts index 02b4ec76d..0e26c262b 100644 --- a/packages/taler-wallet-core/src/pending-types.ts +++ b/packages/taler-wallet-core/src/pending-types.ts @@ -27,7 +27,6 @@  import {    TalerErrorDetails,    BalancesResponse, -  Duration,    Timestamp,  } from "@gnu-taler/taler-util";  import { ReserveRecordStatus } from "./db.js"; diff --git a/packages/taler-wallet-core/src/util/http.ts b/packages/taler-wallet-core/src/util/http.ts index 92a9e4396..68a63e124 100644 --- a/packages/taler-wallet-core/src/util/http.ts +++ b/packages/taler-wallet-core/src/util/http.ts @@ -27,7 +27,7 @@  import {    OperationFailedError,    makeErrorDetails, -} from "../operations/errors.js"; +} from "../errors.js";  import {    Logger,    Duration, diff --git a/packages/taler-wallet-core/src/operations/versions.ts b/packages/taler-wallet-core/src/versions.ts index b798871c2..b798871c2 100644 --- a/packages/taler-wallet-core/src/operations/versions.ts +++ b/packages/taler-wallet-core/src/versions.ts diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts index 4c1715118..a392bf4d7 100644 --- a/packages/taler-wallet-core/src/wallet.ts +++ b/packages/taler-wallet-core/src/wallet.ts @@ -55,7 +55,7 @@ import {    makeErrorDetails,    OperationFailedAndReportedError,    OperationFailedError, -} from "./operations/errors"; +} from "./errors";  import {    acceptExchangeTermsOfService,    getExchangeDetails, @@ -85,7 +85,7 @@ import {    getFundingPaytoUris,    processReserve,  } from "./operations/reserves"; -import { InternalWalletState } from "./operations/state"; +import { InternalWalletState } from "./common";  import {    runIntegrationTest,    testPay, | 
