taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 2ba6692c6ad97285e852fb0b74a650e067817003
parent e89821a6c7f5b740ab5781354149dd2cc2b4047c
Author: Florian Dold <florian@dold.me>
Date:   Mon, 28 Mar 2022 16:11:58 +0200

fix fee discrepancy

The withdrawal call-to-action and withdrawal transaction details dialog
showed different fees, as the "overhead" for unwithdrawable amounts in a
reserve was not included in the withdrawal CTA.

The withdrawal CTA now shows the same fees as the transaction details.

Diffstat:
Mpackages/taler-util/src/walletTypes.ts | 5+++++
Mpackages/taler-wallet-core/src/operations/withdraw.ts | 31+++++++++++++++++--------------
Mpackages/taler-wallet-webextension/src/cta/Withdraw.tsx | 7++++++-
3 files changed, 28 insertions(+), 15 deletions(-)

diff --git a/packages/taler-util/src/walletTypes.ts b/packages/taler-util/src/walletTypes.ts @@ -1133,3 +1133,7 @@ export const codecForImportDbRequest = (): Codec<ImportDb> => buildCodecForObject<ImportDb>() .property("dump", codecForAny()) .build("ImportDbRequest"); + + + + +\ No newline at end of file diff --git a/packages/taler-wallet-core/src/operations/withdraw.ts b/packages/taler-wallet-core/src/operations/withdraw.ts @@ -43,6 +43,7 @@ import { Duration, TalerProtocolTimestamp, TransactionType, + AmountString, } from "@gnu-taler/taler-util"; import { CoinRecord, @@ -103,6 +104,8 @@ interface DenominationSelectionInfo { export interface ExchangeWithdrawDetails { /** * Exchange that the reserve will be created at. + * + * FIXME: Should be its own record. */ exchangeInfo: ExchangeRecord; @@ -119,16 +122,6 @@ export interface ExchangeWithdrawDetails { selectedDenoms: DenominationSelectionInfo; /** - * Fees for withdraw. - */ - withdrawFee: AmountJson; - - /** - * Remaining balance that is too small to be withdrawn. - */ - overhead: AmountJson; - - /** * Does the wallet know about an auditor for * the exchange that the reserve. */ @@ -177,6 +170,13 @@ export interface ExchangeWithdrawDetails { * Libtool-style version string for the wallet. */ walletVersion: string; + + withdrawalAmountRaw: AmountString; + + /** + * Amount that will actually be added to the wallet's balance. + */ + withdrawalAmountEffective: AmountString; } /** @@ -976,13 +976,16 @@ async function processWithdrawGroupImpl( export async function getExchangeWithdrawalInfo( ws: InternalWalletState, exchangeBaseUrl: string, - amount: AmountJson, + instructedAmount: AmountJson, ): Promise<ExchangeWithdrawDetails> { const { exchange, exchangeDetails } = await ws.exchangeOps.updateExchangeFromUrl(ws, exchangeBaseUrl); await updateWithdrawalDenoms(ws, exchangeBaseUrl); const denoms = await getCandidateWithdrawalDenoms(ws, exchangeBaseUrl); - const selectedDenoms = selectWithdrawalDenominations(amount, denoms); + const selectedDenoms = selectWithdrawalDenominations( + instructedAmount, + denoms, + ); const exchangeWireAccounts: string[] = []; for (const account of exchangeDetails.wireInfo.accounts) { exchangeWireAccounts.push(account.payto_uri); @@ -1061,14 +1064,14 @@ export async function getExchangeWithdrawalInfo( isAudited, isTrusted, numOfferedDenoms: possibleDenoms.length, - overhead: Amounts.sub(amount, selectedDenoms.totalWithdrawCost).amount, selectedDenoms, // FIXME: delete this field / replace by something we can display to the user trustedAuditorPubs: [], versionMatch, walletVersion: WALLET_EXCHANGE_PROTOCOL_VERSION, - withdrawFee, termsOfServiceAccepted: tosAccepted, + withdrawalAmountEffective: Amounts.stringify(selectedDenoms.totalCoinValue), + withdrawalAmountRaw: Amounts.stringify(instructedAmount), }; return ret; } diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw.tsx b/packages/taler-wallet-webextension/src/cta/Withdraw.tsx @@ -318,12 +318,17 @@ export function WithdrawPageWithParsedURI({ } }; + const withdrawalFee = Amounts.sub( + Amounts.parseOrThrow(details.info.withdrawalAmountRaw), + Amounts.parseOrThrow(details.info.withdrawalAmountEffective), + ).amount; + return ( <View onWithdraw={onWithdraw} amount={withdrawAmount} exchangeBaseUrl={exchange} - withdrawalFee={details.info.withdrawFee} //FIXME + withdrawalFee={withdrawalFee} terms={detailsHook.response.tos} onSwitchExchange={setCustomExchange} knownExchanges={knownExchanges}