commit 0a34f2b7afe2c4162223e09a0061e57388d94e52
parent c4827255fc86253a8924dea560926fcac01ab0fe
Author: Iván Ávalos <avalos@disroot.org>
Date: Thu, 24 Apr 2025 18:16:09 +0200
wallet-core: add raw and effective amounts to getChoicesForPayment
Diffstat:
2 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/packages/taler-util/src/types-taler-wallet.ts b/packages/taler-util/src/types-taler-wallet.ts
@@ -2348,11 +2348,14 @@ export type ChoiceSelectionDetail =
export interface ChoiceSelectionDetailPaymentPossible {
status: ChoiceSelectionDetailType.PaymentPossible;
+ amountRaw: AmountString;
+ amountEffective: AmountString;
tokenDetails?: PaymentTokenAvailabilityDetails;
}
export interface ChoiceSelectionDetailInsufficientBalance {
status: ChoiceSelectionDetailType.InsufficientBalance;
+ amountRaw: AmountString;
balanceDetails?: PaymentInsufficientBalanceDetails;
tokenDetails?: PaymentTokenAvailabilityDetails;
}
diff --git a/packages/taler-wallet-core/src/pay-merchant.ts b/packages/taler-wallet-core/src/pay-merchant.ts
@@ -2565,6 +2565,9 @@ export async function getChoicesForPayment(
assertUnreachable(contractTerms);
}
+ let amountEffective: AmountJson | undefined = undefined;
+ const currency = Amounts.currencyOf(amount);
+
const selectCoinsResult = await selectPayCoinsInTx(wex, tx, {
restrictExchanges: {
auditors: [],
@@ -2584,21 +2587,38 @@ export async function getChoicesForPayment(
logger.trace("coin selection result", selectCoinsResult);
switch (selectCoinsResult.type) {
+ case "success": {
+ amountEffective = await getTotalPaymentCostInTx(wex,
+ tx, currency, selectCoinsResult.coinSel.coins);
+ break;
+ }
+ case "prospective": {
+ amountEffective = await getTotalPaymentCostInTx(wex,
+ tx, currency, selectCoinsResult.result.prospectiveCoins);
+ break;
+ }
case "failure": {
+ logger.info("choice not payable, insufficient coins");
balanceDetails = selectCoinsResult.insufficientBalanceDetails;
+ break;
}
+ default:
+ assertUnreachable(selectCoinsResult);
}
let choice: ChoiceSelectionDetail;
if (tokenSelection.type === "failure" || selectCoinsResult.type === "failure") {
choice = {
status: ChoiceSelectionDetailType.InsufficientBalance,
+ amountRaw: amount,
balanceDetails: balanceDetails,
tokenDetails: tokenSelection.details,
};
} else {
choice = {
status: ChoiceSelectionDetailType.PaymentPossible,
+ amountRaw: amount,
+ amountEffective: Amounts.stringify(amountEffective!),
tokenDetails: tokenSelection.details,
};
}