From 9996c274886cd80d5255765f7e3db8dfcadcfc94 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Fri, 29 Apr 2022 21:05:17 +0200 Subject: wallet-core: make coin selection aware of age restriction --- packages/taler-wallet-core/src/operations/pay.ts | 4 ++++ .../taler-wallet-core/src/util/coinSelection.ts | 24 +++++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) (limited to 'packages/taler-wallet-core') diff --git a/packages/taler-wallet-core/src/operations/pay.ts b/packages/taler-wallet-core/src/operations/pay.ts index a1773547a..db157257a 100644 --- a/packages/taler-wallet-core/src/operations/pay.ts +++ b/packages/taler-wallet-core/src/operations/pay.ts @@ -315,6 +315,7 @@ export async function getCandidatePayCoins( denomPub: denom.denomPub, feeDeposit: denom.feeDeposit, exchangeBaseUrl: denom.exchangeBaseUrl, + ageCommitmentProof: coin.ageCommitmentProof, }); } @@ -1120,6 +1121,7 @@ async function handleInsufficientFunds( wireFeeAmortization: contractData.wireFeeAmortization ?? 1, wireFeeLimit: contractData.maxWireFee, prevPayCoins, + requiredMinimumAge: contractData.minimumAge, }); if (!res) { @@ -1236,6 +1238,7 @@ export async function checkPaymentByProposalId( wireFeeAmortization: contractData.wireFeeAmortization ?? 1, wireFeeLimit: contractData.maxWireFee, prevPayCoins: [], + requiredMinimumAge: contractData.minimumAge, }); if (!res) { @@ -1488,6 +1491,7 @@ export async function confirmPay( wireFeeAmortization: contractData.wireFeeAmortization ?? 1, wireFeeLimit: contractData.maxWireFee, prevPayCoins: [], + requiredMinimumAge: contractData.minimumAge, }); logger.trace("coin selection result", res); diff --git a/packages/taler-wallet-core/src/util/coinSelection.ts b/packages/taler-wallet-core/src/util/coinSelection.ts index e19b58774..080a5049d 100644 --- a/packages/taler-wallet-core/src/util/coinSelection.ts +++ b/packages/taler-wallet-core/src/util/coinSelection.ts @@ -24,12 +24,12 @@ * Imports. */ import { + AgeCommitmentProof, + AgeRestriction, AmountJson, Amounts, DenominationPubKey, - DenomKeyType, Logger, - strcmp, } from "@gnu-taler/taler-util"; const logger = new Logger("coinSelection.ts"); @@ -77,7 +77,7 @@ export interface AvailableCoinInfo { /** * Coin's denomination public key. - * + * * FIXME: We should only need the denomPubHash here, if at all. */ denomPub: DenominationPubKey; @@ -94,6 +94,8 @@ export interface AvailableCoinInfo { feeDeposit: AmountJson; exchangeBaseUrl: string; + + ageCommitmentProof?: AgeCommitmentProof; } export type PreviousPayCoins = { @@ -115,6 +117,7 @@ export interface SelectPayCoinRequest { wireFeeLimit: AmountJson; wireFeeAmortization: number; prevPayCoins?: PreviousPayCoins; + requiredMinimumAge?: number; } interface CoinSelectionTally { @@ -306,6 +309,21 @@ export function selectPayCoins( continue; } + if (req.requiredMinimumAge != null) { + const index = AgeRestriction.getAgeGroupIndex( + aci.denomPub.age_mask, + req.requiredMinimumAge, + ); + if (!aci.ageCommitmentProof) { + // No age restriction, can't use for this payment + continue; + } + if (aci.ageCommitmentProof.proof.privateKeys.length < index) { + // Available age proofs to low, can't use for this payment + continue; + } + } + tally = tallyFees( tally, candidates.wireFeesPerExchange, -- cgit v1.2.3