Skip to content

fix: faster coinjoin sends#1461

Merged
HashEngineering merged 25 commits intomasterfrom
fix/faster-coinjoin-send
Feb 17, 2026
Merged

fix: faster coinjoin sends#1461
HashEngineering merged 25 commits intomasterfrom
fix/faster-coinjoin-send

Conversation

@HashEngineering
Copy link
Collaborator

@HashEngineering HashEngineering commented Feb 7, 2026

Issue being fixed or feature implemented

Related PR's and Dependencies

dashpay/dashj#283

Screenshots / Videos

How Has This Been Tested?

  • QA (Mobile Team)

Checklist:

  • I have performed a self-review of my own code and added comments where necessary
  • I have added or updated relevant unit/integration/functional/e2e tests

Summary by CodeRabbit

  • Bug Fixes

    • Enhanced monitoring for coin send operations to detect and prevent potential delays.
  • Chores

    • Updated internal transaction handling and threading logic.
    • Improved error logging for image loading failures.
    • Reorganized dialog component references.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 7, 2026

📝 Walkthrough

Walkthrough

This PR enhances observability and refactors core wallet operations. Changes include adding Glide failure logging, updating a navigation dialog reference, disabling strict mode with a TODO marker, modifying address retrieval behavior, adding ANR monitoring to coin sends with relocated signing logic, and refactoring transaction confidence listening with a new helper function and threading adjustments.

Changes

Cohort / File(s) Summary
Logging & Error Handling
common/src/main/java/org/dash/wallet/common/ui/avatar/ProfilePictureDisplay.kt
Adds logging for Glide image load failures, including failed URLs and exception cause chains.
Navigation Configuration
wallet/res/navigation/nav_voting.xml
Updates UsernameRequestFilterDialog class path from de.schildbach.wallet.ui.username.* to de.schildbach.wallet.ui.username.voting.*.
Application Initialization
wallet/src/de/schildbach/wallet/WalletApplication.java
Disables strict mode with TODO comment and changes receive address retrieval from freshReceiveAddress() to currentReceiveAddress().
Payment Processing
wallet/src/de/schildbach/wallet/payments/SendCoinsTaskRunner.kt
Adds ANR monitoring for send operations with Stopwatch-based duration logging; relocates signSendRequest into offline send branch; maintains error handling with monitor cancellation on success or exception.
Transaction Management
wallet/src/de/schildbach/wallet/transactions/WalletObserver.kt
Refactors transaction confidence listening with new shouldStopListeningToTxConfidence helper; replaces Threading.USER_THREAD references with USER_THREAD; removes manual wallet confidence notifications; enhances logging with ISLock flag.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 With logs now flowing through the digital warren,
And addresses hopping to their rightful spot,
A watchful ANR keeps coin sends from fallin',
While confidence listening learns what to plot!
Refactored and polished, this code's gotten softer,
The wallet hops faster—the sender's aloft-er! 🌟

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 2.70% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title 'fix: faster coinjoin sends' is directly related to the main changes, which involve optimizations to the send flow (ANR monitoring, stopwatch timing, and reorganized signing logic in SendCoinsTaskRunner) and supporting improvements to logging and threading.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/faster-coinjoin-send

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 20

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (7)
wallet/res/values-fil/strings-extra.xml (1)

290-290: ⚠️ Potential issue | 🟡 Minor

Copyright year may need updating.

The copyright string still reads "2025" but the current year is 2026. If this is updated in the default values/strings.xml, this locale-specific file should follow suit.

wallet/androidTest/de/schildbach/wallet/security/SecurityGuardMultiThreadingTest.kt (1)

1587-1590: ⚠️ Potential issue | 🟡 Minor

Bug: corruptedPin is defined but never used — corruptedPassword is written to the PIN key alias instead.

Line 1589 writes corruptedPassword to UI_PIN_KEY_ALIAS, but line 1587 defines corruptedPin for that purpose. This is a copy-paste error.

Proposed fix
             val corruptedPin = "CORRUPTED_PIN_2345"
             sharedPreferences.edit()
-                .putString(SecurityGuard.UI_PIN_KEY_ALIAS, corruptedPassword)
+                .putString(SecurityGuard.UI_PIN_KEY_ALIAS, corruptedPin)
                 .apply()
wallet/src/de/schildbach/wallet/service/BlockchainServiceImpl.kt (1)

934-955: ⚠️ Potential issue | 🟠 Major

onCapabilitiesChanged doesn't update availableNetworks, creating inconsistency with onLost.

When a network's capabilities change to lose NET_CAPABILITY_VALIDATED, the NETWORK impediment is added unconditionally (line 950), even if other validated networks exist in availableNetworks. This can cause false impediments during network transitions (e.g., WiFi→cellular handoff).

Additionally, a network that loses validation remains in availableNetworks, so when onLost fires later, availableNetworks may still be non-empty, preventing the impediment from being set when it should be.

Consider updating availableNetworks here to stay consistent:

Suggested fix
 override fun onCapabilitiesChanged(network: Network, capabilities: NetworkCapabilities) {
     serviceScope.launch {
         val hasInternet = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
         val hasValidated = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)

         if (log.isInfoEnabled) {
             val s = StringBuilder("network capabilities changed: ")
                 .append(network)
                 .append(", hasInternet: ").append(hasInternet)
                 .append(", validated: ").append(hasValidated)
             log.info(s.toString())
         }

         if (hasInternet && hasValidated) {
+            availableNetworks.add(network)
             impediments.remove(Impediment.NETWORK)
         } else {
-            impediments.add(Impediment.NETWORK)
+            availableNetworks.remove(network)
+            if (availableNetworks.isEmpty()) {
+                impediments.add(Impediment.NETWORK)
+            }
         }
         updateBlockchainStateImpediments()
         check()
     }
 }
wallet/src/de/schildbach/wallet/payments/SendCoinsTaskRunner.kt (1)

462-500: ⚠️ Potential issue | 🟡 Minor

