View Issue Details

IDProjectCategoryView StatusLast Update
0012107Talerwallet (Android App)public2026-11-11 02:07
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 
Summary0012107: Android: no warning when a withdrawal will create very many coins (numCoins from wallet-core ignored)
Descriptionwallet-core tells the UI how many coins a withdrawal will create (getWithdrawalDetailsForAmount.numCoins; taler-util documents "The UIs should warn if this number is too high (roughly at >100)"). Android ignores it: a withdrawal of hundreds or thousands of coins looks like any other, although it takes much longer to complete.

What the user sees for KUDOS 9.99 at https://tripwire.taler.net:8445/ (denominations 0.01, 1 and 10, so 9 + 99 = 108 coins), same withdraw-exchange link on all three:
- iOS: "Note: It will take some time to prepare this amount. Be patient..." below the amount (before-ios-1.png); above 199 coins "...quite some time...", above 999 "Amount too big for a single withdrawal!" with the button disabled (Views/Actions/Banking/QuiteSomeCoins.swift:12-18, 90-98).
- WebExtension: review screen card "This withdrawal creates more than 100 digital coins and may take longer than usual." (before-web-1.png; routes/withdrawal-review-model.ts:109-112).
- Android: amount and "Confirm withdrawal", nothing else (before-android-1.png).

Code (origin/master 4c483527): wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt:190-217 (WithdrawalDetailsForAmount does not decode numCoins); withdraw/WithdrawalShowInfo.kt:199-361 (no hint). No Android code reads numCoins.

Patch (android-many-coins-warning.patch): decode numCoins (optional) and show a WarningLabel "This withdrawal creates more than 100 digital coins and may take longer than usual." (web wording) below the amount when it is above 100, for bank-integrated and manual withdrawals. One new English string. (iOS additionally refuses more than 999 coins; not copied, since web does not either.)
Verified: :wallet:assembleFdroidSim builds; after-android-1.png (KUDOS 9.99: warning shown), after-android-2-few-coins.png (KUDOS 5: no warning).

Assisted by LLM
Steps To ReproduceOpen taler://withdraw-exchange/tripwire.taler.net:8445/?a=KUDOS%3A9.99, accept the ToS, look at the confirmation screen.
TagsNo tags attached.
Attached Files
before-android-1.png (41,372 bytes)   
before-android-1.png (41,372 bytes)   
before-web-1.png (130,373 bytes)   
before-web-1.png (130,373 bytes)   
before-ios-1.png (220,551 bytes)   
before-ios-1.png (220,551 bytes)   
after-android-1.png (59,310 bytes)   
after-android-1.png (59,310 bytes)   
after-android-2-few-coins.png (74,020 bytes)   
after-android-2-few-coins.png (74,020 bytes)   
android-many-coins-warning.patch (3,186 bytes)   
diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt
index f2862adc..965fd93b 100644
--- a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt
+++ b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt
@@ -214,6 +214,12 @@ data class WithdrawalDetailsForAmount(
      * Scope info of the currency withdrawn.
      */
     val scopeInfo: ScopeInfo,
+
+    /**
+     * Number of coins that would be withdrawn.
+     * wallet-core asks UIs to warn when this is high (roughly > 100).
+     */
+    val numCoins: Int? = null,
 )
 
 @Serializable
diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawalShowInfo.kt b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawalShowInfo.kt
index 7bc37929..eb3293e6 100644
--- a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawalShowInfo.kt
+++ b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawalShowInfo.kt
@@ -73,6 +73,9 @@ import net.taler.wallet.withdraw.WithdrawStatus.Status.TosReviewRequired
 import net.taler.wallet.withdraw.WithdrawStatus.Status.Updating
 import net.taler.wallet.withdraw.WithdrawalOperationStatusFlag.Pending
 
+/** above this many coins the withdrawal takes noticeably longer (wallet-core: "roughly at >100") */
+private const val MANY_COINS = 100
+
 @Composable
 fun WithdrawalShowInfo(
     status: WithdrawStatus,
@@ -272,6 +275,16 @@ fun WithdrawalShowInfo(
                 )
             }
 
+            if (status.status != TosReviewRequired
+                && (status.amountInfo?.numCoins ?: 0) > MANY_COINS) {
+                WarningLabel(
+                    label = stringResource(R.string.withdraw_many_coins),
+                    modifier = Modifier
+                        .padding(16.dp)
+                        .fillMaxWidth(),
+                )
+            }
+
             if (exchange != null && selectedAmount.scope !is ScopeInfo.Exchange) {
                 TransactionInfoComposable(
                     label = stringResource(R.string.withdraw_exchange),
diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml
index 89750709..1f809491 100644
--- a/wallet/src/main/res/values/strings.xml
+++ b/wallet/src/main/res/values/strings.xml
@@ -430,6 +430,7 @@ GNU Taler is immune to many types of fraud such as credit card data theft, phish
     <string name="withdraw_manual_step_subject">Copy this code and paste it into the subject/purpose field (or “Message to recipient”) in your banking app or bank website:</string>
     <string name="withdraw_restrict_age">Restrict usage to age</string>
     <string name="withdraw_restrict_age_unrestricted">Unrestricted</string>
+    <string name="withdraw_many_coins">This withdrawal creates more than 100 digital coins and may take longer than usual.</string>
     <string name="withdraw_review_terms">You must first accept the payment service\'s terms of service before you can withdraw electronic cash to your wallet.</string>
     <string name="withdraw_subtitle">Select target bank account</string>
     <string name="withdraw_title">Withdraw</string>

Required notifications

Address or linkRemarkAdded byNotifiedActions

Activities

Issue History

Date ModifiedUsernameFieldChange
2026-11-11 02:07bot-cgNew Issue
2026-11-11 02:07bot-cgFile Added: before-android-1.png
2026-11-11 02:07bot-cgFile Added: before-web-1.png
2026-11-11 02:07bot-cgFile Added: before-ios-1.png
2026-11-11 02:07bot-cgFile Added: after-android-1.png
2026-11-11 02:07bot-cgFile Added: after-android-2-few-coins.png
2026-11-11 02:07bot-cgFile Added: android-many-coins-warning.patch