aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/withdraw.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-wallet-core/src/withdraw.ts')
-rw-r--r--packages/taler-wallet-core/src/withdraw.ts69
1 files changed, 54 insertions, 15 deletions
diff --git a/packages/taler-wallet-core/src/withdraw.ts b/packages/taler-wallet-core/src/withdraw.ts
index 6aa3b186a..0434aefc2 100644
--- a/packages/taler-wallet-core/src/withdraw.ts
+++ b/packages/taler-wallet-core/src/withdraw.ts
@@ -44,6 +44,7 @@ import {
Duration,
EddsaPrivateKeyString,
ExchangeBatchWithdrawRequest,
+ ExchangeListItem,
ExchangeUpdateStatus,
ExchangeWireAccount,
ExchangeWithdrawBatchResponse,
@@ -150,6 +151,7 @@ import {
getExchangePaytoUri,
getExchangeWireDetailsInTx,
listExchanges,
+ lookupExchangeByUri,
markExchangeUsed,
} from "./exchanges.js";
import { DbAccess } from "./query.js";
@@ -886,7 +888,7 @@ export async function getBankWithdrawalInfo(
TalerErrorCode.WALLET_BANK_INTEGRATION_PROTOCOL_VERSION_INCOMPATIBLE,
{
bankProtocolVersion: config.version,
- walletProtocolVersion: WALLET_BANK_INTEGRATION_PROTOCOL_VERSION,
+ walletProtocolVersion: bankApi.PROTOCOL_VERSION,
},
"bank integration protocol version not compatible with wallet",
);
@@ -901,15 +903,36 @@ export async function getBankWithdrawalInfo(
}
const { body: status } = resp;
+ const maxAmount =
+ status.max_amount === undefined
+ ? undefined
+ : Amounts.parseOrThrow(status.max_amount);
+
let amount: AmountJson | undefined;
- if (status.amount) {
+ let editableAmount = false;
+ if (status.amount !== undefined) {
amount = Amounts.parseOrThrow(status.amount);
+ } else {
+ amount =
+ status.suggested_amount === undefined
+ ? undefined
+ : Amounts.parseOrThrow(status.suggested_amount);
+ editableAmount = true;
}
+
let wireFee: AmountJson | undefined;
if (status.card_fees) {
wireFee = Amounts.parseOrThrow(status.card_fees);
}
+ let exchange: string | undefined = undefined;
+ let editableExchange = false;
+ if (status.required_exchange !== undefined) {
+ exchange = status.required_exchange;
+ } else {
+ exchange = status.suggested_exchange;
+ editableExchange = true;
+ }
return {
operationId: uriResult.withdrawalOperationId,
apiBaseUrl: uriResult.bankIntegrationApiBaseUrl,
@@ -918,7 +941,10 @@ export async function getBankWithdrawalInfo(
wireFee,
confirmTransferUrl: status.confirm_transfer_url,
senderWire: status.sender_wire,
- suggestedExchange: status.suggested_exchange,
+ exchange,
+ editableAmount,
+ editableExchange,
+ maxAmount,
wireTypes: status.wire_types,
status: status.status,
};
@@ -2328,39 +2354,52 @@ export async function getWithdrawalDetailsForUri(
logger.trace(`getting withdrawal details for URI ${talerWithdrawUri}`);
const info = await getBankWithdrawalInfo(wex.http, talerWithdrawUri);
logger.trace(`got bank info`);
- if (info.suggestedExchange) {
+ if (info.exchange) {
try {
// If the exchange entry doesn't exist yet,
// it'll be created as an ephemeral entry.
- await fetchFreshExchange(wex, info.suggestedExchange);
+ await fetchFreshExchange(wex, info.exchange);
} catch (e) {
// We still continued if it failed, as other exchanges might be available.
// We don't want to fail if the bank-suggested exchange is broken/offline.
logger.trace(
- `querying bank-suggested exchange (${info.suggestedExchange}) failed`,
+ `querying bank-suggested exchange (${info.exchange}) failed`,
);
}
}
const currency = info.currency;
- const listExchangesResp = await listExchanges(wex);
- const possibleExchanges = listExchangesResp.exchanges.filter((x) => {
- return (
- x.currency === currency &&
- (x.exchangeUpdateStatus === ExchangeUpdateStatus.Ready ||
- x.exchangeUpdateStatus === ExchangeUpdateStatus.ReadyUpdate)
- );
- });
+ let possibleExchanges: ExchangeListItem[];
+ if (!info.editableExchange && info.exchange !== undefined) {
+ const ex: ExchangeListItem = await lookupExchangeByUri(wex, {
+ exchangeBaseUrl: info.exchange,
+ });
+ possibleExchanges = [ex];
+ } else {
+ const listExchangesResp = await listExchanges(wex);
+
+ possibleExchanges = listExchangesResp.exchanges.filter((x) => {
+ return (
+ x.currency === currency &&
+ (x.exchangeUpdateStatus === ExchangeUpdateStatus.Ready ||
+ x.exchangeUpdateStatus === ExchangeUpdateStatus.ReadyUpdate)
+ );
+ });
+ }
return {
operationId: info.operationId,
confirmTransferUrl: info.confirmTransferUrl,
status: info.status,
currency,
+ editableAmount: info.editableAmount,
+ editableExchange: info.editableExchange,
+ maxAmount: info.maxAmount ? Amounts.stringify(info.maxAmount) : undefined,
amount: info.amount ? Amounts.stringify(info.amount) : undefined,
- defaultExchangeBaseUrl: info.suggestedExchange,
+ defaultExchangeBaseUrl: info.exchange,
possibleExchanges,
+ wireFee: info.wireFee ? Amounts.stringify(info.wireFee) : undefined,
};
}