monitorJob is not cancelled if checkBalanceConditions throws.

If checkBalanceConditions on Line 464 throws LeftoverBalanceException, execution exits withContext without entering the try block, so neither cancel at Line 486 nor Line 489 is reached. The monitor coroutine will fire a spurious ANR warning ~1s later.

Consider wrapping the entire block in try/finally or using a structured approach:

Proposed fix
         val monitorJob = launch(Dispatchers.IO) {
             ...
         }
 
-        if (checkBalanceConditions) {
-            checkBalanceConditions(wallet, sendRequest.tx)
-        }
-
-        try {
+        try {
+            if (checkBalanceConditions) {
+                checkBalanceConditions(wallet, sendRequest.tx)
+            }
+
             log.info("sending: {}", sendRequest)
             ...
         } catch (ex: Exception) {
             monitorJob.cancel()
             ...
+        } finally {
+            monitorJob.cancel()
         }

Alternatively, a single finally { monitorJob.cancel() } would cover all exit paths and remove the need for the two explicit cancel() calls.

wallet/src/de/schildbach/wallet/ui/send/SendCoinsViewModel.kt (1)

273-274: ⚠️ Potential issue | 🟡 Minor

Pre-existing bug: error message is contradictory.

The guard checks !isAssetLock, so when it triggers, isAssetLock is false. But the message says "must be true, but is true" — both clauses say "true".

🐛 Suggested fix
-            error("isAssetLock must be true, but is true")
+            error("isAssetLock must be true, but is false")
wallet/src/de/schildbach/wallet/service/platform/work/RestoreIdentityWorker.kt (1)

176-437: ⚠️ Potential issue | 🟠 Major

Fix earliestCreatedAt calculation to use each contender document.

minOf { ... } currently uses documentWithVotes from the outer loop, so the “earliest” timestamp is computed from a single document rather than all contenders. This can produce incorrect voting start times and scheduling. Apply the fix in both the “current contests” and “all contests” branches.

🛠️ Suggested fix (apply in both blocks)
-    val earliestCreatedAt = voteContenders.map.values.minOf {
-        val document = documentWithVotes.serializedDocument?.let { platformRepo.platform.names.deserialize(it) }
-        document?.createdAt ?: 0
-    }
+    val earliestCreatedAt = voteContenders.map.values.minOf { contender ->
+        val document = contender.serializedDocument?.let { platformRepo.platform.names.deserialize(it) }
+        document?.createdAt ?: 0
+    }
wallet/res/values-zh-rTW/strings-extra.xml (1)

454-455: ⚠️ Potential issue | 🟡 Minor

Remove the pinyin note from timeskew_behind.
The extra “Zài hòumiàn” line will surface in the UI and looks like a translation note.

Proposed fix
-    <string name="timeskew_behind">在後面
-Zài hòumiàn</string>
+    <string name="timeskew_behind">在後面</string>
🤖 Fix all issues with AI agents
In `@features/exploredash/src/main/res/values-el/strings-explore-dash.xml`:
- Around line 194-195: The string resource purchase_check_current_balance
currently reads "Δείτε τις λεπτομέρειες της κάρτας" which implies viewing card
details; update the value to explicitly indicate checking a gift-card balance
(e.g., "Ελέγξτε το υπόλοιπο της κάρτας" or another approved translation) in the
strings-explore-dash.xml so the CTA matches the balance-check action; ensure
purchase_check_current_balance is used consistently where balance checks are
shown and adjust any related copy (purchase_card_number) only if needed for
context.

In `@features/exploredash/src/main/res/values-sk/strings-explore-dash.xml`:
- Line 69: The file mixes two terms for gift card — "karta"/"karty" and the new
"poukážka"/"poukážky" — causing inconsistent UX; update the remaining string
resources (e.g., ctx_gift_cards, explore_payment_gift_card,
explore_filter_gift_cards, explore_pay_gift_card, gift_card_types,
purchase_gift_card_total_label, purchase_gift_card_details,
gift_card_purchase_failed, gift_card_out_of_stock_error, barcode_placeholder and
the groups around lines 162-169, 191, 206-207, 225, 238-245, 262) to use
"poukážka"/"poukážky" with correct Slovak forms and grammar, keeping the
already-changed explore_buy_gift_card terminology, and run a quick grep through
strings-explore-dash.xml to ensure no residual "karta"/"karty" remain.

In `@wallet/res/values-de/strings-dashpay.xml`:
- Around line 57-58: The message for string name
"invitation_username_already_found_voting_message" is inconsistent with the key
(it says the user already has a username); update its German text to reflect the
“already requested” state instead—e.g., change the value for
invitation_username_already_found_voting_message so it reads that the user has
already requested/asked for this Dash username (for example: "Du kannst diese
Einladung nicht beanspruchen, da du diesen Dash‑Nutzernamen bereits angefragt
hast.").

In `@wallet/res/values-el/strings-dashpay.xml`:
- Around line 536-537: The string resource username_types_message contains a
typographical error: a double period ("..") after "θα εγκριθούν αυτόματα..";
edit the <string name="username_types_message"> value to replace the double
period with a single period (ensure proper spacing and punctuation remain
intact) so the UI displays "θα εγκριθούν αυτόματα." instead of "θα εγκριθούν
αυτόματα..".

In `@wallet/res/values-el/strings-extra.xml`:
- Around line 338-340: Update the Greek string resource welcome_screen_title_1
to remove the contradictory word "χωρίς" so it reads naturally as "Στείλτε και
λάβετε Dash μέσω ονομάτων χρήσης" (or use "μέσω ονομάτων χρήστη" if preferred
for singular/plural consistency); edit the value for string
name="welcome_screen_title_1" accordingly to reflect the corrected wording.

In `@wallet/res/values-es/strings-dashpay.xml`:
- Around line 20-23: Update the Spanish string entries: in
new_account_secondary_confirm_message remove the stray "1" before the
placeholder so the value becomes "Elegiste %s como nombre de usuario
instantáneo..." (keep the %s placeholder intact), and in invitation_title remove
the trailing space so the value is "Invitación". Edit the values for string
names new_account_secondary_confirm_message and invitation_title accordingly.

In `@wallet/res/values-es/strings-extra.xml`:
- Line 268: The string resource menu_invite_title contains a Spanish typo
("Invitaciónes"); update the value for the resource named menu_invite_title to
the correct plural "Invitaciones" so the XML entry reads the plural without the
accent.

In `@wallet/res/values-es/strings.xml`:
- Around line 206-212: The string resource restore_wallet_selected_date contains
a stray character ("1%s") that causes an extra character to appear in the UI;
update the value to use the proper format placeholder (for example "Seleccionó:
%s" or "Seleccionado: %s" depending on intended gender) instead of "Selecciono:
1%s" so the placeholder is rendered correctly; modify the string with name
restore_wallet_selected_date to remove the "1" and correct the accent on
"Seleccionó" if desired.

In `@wallet/res/values-fa/strings-dashpay.xml`:
- Around line 541-544: The Persian string create_instant_username_description
contains a typo "در عیر این صورت"; update that string value to use the correct
phrase "در غیر این صورت" within the <string
name="create_instant_username_description"> entry so the description reads
correctly.
- Line 19: The string resource new_account_secondary_confirm_message contains
"%sرا" without a space; update the resource value so there's a space after the
format placeholder ("%s را") to correct Persian spacing, i.e., edit the value of
new_account_secondary_confirm_message to insert a space between %s and را.

In `@wallet/res/values-fil/strings-dashpay.xml`:
- Line 525: The localization string invitation_fee_noncontested_message is
truncated and missing terminal punctuation and a clear conjunction; update the
Filippino string for the key "invitation_fee_noncontested_message" to match the
default/values/ source by replacing the ambiguous comma with "o" (or) between
the two criteria and add a period at the end so the sentence reads clearly and
completes the thought.
- Around line 534-538: Add the missing Filipino translations for the three
string resources used in the instant username flow:
create_instant_username_title, create_instant_username_description, and
create_instant_username_button; locate the nearby existing keys like
create_instant_username_cancel and accept_invitation_create in
strings-dashpay.xml and insert the three new <string
name="create_instant_username_title">, <string
name="create_instant_username_description">, and <string
name="create_instant_username_button"> entries with appropriate Filipino text so
the locale matches other translations and prevents English fallback.

In `@wallet/res/values-fr/strings-dashpay.xml`:
- Line 533: The string resource request_username_invitation_not_mixed_message
uses the masculine past participle "créé"; change it to the feminine form
"créée" so the message reads "L'invitation a été créée avec des fonds non
mélangés" (preserve the existing escaping/quote style around the string value
and update only the word "créé" to "créée").

In `@wallet/res/values-id/strings-dashpay.xml`:
- Around line 542-545: The string resource create_instant_username_title
contains a double space between "Buat" and "sebuah"; edit the value of the
<string name="create_instant_username_title"> entry to remove the extra space so
it reads "Buat sebuah nama pengguna instan" (keep the same string name and XML
structure).

In `@wallet/res/values-ko/strings-dashpay.xml`:
- Line 537: The KO strings file only contains create_instant_username_cancel;
add the missing keys used by the new instant-username flow (e.g.,
create_instant_username_title, create_instant_username_description,
create_instant_username_confirm and request_instant_username if used) with
Korean translations so the UI does not fallback to default text; update
strings-dashpay.xml by inserting these <string name="..."> entries using
appropriate Korean text matching the tone of the existing entries and keep the
same key names (create_instant_username_title,
create_instant_username_description, create_instant_username_confirm,
request_instant_username) so the app picks them up.

In `@wallet/res/values-nl/strings-dashpay.xml`:
- Line 527: The string resource invitation_fee_noncontested contains a leading
space (" Niet betwist") which will render in the UI; remove the leading
whitespace in the value so it becomes "Niet betwist" by updating the string with
name="invitation_fee_noncontested" to trim the leading space.
- Line 454: The string resource request_username_length_requirement_noncontested
contains a leading space in its value which will show in the UI; remove the
leading space so the XML entry reads with no whitespace before "Tussen 20 en 23
tekens" (i.e., ensure the text immediately follows the closing tag marker and
there are no stray spaces or tabs inside the string value).

