diff options
Diffstat (limited to 'packages/taler-wallet-core/src/denomSelection.ts')
-rw-r--r-- | packages/taler-wallet-core/src/denomSelection.ts | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/packages/taler-wallet-core/src/denomSelection.ts b/packages/taler-wallet-core/src/denomSelection.ts index dd5ec60d8..ecc1fa881 100644 --- a/packages/taler-wallet-core/src/denomSelection.ts +++ b/packages/taler-wallet-core/src/denomSelection.ts @@ -24,13 +24,14 @@ * Imports. */ import { + AbsoluteTime, AmountJson, Amounts, DenomSelectionState, ForcedDenomSel, Logger, } from "@gnu-taler/taler-util"; -import { DenominationRecord } from "./db.js"; +import { DenominationRecord, timestampAbsoluteFromDb } from "./db.js"; import { isWithdrawableDenom } from "./denominations.js"; const logger = new Logger("denomSelection.ts"); @@ -54,6 +55,8 @@ export function selectWithdrawalDenominations( let totalCoinValue = Amounts.zeroOfCurrency(amountAvailable.currency); let totalWithdrawCost = Amounts.zeroOfCurrency(amountAvailable.currency); + let earliestDepositExpiration: AbsoluteTime | undefined; + let hasDenomWithAgeRestriction = false; denoms = denoms.filter((d) => isWithdrawableDenom(d, denomselAllowLate)); denoms.sort((d1, d2) => Amounts.cmp(d2.value, d1.value)); @@ -82,6 +85,17 @@ export function selectWithdrawalDenominations( count, denomPubHash: d.denomPubHash, }); + hasDenomWithAgeRestriction = + hasDenomWithAgeRestriction || d.denomPub.age_mask > 0; + const expireDeposit = timestampAbsoluteFromDb(d.stampExpireDeposit); + if (!earliestDepositExpiration) { + earliestDepositExpiration = expireDeposit; + } else { + earliestDepositExpiration = AbsoluteTime.min( + expireDeposit, + earliestDepositExpiration, + ); + } } if (logger.shouldLogTrace()) { @@ -103,10 +117,16 @@ export function selectWithdrawalDenominations( logger.trace("(end of denom selection)"); } + earliestDepositExpiration ??= AbsoluteTime.never(); + return { selectedDenoms, totalCoinValue: Amounts.stringify(totalCoinValue), totalWithdrawCost: Amounts.stringify(totalWithdrawCost), + earliestDepositExpiration: AbsoluteTime.toProtocolTimestamp( + earliestDepositExpiration, + ), + hasDenomWithAgeRestriction, }; } @@ -123,6 +143,8 @@ export function selectForcedWithdrawalDenominations( let totalCoinValue = Amounts.zeroOfCurrency(amountAvailable.currency); let totalWithdrawCost = Amounts.zeroOfCurrency(amountAvailable.currency); + let earliestDepositExpiration: AbsoluteTime | undefined; + let hasDenomWithAgeRestriction = false; denoms = denoms.filter((d) => isWithdrawableDenom(d, denomselAllowLate)); denoms.sort((d1, d2) => Amounts.cmp(d2.value, d1.value)); @@ -150,11 +172,28 @@ export function selectForcedWithdrawalDenominations( count, denomPubHash: denom.denomPubHash, }); + hasDenomWithAgeRestriction = + hasDenomWithAgeRestriction || denom.denomPub.age_mask > 0; + const expireDeposit = timestampAbsoluteFromDb(denom.stampExpireDeposit); + if (!earliestDepositExpiration) { + earliestDepositExpiration = expireDeposit; + } else { + earliestDepositExpiration = AbsoluteTime.min( + expireDeposit, + earliestDepositExpiration, + ); + } } + earliestDepositExpiration ??= AbsoluteTime.never(); + return { selectedDenoms, totalCoinValue: Amounts.stringify(totalCoinValue), totalWithdrawCost: Amounts.stringify(totalWithdrawCost), + earliestDepositExpiration: AbsoluteTime.toProtocolTimestamp( + earliestDepositExpiration, + ), + hasDenomWithAgeRestriction, }; } |