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.
This commit is contained in:
Florian Dold 2022-03-28 16:11:58 +02:00
parent e89821a6c7
commit 2ba6692c6a
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
3 changed files with 27 additions and 15 deletions

View File

@ -1133,3 +1133,7 @@ export const codecForImportDbRequest = (): Codec<ImportDb> =>
buildCodecForObject<ImportDb>()
.property("dump", codecForAny())
.build("ImportDbRequest");

View File

@ -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;
@ -118,16 +121,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;
}

View File

@ -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}