commit 4578a18548970ca42a36a9f665277aeb5ee72b3e
parent 1e9ac6ec1749335f6f5bad9063e8aa90a36d7c36
Author: Florian Dold <florian@dold.me>
Date: Wed, 19 Nov 2025 18:45:54 +0100
wallet-core: support for preferredEntryType in deposits
Diffstat:
2 files changed, 94 insertions(+), 72 deletions(-)
diff --git a/packages/taler-util/src/types-taler-wallet.ts b/packages/taler-util/src/types-taler-wallet.ts
@@ -50,9 +50,9 @@ import {
import { canonicalizeBaseUrl } from "./helpers.js";
import { PaytoString, codecForPaytoString } from "./payto.js";
import { QrCodeSpec } from "./qr.js";
-import { AgeCommitmentProof, HpkeSecretKey } from "./taler-crypto.js";
+import { AgeCommitmentProof } from "./taler-crypto.js";
import { TalerErrorCode } from "./taler-error-codes.js";
-import { TalerUri, TalerUriString, TemplateParams } from "./taleruri.js";
+import { TalerUri, TemplateParams } from "./taleruri.js";
import {
AbsoluteTime,
DurationUnitSpec,
@@ -71,8 +71,8 @@ import {
EddsaPrivateKeyString,
EddsaPublicKeyString,
EddsaSignatureString,
- HashCodeString,
HashCode,
+ HashCodeString,
Timestamp,
codecForEddsaPrivateKey,
} from "./types-taler-common.js";
@@ -1380,14 +1380,13 @@ export interface MailboxConfiguration {
}
export const codecForMailboxConfiguration = (): Codec<MailboxConfiguration> =>
-buildCodecForObject<MailboxConfiguration>()
+ buildCodecForObject<MailboxConfiguration>()
.property("mailboxBaseUrl", codecForString())
.property("privateEncryptionKey", codecForString())
.property("privateKey", codecForEddsaPrivateKey())
.property("expiration", codecForTimestamp)
.build("MailboxConfiguration");
-
export interface SendTalerUriMailboxMessageRequest {
contact: ContactEntry;
talerUri: string;
@@ -1414,7 +1413,7 @@ export const codecForContactEntry = (): Codec<ContactEntry> =>
.property("source", codecForString())
.build("ContactListItem");
- export const codecForAddContactRequest = (): Codec<AddContactRequest> =>
+export const codecForAddContactRequest = (): Codec<AddContactRequest> =>
buildCodecForObject<AddContactRequest>()
.property("contact", codecForContactEntry())
.build("AddContactRequest");
@@ -1424,23 +1423,24 @@ export const codecForDeleteContactRequest = (): Codec<DeleteContactRequest> =>
.property("contact", codecForContactEntry())
.build("DeleteContactRequest");
-export const codecForAddMailboxMessageRequest = (): Codec<AddMailboxMessageRequest> =>
- buildCodecForObject<AddMailboxMessageRequest>()
- .property("message", codecForAny())
- .build("AddContactRequest");
-
-export const codecForDeleteMailboxMessageRequest = (): Codec<DeleteMailboxMessageRequest> =>
- buildCodecForObject<DeleteMailboxMessageRequest>()
- .property("message", codecForAny())
- .build("DeleteContactRequest");
-
-export const codecForSendTalerUriMailboxMessageRequest = (): Codec<SendTalerUriMailboxMessageRequest> =>
- buildCodecForObject<SendTalerUriMailboxMessageRequest>()
- .property("contact", codecForContactEntry())
- .property("talerUri", codecForString())
- .build("SendTalerUriMailboxMessageRequest");
-
-
+export const codecForAddMailboxMessageRequest =
+ (): Codec<AddMailboxMessageRequest> =>
+ buildCodecForObject<AddMailboxMessageRequest>()
+ .property("message", codecForAny())
+ .build("AddContactRequest");
+
+export const codecForDeleteMailboxMessageRequest =
+ (): Codec<DeleteMailboxMessageRequest> =>
+ buildCodecForObject<DeleteMailboxMessageRequest>()
+ .property("message", codecForAny())
+ .build("DeleteContactRequest");
+
+export const codecForSendTalerUriMailboxMessageRequest =
+ (): Codec<SendTalerUriMailboxMessageRequest> =>
+ buildCodecForObject<SendTalerUriMailboxMessageRequest>()
+ .property("contact", codecForContactEntry())
+ .property("talerUri", codecForString())
+ .build("SendTalerUriMailboxMessageRequest");
export interface WalletCoreVersion {
implementationSemver: string;
@@ -1779,35 +1779,34 @@ export interface ContactEntry {
/**
* Contact alias
*/
- alias: string,
+ alias: string;
/**
* Alias type
*/
- aliasType: string,
+ aliasType: string;
/**
* mailbox URI
*/
- mailboxBaseUri: string,
+ mailboxBaseUri: string;
/**
* mailbox identity
*/
- mailboxAddress: HashCodeString,
+ mailboxAddress: HashCodeString;
/**
* The source of this contact
* may be a URI
*/
- source: string,
+ source: string;
}
/**
* Record metadata for mailbox messages
*/
export interface MailboxMessageRecord {
-
// Origin mailbox
originMailboxBaseUrl: string;
@@ -1816,10 +1815,8 @@ export interface MailboxMessageRecord {
// Taler URI in message
talerUri: string;
-
}
-
const codecForAuditorDenomSig = (): Codec<AuditorDenomSig> =>
buildCodecForObject<AuditorDenomSig>()
.property("denom_pub_h", codecForString())
@@ -2758,7 +2755,10 @@ export interface ListSubscriptionsResponse {
subscriptions: SubscriptionListDetail[];
}
-export type SubscriptionListDetail = Omit<DiscountListDetail, 'tokensAvailable'>;
+export type SubscriptionListDetail = Omit<
+ DiscountListDetail,
+ "tokensAvailable"
+>;
export interface DeleteSubscriptionRequest {
/**
@@ -2778,16 +2778,18 @@ export const codecForDeleteDiscountRequest = (): Codec<DeleteDiscountRequest> =>
.property("tokenFamilyHash", codecForString())
.build("DeleteDiscount");
-export const codecForListSubscriptionsRequest = (): Codec<ListSubscriptionsRequest> =>
- buildCodecForObject<ListSubscriptionsRequest>()
- .property("tokenIssuePubHash", codecOptional(codecForString()))
- .property("merchantBaseUrl", codecOptional(codecForCanonBaseUrl()))
- .build("ListSubscriptions");
+export const codecForListSubscriptionsRequest =
+ (): Codec<ListSubscriptionsRequest> =>
+ buildCodecForObject<ListSubscriptionsRequest>()
+ .property("tokenIssuePubHash", codecOptional(codecForString()))
+ .property("merchantBaseUrl", codecOptional(codecForCanonBaseUrl()))
+ .build("ListSubscriptions");
-export const codecForDeleteSubscriptionRequest = (): Codec<DeleteSubscriptionRequest> =>
- buildCodecForObject<DeleteSubscriptionRequest>()
- .property("tokenFamilyHash", codecForString())
- .build("DeleteSubscription");
+export const codecForDeleteSubscriptionRequest =
+ (): Codec<DeleteSubscriptionRequest> =>
+ buildCodecForObject<DeleteSubscriptionRequest>()
+ .property("tokenFamilyHash", codecForString())
+ .build("DeleteSubscription");
export interface CoreApiRequestEnvelope {
id: string;
@@ -4345,6 +4347,17 @@ export interface WireTypeDetails {
paymentTargetType: string;
/**
+ * Only applicable for payment target type IBAN.
+ *
+ * Specifies whether the user wants to preferably
+ * enter their bank account details as an IBAN
+ * or as a BBAN.
+ *
+ * Mandatory for paymentTargetType="iban".
+ */
+ preferredEntryType?: "iban" | "bban";
+
+ /**
* Allowed hostnames for the deposit payto URI.
* Only applicable to x-taler-bank.
*/
@@ -4549,7 +4562,8 @@ export interface GetDonauResponse {
| undefined;
}
-export const codecForGetDonauStatementsRequest = (): Codec<GetDonauStatementsRequest> =>
- buildCodecForObject<GetDonauStatementsRequest>()
- .property("donauBaseUrl", codecOptional(codecForString()))
- .build("GetDonauStatementsRequest");
+export const codecForGetDonauStatementsRequest =
+ (): Codec<GetDonauStatementsRequest> =>
+ buildCodecForObject<GetDonauStatementsRequest>()
+ .property("donauBaseUrl", codecOptional(codecForString()))
+ .build("GetDonauStatementsRequest");
diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts
@@ -61,6 +61,7 @@ import {
DeleteDiscountRequest,
DeleteExchangeRequest,
DeleteStoredBackupRequest,
+ DeleteSubscriptionRequest,
DenominationInfo,
Duration,
EmptyObject,
@@ -98,6 +99,8 @@ import {
ListDiscountsResponse,
ListGlobalCurrencyAuditorsResponse,
ListGlobalCurrencyExchangesResponse,
+ ListSubscriptionsRequest,
+ ListSubscriptionsResponse,
Logger,
LongpollQueue,
NotificationType,
@@ -151,9 +154,11 @@ import {
codecForAcceptManualWithdrawalRequest,
codecForAcceptPeerPullPaymentRequest,
codecForAddBankAccountRequest,
+ codecForAddContactRequest,
codecForAddExchangeRequest,
codecForAddGlobalCurrencyAuditorRequest,
codecForAddGlobalCurrencyExchangeRequest,
+ codecForAddMailboxMessageRequest,
codecForAny,
codecForApplyDevExperiment,
codecForCanonicalizeBaseUrlRequest,
@@ -167,9 +172,12 @@ import {
codecForConfirmWithdrawalRequestRequest,
codecForConvertAmountRequest,
codecForCreateDepositGroupRequest,
+ codecForDeleteContactRequest,
codecForDeleteDiscountRequest,
codecForDeleteExchangeRequest,
+ codecForDeleteMailboxMessageRequest,
codecForDeleteStoredBackupRequest,
+ codecForDeleteSubscriptionRequest,
codecForDeleteTransactionRequest,
codecForEmptyObject,
codecForExportDbToFileRequest,
@@ -204,6 +212,8 @@ import {
codecForListBankAccounts,
codecForListDiscountsRequest,
codecForListExchangesRequest,
+ codecForListSubscriptionsRequest,
+ codecForMailboxConfiguration,
codecForPrepareBankIntegratedWithdrawalRequest,
codecForPreparePayRequest,
codecForPreparePayTemplateRequest,
@@ -217,17 +227,14 @@ import {
codecForResumeTransaction,
codecForRetryTransactionRequest,
codecForRunFixupRequest,
+ codecForSendTalerUriMailboxMessageRequest,
codecForSetCoinSuspendedRequest,
codecForSetDonauRequest,
- codecForAddContactRequest,
- codecForDeleteContactRequest,
- codecForAddMailboxMessageRequest,
- codecForSendTalerUriMailboxMessageRequest,
- codecForDeleteMailboxMessageRequest,
codecForSetWalletDeviceIdRequest,
codecForSharePaymentRequest,
codecForStartExchangeWalletKycRequest,
codecForStartRefundQueryRequest,
+ codecForString,
codecForSuspendTransaction,
codecForTestPayArgs,
codecForTestingGetDenomStatsRequest,
@@ -256,13 +263,6 @@ import {
setGlobalLogLevelFromString,
stringifyScopeInfo,
validateIban,
- codecForString,
- codecForMailboxConfiguration,
- codecForListSubscriptionsRequest,
- codecForDeleteSubscriptionRequest,
- ListSubscriptionsResponse,
- ListSubscriptionsRequest,
- DeleteSubscriptionRequest,
} from "@gnu-taler/taler-util";
import {
readSuccessResponseJsonOrThrow,
@@ -291,6 +291,7 @@ import {
getMaxPeerPushDebitAmount,
} from "./coinSelection.js";
import { cancelableFetch } from "./common.js";
+import { addContact, deleteContact, listContacts } from "./contacts.js";
import { TalerCryptoInterface } from "./crypto/cryptoImplementation.js";
import {
CryptoDispatcher,
@@ -324,16 +325,6 @@ import {
handleGetDonauStatements,
handleSetDonau,
} from "./donau.js";
-import { listContacts, addContact, deleteContact } from "./contacts.js";
-import {
- listMailboxMessages,
- addMailboxMessage,
- deleteMailboxMessage,
- createNewMailbox,
- sendTalerUriMessage,
- getMailbox,
- refreshMailbox
-} from "./mailbox.js";
import {
ReadyExchangeSummary,
acceptExchangeTermsOfService,
@@ -355,6 +346,15 @@ import {
} from "./exchanges.js";
import { convertDepositAmount } from "./instructedAmountConversion.js";
import {
+ addMailboxMessage,
+ createNewMailbox,
+ deleteMailboxMessage,
+ getMailbox,
+ listMailboxMessages,
+ refreshMailbox,
+ sendTalerUriMessage,
+} from "./mailbox.js";
+import {
ObservableDbAccess,
ObservableTaskScheduler,
observeTalerCrypto,
@@ -1323,18 +1323,18 @@ async function handleListSubscriptions(
wex: WalletExecutionContext,
req: ListSubscriptionsRequest,
): Promise<ListSubscriptionsResponse> {
- return await listSubscriptions(wex,
+ return await listSubscriptions(
+ wex,
req.tokenIssuePubHash,
- req.merchantBaseUrl);
+ req.merchantBaseUrl,
+ );
}
async function handleDeleteSubscription(
wex: WalletExecutionContext,
req: DeleteSubscriptionRequest,
): Promise<EmptyObject> {
- return await deleteSubscription(wex,
- req.tokenFamilyHash,
- );
+ return await deleteSubscription(wex, req.tokenFamilyHash);
}
async function handleAbortTransaction(
@@ -1479,6 +1479,14 @@ async function handleGetDepositWireTypes(
if (!parsedPayto) {
continue;
}
+ let preferredEntryType: "iban" | "bban" | undefined = undefined;
+ if (parsedPayto.targetType === "iban") {
+ if (det.currency === "HUF") {
+ preferredEntryType = "bban";
+ } else {
+ preferredEntryType = "iban";
+ }
+ }
if (
parsedPayto.isKnown &&
parsedPayto.targetType === "x-taler-bank"