From f57dc7bf7a1e3a14c67512ba67d92fa350c95c0e Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Fri, 10 Jun 2022 13:03:47 +0200 Subject: wallet-core: implement and test forced coin/denom selection --- packages/taler-wallet-core/src/operations/pay.ts | 37 +++++++++++++++++------- 1 file changed, 27 insertions(+), 10 deletions(-) (limited to 'packages/taler-wallet-core/src/operations/pay.ts') diff --git a/packages/taler-wallet-core/src/operations/pay.ts b/packages/taler-wallet-core/src/operations/pay.ts index f22d51a9d..b6bae7518 100644 --- a/packages/taler-wallet-core/src/operations/pay.ts +++ b/packages/taler-wallet-core/src/operations/pay.ts @@ -40,12 +40,14 @@ import { durationMin, durationMul, encodeCrock, + ForcedCoinSel, getRandomBytes, HttpStatusCode, j2s, Logger, NotificationType, parsePayUri, + PayCoinSelection, PreparePayResult, PreparePayResultType, RefreshReason, @@ -81,8 +83,8 @@ import { import { AvailableCoinInfo, CoinCandidateSelection, - PayCoinSelection, PreviousPayCoins, + selectForcedPayCoins, selectPayCoins, } from "../util/coinSelection.js"; import { ContractTermsUtil } from "../util/contractTerms.js"; @@ -305,6 +307,7 @@ export async function getCandidatePayCoins( } candidateCoins.push({ availableAmount: coin.currentAmount, + value: denom.value, coinPub: coin.coinPub, denomPub: denom.denomPub, feeDeposit: denom.feeDeposit, @@ -1423,6 +1426,7 @@ export async function confirmPay( ws: InternalWalletState, proposalId: string, sessionIdOverride?: string, + forcedCoinSel?: ForcedCoinSel, ): Promise { logger.trace( `executing confirmPay with proposalId ${proposalId} and sessionIdOverride ${sessionIdOverride}`, @@ -1479,15 +1483,28 @@ export async function confirmPay( wireMethod: contractData.wireMethod, }); - const res = selectPayCoins({ - candidates, - contractTermsAmount: contractData.amount, - depositFeeLimit: contractData.maxDepositFee, - wireFeeAmortization: contractData.wireFeeAmortization ?? 1, - wireFeeLimit: contractData.maxWireFee, - prevPayCoins: [], - requiredMinimumAge: contractData.minimumAge, - }); + let res: PayCoinSelection | undefined = undefined; + + if (forcedCoinSel) { + res = selectForcedPayCoins(forcedCoinSel, { + candidates, + contractTermsAmount: contractData.amount, + depositFeeLimit: contractData.maxDepositFee, + wireFeeAmortization: contractData.wireFeeAmortization ?? 1, + wireFeeLimit: contractData.maxWireFee, + requiredMinimumAge: contractData.minimumAge, + }); + } else { + res = selectPayCoins({ + candidates, + contractTermsAmount: contractData.amount, + depositFeeLimit: contractData.maxDepositFee, + wireFeeAmortization: contractData.wireFeeAmortization ?? 1, + wireFeeLimit: contractData.maxWireFee, + prevPayCoins: [], + requiredMinimumAge: contractData.minimumAge, + }); + } logger.trace("coin selection result", res); -- cgit v1.2.3