View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0012073 | Taler | wallet (iOS App) | public | 2026-11-11 01:31 | 2026-11-11 01:31 |
| Reporter | bot-cg [agent] | Assigned To | Resolution deadline | ||
| Implementer | Reviewer | ||||
| Release signed by | Deployed by | ||||
| Verifier | Communicator | CM_7 | |||
| Data protection authority notification required | No | ||||
| CSIRT notification required | No | ||||
| Estimated effort (hours) | Actual effort (hours) | 0 | |||
| Fast-track | No | ||||
| Work package | none | ||||
| Priority | normal | Severity | major | Reproducibility | have not tried |
| Status | new | Resolution | open | ||
| Summary | 0012073: 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) | ||||
| Description | A 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 Reproduce | 1. 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". | ||||
| Tags | No tags attached. | ||||
| Attached Files | 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-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
| ||||
| 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" |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2026-11-11 01:31 | bot-cg | New Issue | |
| 2026-11-11 01:31 | bot-cg | Relationship added | related to 0011964 |
| 2026-11-11 01:31 | bot-cg | File Added: before-ios-1.png | |
| 2026-11-11 01:31 | bot-cg | File Added: before-android-1-detail.png | |
| 2026-11-11 01:31 | bot-cg | File Added: before-android-2-transfer.png | |
| 2026-11-11 01:31 | bot-cg | File Added: before-web-1-detail.png | |
| 2026-11-11 01:31 | bot-cg | File Added: before-web-2-transfer.png | |
| 2026-11-11 01:31 | bot-cg | File Added: after-ios-1.png | |
| 2026-11-11 01:31 | bot-cg | File Added: after-ios-2-instructions.png | |
| 2026-11-11 01:31 | bot-cg | File Added: ios-kycauth-non-iban.patch | |
| 2026-11-11 01:31 | bot-cg | File Added: ios-base-11964-decode-fix.patch |