commit 5d698c7bb4f38131c76f751f643093bbc4de75d6
parent af22332b5edbc1de3b4bd123c67c16adbd37217b
Author: Florian Dold <florian@dold.me>
Date: Thu, 4 Dec 2025 16:53:39 +0100
wallet-core: scaffolding for DD75/BBAN support
Diffstat:
3 files changed, 92 insertions(+), 20 deletions(-)
diff --git a/packages/taler-util/src/types-taler-wallet.ts b/packages/taler-util/src/types-taler-wallet.ts
@@ -4416,6 +4416,35 @@ export const codecForGetBankingChoicesForPaytoRequest = () =>
.property("paytoUri", codecForString())
.build("GetBankingChoicesForPaytoRequest");
+export interface ConvertIbanAccountFieldToPaytoRequest {
+ value: string;
+ currency: string;
+}
+
+export const codecForConvertIbanAccountFieldToPaytoRequest = () =>
+ buildCodecForObject<ConvertIbanAccountFieldToPaytoRequest>()
+ .property("value", codecForString())
+ .property("currency", codecForString())
+ .build("ConvertIbanAccountFieldToPaytoRequest");
+
+export interface ConvertIbanPaytoToAccountFieldRequest {
+ paytoUri: string;
+}
+
+export const codecForConvertIbanPaytoToAccountFieldRequest = () =>
+ buildCodecForObject<ConvertIbanPaytoToAccountFieldRequest>()
+ .property("paytoUri", codecForString())
+ .build("ConvertIbanPaytoToAccountFieldRequest");
+
+export interface ConvertIbanPaytoToAccountFieldResponse {
+ type: "iban" | "bban";
+ value: string;
+}
+
+export type ConvertIbanAccountFieldToPaytoResponse =
+ | { ok: true; type: "iban" | "bban"; paytoUri: string }
+ | { ok: false };
+
export interface BankingChoiceSpec {
label: string;
// FIXME: In the future, we might also have some way to return intents here?
diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts b/packages/taler-wallet-core/src/wallet-api-types.ts
@@ -34,10 +34,12 @@ import {
AcceptWithdrawalResponse,
AddBankAccountRequest,
AddBankAccountResponse,
+ AddContactRequest,
AddExchangeRequest,
AddExchangeResponse,
AddGlobalCurrencyAuditorRequest,
AddGlobalCurrencyExchangeRequest,
+ AddMailboxMessageRequest,
AmountResponse,
ApplyDevExperimentRequest,
BackupRecovery,
@@ -61,13 +63,21 @@ import {
ConfirmPeerPullDebitRequest,
ConfirmPeerPushCreditRequest,
ConfirmWithdrawalRequest,
+ ContactListResponse,
ConvertAmountRequest,
+ ConvertIbanAccountFieldToPaytoRequest,
+ ConvertIbanAccountFieldToPaytoResponse,
+ ConvertIbanPaytoToAccountFieldRequest,
+ ConvertIbanPaytoToAccountFieldResponse,
CreateDepositGroupRequest,
CreateDepositGroupResponse,
CreateStoredBackupResponse,
+ DeleteContactRequest,
DeleteDiscountRequest,
DeleteExchangeRequest,
+ DeleteMailboxMessageRequest,
DeleteStoredBackupRequest,
+ DeleteSubscriptionRequest,
DeleteTransactionRequest,
EmptyObject,
ExchangeDetailedResponse,
@@ -94,10 +104,6 @@ import {
GetDonauResponse,
GetDonauStatementsRequest,
GetDonauStatementsResponse,
- ContactListResponse,
- AddMailboxMessageRequest,
- DeleteMailboxMessageRequest,
- MailboxMessagesResponse,
GetExchangeDetailedInfoRequest,
GetExchangeEntryByUrlRequest,
GetExchangeEntryByUrlResponse,
@@ -134,6 +140,11 @@ import {
ListExchangesRequest,
ListGlobalCurrencyAuditorsResponse,
ListGlobalCurrencyExchangesResponse,
+ ListSubscriptionsRequest,
+ ListSubscriptionsResponse,
+ MailboxConfiguration,
+ MailboxMessageRecord,
+ MailboxMessagesResponse,
PrepareBankIntegratedWithdrawalRequest,
PrepareBankIntegratedWithdrawalResponse,
PreparePayRequest,
@@ -152,6 +163,7 @@ import {
RemoveGlobalCurrencyExchangeRequest,
RetryTransactionRequest,
RunFixupRequest,
+ SendTalerUriMailboxMessageRequest,
SetCoinSuspendedRequest,
SetDonauRequest,
SetWalletDeviceIdRequest,
@@ -187,15 +199,6 @@ import {
WithdrawTestBalanceRequest,
WithdrawUriInfoResponse,
WithdrawalDetailsForAmount,
- AddContactRequest,
- DeleteContactRequest,
- EddsaPrivateKey,
- MailboxConfiguration,
- SendTalerUriMailboxMessageRequest,
- MailboxMessageRecord,
- ListSubscriptionsRequest,
- ListSubscriptionsResponse,
- DeleteSubscriptionRequest,
} from "@gnu-taler/taler-util";
import {
AddBackupProviderRequest,
@@ -314,6 +317,8 @@ export enum WalletApiOperation {
GetQrCodesForPayto = "getQrCodesForPayto",
StartExchangeWalletKyc = "startExchangeWalletKyc",
GetBankingChoicesForPayto = "getBankingChoicesForPayto",
+ ConvertIbanAccountFieldToPayto = "convertIbanAccountFieldToPayto",
+ ConvertIbanPaytoToAccountField = "convertIbanPaytoToAccountField",
// Tokens and token families
ListDiscounts = "listDiscounts",
@@ -500,7 +505,6 @@ export type RefreshMailboxOp = {
response: MailboxMessageRecord[];
};
-
/**
* Initialize messages mailbox Op.
*/
@@ -519,7 +523,6 @@ export type GetMailboxOp = {
response: MailboxConfiguration | undefined;
};
-
/**
* Get Messages Op.
*/
@@ -556,8 +559,6 @@ export type SendTalerUriMailboxMessageOp = {
response: EmptyObject;
};
-
-
// group: Basic Wallet Information
/**
@@ -1323,7 +1324,7 @@ export type ConfirmPeerPullDebitOp = {
response: AcceptPeerPullPaymentResponse;
};
-// group: Data Validation
+// group: Data Validation and Conversion
export type ValidateIbanOp = {
op: WalletApiOperation.ValidateIban;
@@ -1343,6 +1344,18 @@ export type GetQrCodesForPaytoOp = {
response: GetQrCodesForPaytoResponse;
};
+export type ConvertIbanAccountFieldToPaytoOp = {
+ op: WalletApiOperation.ConvertIbanAccountFieldToPayto;
+ request: ConvertIbanAccountFieldToPaytoRequest;
+ response: ConvertIbanAccountFieldToPaytoResponse;
+};
+
+export type ConvertIbanPaytoToAccountFieldOp = {
+ op: WalletApiOperation.ConvertIbanPaytoToAccountField;
+ request: ConvertIbanPaytoToAccountFieldRequest;
+ response: ConvertIbanPaytoToAccountFieldResponse;
+};
+
export type GetBankingChoicesForPaytoOp = {
op: WalletApiOperation.GetBankingChoicesForPayto;
request: GetBankingChoicesForPaytoRequest;
@@ -1761,6 +1774,8 @@ export type WalletOperations = {
[WalletApiOperation.InitializeMailbox]: InitializeMailboxOp;
[WalletApiOperation.RefreshMailbox]: RefreshMailboxOp;
[WalletApiOperation.SendTalerUriMailboxMessage]: SendTalerUriMailboxMessageOp;
+ [WalletApiOperation.ConvertIbanAccountFieldToPayto]: ConvertIbanAccountFieldToPaytoOp;
+ [WalletApiOperation.ConvertIbanPaytoToAccountField]: ConvertIbanPaytoToAccountFieldOp;
};
export type WalletCoreRequestType<
diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts
@@ -56,6 +56,10 @@ import {
CompleteBaseUrlResult,
ConfirmPayRequest,
ConfirmPayResult,
+ ConvertIbanAccountFieldToPaytoRequest,
+ ConvertIbanAccountFieldToPaytoResponse,
+ ConvertIbanPaytoToAccountFieldRequest,
+ ConvertIbanPaytoToAccountFieldResponse,
CoreApiResponse,
CreateStoredBackupResponse,
DeleteDiscountRequest,
@@ -171,6 +175,8 @@ import {
codecForConfirmPeerPushPaymentRequest,
codecForConfirmWithdrawalRequestRequest,
codecForConvertAmountRequest,
+ codecForConvertIbanAccountFieldToPaytoRequest,
+ codecForConvertIbanPaytoToAccountFieldRequest,
codecForCreateDepositGroupRequest,
codecForDeleteContactRequest,
codecForDeleteDiscountRequest,
@@ -262,7 +268,7 @@ import {
setDangerousTimetravel,
setGlobalLogLevelFromString,
stringifyScopeInfo,
- validateIban,
+ validateIban
} from "@gnu-taler/taler-util";
import {
readSuccessResponseJsonOrThrow,
@@ -442,7 +448,7 @@ import {
WalletApiOperation,
WalletCoreApiClient,
WalletCoreRequestType,
- WalletCoreResponseType,
+ WalletCoreResponseType
} from "./wallet-api-types.js";
import {
acceptBankIntegratedWithdrawal,
@@ -1930,6 +1936,20 @@ async function handleGetVersion(
return result;
}
+export async function handleConvertIbanAccountFieldToPayto(
+ wex: WalletExecutionContext,
+ req: ConvertIbanAccountFieldToPaytoRequest,
+): Promise<ConvertIbanAccountFieldToPaytoResponse> {
+ throw Error("not implemented");
+}
+
+export async function handleConvertIbanPaytoToAccountField(
+ wex: WalletExecutionContext,
+ req: ConvertIbanPaytoToAccountFieldRequest,
+): Promise<ConvertIbanPaytoToAccountFieldResponse> {
+ throw Error("not implemented");
+}
+
interface HandlerWithValidator<Tag extends WalletApiOperation> {
codec: Codec<WalletCoreRequestType<Tag>>;
handler: (
@@ -1939,6 +1959,14 @@ interface HandlerWithValidator<Tag extends WalletApiOperation> {
}
const handlers: { [T in WalletApiOperation]: HandlerWithValidator<T> } = {
+ [WalletApiOperation.ConvertIbanAccountFieldToPayto]: {
+ codec: codecForConvertIbanAccountFieldToPaytoRequest(),
+ handler: handleConvertIbanAccountFieldToPayto
+ },
+ [WalletApiOperation.ConvertIbanPaytoToAccountField]: {
+ codec: codecForConvertIbanPaytoToAccountFieldRequest(),
+ handler: handleConvertIbanPaytoToAccountField,
+ },
[WalletApiOperation.TestingWaitExchangeState]: {
codec: codecForAny(),
handler: handleTestingWaitExchangeState,