commit e7beff1a329b8976c1c38b93054e1336d4e624fd
parent 76763e47a084e43101635a8b3cca53cf2523fcdb
Author: Iván Ávalos <avalos@disroot.org>
Date: Wed, 11 Dec 2024 14:30:51 +0100
wallet-core: add getDepositWireTypes request
Diffstat:
3 files changed, 103 insertions(+), 0 deletions(-)
diff --git a/packages/taler-util/src/types-taler-wallet.ts b/packages/taler-util/src/types-taler-wallet.ts
@@ -3564,6 +3564,29 @@ export const codecForHintNetworkAvailabilityRequest =
.property("isNetworkAvailable", codecForBoolean())
.build("HintNetworkAvailabilityRequest");
+export interface GetDepositWireTypesRequest {
+ currency?: string;
+ /**
+ * Optional scope info to further restrict the result.
+ * Currency must match the currency field.
+ */
+ scopeInfo?: ScopeInfo;
+}
+
+export const codecForGetDepositWireTypesRequest =
+ (): Codec<GetDepositWireTypesRequest> =>
+ buildCodecForObject<GetDepositWireTypesRequest>()
+ .property("currency", codecOptional(codecForString()))
+ .property("scopeInfo", codecOptional(codecForScopeInfo()))
+ .build("GetDepositWireTypesRequest");
+
+export interface GetDepositWireTypesResponse {
+ /**
+ * Details for each wire type.
+ */
+ wireTypeDetails: WireTypeDetails[];
+}
+
export interface GetDepositWireTypesForCurrencyRequest {
currency: string;
/**
diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts b/packages/taler-wallet-core/src/wallet-api-types.ts
@@ -83,6 +83,8 @@ import {
GetCurrencySpecificationResponse,
GetDepositWireTypesForCurrencyRequest,
GetDepositWireTypesForCurrencyResponse,
+ GetDepositWireTypesRequest,
+ GetDepositWireTypesResponse,
GetExchangeEntryByUrlRequest,
GetExchangeEntryByUrlResponse,
GetExchangeResourcesRequest,
@@ -278,6 +280,7 @@ export enum WalletApiOperation {
Shutdown = "shutdown",
HintNetworkAvailability = "hintNetworkAvailability",
CanonicalizeBaseUrl = "canonicalizeBaseUrl",
+ GetDepositWireTypes = "getDepositWireTypes",
GetDepositWireTypesForCurrency = "getDepositWireTypesForCurrency",
GetQrCodesForPayto = "getQrCodesForPayto",
GetBankingChoicesForPayto = "getBankingChoicesForPayto",
@@ -762,9 +765,17 @@ export type GetExchangeTosOp = {
response: GetExchangeTosResult;
};
+export type GetDepositWireTypesOp = {
+ op: WalletApiOperation.GetDepositWireTypes;
+ request: GetDepositWireTypesRequest;
+ response: GetDepositWireTypesResponse;
+};
+
/**
* Get wire types that can be used for a deposit operation
* with the provided currency.
+ *
+ * @deprecated Use getDepositWireTypes instead
*/
export type GetDepositWireTypesForCurrencyOp = {
op: WalletApiOperation.GetDepositWireTypesForCurrency;
@@ -1440,6 +1451,7 @@ export type WalletOperations = {
[WalletApiOperation.TestingGetReserveHistory]: TestingGetReserveHistoryOp;
[WalletApiOperation.TestingResetAllRetries]: TestingResetAllRetriesOp;
[WalletApiOperation.HintNetworkAvailability]: HintNetworkAvailabilityOp;
+ [WalletApiOperation.GetDepositWireTypes]: GetDepositWireTypesOp;
[WalletApiOperation.GetDepositWireTypesForCurrency]: GetDepositWireTypesForCurrencyOp;
[WalletApiOperation.GetQrCodesForPayto]: GetQrCodesForPaytoOp;
[WalletApiOperation.GetBankingChoicesForPayto]: GetBankingChoicesForPaytoOp;
diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts
@@ -72,6 +72,8 @@ import {
GetCurrencySpecificationResponse,
GetDepositWireTypesForCurrencyRequest,
GetDepositWireTypesForCurrencyResponse,
+ GetDepositWireTypesRequest,
+ GetDepositWireTypesResponse,
GetExchangeTosRequest,
GetExchangeTosResult,
GetQrCodesForPaytoRequest,
@@ -163,6 +165,7 @@ import {
codecForGetContractTermsDetails,
codecForGetCurrencyInfoRequest,
codecForGetDepositWireTypesForCurrencyRequest,
+ codecForGetDepositWireTypesRequest,
codecForGetExchangeEntryByUrlRequest,
codecForGetExchangeResourcesRequest,
codecForGetExchangeTosRequest,
@@ -1259,6 +1262,67 @@ async function handleHintNetworkAvailability(
return {};
}
+async function handleGetDepositWireTypes(
+ wex: WalletExecutionContext,
+ req: GetDepositWireTypesRequest,
+): Promise<GetDepositWireTypesResponse> {
+ const wtSet: Set<string> = new Set();
+ const wireTypeDetails: WireTypeDetails[] = [];
+ const talerBankHostnames: string[] = [];
+ await wex.db.runReadOnlyTx(
+ { storeNames: ["exchanges", "exchangeDetails"] },
+ async (tx) => {
+ const exchanges = await tx.exchanges.getAll();
+ for (const exchange of exchanges) {
+ const det = await getExchangeWireDetailsInTx(tx, exchange.baseUrl);
+ if (!det) {
+ continue;
+ }
+ if (req.currency !== undefined
+ && det.currency !== req.currency) {
+ continue;
+ }
+ for (const acc of det.wireInfo.accounts) {
+ let usable = true;
+ for (const dr of acc.debit_restrictions) {
+ if (dr.type === "deny") {
+ usable = false;
+ break;
+ }
+ }
+ if (!usable) {
+ continue;
+ }
+ const parsedPayto = parsePaytoUri(acc.payto_uri);
+ if (!parsedPayto) {
+ continue;
+ }
+ if (
+ parsedPayto.isKnown &&
+ parsedPayto.targetType === "x-taler-bank"
+ ) {
+ if (!talerBankHostnames.includes(parsedPayto.host)) {
+ talerBankHostnames.push(parsedPayto.host);
+ }
+ }
+ if (!wtSet.has(parsedPayto.targetType)) {
+ wtSet.add(parsedPayto.targetType);
+ wireTypeDetails.push({
+ paymentTargetType: parsedPayto.targetType,
+ // Will possibly extended later by other exchanges
+ // with the same wire type.
+ talerBankHostnames,
+ });
+ }
+ }
+ }
+ },
+ );
+ return {
+ wireTypeDetails,
+ };
+}
+
async function handleGetDepositWireTypesForCurrency(
wex: WalletExecutionContext,
req: GetDepositWireTypesForCurrencyRequest,
@@ -2026,6 +2090,10 @@ const handlers: { [T in WalletApiOperation]: HandlerWithValidator<T> } = {
return dbDump;
},
},
+ [WalletApiOperation.GetDepositWireTypes]: {
+ codec: codecForGetDepositWireTypesRequest(),
+ handler: handleGetDepositWireTypes,
+ },
[WalletApiOperation.GetDepositWireTypesForCurrency]: {
codec: codecForGetDepositWireTypesForCurrencyRequest(),
handler: handleGetDepositWireTypesForCurrency,