In `@wallet/res/values-pl/strings-dashpay.xml`:
- Around line 523-544: Fix the Polish typos in the strings: update the value of
invitation_fee_confirm_and_pay_button from "Potwiedź i zapłać" to "Potwierdź i
zapłać" and correct the gender agreement in create_instant_username_description
by changing "będzie poddane głosowaniu" to "będzie poddana głosowaniu" (since
"nazwa" is feminine); ensure both string entries
(invitation_fee_confirm_and_pay_button and create_instant_username_description)
are updated exactly and keep escaping/line breaks as in the original XML.

In `@wallet/res/values-zh-rTW/strings-dashpay.xml`:
- Around line 537-545: The two new string resources username_types_message and
create_instant_username_description contain stray "." characters after Chinese
punctuation; remove those extra periods (keep the intended Chinese punctuation
and existing \n sequences) so the UI doesn't display an extra dot—for example,
edit the values for username_types_message and
create_instant_username_description to delete the stray "." characters while
preserving line breaks and semantics.

In `@wallet/src/de/schildbach/wallet/payments/SendCoinsTaskRunner.kt`:
- Around line 450-461: The error log message inside the monitor coroutine for
sendCoins incorrectly mentions "executeDryrun"; update the string in the catch
block where AnrException.logProcessMap() is invoked (monitorJob launched with
Dispatchers.IO, using currentThread and Stopwatch) to reference "sendCoins"
instead of "executeDryrun" so the log reads something like "Failed to dump
thread traces during sendCoins" to avoid misleading diagnostics.
🧹 Nitpick comments (8)
wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.kt (1)

271-271: Consider using log.error or log.warn for send failures.

