wallet-core: make coin selection aware of age restriction
This commit is contained in:
parent
5e7be58658
commit
9996c27488
@ -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);
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user