wallet-core: make coin selection aware of age restriction

This commit is contained in:
Florian Dold 2022-04-29 21:05:17 +02:00
parent 5e7be58658
commit 9996c27488
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
2 changed files with 25 additions and 3 deletions

View File

@ -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);

View File

@ -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");
@ -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,