This catch block handles actual transaction send failures (crypto errors, insufficient funds mid-send, etc.). Logging these at info level may cause them to be overlooked in log analysis. log.error better reflects the severity.

The same consideration applies to line 185, though info is more defensible there since dry-run exceptions are expected user-correctable conditions.

Suggested change
-                log.info("send exception: ", ex)
+                log.error("send exception: ", ex)
wallet/src/de/schildbach/wallet/WalletApplication.java (1)

480-481: Clarify or remove the TODO comment.

The TODO "do we need this commented out for saving" is ambiguous. If strict mode is intentionally disabled (as the PR indicates), either document why it was disabled (e.g., "strict mode causes wallet save failures") or remove the commented-out code entirely.

wallet/androidTest/de/schildbach/wallet/security/SecurityGuardMultiThreadingTest.kt (1)

910-1043: Prefer @Ignore over commenting out the entire test method.

The @Ignore annotation is already imported (line 39) but unused. Commenting out 130+ lines of test code means the compiler no longer checks it, so it silently rots as APIs evolve. Wrapping with @Ignore("IV backup recovery not yet fully implemented") keeps the code compilable and visible in test reports as skipped.

wallet/src/de/schildbach/wallet/ui/main/WalletTransactionsFragment.kt (1)

430-431: Inconsistent null-safety operator on errorMessage.

Line 430 uses errorMessage?.contains(…) (safe call), but line 431 uses errorMessage.contains(…) (non-safe). Even if errorMessage is smart-cast to non-null here (from the != null check on line 412), the style is inconsistent with the rest of this block (lines 424–426, 430). Consider using ?. on line 431 as well for consistency, or dropping the redundant ?. elsewhere.

Suggested consistency fix
-                        (errorMessage?.contains("invalid quorum: quorum not found") != true ||
-                                errorMessage.contains("invalid peer certificate: certificate expired") == true)
+                        (errorMessage?.contains("invalid quorum: quorum not found") != true ||
+                                errorMessage?.contains("invalid peer certificate: certificate expired") == true)
wallet/src/de/schildbach/wallet/service/BlockchainServiceImpl.kt (1)

1937-1942: TOCTOU race on peerGroup!!.lock.isLocked — acceptable but worth a comment.

The lock state can change between the isLocked check and the removeXxxEventListener calls. Given this is a best-effort guard to avoid deadlocks during cleanup (as the comment suggests), the pragmatic approach is reasonable. Consider adding a brief inline comment that this is intentionally racy to prevent reviewer confusion in the future.

wallet/androidTest/de/schildbach/wallet/transactions/TransactionExportTest.kt (1)

71-79: Nullable updateTime fallback may silently break the assertion.

Line 73: tx.updateTime?.time ?: System.currentTimeMillis() — the test assertion on line 92 expects "1970-01-01T00:00:00Z" (epoch 0). If a future dashj update changes Transaction(params, data, offset) to return null for updateTime, the fallback to System.currentTimeMillis() will silently produce a non-zero timestamp and the assertion will fail with a confusing message.

Consider using tx.updateTime?.time ?: 0L (or asserting updateTime is non-null) so the test fails clearly at the metadata construction site rather than at the CSV string comparison.

