View Issue Details

IDProjectCategoryView StatusLast Update
0012073Talerwallet (iOS App)public2026-11-11 01:31
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
PrioritynormalSeveritymajorReproducibilityhave not tried
Status newResolutionopen 
Summary0012073: iOS deposit to a non-IBAN (x-taler-bank) account: the bank-account verification step shows "KYC Error -- No IBAN" instead of the transfer instructions (patch attached)
DescriptionA deposit to a bank account that is not an IBAN (e.g. an x-taler-bank account, the only wire method of the demo and of regional-currency exchanges) that needs the "prove control of the account" step (pending kyc-auth) cannot be completed on iOS: the deposit's transaction view shows "Verify bank account" followed by an error box "KYC Error" / "No IBAN" instead of the wire transfer instructions. Android and the web wallet show the instructions for the same deposit.

Screenshots (tripwire KUDOS exchange :8445, KYC rule DEPOSIT > KUDOS:0.1, deposit of KUDOS:1 to payto://x-taler-bank/tripwire.taler.net/wc-kudos-deposit-19c8f2):
- before-ios-1.png: iOS, "KYC Error" / "No IBAN".
- before-android-1-detail.png, before-android-2-transfer.png: Android, "You need to prove having control over the bank account for the deposit…", "Wire transfer instructions" -> amount, subject, recipient, account.
- before-web-1-detail.png, before-web-2-transfer.png: web, "Bank account authentication required" -> "Deposit account authentication" with the transfer option.
- after-ios-1.png, after-ios-2-instructions.png: iOS with the patch: "You need to prove having control over the bank account for the deposit of KUDOS 1.00.", "Wire transfer instructions" -> "You need to transfer KUDOS 0.01 to the payment service from your bank account tripwire.taler.net/wc-kudos-deposit-19c8f2 …", recipient, account, subject.

Note: on current origin/master the iOS deposit flow does not get this far because of 0011964 (getMaxDepositAmount decode). Both iOS images were therefore built from origin/master plus a reproduction of the 0011964 decode fix (attached as ios-base-11964-decode-fix.patch, for reference only); the after image additionally carries the patch of this issue. The patch of this issue does not depend on 0011964 and applies to origin/master on its own.

Code (taler-ios origin/master 674b7915):
- TalerWallet1/Views/Transactions/TransactionTypeDetail.swift:133-134: isPendingKYCauth -> KYCauth
- TalerWallet1/Views/Transactions/KYCauth.swift:28-31: let debitPayTo = PayTo(info.debitPaytoUri); if let debitIban = debitPayTo.iban { … }
- TalerWallet1/Views/Transactions/KYCauth.swift:46-49: "// TODO: What if payto contains no IBAN, but URL?" -> ErrorView(title: "KYC Error", message: "No IBAN")
- TalerWallet1/Views/Transactions/ManualDetailsWireV.swift:15, 41-45: debitIBAN is only interpolated into the "transfer from your bank account …" sentence
For comparison: Android transfer/TransferTaler.kt:56-63 (DepositKycAuth with an x-taler-bank debit account), web routes/transaction-model.ts:788-800 (any payto type).

Patch (attached, ios-kycauth-non-iban.patch, KYCauth.swift only): use the account of whatever payto type the deposit target has -- debitPayTo.iban ?? debitPayTo.cyclos ?? URL(string: debitPaytoUri)?.xTaler (PayTo.xTaler itself falls back to a placeholder string, so the URL extension is asked directly). No new strings.

Verification: wc-ios build (Release, iOS 27.2 simulator) of origin/master + 0011964 decode fix + this patch; after-ios-1.png / after-ios-2-instructions.png from the same wallet and deposit as before-ios-1.png.

Assisted by LLM
Steps To Reproduce1. Fund the wallet with KUDOS:3 from https://tripwire.taler.net:8445/ (bank :8446).
2. Settings -> Bank Accounts -> + -> X-TALER-BANK, enter "tripwire.taler.net/<account>" (see 0012064 for why the host must be typed).
3. Deposit KUDOS:1 to it from the tripwire balance (requires the 0011964 fix to get past the amount screen).
4. The deposit goes to pending kyc-auth; open it: "KYC Error" / "No IBAN".
TagsNo tags attached.
Attached Files
before-ios-1.png (186,531 bytes)   
before-ios-1.png (186,531 bytes)   
before-android-1-detail.png (94,843 bytes)   
before-android-1-detail.png (94,843 bytes)   
before-android-2-transfer.png (187,821 bytes)   
before-android-2-transfer.png (187,821 bytes)   
before-web-1-detail.png (150,182 bytes)   
before-web-1-detail.png (150,182 bytes)   
before-web-2-transfer.png (166,795 bytes)   
before-web-2-transfer.png (166,795 bytes)   
after-ios-1.png (234,838 bytes)   
after-ios-1.png (234,838 bytes)   
ios-kycauth-non-iban.patch (1,079 bytes)   
diff --git a/TalerWallet1/Views/Transactions/KYCauth.swift b/TalerWallet1/Views/Transactions/KYCauth.swift
index c7624100..4dd0704c 100755
--- a/TalerWallet1/Views/Transactions/KYCauth.swift
+++ b/TalerWallet1/Views/Transactions/KYCauth.swift
@@ -27,7 +27,11 @@ struct KYCauth: View {
         let kycErr = String(localized: "KYC Error")
         if let info = common.kycAuthTransferInfo {
             let debitPayTo = PayTo(info.debitPaytoUri)
-            if let debitIban = debitPayTo.iban {
+            // the account the auth transfer must come from: an IBAN, or a
+            // regional bank account (x-taler-bank: "host/account", cyclos)
+            // (PayTo.xTaler falls back to a placeholder text, so ask the URL itself)
+            if let debitIban = debitPayTo.iban ?? debitPayTo.cyclos
+                            ?? URL(string: info.debitPaytoUri)?.xTaler {
                 let accountDetails = info.transferOptionsExt
                 if let validDetails = accountDetails.validDetails {
                     if let scope: ScopeInfo = common.scopes.first {
ios-kycauth-non-iban.patch (1,079 bytes)   
ios-base-11964-decode-fix.patch (1,292 bytes)   
diff --git a/TalerWallet1/Model/Model+Deposit.swift b/TalerWallet1/Model/Model+Deposit.swift
index aace81a7..ce494e88 100644
--- a/TalerWallet1/Model/Model+Deposit.swift
+++ b/TalerWallet1/Model/Model+Deposit.swift
@@ -141,12 +141,16 @@ extension WalletModel {
 }
 // MARK: - max Deposit amount
 /// Check if initiating a deposit is possible, check fees
-fileprivate struct AmountResponse: Codable {
+fileprivate struct DepositMaximum: Codable {
     let effectiveAmount: Amount?
     let rawAmount: Amount
 }
+fileprivate struct MaxDepositAmountResponse: Codable {
+    let material: DepositMaximum
+    let available: DepositMaximum
+}
 fileprivate struct GetMaxDepositAmount: WalletBackendFormattedRequest {
-    typealias Response = AmountResponse
+    typealias Response = MaxDepositAmountResponse
     var operation: String { "getMaxDepositAmount" }
     func args() -> Args { Args(currency: scope.currency, restrictScope: scope) }
 
@@ -162,7 +166,7 @@ extension WalletModel {
       async throws -> Amount {
         let request = GetMaxDepositAmount(scope: scope)
         let (response, _) = try await sendRequest(request, viewHandles: viewHandles)
-        return response.rawAmount
+        return response.available.rawAmount
     }
 } // getMaxDepositAmount
 // MARK: - Deposit

Required notifications

Address or linkRemarkAdded byNotifiedActions

Relationships

related to 0011964 planning Deposit is impossible: getMaxDepositAmount's response is nested, the app decodes it as flat, and the whole flow dies with "Unknown error" 

Activities

Issue History

Date ModifiedUsernameFieldChange
2026-11-11 01:31bot-cgNew Issue
2026-11-11 01:31bot-cgRelationship addedrelated to 0011964
2026-11-11 01:31bot-cgFile Added: before-ios-1.png
2026-11-11 01:31bot-cgFile Added: before-android-1-detail.png
2026-11-11 01:31bot-cgFile Added: before-android-2-transfer.png
2026-11-11 01:31bot-cgFile Added: before-web-1-detail.png
2026-11-11 01:31bot-cgFile Added: before-web-2-transfer.png
2026-11-11 01:31bot-cgFile Added: after-ios-1.png
2026-11-11 01:31bot-cgFile Added: after-ios-2-instructions.png
2026-11-11 01:31bot-cgFile Added: ios-kycauth-non-iban.patch
2026-11-11 01:31bot-cgFile Added: ios-base-11964-decode-fix.patch