taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

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:
Mpackages/taler-util/src/types-taler-wallet.ts | 104+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Mpackages/taler-wallet-core/src/wallet.ts | 62+++++++++++++++++++++++++++++++++++---------------------------
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"