taler-typescript-core

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

commit 501e518906e8b9b6fe200684654eae4a7d86ea39
parent 30bdfb6bab274e1e35f0371f2ee6285dccbcedd7
Author: Florian Dold <florian@dold.me>
Date:   Mon,  6 Jul 2026 11:25:32 +0200

remove enableV1Contracts feature flag, it's now the default

This commit also completely removes downgrading v1 contract terms to v0
contract terms. Clients now all need to handle both v0 and v1.

Diffstat:
Mpackages/taler-auditor-webui/src/hooks/useSettings.ts | 3+--
Mpackages/taler-harness/src/integrationtests/test-donau-idempotency.ts | 4+---
Mpackages/taler-harness/src/integrationtests/test-donau-keychange.ts | 1-
Mpackages/taler-harness/src/integrationtests/test-donau-minus-t.ts | 1-
Mpackages/taler-harness/src/integrationtests/test-donau-multi.ts | 1-
Mpackages/taler-harness/src/integrationtests/test-donau.ts | 1-
Mpackages/taler-harness/src/integrationtests/test-merchant-tokenfamilies.ts | 1-
Mpackages/taler-harness/src/integrationtests/test-wallet-tokens-discount.ts | 1-
Mpackages/taler-harness/src/integrationtests/test-wallet-tokens.ts | 1-
Mpackages/taler-util/src/contract-terms.ts | 48------------------------------------------------
Mpackages/taler-util/src/types-taler-wallet.ts | 10----------
Mpackages/taler-wallet-cli/src/index.ts | 1-
Mpackages/taler-wallet-core/src/pay-merchant.ts | 47++++++++---------------------------------------
Mpackages/taler-wallet-core/src/wallet.ts | 1-
Mpackages/taler-wallet-webextension/src/hooks/useSettings.ts | 1-
Mpackages/taler-wallet-webextension/src/platform/api.ts | 1-
Mpackages/taler-wallet-webextension/src/wallet/Settings.tsx | 4----
Mpackages/taler-wallet-webextension/src/wxBackend.ts | 1-
18 files changed, 10 insertions(+), 118 deletions(-)