Proposed fix
         val txMetadata = TransactionMetadata(
             tx.txId,
-            tx.updateTime?.time ?: System.currentTimeMillis(),
+            tx.updateTime?.time ?: 0L,
             tx.outputSum,
wallet/src/de/schildbach/wallet/transactions/WalletObserver.kt (1)

140-140: Consider removing commented-out code rather than leaving it in.

Lines 140, 145, 157, and 216–217 all contain commented-out log statements or a commented-out removeManualNotifyConfidenceChangeTransaction call. If this code is no longer needed, removing it keeps the file cleaner; if it's useful for debugging, a log.debug/log.trace guarded by level is preferable to commented-out lines.

Also applies to: 145-145, 157-157, 216-217

Gemfile (1)

11-11: Consider pinning the nkf gem version for reproducible builds.

The other gems (fastlane, abbrev) specify version constraints, but nkf is unpinned. Adding a version constraint (e.g., gem "nkf", "~> 0.2.0") would keep builds reproducible and consistent with the rest of the Gemfile.

Comment on lines 194 to 195
<string name="purchase_check_current_balance">Δείτε τις λεπτομέρειες της κάρτας</string>
<string name="purchase_card_number">Αριθμός κάρτας</string>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Confirm the CTA text for checking gift-card balance.
purchase_check_current_balance currently reads “Δείτε τις λεπτομέρειες της κάρτας” (see card details). If this is shown for balance checks, consider adjusting the copy to reflect that action.

🤖 Prompt for AI Agents
In `@features/exploredash/src/main/res/values-el/strings-explore-dash.xml` around
lines 194 - 195, The string resource purchase_check_current_balance currently
reads "Δείτε τις λεπτομέρειες της κάρτας" which implies viewing card details;
update the value to explicitly indicate checking a gift-card balance (e.g.,
"Ελέγξτε το υπόλοιπο της κάρτας" or another approved translation) in the
strings-explore-dash.xml so the CTA matches the balance-check action; ensure
purchase_check_current_balance is used consistently where balance checks are
shown and adjust any related copy (purchase_card_number) only if needed for
context.

<string name="explore_pay_with_dash">Plaťte pomocou Dash</string>
<string name="explore_pay_with_dash_save">Uložiť %.2f%%</string>
<string name="explore_buy_gift_card">Kúpiť darčekovú kartu</string>
<string name="explore_buy_gift_card">Kúpiť darčekovú poukážku</string>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Inconsistent terminology: many strings still use "karta" instead of "poukážka".

The changed lines consistently update gift card references from "karta" (card) to "poukážka" (voucher), but numerous unchanged strings in the same file still use the old terminology. For example:

  • Line 82: ctx_gift_cards — "Darčekové karty CTX"
  • Line 84: explore_payment_gift_card — "Darčeková karta"
  • Line 85: explore_filter_gift_cards — "Darčekové karty"
  • Line 93: explore_pay_gift_card — "Plaťte darčekovou kartou"
  • Line 95: gift_card_types — "Typy darčekových kariet"
  • Line 196: purchase_gift_card_total_label — "Darčeková karta spolu"
  • Line 200: purchase_gift_card_details — "Podrobnosti darčekovej karty"
  • Line 235: gift_card_purchase_failed — "Nákup darčekovej karty zlyhal"
  • Line 239: gift_card_out_of_stock_error — "Táto darčeková karta je vypredaná"
  • Line 254: barcode_placeholder — "…darčekovej karte"

This mixed usage will confuse Slovak-speaking users who see both "poukážka" and "karta" for the same concept within the app.

Also applies to: 162-169, 191-191, 206-207, 225-225, 238-245, 262-262

🤖 Prompt for AI Agents
In `@features/exploredash/src/main/res/values-sk/strings-explore-dash.xml` at line
69, The file mixes two terms for gift card — "karta"/"karty" and the new
"poukážka"/"poukážky" — causing inconsistent UX; update the remaining string
resources (e.g., ctx_gift_cards, explore_payment_gift_card,
explore_filter_gift_cards, explore_pay_gift_card, gift_card_types,
purchase_gift_card_total_label, purchase_gift_card_details,
gift_card_purchase_failed, gift_card_out_of_stock_error, barcode_placeholder and
the groups around lines 162-169, 191, 206-207, 225, 238-245, 262) to use
"poukážka"/"poukážky" with correct Slovak forms and grammar, keeping the
already-changed explore_buy_gift_card terminology, and run a quick grep through
strings-explore-dash.xml to ensure no residual "karta"/"karty" remain.

Comment on lines 57 to 58
<string name="invitation_username_already_found_voting_title">Nutzername bereits angefragt</string>
<string name="invitation_username_already_found_voting_message">Du kannst diese Einladung nicht beanspruchen, da du bereits einen Dash-Nutzernamen hast.</string>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Align the German message with the “already requested” state.
Line 58 currently says the user already has a username, which conflicts with the key meaning (“already requested”).

Proposed fix
-    <string name="invitation_username_already_found_voting_message">Du kannst diese Einladung nicht beanspruchen, da du bereits einen Dash-Nutzernamen hast.</string>
+    <string name="invitation_username_already_found_voting_message">Du kannst diese Einladung nicht beanspruchen, da du bereits einen Dash-Nutzernamen beantragt hast.</string>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<string name="invitation_username_already_found_voting_title">Nutzername bereits angefragt</string>
<string name="invitation_username_already_found_voting_message">Du kannst diese Einladung nicht beanspruchen, da du bereits einen Dash-Nutzernamen hast.</string>
<string name="invitation_username_already_found_voting_title">Nutzername bereits angefragt</string>
<string name="invitation_username_already_found_voting_message">Du kannst diese Einladung nicht beanspruchen, da du bereits einen Dash-Nutzernamen beantragt hast.</string>
🤖 Prompt for AI Agents
In `@wallet/res/values-de/strings-dashpay.xml` around lines 57 - 58, The message
for string name "invitation_username_already_found_voting_message" is
inconsistent with the key (it says the user already has a username); update its
German text to reflect the “already requested” state instead—e.g., change the
value for invitation_username_already_found_voting_message so it reads that the
user has already requested/asked for this Dash username (for example: "Du kannst
diese Einladung nicht beanspruchen, da du diesen Dash‑Nutzernamen bereits
angefragt hast.").

Comment on lines 536 to 537
<string name="username_types_title">Τι είναι τα αμφισβητούμενα και μη αμφισβητούμενα ονόματα χρήστη;</string>
<string name="username_types_message">Υπάρχουν δύο τύποι ονομάτων χρήστη: αμφισβητούμενα και μη αμφισβητούμενα.\n\nΤα μη αμφισβητούμενα ονόματα χρηστών έχουν τουλάχιστον έναν αριθμό (2-9) ή είναι μεγαλύτερα από 20 χαρακτήρες και θα εγκριθούν αυτόματα..\n\nΑν θέλετε να δημιουργήσετε ένα αμφισβητούμενο όνομα χρήστη που είναι μικρότερο και χωρίς αριθμούς, πρέπει να εγγραφείτε στο DashPay χωρίς πρόσκληση, να πληρώσετε το απαιτούμενο τέλος και να περιμένετε την έγκριση μετά την ολοκλήρωση της περιόδου ψηφοφορίας.</string>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Remove the double period in username_types_message.
There’s a .. after “θα εγκριθούν αυτόματα..” that will display in the UI.

Proposed fix
-    <string name="username_types_message">Υπάρχουν δύο τύποι ονομάτων χρήστη: αμφισβητούμενα και μη αμφισβητούμενα.\n\nΤα μη αμφισβητούμενα ονόματα χρηστών έχουν τουλάχιστον έναν αριθμό (2-9) ή είναι μεγαλύτερα από 20 χαρακτήρες και θα εγκριθούν αυτόματα..\n\nΑν θέλετε να δημιουργήσετε ένα αμφισβητούμενο όνομα χρήστη που είναι μικρότερο και χωρίς αριθμούς, πρέπει να εγγραφείτε στο DashPay χωρίς πρόσκληση, να πληρώσετε το απαιτούμενο τέλος και να περιμένετε την έγκριση μετά την ολοκλήρωση της περιόδου ψηφοφορίας.</string>
+    <string name="username_types_message">Υπάρχουν δύο τύποι ονομάτων χρήστη: αμφισβητούμενα και μη αμφισβητούμενα.\n\nΤα μη αμφισβητούμενα ονόματα χρηστών έχουν τουλάχιστον έναν αριθμό (2-9) ή είναι μεγαλύτερα από 20 χαρακτήρες και θα εγκριθούν αυτόματα.\n\nΑν θέλετε να δημιουργήσετε ένα αμφισβητούμενο όνομα χρήστη που είναι μικρότερο και χωρίς αριθμούς, πρέπει να εγγραφείτε στο DashPay χωρίς πρόσκληση, να πληρώσετε το απαιτούμενο τέλος και να περιμένετε την έγκριση μετά την ολοκλήρωση της περιόδου ψηφοφορίας.</string>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<string name="username_types_title">Τι είναι τα αμφισβητούμενα και μη αμφισβητούμενα ονόματα χρήστη;</string>
<string name="username_types_message">Υπάρχουν δύο τύποι ονομάτων χρήστη: αμφισβητούμενα και μη αμφισβητούμενα.\n\nΤα μη αμφισβητούμενα ονόματα χρηστών έχουν τουλάχιστον έναν αριθμό (2-9) ή είναι μεγαλύτερα από 20 χαρακτήρες και θα εγκριθούν αυτόματα..\n\nΑν θέλετε να δημιουργήσετε ένα αμφισβητούμενο όνομα χρήστη που είναι μικρότερο και χωρίς αριθμούς, πρέπει να εγγραφείτε στο DashPay χωρίς πρόσκληση, να πληρώσετε το απαιτούμενο τέλος και να περιμένετε την έγκριση μετά την ολοκλήρωση της περιόδου ψηφοφορίας.</string>
<string name="username_types_title">Τι είναι τα αμφισβητούμενα και μη αμφισβητούμενα ονόματα χρήστη;</string>
<string name="username_types_message">Υπάρχουν δύο τύποι ονομάτων χρήστη: αμφισβητούμενα και μη αμφισβητούμενα.\n\nΤα μη αμφισβητούμενα ονόματα χρηστών έχουν τουλάχιστον έναν αριθμό (2-9) ή είναι μεγαλύτερα από 20 χαρακτήρες και θα εγκριθούν αυτόματα.\n\nΑν θέλετε να δημιουργήσετε ένα αμφισβητούμενο όνομα χρήστη που είναι μικρότερο και χωρίς αριθμούς, πρέπει να εγγραφείτε στο DashPay χωρίς πρόσκληση, να πληρώσετε το απαιτούμενο τέλος και να περιμένετε την έγκριση μετά την ολοκλήρωση της περιόδου ψηφοφορίας.</string>
🤖 Prompt for AI Agents
In `@wallet/res/values-el/strings-dashpay.xml` around lines 536 - 537, The string
resource username_types_message contains a typographical error: a double period
("..") after "θα εγκριθούν αυτόματα.."; edit the <string
name="username_types_message"> value to replace the double period with a single
period (ensure proper spacing and punctuation remain intact) so the UI displays
"θα εγκριθούν αυτόματα." instead of "θα εγκριθούν αυτόματα..".

Comment on lines 338 to 340
<string name="welcome_screen_title_1">Στείλτε και λάβετε Dash χωρίς μέσω ονομάτων χρήσης</string>
<string name="welcome_screen_title_2">Ξοδέψτε Dash σε χιλιάδες καταστήματα</string>
<string name="welcome_screen_title_3">Ο ασφαλέστερος τρόπος για να αποθηκεύσετε τα Dash σας</string>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix the wording in the first welcome title.

“χωρίς μέσω” is grammatically contradictory. Consider dropping “χωρίς” so the phrase reads naturally as “via usernames”.

✏️ Suggested fix
-    <string name="welcome_screen_title_1">Στείλτε και λάβετε Dash χωρίς μέσω ονομάτων χρήσης</string>
+    <string name="welcome_screen_title_1">Στείλτε και λάβετε Dash μέσω ονομάτων χρήσης</string>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<string name="welcome_screen_title_1">Στείλτε και λάβετε Dash χωρίς μέσω ονομάτων χρήσης</string>
<string name="welcome_screen_title_2">Ξοδέψτε Dash σε χιλιάδες καταστήματα</string>
<string name="welcome_screen_title_3">Ο ασφαλέστερος τρόπος για να αποθηκεύσετε τα Dash σας</string>
<string name="welcome_screen_title_1">Στείλτε και λάβετε Dash μέσω ονομάτων χρήσης</string>
<string name="welcome_screen_title_2">Ξοδέψτε Dash σε χιλιάδες καταστήματα</string>
<string name="welcome_screen_title_3">Ο ασφαλέστερος τρόπος για να αποθηκεύσετε τα Dash σας</string>
🤖 Prompt for AI Agents
In `@wallet/res/values-el/strings-extra.xml` around lines 338 - 340, Update the
Greek string resource welcome_screen_title_1 to remove the contradictory word
"χωρίς" so it reads naturally as "Στείλτε και λάβετε Dash μέσω ονομάτων χρήσης"
(or use "μέσω ονομάτων χρήστη" if preferred for singular/plural consistency);
edit the value for string name="welcome_screen_title_1" accordingly to reflect
the corrected wording.

<string name="request_username_requirements_message_invite_noncontested">De gebruikersnaam moet aan een van deze criteria voldoen</string>
<string name="request_username_requirements_message">De gebruikersnaam moet aan deze criteria voldoen</string>
<string name="request_username_length_requirement">Tussen 3 en 23 tekens</string>
<string name="request_username_length_requirement_noncontested"> Tussen 20 en 23 tekens</string>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Leading whitespace in string value will appear in the UI.

The string value starts with a space ( Tussen 20 en 23 tekens), which will render as extra leading whitespace in the UI.

Proposed fix
-    <string name="request_username_length_requirement_noncontested"> Tussen 20 en 23 tekens</string>
+    <string name="request_username_length_requirement_noncontested">Tussen 20 en 23 tekens</string>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<string name="request_username_length_requirement_noncontested"> Tussen 20 en 23 tekens</string>
<string name="request_username_length_requirement_noncontested">Tussen 20 en 23 tekens</string>
🤖 Prompt for AI Agents
In `@wallet/res/values-nl/strings-dashpay.xml` at line 454, The string resource
request_username_length_requirement_noncontested contains a leading space in its
value which will show in the UI; remove the leading space so the XML entry reads
with no whitespace before "Tussen 20 en 23 tekens" (i.e., ensure the text
immediately follows the closing tag marker and there are no stray spaces or tabs
inside the string value).

<string name="transaction_metadata_continue_without_saving">Doorgaan zonder op te slaan</string>
<string name="invitation_fee_title">Vergoeding uitnodiging</string>
<string name="invitation_fee_message">Elke uitnodiging wordt gefinancierd zodat de ontvanger snel zijn gebruikersnaam op het Dash netwerk kan aanmaken.</string>
<string name="invitation_fee_noncontested"> Niet betwist</string>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Leading whitespace in string value will appear in the UI.

Same issue here: Niet betwist has a leading space that will be rendered.

Proposed fix
-    <string name="invitation_fee_noncontested"> Niet betwist</string>
+    <string name="invitation_fee_noncontested">Niet betwist</string>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<string name="invitation_fee_noncontested"> Niet betwist</string>
<string name="invitation_fee_noncontested">Niet betwist</string>
🤖 Prompt for AI Agents
In `@wallet/res/values-nl/strings-dashpay.xml` at line 527, The string resource
invitation_fee_noncontested contains a leading space (" Niet betwist") which
will render in the UI; remove the leading whitespace in the value so it becomes
"Niet betwist" by updating the string with name="invitation_fee_noncontested" to
trim the leading space.

Comment on lines 523 to 544
<string name="invitation_fee_title">Opłata za zaproszenie</string>
<string name="invitation_fee_message">Każde zaproszenie zostanie sfinansowane tak, aby odbiorca mógł szybko utworzyć swoją nazwę użytkownika w sieci Dash.</string>
<string name="invitation_fee_noncontested">Bezsporny</string>
<string name="invitation_fee_contested">Sporny</string>
<string name="invitation_fee_contested_message">Osoba, do której wysyłasz zaproszenie, może poprosić o podanie dowolnej nazwy użytkownika, a sieć zagłosuje nad jej zatwierdzeniem.</string>
<string name="invitation_fee_noncontested_message">Osoba, do której wysyłasz to zaproszenie, może poprosić o nazwę użytkownika składającą się z cyfr 2-9 i dłuższą niż 20 znaków.</string>
<string name="invitation_creating_progress_loading">Ładuje zaproszenie...</string>
<string name="invitation_creating_progress_wip">Tworzenie zaproszenia</string>
<string name="invitation_fee_confirm_and_pay_button">Potwiedź i zapłać</string>
<string name="error_sending_invite_transaction">Błąd w wysyłaniu transakcji zaproszenia</string>
<string name="request_username_invitation_not_mixed_message">Zaproszenie zostało stworzone z niewymieszanych środków</string>
<string name="request_username_invitation_only_noncontested_message">Za pomocą tego zaproszenia możesz tylko utworzyć bezsporną nazwę użytkownika</string>
<string name="username_types_title">Czym są sporne i bezsporne nazwy użytkownika\?</string>
<string name="username_types_message">Istnieją dwa rodzaje nazw użytkowników: sporne i bezsporne.\n\nNazwy użytkowników bezsporne mają co najmniej jedną cyfrę (2-9) lub są dłuższe niż 20 znaków i zostaną automatycznie zatwierdzone.\n\nJeśli chcesz utworzyć sporną nazwę użytkownika, która jest krótsza i bez cyfr, musisz zarejestrować się w DashPay bez zaproszenia, zapłacić wymaganą opłatę i poczekać na zatwierdzenie po zakończeniu okresu głosowania.</string>
<string name="accept_invitation_hide">Ukryj</string>
<string name="accept_invitation_create">Stwórz</string>

<!-- Create Instant Username Dialog -->
<string name="create_instant_username_title">Stwórz natychmiastową nazwę użytkownika</string>
<string name="create_instant_username_description">Twoja wybrana nazwa użytkownika będzie poddane głosowaniu przez 2 tygodnie. Do natychmiastowych kontaktów i płatności możesz utworzyć podobną natychmiastową nazwę użytkownika.\n\nJeśli Twoja pierwotna prośba zostanie zatwierdzona, zastąpi ona natychmiastową nazwę użytkownika, zachowując kontakty i historię. W przeciwnym razie możesz ciągle korzystać z tej samej natychmiastowej nazwy.</string>
<string name="create_instant_username_button">Stwórz natychmiastową nazwę użytkownika</string>
<string name="create_instant_username_cancel">Anuluj</string>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Typo in invitation_fee_confirm_and_pay_button: "Potwiedź" should be "Potwierdź".

Line 531: The Polish word is missing the letter "r" — PotwiedźPotwierdź.

Also, Line 542 has a grammatical mismatch: "nazwa użytkownika będzie poddane" should be "będzie poddana" since "nazwa" is feminine.

Proposed fixes
-    <string name="invitation_fee_confirm_and_pay_button">Potwiedź i zapłać</string>
+    <string name="invitation_fee_confirm_and_pay_button">Potwierdź i zapłać</string>
-    <string name="create_instant_username_description">Twoja wybrana nazwa użytkownika będzie poddane głosowaniu przez 2 tygodnie. Do natychmiastowych kontaktów i płatności możesz utworzyć podobną natychmiastową nazwę użytkownika.\n\nJeśli Twoja pierwotna prośba zostanie zatwierdzona, zastąpi ona natychmiastową nazwę użytkownika, zachowując kontakty i historię. W przeciwnym razie możesz ciągle korzystać z tej samej natychmiastowej nazwy.</string>
+    <string name="create_instant_username_description">Twoja wybrana nazwa użytkownika będzie poddana głosowaniu przez 2 tygodnie. Do natychmiastowych kontaktów i płatności możesz utworzyć podobną natychmiastową nazwę użytkownika.\n\nJeśli Twoja pierwotna prośba zostanie zatwierdzona, zastąpi ona natychmiastową nazwę użytkownika, zachowując kontakty i historię. W przeciwnym razie możesz ciągle korzystać z tej samej natychmiastowej nazwy.</string>
🤖 Prompt for AI Agents
In `@wallet/res/values-pl/strings-dashpay.xml` around lines 523 - 544, Fix the
Polish typos in the strings: update the value of
invitation_fee_confirm_and_pay_button from "Potwiedź i zapłać" to "Potwierdź i
zapłać" and correct the gender agreement in create_instant_username_description
by changing "będzie poddane głosowaniu" to "będzie poddana głosowaniu" (since
"nazwa" is feminine); ensure both string entries
(invitation_fee_confirm_and_pay_button and create_instant_username_description)
are updated exactly and keep escaping/line breaks as in the original XML.

Comment on lines 537 to 545
<string name="username_types_message">用戶名有兩種類型:有爭議的和沒有爭議的。.\n\n沒有爭議的用戶名至少有一個數字(2-9)或超過20個字符,該用戶名稱將自動批准.\n\n如果您想創建一個較短且沒有數字的有爭議的用戶名,則需要在沒有邀請的情況下註冊Dashpay,支付所需的費用並在投票期完成後等待批准。</string>
<string name="accept_invitation_hide">隱藏</string>
<string name="accept_invitation_create">創建</string>

<!-- Create Instant Username Dialog -->
<string name="create_instant_username_title">創建即時用戶名</string>
<string name="create_instant_username_description">您請求的用戶名將在 2 週內進行投票。為了立即聯繫和付款,您可以創建類似的即時用戶名。.\n\n如果您的原始請求獲得批准,它將取代即時用戶名,並保留聯繫人和歷史記錄。如果沒有獲批,請繼續使用即時用戶名。</string>
<string name="create_instant_username_button">創建即時用戶名</string>
<string name="create_instant_username_cancel">取消</string>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Remove the stray “.” punctuation in the new messages.
Some of the added strings include extra periods after Chinese punctuation, which will show up in the UI.

Proposed fix
-    <string name="username_types_message">用戶名有兩種類型:有爭議的和沒有爭議的。.\n\n沒有爭議的用戶名至少有一個數字(2-9)或超過20個字符,該用戶名稱將自動批准.\n\n如果您想創建一個較短且沒有數字的有爭議的用戶名,則需要在沒有邀請的情況下註冊Dashpay,支付所需的費用並在投票期完成後等待批准。</string>
+    <string name="username_types_message">用戶名有兩種類型:有爭議的和沒有爭議的。\n\n沒有爭議的用戶名至少有一個數字(2-9)或超過20個字符,該用戶名稱將自動批准。\n\n如果您想創建一個較短且沒有數字的有爭議的用戶名,則需要在沒有邀請的情況下註冊Dashpay,支付所需的費用並在投票期完成後等待批准。</string>
-    <string name="create_instant_username_description">您請求的用戶名將在 2 週內進行投票。為了立即聯繫和付款,您可以創建類似的即時用戶名。.\n\n如果您的原始請求獲得批准,它將取代即時用戶名,並保留聯繫人和歷史記錄。如果沒有獲批,請繼續使用即時用戶名。</string>
+    <string name="create_instant_username_description">您請求的用戶名將在 2 週內進行投票。為了立即聯繫和付款,您可以創建類似的即時用戶名。\n\n如果您的原始請求獲得批准,它將取代即時用戶名,並保留聯繫人和歷史記錄。如果沒有獲批,請繼續使用即時用戶名。</string>
🤖 Prompt for AI Agents
In `@wallet/res/values-zh-rTW/strings-dashpay.xml` around lines 537 - 545, The two
new string resources username_types_message and
create_instant_username_description contain stray "." characters after Chinese
punctuation; remove those extra periods (keep the intended Chinese punctuation
and existing \n sequences) so the UI doesn't display an extra dot—for example,
edit the values for username_types_message and
create_instant_username_description to delete the stray "." characters while
preserving line breaks and semantics.

Comment on lines +450 to +461
val watch = Stopwatch.createStarted()
val currentThread = Thread.currentThread()
val monitorJob = launch(Dispatchers.IO) {
delay(1000)
log.warn("sendCoins is taking longer than 1 second")
try {
val anrException = AnrException(currentThread)
anrException.logProcessMap()
} catch (e: Exception) {
log.error("Failed to dump thread traces during executeDryrun", e)
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Copy-paste error in log message: "executeDryrun" should be "sendCoins".

Line 459 references executeDryrun, but this monitor is in the sendCoins method. This will be misleading when diagnosing production logs.

Proposed fix
-                log.error("Failed to dump thread traces during executeDryrun", e)
+                log.error("Failed to dump thread traces during sendCoins", e)
🤖 Prompt for AI Agents
In `@wallet/src/de/schildbach/wallet/payments/SendCoinsTaskRunner.kt` around lines
450 - 461, The error log message inside the monitor coroutine for sendCoins
incorrectly mentions "executeDryrun"; update the string in the catch block where
AnrException.logProcessMap() is invoked (monitorJob launched with
Dispatchers.IO, using currentThread and Stopwatch) to reference "sendCoins"
instead of "executeDryrun" so the log reads something like "Failed to dump
thread traces during sendCoins" to avoid misleading diagnostics.

Copy link

@abaranouski abaranouski left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

verified

@HashEngineering HashEngineering changed the title Fix/faster coinjoin send fix: faster coinjoin sends Feb 17, 2026
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@wallet/src/de/schildbach/wallet/payments/SendCoinsTaskRunner.kt`:
- Around line 607-618: The catch block in SendCoinsTaskRunner's monitor
coroutine logs the wrong operation name ("executeDryrun"); update the error
message in the log.error call inside the monitorJob coroutine to reference
"sendCoins" instead of "executeDryrun" (locate the catch in the coroutine
started with launch(Dispatchers.IO) where
AnrException(currentThread).logProcessMap() is called and change the message
passed to log.error accordingly).

@HashEngineering HashEngineering merged commit c1ef6f1 into master Feb 17, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants