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 --- .../taler-wallet-core/src/util/coinSelection.ts | 24 +++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'packages/taler-wallet-core/src/util/coinSelection.ts') 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