From 53120dfc3ec05d49fc6f94bb498c66238225dd6b Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 7 Mar 2024 11:46:31 +0100 Subject: rename insufficient balance fields to work for both merchant and p2p payments --- .../src/integrationtests/test-wallet-balance.ts | 4 +-- packages/taler-util/src/wallet-types.ts | 12 ++++----- packages/taler-wallet-core/src/balance.ts | 30 ++++++++++------------ packages/taler-wallet-core/src/coinSelection.ts | 18 ++++++------- .../src/components/PaymentButtons.tsx | 8 +++--- .../src/cta/Payment/stories.tsx | 24 ++++++++--------- 6 files changed, 46 insertions(+), 50 deletions(-) diff --git a/packages/taler-harness/src/integrationtests/test-wallet-balance.ts b/packages/taler-harness/src/integrationtests/test-wallet-balance.ts index 0e4452892..eb7359781 100644 --- a/packages/taler-harness/src/integrationtests/test-wallet-balance.ts +++ b/packages/taler-harness/src/integrationtests/test-wallet-balance.ts @@ -113,12 +113,12 @@ export async function runWalletBalanceTest(t: GlobalTestState) { t.assertTrue( Amounts.isNonZero( - preparePayResult.balanceDetails.balanceMerchantAcceptable, + preparePayResult.balanceDetails.balanceReceiverAcceptable, ), ); t.assertTrue( - Amounts.isZero(preparePayResult.balanceDetails.balanceMerchantDepositable), + Amounts.isZero(preparePayResult.balanceDetails.balanceReceiverDepositable), ); console.log("waiting for transactions to finalize"); diff --git a/packages/taler-util/src/wallet-types.ts b/packages/taler-util/src/wallet-types.ts index cfbed04dc..69811969c 100644 --- a/packages/taler-util/src/wallet-types.ts +++ b/packages/taler-util/src/wallet-types.ts @@ -862,12 +862,12 @@ export interface PaymentInsufficientBalanceDetails { /** * Balance of type "merchant-acceptable" (see balance.ts for definition). */ - balanceMerchantAcceptable: AmountString; + balanceReceiverAcceptable: AmountString; /** * Balance of type "merchant-depositable" (see balance.ts for definition). */ - balanceMerchantDepositable: AmountString; + balanceReceiverDepositable: AmountString; balanceExchangeDepositable: AmountString; @@ -883,8 +883,8 @@ export interface PaymentInsufficientBalanceDetails { balanceMaterial: AmountString; balanceExchangeDepositable: AmountString; balanceAgeAcceptable: AmountString; - balanceMerchantAcceptable: AmountString; - balanceMerchantDepositable: AmountString; + balanceReceiverAcceptable: AmountString; + balanceReceiverDepositable: AmountString; maxEffectiveSpendAmount: AmountString; }; }; @@ -897,8 +897,8 @@ export const codecForPayMerchantInsufficientBalanceDetails = .property("balanceAgeAcceptable", codecForAmountString()) .property("balanceAvailable", codecForAmountString()) .property("balanceMaterial", codecForAmountString()) - .property("balanceMerchantAcceptable", codecForAmountString()) - .property("balanceMerchantDepositable", codecForAmountString()) + .property("balanceReceiverAcceptable", codecForAmountString()) + .property("balanceReceiverDepositable", codecForAmountString()) .property("balanceExchangeDepositable", codecForAmountString()) .property("perExchange", codecForAny()) .property("maxEffectiveSpendAmount", codecForAmountString()) diff --git a/packages/taler-wallet-core/src/balance.ts b/packages/taler-wallet-core/src/balance.ts index 26d348b39..5e3562ba2 100644 --- a/packages/taler-wallet-core/src/balance.ts +++ b/packages/taler-wallet-core/src/balance.ts @@ -51,8 +51,6 @@ */ import { GlobalIDB } from "@gnu-taler/idb-bridge"; import { - AllowedAuditorInfo, - AllowedExchangeInfo, AmountJson, AmountLike, Amounts, @@ -60,12 +58,13 @@ import { BalanceFlag, BalancesResponse, GetBalanceDetailRequest, + j2s, Logger, parsePaytoUri, ScopeInfo, ScopeType, } from "@gnu-taler/taler-util"; -import { findMatchingWire } from "./coinSelection.js"; +import { ExchangeRestrictionSpec, findMatchingWire } from "./coinSelection.js"; import { DepositOperationStatus, OPERATION_STATUS_ACTIVE_FIRST, @@ -462,12 +461,7 @@ export async function getBalances( export interface PaymentRestrictionsForBalance { currency: string; minAge: number; - restrictExchanges: - | { - exchanges: AllowedExchangeInfo[]; - auditors: AllowedAuditorInfo[]; - } - | undefined; + restrictExchanges: ExchangeRestrictionSpec | undefined; restrictWireMethods: string[] | undefined; depositPaytoUri: string | undefined; } @@ -504,12 +498,12 @@ export interface PaymentBalanceDetails { /** * Balance of type "merchant-acceptable" (see balance.ts for definition). */ - balanceMerchantAcceptable: AmountJson; + balanceReceiverAcceptable: AmountJson; /** * Balance of type "merchant-depositable" (see balance.ts for definition). */ - balanceMerchantDepositable: AmountJson; + balanceReceiverDepositable: AmountJson; /** * Balance that's depositable with the exchange. @@ -556,12 +550,14 @@ export async function getPaymentBalanceDetailsInTx( balanceAvailable: Amounts.zeroOfCurrency(req.currency), balanceMaterial: Amounts.zeroOfCurrency(req.currency), balanceAgeAcceptable: Amounts.zeroOfCurrency(req.currency), - balanceMerchantAcceptable: Amounts.zeroOfCurrency(req.currency), - balanceMerchantDepositable: Amounts.zeroOfCurrency(req.currency), + balanceReceiverAcceptable: Amounts.zeroOfCurrency(req.currency), + balanceReceiverDepositable: Amounts.zeroOfCurrency(req.currency), maxEffectiveSpendAmount: Amounts.zeroOfCurrency(req.currency), balanceExchangeDepositable: Amounts.zeroOfCurrency(req.currency), }; + logger.info(`computing balance details for ${j2s(req)}`); + const availableCoins = await tx.coinAvailability.getAll(); for (const ca of availableCoins) { @@ -646,13 +642,13 @@ export async function getPaymentBalanceDetailsInTx( coinAmount, ).amount; if (merchantExchangeAcceptable) { - d.balanceMerchantAcceptable = Amounts.add( - d.balanceMerchantAcceptable, + d.balanceReceiverAcceptable = Amounts.add( + d.balanceReceiverAcceptable, coinAmount, ).amount; if (merchantExchangeDepositable) { - d.balanceMerchantDepositable = Amounts.add( - d.balanceMerchantDepositable, + d.balanceReceiverDepositable = Amounts.add( + d.balanceReceiverDepositable, coinAmount, ).amount; } diff --git a/packages/taler-wallet-core/src/coinSelection.ts b/packages/taler-wallet-core/src/coinSelection.ts index 98fd0dec1..50965fd6c 100644 --- a/packages/taler-wallet-core/src/coinSelection.ts +++ b/packages/taler-wallet-core/src/coinSelection.ts @@ -392,7 +392,7 @@ export async function reportInsufficientBalanceDetails( ): Promise { const details = await getPaymentBalanceDetailsInTx(wex, tx, { restrictExchanges: req.restrictExchanges, - restrictWireMethods: req.wireMethod ? [req.wireMethod] : [], + restrictWireMethods: req.wireMethod ? [req.wireMethod] : undefined, currency: Amounts.currencyOf(req.instructedAmount), minAge: req.requiredMinimumAge ?? 0, depositPaytoUri: req.depositPaytoUri, @@ -426,11 +426,11 @@ export async function reportInsufficientBalanceDetails( exchDet.balanceExchangeDepositable, ), balanceAgeAcceptable: Amounts.stringify(exchDet.balanceAgeAcceptable), - balanceMerchantAcceptable: Amounts.stringify( - exchDet.balanceMerchantAcceptable, + balanceReceiverAcceptable: Amounts.stringify( + exchDet.balanceReceiverAcceptable, ), - balanceMerchantDepositable: Amounts.stringify( - exchDet.balanceMerchantDepositable, + balanceReceiverDepositable: Amounts.stringify( + exchDet.balanceReceiverDepositable, ), maxEffectiveSpendAmount: Amounts.stringify( exchDet.maxEffectiveSpendAmount, @@ -443,14 +443,14 @@ export async function reportInsufficientBalanceDetails( balanceAgeAcceptable: Amounts.stringify(details.balanceAgeAcceptable), balanceAvailable: Amounts.stringify(details.balanceAvailable), balanceMaterial: Amounts.stringify(details.balanceMaterial), - balanceMerchantAcceptable: Amounts.stringify( - details.balanceMerchantAcceptable, + balanceReceiverAcceptable: Amounts.stringify( + details.balanceReceiverAcceptable, ), balanceExchangeDepositable: Amounts.stringify( details.balanceExchangeDepositable, ), - balanceMerchantDepositable: Amounts.stringify( - details.balanceMerchantDepositable, + balanceReceiverDepositable: Amounts.stringify( + details.balanceReceiverDepositable, ), maxEffectiveSpendAmount: Amounts.stringify(details.maxEffectiveSpendAmount), perExchange, diff --git a/packages/taler-wallet-webextension/src/components/PaymentButtons.tsx b/packages/taler-wallet-webextension/src/components/PaymentButtons.tsx index e7c4fbba4..21ee4d3d2 100644 --- a/packages/taler-wallet-webextension/src/components/PaymentButtons.tsx +++ b/packages/taler-wallet-webextension/src/components/PaymentButtons.tsx @@ -93,7 +93,7 @@ export function PaymentButtons({ } case "merchant-acceptable": { BalanceMessage = i18n.str`Balance is not enough because merchant will just accept ${Amounts.stringifyValue( - payStatus.balanceDetails.balanceMerchantAcceptable, + payStatus.balanceDetails.balanceReceiverAcceptable, )} ${ amount.currency } . To know more you can check which exchange and auditors the merchant trust.`; @@ -101,7 +101,7 @@ export function PaymentButtons({ } case "merchant-depositable": { BalanceMessage = i18n.str`Balance is not enough because merchant will just accept ${Amounts.stringifyValue( - payStatus.balanceDetails.balanceMerchantDepositable, + payStatus.balanceDetails.balanceReceiverDepositable, )} ${ amount.currency } . To know more you can check which wire methods the merchant accepts.`; @@ -232,10 +232,10 @@ function getReason( if (Amounts.cmp(info.amountRequested, info.balanceAgeAcceptable) > 0) { return "age-acceptable"; } - if (Amounts.cmp(info.amountRequested, info.balanceMerchantAcceptable) > 0) { + if (Amounts.cmp(info.amountRequested, info.balanceReceiverAcceptable) > 0) { return "merchant-acceptable"; } - if (Amounts.cmp(info.amountRequested, info.balanceMerchantDepositable) > 0) { + if (Amounts.cmp(info.amountRequested, info.balanceReceiverDepositable) > 0) { return "merchant-depositable"; } return "fee-gap"; diff --git a/packages/taler-wallet-webextension/src/cta/Payment/stories.tsx b/packages/taler-wallet-webextension/src/cta/Payment/stories.tsx index 93b96c836..d03f48746 100644 --- a/packages/taler-wallet-webextension/src/cta/Payment/stories.tsx +++ b/packages/taler-wallet-webextension/src/cta/Payment/stories.tsx @@ -57,8 +57,8 @@ export const NoEnoughBalanceAvailable = tests.createExample(BaseView, { balanceAvailable: "USD:9" as AmountString, balanceMaterial: "USD:9" as AmountString, balanceAgeAcceptable: "USD:9" as AmountString, - balanceMerchantAcceptable: "USD:9" as AmountString, - balanceMerchantDepositable: "USD:9" as AmountString, + balanceReceiverAcceptable: "USD:9" as AmountString, + balanceReceiverDepositable: "USD:9" as AmountString, maxEffectiveSpendAmount: "USD:9.5" as AmountString, balanceExchangeDepositable: "USD:9.5" as AmountString, perExchange: {}, @@ -99,8 +99,8 @@ export const NoEnoughBalanceMaterial = tests.createExample(BaseView, { balanceAvailable: "USD:10" as AmountString, balanceMaterial: "USD:9" as AmountString, balanceAgeAcceptable: "USD:9" as AmountString, - balanceMerchantAcceptable: "USD:9" as AmountString, - balanceMerchantDepositable: "USD:0" as AmountString, + balanceReceiverAcceptable: "USD:9" as AmountString, + balanceReceiverDepositable: "USD:0" as AmountString, maxEffectiveSpendAmount: "USD:9.5" as AmountString, balanceExchangeDepositable: "USD:9.5" as AmountString, perExchange: {}, @@ -141,8 +141,8 @@ export const NoEnoughBalanceAgeAcceptable = tests.createExample(BaseView, { balanceAvailable: "USD:10" as AmountString, balanceMaterial: "USD:10" as AmountString, balanceAgeAcceptable: "USD:9" as AmountString, - balanceMerchantAcceptable: "USD:9" as AmountString, - balanceMerchantDepositable: "USD:9" as AmountString, + balanceReceiverAcceptable: "USD:9" as AmountString, + balanceReceiverDepositable: "USD:9" as AmountString, maxEffectiveSpendAmount: "USD:9.5" as AmountString, balanceExchangeDepositable: "USD:9.5" as AmountString, perExchange: {}, @@ -184,8 +184,8 @@ export const NoEnoughBalanceMerchantAcceptable = tests.createExample(BaseView, { balanceAvailable: "USD:10" as AmountString, balanceMaterial: "USD:10" as AmountString, balanceAgeAcceptable: "USD:10" as AmountString, - balanceMerchantAcceptable: "USD:9" as AmountString, - balanceMerchantDepositable: "USD:9" as AmountString, + balanceReceiverAcceptable: "USD:9" as AmountString, + balanceReceiverDepositable: "USD:9" as AmountString, maxEffectiveSpendAmount: "USD:9.5" as AmountString, balanceExchangeDepositable: "USD:9.5" as AmountString, perExchange: {}, @@ -228,8 +228,8 @@ export const NoEnoughBalanceMerchantDepositable = tests.createExample( balanceAvailable: "USD:10" as AmountString, balanceMaterial: "USD:10" as AmountString, balanceAgeAcceptable: "USD:10" as AmountString, - balanceMerchantAcceptable: "USD:10" as AmountString, - balanceMerchantDepositable: "USD:9" as AmountString, + balanceReceiverAcceptable: "USD:10" as AmountString, + balanceReceiverDepositable: "USD:9" as AmountString, maxEffectiveSpendAmount: "USD:9.5" as AmountString, balanceExchangeDepositable: "USD:9.5" as AmountString, perExchange: {}, @@ -271,8 +271,8 @@ export const NoEnoughBalanceFeeGap = tests.createExample(BaseView, { balanceAvailable: "USD:10" as AmountString, balanceMaterial: "USD:10" as AmountString, balanceAgeAcceptable: "USD:10" as AmountString, - balanceMerchantAcceptable: "USD:10" as AmountString, - balanceMerchantDepositable: "USD:10" as AmountString, + balanceReceiverAcceptable: "USD:10" as AmountString, + balanceReceiverDepositable: "USD:10" as AmountString, maxEffectiveSpendAmount: "USD:9.5" as AmountString, balanceExchangeDepositable: "USD:9.5" as AmountString, perExchange: {}, -- cgit v1.2.3