From 7d02e4212346b7b7b88197259a7e74554e1b10a3 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 4 Jan 2023 15:18:58 +0100 Subject: wallet-core: define insufficient balance details --- .../taler-wallet-core/src/operations/balance.ts | 33 ++++++++++ .../src/operations/pay-merchant.ts | 73 +++++++++++++--------- 2 files changed, 78 insertions(+), 28 deletions(-) diff --git a/packages/taler-wallet-core/src/operations/balance.ts b/packages/taler-wallet-core/src/operations/balance.ts index cd78b0360..d2a029d53 100644 --- a/packages/taler-wallet-core/src/operations/balance.ts +++ b/packages/taler-wallet-core/src/operations/balance.ts @@ -14,6 +14,36 @@ GNU Taler; see the file COPYING. If not, see */ +/** + * Functions to compute the wallet's balance. + * + * There are multiple definition of the wallet's balance. + * We use the following terminology: + * + * - "available": Balance that the wallet believes will certainly be available + * for spending, modulo any failures of the exchange or double spending issues. + * This includes available coins *not* allocated to any + * spending/refresh/... operation. Pending withdrawals are *not* counted + * towards this balance, because they are not certain to succeed. + * Pending refreshes *are* counted towards this balance. + * This balance type is nice to show to the user, because it does not + * temporarily decrease after payment when we are waiting for refreshes + * + * - "material": Balance that the wallet believes it could spend *right now*, + * without waiting for any operations to complete. + * This balance type is important when showing "insufficient balance" error messages. + * + * - "age-acceptable": Subset of the material balance that can be spent + * with age restrictions applied. + * + * - "merchant-acceptable": Subset of the material balance that can be spent with a particular + * merchant (restricted via min age, exchange, auditor, wire_method). + * + * - "merchant-wireable": Subset of the merchant-acceptable balance that the merchant + * can accept via their supported wire methods. + */ + + /** * Imports. */ @@ -27,6 +57,9 @@ import { WalletStoresV1 } from "../db.js"; import { GetReadOnlyAccess } from "../util/query.js"; import { InternalWalletState } from "../internal-wallet-state.js"; +/** + * Logger. + */ const logger = new Logger("operations/balance.ts"); interface WalletBalance { diff --git a/packages/taler-wallet-core/src/operations/pay-merchant.ts b/packages/taler-wallet-core/src/operations/pay-merchant.ts index ed7f17a18..49b9a6559 100644 --- a/packages/taler-wallet-core/src/operations/pay-merchant.ts +++ b/packages/taler-wallet-core/src/operations/pay-merchant.ts @@ -191,34 +191,6 @@ export async function getTotalPaymentCost( }); } -export interface CoinSelectionRequest { - amount: AmountJson; - - allowedAuditors: AllowedAuditorInfo[]; - allowedExchanges: AllowedExchangeInfo[]; - - /** - * Timestamp of the contract. - */ - timestamp: TalerProtocolTimestamp; - - wireMethod: string; - - wireFeeAmortization: number; - - maxWireFee: AmountJson; - - maxDepositFee: AmountJson; - - /** - * Minimum age requirement for the coin selection. - * - * When present, only select coins with either no age restriction - * or coins with an age commitment that matches the minimum age. - */ - minimumAge?: number; -} - async function failProposalPermanently( ws: InternalWalletState, proposalId: string, @@ -903,6 +875,51 @@ async function unblockBackup( }); } +/** + * Detailed reason for why the wallet's balance is insufficient. + */ +export interface PayMerchantInsufficientBalanceDetails { + /** + * Amount requested by the merchant. + */ + amountRequested: AmountJson; + + /** + * Balance of type "available" (see balance.ts for definition). + */ + balanceAvailable: AmountJson; + + /** + * Balance of type "material" (see balance.ts for definition). + */ + balanceMaterial: AmountJson; + + /** + * Balance of type "age-acceptable" (see balance.ts for definition). + */ + balanceAgeAcceptable: AmountJson; + + /** + * Balance of type "merchant-acceptable" (see balance.ts for definition). + */ + balanceMechantAcceptable: AmountJson; + + /** + * Balance of type "merchant-wireable" (see balance.ts for definition). + */ + balanceMechantWireable: AmountJson; + + /** + * If the payment would succeed without fees, + * this field contains an estimate of the amount that would additionally + * be required to cover the fees. + * + * It is not possible to give an exact value here, since it depends + * on the coin selection for the amount that would be additionally withdrawn. + */ + feeGapEstimate: AmountJson +} + export interface SelectPayCoinRequestNg { exchanges: AllowedExchangeInfo[]; auditors: AllowedAuditorInfo[]; -- cgit v1.2.3