diff --git a/packages/taler-auditor-webui/src/hooks/useSettings.ts b/packages/taler-auditor-webui/src/hooks/useSettings.ts @@ -14,15 +14,14 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { buildStorageKey, useLocalStorage } from "@gnu-taler/web-util/browser"; import { Codec, buildCodecForObject, codecForBoolean, codecForConstString, codecForEither, - codecForString, } from "@gnu-taler/taler-util"; +import { buildStorageKey, useLocalStorage } from "@gnu-taler/web-util/browser"; export interface Settings { advanceOrderMode: boolean; diff --git a/packages/taler-harness/src/integrationtests/test-donau-idempotency.ts b/packages/taler-harness/src/integrationtests/test-donau-idempotency.ts @@ -56,9 +56,7 @@ export async function runDonauIdempotencyTest(t: GlobalTestState) { testing: { devModeActive: true, }, - features: { - enableV1Contracts: true, - }, + features: {}, }, }); diff --git a/packages/taler-harness/src/integrationtests/test-donau-keychange.ts b/packages/taler-harness/src/integrationtests/test-donau-keychange.ts @@ -54,7 +54,6 @@ export async function runDonauKeychangeTest(t: GlobalTestState) { merchantUseDonau: true, walletConfig: { features: { - enableV1Contracts: true, }, }, }); diff --git a/packages/taler-harness/src/integrationtests/test-donau-minus-t.ts b/packages/taler-harness/src/integrationtests/test-donau-minus-t.ts @@ -52,7 +52,6 @@ export async function runDonauMinusTTest(t: GlobalTestState) { } = await createSimpleTestkudosEnvironmentV3(t, undefined, { walletConfig: { features: { - enableV1Contracts: true, }, }, }); diff --git a/packages/taler-harness/src/integrationtests/test-donau-multi.ts b/packages/taler-harness/src/integrationtests/test-donau-multi.ts @@ -58,7 +58,6 @@ export async function runDonauMultiTest(t: GlobalTestState) { merchantUseDonau: true, walletConfig: { features: { - enableV1Contracts: true, }, }, }); diff --git a/packages/taler-harness/src/integrationtests/test-donau.ts b/packages/taler-harness/src/integrationtests/test-donau.ts @@ -54,7 +54,6 @@ export async function runDonauTest(t: GlobalTestState) { merchantUseDonau: true, walletConfig: { features: { - enableV1Contracts: true, }, }, }); diff --git a/packages/taler-harness/src/integrationtests/test-merchant-tokenfamilies.ts b/packages/taler-harness/src/integrationtests/test-merchant-tokenfamilies.ts @@ -52,7 +52,6 @@ export async function runMerchantTokenfamiliesTest(t: GlobalTestState) { { walletConfig: { features: { - enableV1Contracts: true, }, }, }, diff --git a/packages/taler-harness/src/integrationtests/test-wallet-tokens-discount.ts b/packages/taler-harness/src/integrationtests/test-wallet-tokens-discount.ts @@ -54,7 +54,6 @@ export async function runWalletTokensDiscountTest(t: GlobalTestState) { { walletConfig: { features: { - enableV1Contracts: true, }, }, }, diff --git a/packages/taler-harness/src/integrationtests/test-wallet-tokens.ts b/packages/taler-harness/src/integrationtests/test-wallet-tokens.ts @@ -53,7 +53,6 @@ export async function runWalletTokensTest(t: GlobalTestState) { { walletConfig: { features: { - enableV1Contracts: true, }, }, }, diff --git a/packages/taler-util/src/contract-terms.ts b/packages/taler-util/src/contract-terms.ts @@ -340,52 +340,4 @@ export namespace ContractTermsUtil { return undefined; } - /** - * Try to downgrade contract terms in the v1 format to the v0 format. - * Returns undefined if downgrading is not possible. This can happen - * when the contract only offers token payments. - */ - export function downgradeContractTerms( - terms: MerchantContractTerms, - ): MerchantContractTermsV0 | undefined { - if (terms.version == MerchantContractVersion.V0) { - return terms; - } - if (terms.version !== MerchantContractVersion.V1) { - return undefined; - } - const firstGood = getV0CompatChoiceIndex(terms); - if (firstGood == null) { - return undefined; - } - return { - amount: terms.choices[firstGood].amount, - exchanges: terms.exchanges, - h_wire: terms.h_wire, - max_fee: terms.choices[firstGood].max_fee, - merchant: terms.merchant, - merchant_base_url: terms.merchant_base_url, - merchant_pub: terms.merchant_pub, - nonce: terms.nonce, - order_id: terms.order_id, - pay_deadline: terms.pay_deadline, - refund_deadline: terms.refund_deadline, - summary: terms.summary, - timestamp: terms.timestamp, - wire_method: terms.wire_method, - wire_transfer_deadline: terms.wire_transfer_deadline, - auto_refund: terms.auto_refund, - delivery_date: terms.delivery_date, - delivery_location: terms.delivery_location, - extra: terms.extra, - fulfillment_message: terms.fulfillment_message, - fulfillment_message_i18n: terms.fulfillment_message_i18n, - fulfillment_url: terms.fulfillment_url, - minimum_age: terms.minimum_age, - products: terms.products, - public_reorder_url: terms.public_reorder_url, - summary_i18n: terms.summary_i18n, - version: MerchantContractVersion.V0, - }; - } } diff --git a/packages/taler-util/src/types-taler-wallet.ts b/packages/taler-util/src/types-taler-wallet.ts @@ -446,16 +446,6 @@ export interface WalletRunConfig { */ features: { allowHttp: boolean; - - /** - * If set to true, enable V1 contracts. Otherwise, emulate v0 contracts - * to wallet-core clients. - * - * Will become enabled by default in the future. - * - * Added 2025-08-19. - */ - enableV1Contracts: boolean; }; /** diff --git a/packages/taler-wallet-cli/src/index.ts b/packages/taler-wallet-cli/src/index.ts @@ -416,7 +416,6 @@ async function createLocalWallet( skipDefaults: walletCliArgs.wallet.skipDefaults, }, features: { - enableV1Contracts: true, }, }, } satisfies InitRequest, diff --git a/packages/taler-wallet-core/src/pay-merchant.ts b/packages/taler-wallet-core/src/pay-merchant.ts @@ -365,13 +365,7 @@ export class PayMerchantTransactionContext implements TransactionContext { let contractTerms: MerchantContractTerms | undefined; if (req?.includeContractTerms) { - if (!this.wex.ws.config.features.enableV1Contracts) { - contractTerms = ContractTermsUtil.downgradeContractTerms( - download.contractTerms, - ); - } else { - contractTerms = download.contractTerms; - } + contractTerms = download.contractTerms; } return { @@ -1919,27 +1913,13 @@ async function checkPaymentByProposalId( const handleUnconfirmed = async (): Promise<PreparePayResult> => { if (contractTerms.version === MerchantContractVersion.V1) { - if (!wex.ws.config.features.enableV1Contracts) { - let v0Contract = - ContractTermsUtil.downgradeContractTerms(contractTerms); - logger.warn( - `contract uses v1 features, trying to downgrade, as enableV1Contracts is false`, - ); - if (!v0Contract) { - throw Error( - "payment not possible (uses v1 contract features and downgrade failed)", - ); - } - contractTerms = v0Contract; - } else { - return { - status: PreparePayResultType.ChoiceSelection, - transactionId, - contractTerms: contractTerms, - contractTermsHash: contractTermsHash, - talerUri, - }; - } + return { + status: PreparePayResultType.ChoiceSelection, + transactionId, + contractTerms: contractTerms, + contractTermsHash: contractTermsHash, + talerUri, + }; } const instructedAmount = Amounts.parseOrThrow(contractTerms.amount); @@ -2803,17 +2783,6 @@ export async function confirmPay( const contractTerms = d.contractTerms; - if ( - choiceIndex == null && - contractTerms.version === MerchantContractVersion.V1 && - !wex.ws.config.features.enableV1Contracts - ) { - choiceIndex = ContractTermsUtil.getV0CompatChoiceIndex(contractTerms); - if (choiceIndex == null) { - throw Error("unable to confirm payment, contracts v1 support required"); - } - } - const { available, amountRaw, maxFee } = ContractTermsUtil.extractAmounts( contractTerms, choiceIndex, diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts @@ -3072,7 +3072,6 @@ function applyRunConfigDefaults(wcp?: PartialWalletRunConfig): WalletRunConfig { return { features: { allowHttp: true, - enableV1Contracts: wcp?.features?.enableV1Contracts ?? false, }, testing: { devModeActive: wcp?.testing?.devModeActive ?? false, diff --git a/packages/taler-wallet-webextension/src/hooks/useSettings.ts b/packages/taler-wallet-webextension/src/hooks/useSettings.ts @@ -38,7 +38,6 @@ export const codecForSettings = (): Codec<Settings> => .property("showExchangeManagement", codecForBoolean()) .property("selectTosFormat", codecForBoolean()) .property("showWalletActivity", codecForBoolean()) - .property("walletEnableV1Contracts", codecForBoolean()) .build("Settings"); const SETTINGS_KEY = buildStorageKey("wallet-settings", codecForSettings()); diff --git a/packages/taler-wallet-webextension/src/platform/api.ts b/packages/taler-wallet-webextension/src/platform/api.ts @@ -144,7 +144,6 @@ export const defaultSettings: Settings = { walletAllowHttp: false, selectTosFormat: false, showWalletActivity: false, - walletEnableV1Contracts: false, }; /** diff --git a/packages/taler-wallet-webextension/src/wallet/Settings.tsx b/packages/taler-wallet-webextension/src/wallet/Settings.tsx @@ -257,10 +257,6 @@ function AdvanceSettings(): VNode { label: i18n.str`Show wallet activity`, description: i18n.str`Show wallet notifications and activity events in the UI.`, }, - walletEnableV1Contracts: { - label: i18n.str`Enable v1 contract`, - description: i18n.str`v1 is under development and wallet-core converts v1 contracts to v0. Enable this option for testing`, - }, }; return ( <Fragment> diff --git a/packages/taler-wallet-webextension/src/wxBackend.ts b/packages/taler-wallet-webextension/src/wxBackend.ts @@ -502,7 +502,6 @@ async function reinitWallet(): Promise<void> { }, features: { allowHttp: settings.walletAllowHttp, - enableV1Contracts: settings.walletEnableV1Contracts, }, }, });