View Issue Details

IDProjectCategoryView StatusLast Update
0012103Talerwallet (iOS App)public2026-11-11 02:00
Reporterbot-cg [agent] Assigned ToResolution deadline
ImplementerReviewer 
Release signed byDeployed by 
VerifierCommunicatorCM_7  
Data protection authority notification requiredNo  
CSIRT notification requiredNo  
Estimated effort (hours)Actual effort (hours)0 
Fast-trackNo
Work packagenone
PrioritynormalSeverityminorReproducibilityhave not tried
Status newResolutionopen 
Summary0012103: iOS: during the exchange's AML review a KYC-blocked transaction still says "You need to pass a legitimization procedure" -- wallet-core's kycAmlReview is ignored (patch attached)
DescriptionSame defect as the Android report 0012098 (related). When the exchange reviews a KYC-blocked account, wallet-core sets TransactionCommon.kycAmlReview = true. iOS does not decode the field, so the transaction keeps saying "Legitimization required" / "You need to pass a legitimization procedure." / "Open legitimization website", although the user already did that and can only wait. The WebExtension shows "Waiting for review - The exchange is reviewing your account. Please wait.".

What the user sees:
- iOS, KUDOS 5 withdrawal from the tripwire KUDOS test exchange blocked on KYC: "Legitimization required", "You need to pass a legitimization procedure.", "Open legitimization website" (before-ios-1.png). Because iOS ignores kycAmlReview, this is also what it shows during an AML review.
- WebExtension, the same kind of transaction with kycAmlReview = true (wallet-core's transaction JSON replayed with the flag set via the dev experiment api-response, since a test exchange cannot be put into AML review from the client): "Waiting for review" (before-web-1.png); without the flag: "Identity verification required" (before-web-0-no-review.png).
- Android: same defect, before-android-1.png / after-android-1.png in 0012098.

Code (origin/master 674b7915):
- TalerWallet1/Model/Transaction.swift:357-371 (TransactionCommon has kycUrl, no kycAmlReview), :67-85 (MinorState.kyc -> "Legitimization required").
- TalerWallet1/Views/Transactions/TransactionSummaryList.swift:464-477 (KYCbutton texts), :487-492; TransactionTypeDetail.swift:136, 226 (deposit / peer KYC buttons).

The patch (ios-F406-kyc-aml-review.patch): TransactionCommon.kycAmlReview (optional, decoded automatically); when it is set on a pending transaction the status reads "Under review" and the KYC button's hint says "The payment service is reviewing your information. Please wait." (the button still opens the KYC page, where the status can be checked). Two new strings in Localizable.xcstrings.

Verified: wc-ios build (GNU_Taler, Release) succeeds. An after screenshot could not be produced: the review state cannot be created on the test exchanges, and in this iOS build the wallet-core dev experiments api-response / api-error had no visible effect (applied via taler://dev-experiment/..., "Finished" shown, but getTransactionById/getBalances kept returning the real data), so the patched branch is only build-verified on iOS (the same logic was verified on Android, 0012098).

Assisted by LLM
Steps To Reproduce1. Withdraw more than the KYC threshold (e.g. KUDOS 5 from https://tripwire.taler.net:8445/), complete the KYC forms.
2. While the exchange reviews the account (kycAmlReview: true), open the transaction: it still asks to pass the legitimization procedure.
TagsNo tags attached.
Attached Files
before-ios-1.png (242,238 bytes)   
before-ios-1.png (242,238 bytes)   
before-web-1.png (127,407 bytes)   
before-web-1.png (127,407 bytes)   
before-web-0-no-review.png (137,384 bytes)   
before-web-0-no-review.png (137,384 bytes)   
before-android-1.png (84,948 bytes)   
before-android-1.png (84,948 bytes)   
ios-F406-kyc-aml-review.patch (5,683 bytes)   
diff --git a/TalerWallet1/Model/Transaction.swift b/TalerWallet1/Model/Transaction.swift
index 51c680f2..639e6523 100755
--- a/TalerWallet1/Model/Transaction.swift
+++ b/TalerWallet1/Model/Transaction.swift
@@ -367,6 +367,7 @@ struct TransactionCommon: Decodable, Sendable {
     var error: TalerErrorDetail?
     var failReason: TalerErrorDetail?       // only for isFailed TODO: i18n
     var kycUrl: String?
+    var kycAmlReview: Bool?                 // the payment service reviews the KYC data - the user can only wait
     var kycAuthTransferInfo: KycAuthTransferInfo?
 
     var isIncoming      : Bool { type == .withdrawal
diff --git a/TalerWallet1/Resources/Localizable.xcstrings b/TalerWallet1/Resources/Localizable.xcstrings
index e283ca45..1783f874 100755
--- a/TalerWallet1/Resources/Localizable.xcstrings
+++ b/TalerWallet1/Resources/Localizable.xcstrings
@@ -19138,6 +19138,9 @@
         }
       }
     },
+    "The payment service is reviewing your information. Please wait." : {
+      "comment" : "KYC"
+    },
     "The payment service is waiting for your wire-transfer." : {
       "localizations" : {
         "de" : {
@@ -21666,6 +21669,9 @@
       "comment" : "Alert message displayed when there is an error connecting to the NFC tag.",
       "isCommentAutoGenerated" : true
     },
+    "Under review" : {
+      "comment" : "TxMinorState heading: the payment service reviews the KYC data"
+    },
     "Unfortunately this means, that your %@ are not valid anymore, because they were obtained with the old security identity." : {
       "comment" : "A message that appears when the user has selected to keep their funds, but the funds are not valid anymore. The argument is the name of the currency.",
       "isCommentAutoGenerated" : true,
diff --git a/TalerWallet1/Views/Transactions/TransactionSummaryList.swift b/TalerWallet1/Views/Transactions/TransactionSummaryList.swift
index 74f04b65..d342bcd6 100755
--- a/TalerWallet1/Views/Transactions/TransactionSummaryList.swift
+++ b/TalerWallet1/Views/Transactions/TransactionSummaryList.swift
@@ -210,7 +210,9 @@ struct TransactionSummaryList: View {
             .accessibilityLabel(a11yDate)
             .foregroundColor(WalletColors().secondary2(colorScheme, colorSchemeContrast))
             .id(topID)
-        let state = localizedState(common.txState)
+        let underReview = common.isPending && common.kycAmlReview == true
+        let state = underReview ? String(localized: "Under review", comment: "TxMinorState heading: the payment service reviews the KYC data")
+                                : localizedState(common.txState)
         let statusT = Text(state)
             .multilineTextAlignment(.trailing)
         let imageT = Text(common.type.icon())
@@ -463,12 +465,14 @@ struct TransactionSummaryList: View {
     // MARK: -
     struct KYCbutton: View {
         let kycUrl: String?
+        var underReview: Bool = false
 
         var body: some View {
             if let kycUrl {
                 if let destination = URL(string: kycUrl) {
                     LinkButton(destination: destination,
-                               hintTitle: String(localized: "You need to pass a legitimization procedure.", comment: "KYC"),
+                               hintTitle: underReview ? String(localized: "The payment service is reviewing your information. Please wait.", comment: "KYC")
+                                                      : String(localized: "You need to pass a legitimization procedure.", comment: "KYC"),
                                buttonTitle: String(localized: "Open legitimization website", comment: "KYC"),
                                   a11yHint: String(localized: "Will go to legitimization website to permit this withdrawal.", comment: "a11y"),
                                      badge: NEEDS_KYC)
@@ -486,7 +490,7 @@ struct TransactionSummaryList: View {
             let common = transaction.common
             if transaction.isPendingKYC {
                 if let kycUrl = common.kycUrl {
-                    KYCbutton(kycUrl: common.kycUrl)
+                    KYCbutton(kycUrl: common.kycUrl, underReview: common.kycAmlReview == true)
                 } else {
                     Text("Legitimization procedure required", comment: "KYC")
                 }
diff --git a/TalerWallet1/Views/Transactions/TransactionTypeDetail.swift b/TalerWallet1/Views/Transactions/TransactionTypeDetail.swift
index 75efbdfb..6bfb9e25 100755
--- a/TalerWallet1/Views/Transactions/TransactionTypeDetail.swift
+++ b/TalerWallet1/Views/Transactions/TransactionTypeDetail.swift
@@ -133,7 +133,7 @@ struct TransactionTypeDetail: View {
                     if transaction.common.isPendingKYCauth {
                         KYCauth(stack: stack.push(), common: common)
                     } else if transaction.isPendingKYC {
-                        KYCbutton(kycUrl: common.kycUrl)
+                        KYCbutton(kycUrl: common.kycUrl, underReview: common.kycAmlReview == true)
                     }
                     ThreeAmountsSheet(stack: stack.push(),
                                       scope: scope,
@@ -223,7 +223,7 @@ struct TransactionTypeDetail: View {
                 case .peer2peer(let p2pTransaction): Group {
                     let details = p2pTransaction.details
                     if transaction.isPendingKYC {
-                        KYCbutton(kycUrl: common.kycUrl)
+                        KYCbutton(kycUrl: common.kycUrl, underReview: common.kycAmlReview == true)
                     }
                     if !transaction.isDone {
                         ExpiresView(expiration: details.info.expiration)
ios-F406-kyc-aml-review.patch (5,683 bytes)   

Required notifications

Address or linkRemarkAdded byNotifiedActions

Relationships

related to 0012098 new Android: during the exchange's AML review a KYC-blocked transaction still says "follow the instructions" / "Complete KYC" -- wallet-core's kycAmlReview is ignored (patch attached) 

Activities

Issue History

Date ModifiedUsernameFieldChange
2026-11-11 02:00bot-cgNew Issue
2026-11-11 02:00bot-cgRelationship addedrelated to 0012098
2026-11-11 02:00bot-cgFile Added: before-ios-1.png
2026-11-11 02:00bot-cgFile Added: before-web-1.png
2026-11-11 02:00bot-cgFile Added: before-web-0-no-review.png
2026-11-11 02:00bot-cgFile Added: before-android-1.png
2026-11-11 02:00bot-cgFile Added: ios-F406-kyc-aml-review.patch