fix: send source & fee progress ui/ux - #1195

Merged
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui
Aug 31, 2026
Merged

fix: send source & fee progress ui/ux#1195
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui

Conversation

@ovitrif

@ovitrifovitrif commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

Description

This PR polishes the Trezor send UI from #1187, where switching to hardware left a rough loading chip: the track vanished, the label disappeared behind a spinner, and a Material ripple flashed while the device warmed up.

This PR:

  1. Rebuilds that funding-source chip so switching to Trezor keeps the filled track, animates the label width as the name appears, and swaps only the transfer icon for a small tinted spinner. Savings and Spending switches stay instant, with no loader flash.
  2. Replaces the fee-rate icon with a matching spinner and keeps the previous fee text until the next estimate lands.
  3. Keeps swipe-to-confirm's gradient track visible after switching to Trezor.
  4. Refactors onchain fee UI logic to group fee rate, sats, estimates, and loading into one state.
  5. Pops Speed immediately after a rate is chosen, matching iOS's tap-to-select flow, while blocking conflicting hardware send actions until the new maximum and fee are ready.
  6. Keeps the Trezor source chip filled while Amount Continue prepares the hardware fee.

Preview

hwwSendUiFix.mp4

Linked Issues/Tasks

Fixes#1203

QA Notes

Manual Tests

  • 1. Send Amount or Confirm → switch to Trezor: the chip keeps its filled track, the label stays visible and animates to the Trezor name, and a small tinted spinner replaces only the transfer icon until the device fee is ready.
  • 2a. Send Confirm → switch Trezor → Spending: no source loader flash.
    • 2b. Send Confirm → switch Trezor → Savings: no source loader flash.
  • 3. Send Confirm → switch Spending → Savings: swipe-to-confirm does not dim or flash.
  • 4.regression: after Trezor is selected and loading ends: swipe-to-confirm keeps its gradient track and can still be swiped.
  • 5. Trezor Send Amount → Continue: the Trezor chip stays filled with no blue outline until Confirm.
  • 6. Trezor Send Confirm → Speed → pick another rate: Speed closes immediately like iOS, Confirm keeps the previous fee with a spinner, and speed, source, and swipe actions remain blocked until the new fee lands.
  • 7a.regression: Savings Send Confirm → Speed: Fast, Normal, and Slow still show estimates like master, and the current rate stays selected.
    • 7b.regression: Savings Send Confirm → Speed → pick Fast, Normal, or Slow: returns to Confirm and the fee/speed row updates.
    • 7c.regression: Savings Send Confirm → Speed → Custom → set a valid rate → Continue: Confirm shows the custom fee.
    • 7d.regression: Savings Send Fee Custom → rate below min or above max: toast blocks continue, same as master.
    • 7e.regression: Savings Send Confirm → Speed → back without changing: Confirm fee and speed stay the same.
  • 8.regression: unified Send Confirm → Speed → Instant: still switches to Spending like master.

Automated Checks

  • Unit tests added or extended in AppViewModelSendFlowTest.kt: cover hardware-only source loading, keeping a valid amount while Savings refreshes, retaining the previous on-chain fee while estimates refresh, returning from Speed before hardware max finishes, resetting selected UTXOs from the previous rate, and confirming that a missing hardware fee does not block navigation to signing.
  • Instrumented tests added or updated in SendAmountContentTest.kt: use the funding-source loading flag to disable source and continue, and ignore source-chip taps while Amount Continue is loading.
  • Unit tests updated in SendFeeViewModelTest.kt: fee-sheet init still disables unaffordable rates and validates custom min/max against the unified on-chain fee estimates.
  • CI: standard compile, unit test, and detekt checks run by the PR bot.

@ovitrifovitrif changed the title fix: polish send source and fee uifix: send source & fee loading ui/uxAug 28, 2026
@ovitrifovitrif changed the title fix: send source & fee loading ui/uxfix: send source & fee progress ui/uxAug 28, 2026
@ovitrif
ovitrif marked this pull request as ready for review August 28, 2026 21:40
@ovitrifovitrif self-assigned this Aug 28, 2026
Base automatically changed from feat/trezor-send to masterAugust 28, 2026 21:41
@ovitrifovitrif added this to the 2.5.0 milestone Aug 28, 2026
@greptile-apps

Copy link
Copy Markdown

Greptile Summary

The PR refines send-flow loading presentation and consolidates on-chain fee data into a single UI state while making fee selection return to confirmation immediately.

  • Keeps funding-source labels and swipe tracks visible during Trezor preparation.
  • Adds tinted inline progress indicators for source and fee refreshes.
  • Refactors on-chain estimates, selected fee, and loading status into OnchainFeeUi.
  • Updates send-flow and fee-selection tests for the new state model.

Confidence Score: 4/5

The hardware send path should not be merged until failed fee estimates stop turning swipe-to-confirm into a silent no-op.

The refactor filters unsuccessful hardware fee estimates to null, while the confirmation path treats null as an unconditional return without navigation, retry, or user-visible error.

Files Needing Attention: app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

Important Files Changed

FilenameOverview
app/src/main/java/to/bitkit/viewmodels/AppViewModel.ktConsolidates send fee state and adjusts asynchronous source/speed refreshes, but failed hardware estimates can now silently block confirmation.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.ktReworks source and fee loading presentation around the unified fee state.
app/src/main/java/to/bitkit/ui/components/NumberPadActionButton.ktReplaces the Material button wrapper with a stable custom row that preserves its label and track while loading.
app/src/main/java/to/bitkit/ui/components/SwipeToConfirm.ktMoves disabled alpha to inner content so the gradient track remains fully visible.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendFeeViewModel.ktReads selected rate and estimates from the new unified on-chain fee state.
app/src/test/java/to/bitkit/viewmodels/AppViewModelSendFlowTest.ktAdds coverage for source loading, retained fee display, immediate navigation, and UTXO reset behavior.

Sequence Diagram

sequenceDiagram
participant User
participant FeeSheet
participant AppVM as AppViewModel
participant Wallet as Fee estimator
participant Confirm
User->>FeeSheet: Select transaction speed
FeeSheet->>AppVM: setTransactionSpeed(speed)
AppVM->>AppVM: Set speed and loading state
AppVM-->>Confirm: Pop back immediately
AppVM->>Wallet: Refresh max spendable and fee estimates
Wallet-->>AppVM: Updated estimates
AppVM->>AppVM: Replace OnchainFeeUi
AppVM-->>Confirm: Render selected fee
Loading

Reviews (1): Last reviewed commit: "test: cover amount continue and speed re..." | Re-trigger Greptile

Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

@piotr-iohkpiotr-iohk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

Source chip stays filled with an icon-only spinner on Trezor, no flash switching back to Spending/Savings, swipe keeps its track after load, and Speed pops immediately while the previous fee stays until the new estimate lands.

@ovitrif
ovitrif merged commit 7e0b4c4 into masterAug 31, 2026
18 checks passed
Sign up for freeto 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.

Trezor send UI polish

3 participants

@ovitrif@ben-kaufman@piotr-iohk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: send source & fee progress ui/ux - #1195

Merged
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui
Aug 31, 2026
Merged

fix: send source & fee progress ui/ux#1195
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui

Conversation

@ovitrif

@ovitrifovitrif commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

Description

This PR polishes the Trezor send UI from #1187, where switching to hardware left a rough loading chip: the track vanished, the label disappeared behind a spinner, and a Material ripple flashed while the device warmed up.

This PR:

  1. Rebuilds that funding-source chip so switching to Trezor keeps the filled track, animates the label width as the name appears, and swaps only the transfer icon for a small tinted spinner. Savings and Spending switches stay instant, with no loader flash.
  2. Replaces the fee-rate icon with a matching spinner and keeps the previous fee text until the next estimate lands.
  3. Keeps swipe-to-confirm's gradient track visible after switching to Trezor.
  4. Refactors onchain fee UI logic to group fee rate, sats, estimates, and loading into one state.
  5. Pops Speed immediately after a rate is chosen, matching iOS's tap-to-select flow, while blocking conflicting hardware send actions until the new maximum and fee are ready.
  6. Keeps the Trezor source chip filled while Amount Continue prepares the hardware fee.

Preview

hwwSendUiFix.mp4

Linked Issues/Tasks

Fixes#1203

QA Notes

Manual Tests

  • 1. Send Amount or Confirm → switch to Trezor: the chip keeps its filled track, the label stays visible and animates to the Trezor name, and a small tinted spinner replaces only the transfer icon until the device fee is ready.
  • 2a. Send Confirm → switch Trezor → Spending: no source loader flash.
    • 2b. Send Confirm → switch Trezor → Savings: no source loader flash.
  • 3. Send Confirm → switch Spending → Savings: swipe-to-confirm does not dim or flash.
  • 4.regression: after Trezor is selected and loading ends: swipe-to-confirm keeps its gradient track and can still be swiped.
  • 5. Trezor Send Amount → Continue: the Trezor chip stays filled with no blue outline until Confirm.
  • 6. Trezor Send Confirm → Speed → pick another rate: Speed closes immediately like iOS, Confirm keeps the previous fee with a spinner, and speed, source, and swipe actions remain blocked until the new fee lands.
  • 7a.regression: Savings Send Confirm → Speed: Fast, Normal, and Slow still show estimates like master, and the current rate stays selected.
    • 7b.regression: Savings Send Confirm → Speed → pick Fast, Normal, or Slow: returns to Confirm and the fee/speed row updates.
    • 7c.regression: Savings Send Confirm → Speed → Custom → set a valid rate → Continue: Confirm shows the custom fee.
    • 7d.regression: Savings Send Fee Custom → rate below min or above max: toast blocks continue, same as master.
    • 7e.regression: Savings Send Confirm → Speed → back without changing: Confirm fee and speed stay the same.
  • 8.regression: unified Send Confirm → Speed → Instant: still switches to Spending like master.

Automated Checks

  • Unit tests added or extended in AppViewModelSendFlowTest.kt: cover hardware-only source loading, keeping a valid amount while Savings refreshes, retaining the previous on-chain fee while estimates refresh, returning from Speed before hardware max finishes, resetting selected UTXOs from the previous rate, and confirming that a missing hardware fee does not block navigation to signing.
  • Instrumented tests added or updated in SendAmountContentTest.kt: use the funding-source loading flag to disable source and continue, and ignore source-chip taps while Amount Continue is loading.
  • Unit tests updated in SendFeeViewModelTest.kt: fee-sheet init still disables unaffordable rates and validates custom min/max against the unified on-chain fee estimates.
  • CI: standard compile, unit test, and detekt checks run by the PR bot.

@ovitrifovitrif changed the title fix: polish send source and fee uifix: send source & fee loading ui/uxAug 28, 2026
@ovitrifovitrif changed the title fix: send source & fee loading ui/uxfix: send source & fee progress ui/uxAug 28, 2026
@ovitrif
ovitrif marked this pull request as ready for review August 28, 2026 21:40
@ovitrifovitrif self-assigned this Aug 28, 2026
Base automatically changed from feat/trezor-send to masterAugust 28, 2026 21:41
@ovitrifovitrif added this to the 2.5.0 milestone Aug 28, 2026
@greptile-apps

Copy link
Copy Markdown

Greptile Summary

The PR refines send-flow loading presentation and consolidates on-chain fee data into a single UI state while making fee selection return to confirmation immediately.

  • Keeps funding-source labels and swipe tracks visible during Trezor preparation.
  • Adds tinted inline progress indicators for source and fee refreshes.
  • Refactors on-chain estimates, selected fee, and loading status into OnchainFeeUi.
  • Updates send-flow and fee-selection tests for the new state model.

Confidence Score: 4/5

The hardware send path should not be merged until failed fee estimates stop turning swipe-to-confirm into a silent no-op.

The refactor filters unsuccessful hardware fee estimates to null, while the confirmation path treats null as an unconditional return without navigation, retry, or user-visible error.

Files Needing Attention: app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

Important Files Changed

FilenameOverview
app/src/main/java/to/bitkit/viewmodels/AppViewModel.ktConsolidates send fee state and adjusts asynchronous source/speed refreshes, but failed hardware estimates can now silently block confirmation.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.ktReworks source and fee loading presentation around the unified fee state.
app/src/main/java/to/bitkit/ui/components/NumberPadActionButton.ktReplaces the Material button wrapper with a stable custom row that preserves its label and track while loading.
app/src/main/java/to/bitkit/ui/components/SwipeToConfirm.ktMoves disabled alpha to inner content so the gradient track remains fully visible.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendFeeViewModel.ktReads selected rate and estimates from the new unified on-chain fee state.
app/src/test/java/to/bitkit/viewmodels/AppViewModelSendFlowTest.ktAdds coverage for source loading, retained fee display, immediate navigation, and UTXO reset behavior.

Sequence Diagram

sequenceDiagram
participant User
participant FeeSheet
participant AppVM as AppViewModel
participant Wallet as Fee estimator
participant Confirm
User->>FeeSheet: Select transaction speed
FeeSheet->>AppVM: setTransactionSpeed(speed)
AppVM->>AppVM: Set speed and loading state
AppVM-->>Confirm: Pop back immediately
AppVM->>Wallet: Refresh max spendable and fee estimates
Wallet-->>AppVM: Updated estimates
AppVM->>AppVM: Replace OnchainFeeUi
AppVM-->>Confirm: Render selected fee
Loading

Reviews (1): Last reviewed commit: "test: cover amount continue and speed re..." | Re-trigger Greptile

Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

@piotr-iohkpiotr-iohk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

Source chip stays filled with an icon-only spinner on Trezor, no flash switching back to Spending/Savings, swipe keeps its track after load, and Speed pops immediately while the previous fee stays until the new estimate lands.

@ovitrif
ovitrif merged commit 7e0b4c4 into masterAug 31, 2026
18 checks passed
Sign up for freeto 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.

Trezor send UI polish

3 participants

@ovitrif@ben-kaufman@piotr-iohk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: send source & fee progress ui/ux - #1195

Merged
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui
Aug 31, 2026
Merged

fix: send source & fee progress ui/ux#1195
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui

Conversation

@ovitrif

@ovitrifovitrif commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

Description

This PR polishes the Trezor send UI from #1187, where switching to hardware left a rough loading chip: the track vanished, the label disappeared behind a spinner, and a Material ripple flashed while the device warmed up.

This PR:

  1. Rebuilds that funding-source chip so switching to Trezor keeps the filled track, animates the label width as the name appears, and swaps only the transfer icon for a small tinted spinner. Savings and Spending switches stay instant, with no loader flash.
  2. Replaces the fee-rate icon with a matching spinner and keeps the previous fee text until the next estimate lands.
  3. Keeps swipe-to-confirm's gradient track visible after switching to Trezor.
  4. Refactors onchain fee UI logic to group fee rate, sats, estimates, and loading into one state.
  5. Pops Speed immediately after a rate is chosen, matching iOS's tap-to-select flow, while blocking conflicting hardware send actions until the new maximum and fee are ready.
  6. Keeps the Trezor source chip filled while Amount Continue prepares the hardware fee.

Preview

hwwSendUiFix.mp4

Linked Issues/Tasks

Fixes#1203

QA Notes

Manual Tests

  • 1. Send Amount or Confirm → switch to Trezor: the chip keeps its filled track, the label stays visible and animates to the Trezor name, and a small tinted spinner replaces only the transfer icon until the device fee is ready.
  • 2a. Send Confirm → switch Trezor → Spending: no source loader flash.
    • 2b. Send Confirm → switch Trezor → Savings: no source loader flash.
  • 3. Send Confirm → switch Spending → Savings: swipe-to-confirm does not dim or flash.
  • 4.regression: after Trezor is selected and loading ends: swipe-to-confirm keeps its gradient track and can still be swiped.
  • 5. Trezor Send Amount → Continue: the Trezor chip stays filled with no blue outline until Confirm.
  • 6. Trezor Send Confirm → Speed → pick another rate: Speed closes immediately like iOS, Confirm keeps the previous fee with a spinner, and speed, source, and swipe actions remain blocked until the new fee lands.
  • 7a.regression: Savings Send Confirm → Speed: Fast, Normal, and Slow still show estimates like master, and the current rate stays selected.
    • 7b.regression: Savings Send Confirm → Speed → pick Fast, Normal, or Slow: returns to Confirm and the fee/speed row updates.
    • 7c.regression: Savings Send Confirm → Speed → Custom → set a valid rate → Continue: Confirm shows the custom fee.
    • 7d.regression: Savings Send Fee Custom → rate below min or above max: toast blocks continue, same as master.
    • 7e.regression: Savings Send Confirm → Speed → back without changing: Confirm fee and speed stay the same.
  • 8.regression: unified Send Confirm → Speed → Instant: still switches to Spending like master.

Automated Checks

  • Unit tests added or extended in AppViewModelSendFlowTest.kt: cover hardware-only source loading, keeping a valid amount while Savings refreshes, retaining the previous on-chain fee while estimates refresh, returning from Speed before hardware max finishes, resetting selected UTXOs from the previous rate, and confirming that a missing hardware fee does not block navigation to signing.
  • Instrumented tests added or updated in SendAmountContentTest.kt: use the funding-source loading flag to disable source and continue, and ignore source-chip taps while Amount Continue is loading.
  • Unit tests updated in SendFeeViewModelTest.kt: fee-sheet init still disables unaffordable rates and validates custom min/max against the unified on-chain fee estimates.
  • CI: standard compile, unit test, and detekt checks run by the PR bot.

@ovitrifovitrif changed the title fix: polish send source and fee uifix: send source & fee loading ui/uxAug 28, 2026
@ovitrifovitrif changed the title fix: send source & fee loading ui/uxfix: send source & fee progress ui/uxAug 28, 2026
@ovitrif
ovitrif marked this pull request as ready for review August 28, 2026 21:40
@ovitrifovitrif self-assigned this Aug 28, 2026
Base automatically changed from feat/trezor-send to masterAugust 28, 2026 21:41
@ovitrifovitrif added this to the 2.5.0 milestone Aug 28, 2026
@greptile-apps

Copy link
Copy Markdown

Greptile Summary

The PR refines send-flow loading presentation and consolidates on-chain fee data into a single UI state while making fee selection return to confirmation immediately.

  • Keeps funding-source labels and swipe tracks visible during Trezor preparation.
  • Adds tinted inline progress indicators for source and fee refreshes.
  • Refactors on-chain estimates, selected fee, and loading status into OnchainFeeUi.
  • Updates send-flow and fee-selection tests for the new state model.

Confidence Score: 4/5

The hardware send path should not be merged until failed fee estimates stop turning swipe-to-confirm into a silent no-op.

The refactor filters unsuccessful hardware fee estimates to null, while the confirmation path treats null as an unconditional return without navigation, retry, or user-visible error.

Files Needing Attention: app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

Important Files Changed

FilenameOverview
app/src/main/java/to/bitkit/viewmodels/AppViewModel.ktConsolidates send fee state and adjusts asynchronous source/speed refreshes, but failed hardware estimates can now silently block confirmation.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.ktReworks source and fee loading presentation around the unified fee state.
app/src/main/java/to/bitkit/ui/components/NumberPadActionButton.ktReplaces the Material button wrapper with a stable custom row that preserves its label and track while loading.
app/src/main/java/to/bitkit/ui/components/SwipeToConfirm.ktMoves disabled alpha to inner content so the gradient track remains fully visible.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendFeeViewModel.ktReads selected rate and estimates from the new unified on-chain fee state.
app/src/test/java/to/bitkit/viewmodels/AppViewModelSendFlowTest.ktAdds coverage for source loading, retained fee display, immediate navigation, and UTXO reset behavior.

Sequence Diagram

sequenceDiagram
participant User
participant FeeSheet
participant AppVM as AppViewModel
participant Wallet as Fee estimator
participant Confirm
User->>FeeSheet: Select transaction speed
FeeSheet->>AppVM: setTransactionSpeed(speed)
AppVM->>AppVM: Set speed and loading state
AppVM-->>Confirm: Pop back immediately
AppVM->>Wallet: Refresh max spendable and fee estimates
Wallet-->>AppVM: Updated estimates
AppVM->>AppVM: Replace OnchainFeeUi
AppVM-->>Confirm: Render selected fee
Loading

Reviews (1): Last reviewed commit: "test: cover amount continue and speed re..." | Re-trigger Greptile

Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

@piotr-iohkpiotr-iohk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

Source chip stays filled with an icon-only spinner on Trezor, no flash switching back to Spending/Savings, swipe keeps its track after load, and Speed pops immediately while the previous fee stays until the new estimate lands.

@ovitrif
ovitrif merged commit 7e0b4c4 into masterAug 31, 2026
18 checks passed
Sign up for freeto 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.

Trezor send UI polish

3 participants

@ovitrif@ben-kaufman@piotr-iohk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: send source & fee progress ui/ux - #1195

Merged
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui
Aug 31, 2026
Merged

fix: send source & fee progress ui/ux#1195
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui

Conversation

@ovitrif

@ovitrifovitrif commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

Description

This PR polishes the Trezor send UI from #1187, where switching to hardware left a rough loading chip: the track vanished, the label disappeared behind a spinner, and a Material ripple flashed while the device warmed up.

This PR:

  1. Rebuilds that funding-source chip so switching to Trezor keeps the filled track, animates the label width as the name appears, and swaps only the transfer icon for a small tinted spinner. Savings and Spending switches stay instant, with no loader flash.
  2. Replaces the fee-rate icon with a matching spinner and keeps the previous fee text until the next estimate lands.
  3. Keeps swipe-to-confirm's gradient track visible after switching to Trezor.
  4. Refactors onchain fee UI logic to group fee rate, sats, estimates, and loading into one state.
  5. Pops Speed immediately after a rate is chosen, matching iOS's tap-to-select flow, while blocking conflicting hardware send actions until the new maximum and fee are ready.
  6. Keeps the Trezor source chip filled while Amount Continue prepares the hardware fee.

Preview

hwwSendUiFix.mp4

Linked Issues/Tasks

Fixes#1203

QA Notes

Manual Tests

  • 1. Send Amount or Confirm → switch to Trezor: the chip keeps its filled track, the label stays visible and animates to the Trezor name, and a small tinted spinner replaces only the transfer icon until the device fee is ready.
  • 2a. Send Confirm → switch Trezor → Spending: no source loader flash.
    • 2b. Send Confirm → switch Trezor → Savings: no source loader flash.
  • 3. Send Confirm → switch Spending → Savings: swipe-to-confirm does not dim or flash.
  • 4.regression: after Trezor is selected and loading ends: swipe-to-confirm keeps its gradient track and can still be swiped.
  • 5. Trezor Send Amount → Continue: the Trezor chip stays filled with no blue outline until Confirm.
  • 6. Trezor Send Confirm → Speed → pick another rate: Speed closes immediately like iOS, Confirm keeps the previous fee with a spinner, and speed, source, and swipe actions remain blocked until the new fee lands.
  • 7a.regression: Savings Send Confirm → Speed: Fast, Normal, and Slow still show estimates like master, and the current rate stays selected.
    • 7b.regression: Savings Send Confirm → Speed → pick Fast, Normal, or Slow: returns to Confirm and the fee/speed row updates.
    • 7c.regression: Savings Send Confirm → Speed → Custom → set a valid rate → Continue: Confirm shows the custom fee.
    • 7d.regression: Savings Send Fee Custom → rate below min or above max: toast blocks continue, same as master.
    • 7e.regression: Savings Send Confirm → Speed → back without changing: Confirm fee and speed stay the same.
  • 8.regression: unified Send Confirm → Speed → Instant: still switches to Spending like master.

Automated Checks

  • Unit tests added or extended in AppViewModelSendFlowTest.kt: cover hardware-only source loading, keeping a valid amount while Savings refreshes, retaining the previous on-chain fee while estimates refresh, returning from Speed before hardware max finishes, resetting selected UTXOs from the previous rate, and confirming that a missing hardware fee does not block navigation to signing.
  • Instrumented tests added or updated in SendAmountContentTest.kt: use the funding-source loading flag to disable source and continue, and ignore source-chip taps while Amount Continue is loading.
  • Unit tests updated in SendFeeViewModelTest.kt: fee-sheet init still disables unaffordable rates and validates custom min/max against the unified on-chain fee estimates.
  • CI: standard compile, unit test, and detekt checks run by the PR bot.

@ovitrifovitrif changed the title fix: polish send source and fee uifix: send source & fee loading ui/uxAug 28, 2026
@ovitrifovitrif changed the title fix: send source & fee loading ui/uxfix: send source & fee progress ui/uxAug 28, 2026
@ovitrif
ovitrif marked this pull request as ready for review August 28, 2026 21:40
@ovitrifovitrif self-assigned this Aug 28, 2026
Base automatically changed from feat/trezor-send to masterAugust 28, 2026 21:41
@ovitrifovitrif added this to the 2.5.0 milestone Aug 28, 2026
@greptile-apps

Copy link
Copy Markdown

Greptile Summary

The PR refines send-flow loading presentation and consolidates on-chain fee data into a single UI state while making fee selection return to confirmation immediately.

  • Keeps funding-source labels and swipe tracks visible during Trezor preparation.
  • Adds tinted inline progress indicators for source and fee refreshes.
  • Refactors on-chain estimates, selected fee, and loading status into OnchainFeeUi.
  • Updates send-flow and fee-selection tests for the new state model.

Confidence Score: 4/5

The hardware send path should not be merged until failed fee estimates stop turning swipe-to-confirm into a silent no-op.

The refactor filters unsuccessful hardware fee estimates to null, while the confirmation path treats null as an unconditional return without navigation, retry, or user-visible error.

Files Needing Attention: app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

Important Files Changed

FilenameOverview
app/src/main/java/to/bitkit/viewmodels/AppViewModel.ktConsolidates send fee state and adjusts asynchronous source/speed refreshes, but failed hardware estimates can now silently block confirmation.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.ktReworks source and fee loading presentation around the unified fee state.
app/src/main/java/to/bitkit/ui/components/NumberPadActionButton.ktReplaces the Material button wrapper with a stable custom row that preserves its label and track while loading.
app/src/main/java/to/bitkit/ui/components/SwipeToConfirm.ktMoves disabled alpha to inner content so the gradient track remains fully visible.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendFeeViewModel.ktReads selected rate and estimates from the new unified on-chain fee state.
app/src/test/java/to/bitkit/viewmodels/AppViewModelSendFlowTest.ktAdds coverage for source loading, retained fee display, immediate navigation, and UTXO reset behavior.

Sequence Diagram

sequenceDiagram
participant User
participant FeeSheet
participant AppVM as AppViewModel
participant Wallet as Fee estimator
participant Confirm
User->>FeeSheet: Select transaction speed
FeeSheet->>AppVM: setTransactionSpeed(speed)
AppVM->>AppVM: Set speed and loading state
AppVM-->>Confirm: Pop back immediately
AppVM->>Wallet: Refresh max spendable and fee estimates
Wallet-->>AppVM: Updated estimates
AppVM->>AppVM: Replace OnchainFeeUi
AppVM-->>Confirm: Render selected fee
Loading

Reviews (1): Last reviewed commit: "test: cover amount continue and speed re..." | Re-trigger Greptile

Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

@piotr-iohkpiotr-iohk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

Source chip stays filled with an icon-only spinner on Trezor, no flash switching back to Spending/Savings, swipe keeps its track after load, and Speed pops immediately while the previous fee stays until the new estimate lands.

@ovitrif
ovitrif merged commit 7e0b4c4 into masterAug 31, 2026
18 checks passed
Sign up for freeto 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.

Trezor send UI polish

3 participants

@ovitrif@ben-kaufman@piotr-iohk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: send source & fee progress ui/ux - #1195

Merged
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui
Aug 31, 2026
Merged

fix: send source & fee progress ui/ux#1195
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui

Conversation

@ovitrif

@ovitrifovitrif commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

Description

This PR polishes the Trezor send UI from #1187, where switching to hardware left a rough loading chip: the track vanished, the label disappeared behind a spinner, and a Material ripple flashed while the device warmed up.

This PR:

  1. Rebuilds that funding-source chip so switching to Trezor keeps the filled track, animates the label width as the name appears, and swaps only the transfer icon for a small tinted spinner. Savings and Spending switches stay instant, with no loader flash.
  2. Replaces the fee-rate icon with a matching spinner and keeps the previous fee text until the next estimate lands.
  3. Keeps swipe-to-confirm's gradient track visible after switching to Trezor.
  4. Refactors onchain fee UI logic to group fee rate, sats, estimates, and loading into one state.
  5. Pops Speed immediately after a rate is chosen, matching iOS's tap-to-select flow, while blocking conflicting hardware send actions until the new maximum and fee are ready.
  6. Keeps the Trezor source chip filled while Amount Continue prepares the hardware fee.

Preview

hwwSendUiFix.mp4

Linked Issues/Tasks

Fixes#1203

QA Notes

Manual Tests

  • 1. Send Amount or Confirm → switch to Trezor: the chip keeps its filled track, the label stays visible and animates to the Trezor name, and a small tinted spinner replaces only the transfer icon until the device fee is ready.
  • 2a. Send Confirm → switch Trezor → Spending: no source loader flash.
    • 2b. Send Confirm → switch Trezor → Savings: no source loader flash.
  • 3. Send Confirm → switch Spending → Savings: swipe-to-confirm does not dim or flash.
  • 4.regression: after Trezor is selected and loading ends: swipe-to-confirm keeps its gradient track and can still be swiped.
  • 5. Trezor Send Amount → Continue: the Trezor chip stays filled with no blue outline until Confirm.
  • 6. Trezor Send Confirm → Speed → pick another rate: Speed closes immediately like iOS, Confirm keeps the previous fee with a spinner, and speed, source, and swipe actions remain blocked until the new fee lands.
  • 7a.regression: Savings Send Confirm → Speed: Fast, Normal, and Slow still show estimates like master, and the current rate stays selected.
    • 7b.regression: Savings Send Confirm → Speed → pick Fast, Normal, or Slow: returns to Confirm and the fee/speed row updates.
    • 7c.regression: Savings Send Confirm → Speed → Custom → set a valid rate → Continue: Confirm shows the custom fee.
    • 7d.regression: Savings Send Fee Custom → rate below min or above max: toast blocks continue, same as master.
    • 7e.regression: Savings Send Confirm → Speed → back without changing: Confirm fee and speed stay the same.
  • 8.regression: unified Send Confirm → Speed → Instant: still switches to Spending like master.

Automated Checks

  • Unit tests added or extended in AppViewModelSendFlowTest.kt: cover hardware-only source loading, keeping a valid amount while Savings refreshes, retaining the previous on-chain fee while estimates refresh, returning from Speed before hardware max finishes, resetting selected UTXOs from the previous rate, and confirming that a missing hardware fee does not block navigation to signing.
  • Instrumented tests added or updated in SendAmountContentTest.kt: use the funding-source loading flag to disable source and continue, and ignore source-chip taps while Amount Continue is loading.
  • Unit tests updated in SendFeeViewModelTest.kt: fee-sheet init still disables unaffordable rates and validates custom min/max against the unified on-chain fee estimates.
  • CI: standard compile, unit test, and detekt checks run by the PR bot.

@ovitrifovitrif changed the title fix: polish send source and fee uifix: send source & fee loading ui/uxAug 28, 2026
@ovitrifovitrif changed the title fix: send source & fee loading ui/uxfix: send source & fee progress ui/uxAug 28, 2026
@ovitrif
ovitrif marked this pull request as ready for review August 28, 2026 21:40
@ovitrifovitrif self-assigned this Aug 28, 2026
Base automatically changed from feat/trezor-send to masterAugust 28, 2026 21:41
@ovitrifovitrif added this to the 2.5.0 milestone Aug 28, 2026
@greptile-apps

Copy link
Copy Markdown

Greptile Summary

The PR refines send-flow loading presentation and consolidates on-chain fee data into a single UI state while making fee selection return to confirmation immediately.

  • Keeps funding-source labels and swipe tracks visible during Trezor preparation.
  • Adds tinted inline progress indicators for source and fee refreshes.
  • Refactors on-chain estimates, selected fee, and loading status into OnchainFeeUi.
  • Updates send-flow and fee-selection tests for the new state model.

Confidence Score: 4/5

The hardware send path should not be merged until failed fee estimates stop turning swipe-to-confirm into a silent no-op.

The refactor filters unsuccessful hardware fee estimates to null, while the confirmation path treats null as an unconditional return without navigation, retry, or user-visible error.

Files Needing Attention: app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

Important Files Changed

FilenameOverview
app/src/main/java/to/bitkit/viewmodels/AppViewModel.ktConsolidates send fee state and adjusts asynchronous source/speed refreshes, but failed hardware estimates can now silently block confirmation.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.ktReworks source and fee loading presentation around the unified fee state.
app/src/main/java/to/bitkit/ui/components/NumberPadActionButton.ktReplaces the Material button wrapper with a stable custom row that preserves its label and track while loading.
app/src/main/java/to/bitkit/ui/components/SwipeToConfirm.ktMoves disabled alpha to inner content so the gradient track remains fully visible.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendFeeViewModel.ktReads selected rate and estimates from the new unified on-chain fee state.
app/src/test/java/to/bitkit/viewmodels/AppViewModelSendFlowTest.ktAdds coverage for source loading, retained fee display, immediate navigation, and UTXO reset behavior.

Sequence Diagram

sequenceDiagram
participant User
participant FeeSheet
participant AppVM as AppViewModel
participant Wallet as Fee estimator
participant Confirm
User->>FeeSheet: Select transaction speed
FeeSheet->>AppVM: setTransactionSpeed(speed)
AppVM->>AppVM: Set speed and loading state
AppVM-->>Confirm: Pop back immediately
AppVM->>Wallet: Refresh max spendable and fee estimates
Wallet-->>AppVM: Updated estimates
AppVM->>AppVM: Replace OnchainFeeUi
AppVM-->>Confirm: Render selected fee
Loading

Reviews (1): Last reviewed commit: "test: cover amount continue and speed re..." | Re-trigger Greptile

Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

@piotr-iohkpiotr-iohk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

Source chip stays filled with an icon-only spinner on Trezor, no flash switching back to Spending/Savings, swipe keeps its track after load, and Speed pops immediately while the previous fee stays until the new estimate lands.

@ovitrif
ovitrif merged commit 7e0b4c4 into masterAug 31, 2026
18 checks passed
Sign up for freeto 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.

Trezor send UI polish

3 participants

@ovitrif@ben-kaufman@piotr-iohk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: send source & fee progress ui/ux - #1195

Merged
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui
Aug 31, 2026
Merged

fix: send source & fee progress ui/ux#1195
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui

Conversation

@ovitrif

@ovitrifovitrif commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

Description

This PR polishes the Trezor send UI from #1187, where switching to hardware left a rough loading chip: the track vanished, the label disappeared behind a spinner, and a Material ripple flashed while the device warmed up.

This PR:

  1. Rebuilds that funding-source chip so switching to Trezor keeps the filled track, animates the label width as the name appears, and swaps only the transfer icon for a small tinted spinner. Savings and Spending switches stay instant, with no loader flash.
  2. Replaces the fee-rate icon with a matching spinner and keeps the previous fee text until the next estimate lands.
  3. Keeps swipe-to-confirm's gradient track visible after switching to Trezor.
  4. Refactors onchain fee UI logic to group fee rate, sats, estimates, and loading into one state.
  5. Pops Speed immediately after a rate is chosen, matching iOS's tap-to-select flow, while blocking conflicting hardware send actions until the new maximum and fee are ready.
  6. Keeps the Trezor source chip filled while Amount Continue prepares the hardware fee.

Preview

hwwSendUiFix.mp4

Linked Issues/Tasks

Fixes#1203

QA Notes

Manual Tests

  • 1. Send Amount or Confirm → switch to Trezor: the chip keeps its filled track, the label stays visible and animates to the Trezor name, and a small tinted spinner replaces only the transfer icon until the device fee is ready.
  • 2a. Send Confirm → switch Trezor → Spending: no source loader flash.
    • 2b. Send Confirm → switch Trezor → Savings: no source loader flash.
  • 3. Send Confirm → switch Spending → Savings: swipe-to-confirm does not dim or flash.
  • 4.regression: after Trezor is selected and loading ends: swipe-to-confirm keeps its gradient track and can still be swiped.
  • 5. Trezor Send Amount → Continue: the Trezor chip stays filled with no blue outline until Confirm.
  • 6. Trezor Send Confirm → Speed → pick another rate: Speed closes immediately like iOS, Confirm keeps the previous fee with a spinner, and speed, source, and swipe actions remain blocked until the new fee lands.
  • 7a.regression: Savings Send Confirm → Speed: Fast, Normal, and Slow still show estimates like master, and the current rate stays selected.
    • 7b.regression: Savings Send Confirm → Speed → pick Fast, Normal, or Slow: returns to Confirm and the fee/speed row updates.
    • 7c.regression: Savings Send Confirm → Speed → Custom → set a valid rate → Continue: Confirm shows the custom fee.
    • 7d.regression: Savings Send Fee Custom → rate below min or above max: toast blocks continue, same as master.
    • 7e.regression: Savings Send Confirm → Speed → back without changing: Confirm fee and speed stay the same.
  • 8.regression: unified Send Confirm → Speed → Instant: still switches to Spending like master.

Automated Checks

  • Unit tests added or extended in AppViewModelSendFlowTest.kt: cover hardware-only source loading, keeping a valid amount while Savings refreshes, retaining the previous on-chain fee while estimates refresh, returning from Speed before hardware max finishes, resetting selected UTXOs from the previous rate, and confirming that a missing hardware fee does not block navigation to signing.
  • Instrumented tests added or updated in SendAmountContentTest.kt: use the funding-source loading flag to disable source and continue, and ignore source-chip taps while Amount Continue is loading.
  • Unit tests updated in SendFeeViewModelTest.kt: fee-sheet init still disables unaffordable rates and validates custom min/max against the unified on-chain fee estimates.
  • CI: standard compile, unit test, and detekt checks run by the PR bot.

@ovitrifovitrif changed the title fix: polish send source and fee uifix: send source & fee loading ui/uxAug 28, 2026
@ovitrifovitrif changed the title fix: send source & fee loading ui/uxfix: send source & fee progress ui/uxAug 28, 2026
@ovitrif
ovitrif marked this pull request as ready for review August 28, 2026 21:40
@ovitrifovitrif self-assigned this Aug 28, 2026
Base automatically changed from feat/trezor-send to masterAugust 28, 2026 21:41
@ovitrifovitrif added this to the 2.5.0 milestone Aug 28, 2026
@greptile-apps

Copy link
Copy Markdown

Greptile Summary

The PR refines send-flow loading presentation and consolidates on-chain fee data into a single UI state while making fee selection return to confirmation immediately.

  • Keeps funding-source labels and swipe tracks visible during Trezor preparation.
  • Adds tinted inline progress indicators for source and fee refreshes.
  • Refactors on-chain estimates, selected fee, and loading status into OnchainFeeUi.
  • Updates send-flow and fee-selection tests for the new state model.

Confidence Score: 4/5

The hardware send path should not be merged until failed fee estimates stop turning swipe-to-confirm into a silent no-op.

The refactor filters unsuccessful hardware fee estimates to null, while the confirmation path treats null as an unconditional return without navigation, retry, or user-visible error.

Files Needing Attention: app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

Important Files Changed

FilenameOverview
app/src/main/java/to/bitkit/viewmodels/AppViewModel.ktConsolidates send fee state and adjusts asynchronous source/speed refreshes, but failed hardware estimates can now silently block confirmation.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.ktReworks source and fee loading presentation around the unified fee state.
app/src/main/java/to/bitkit/ui/components/NumberPadActionButton.ktReplaces the Material button wrapper with a stable custom row that preserves its label and track while loading.
app/src/main/java/to/bitkit/ui/components/SwipeToConfirm.ktMoves disabled alpha to inner content so the gradient track remains fully visible.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendFeeViewModel.ktReads selected rate and estimates from the new unified on-chain fee state.
app/src/test/java/to/bitkit/viewmodels/AppViewModelSendFlowTest.ktAdds coverage for source loading, retained fee display, immediate navigation, and UTXO reset behavior.

Sequence Diagram

sequenceDiagram
participant User
participant FeeSheet
participant AppVM as AppViewModel
participant Wallet as Fee estimator
participant Confirm
User->>FeeSheet: Select transaction speed
FeeSheet->>AppVM: setTransactionSpeed(speed)
AppVM->>AppVM: Set speed and loading state
AppVM-->>Confirm: Pop back immediately
AppVM->>Wallet: Refresh max spendable and fee estimates
Wallet-->>AppVM: Updated estimates
AppVM->>AppVM: Replace OnchainFeeUi
AppVM-->>Confirm: Render selected fee
Loading

Reviews (1): Last reviewed commit: "test: cover amount continue and speed re..." | Re-trigger Greptile

Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

@piotr-iohkpiotr-iohk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

Source chip stays filled with an icon-only spinner on Trezor, no flash switching back to Spending/Savings, swipe keeps its track after load, and Speed pops immediately while the previous fee stays until the new estimate lands.

@ovitrif
ovitrif merged commit 7e0b4c4 into masterAug 31, 2026
18 checks passed
Sign up for freeto 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.

Trezor send UI polish

3 participants

@ovitrif@ben-kaufman@piotr-iohk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: send source & fee progress ui/ux - #1195

Merged
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui
Aug 31, 2026
Merged

fix: send source & fee progress ui/ux#1195
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui

Conversation

@ovitrif

@ovitrifovitrif commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

Description

This PR polishes the Trezor send UI from #1187, where switching to hardware left a rough loading chip: the track vanished, the label disappeared behind a spinner, and a Material ripple flashed while the device warmed up.

This PR:

  1. Rebuilds that funding-source chip so switching to Trezor keeps the filled track, animates the label width as the name appears, and swaps only the transfer icon for a small tinted spinner. Savings and Spending switches stay instant, with no loader flash.
  2. Replaces the fee-rate icon with a matching spinner and keeps the previous fee text until the next estimate lands.
  3. Keeps swipe-to-confirm's gradient track visible after switching to Trezor.
  4. Refactors onchain fee UI logic to group fee rate, sats, estimates, and loading into one state.
  5. Pops Speed immediately after a rate is chosen, matching iOS's tap-to-select flow, while blocking conflicting hardware send actions until the new maximum and fee are ready.
  6. Keeps the Trezor source chip filled while Amount Continue prepares the hardware fee.

Preview

hwwSendUiFix.mp4

Linked Issues/Tasks

Fixes#1203

QA Notes

Manual Tests

  • 1. Send Amount or Confirm → switch to Trezor: the chip keeps its filled track, the label stays visible and animates to the Trezor name, and a small tinted spinner replaces only the transfer icon until the device fee is ready.
  • 2a. Send Confirm → switch Trezor → Spending: no source loader flash.
    • 2b. Send Confirm → switch Trezor → Savings: no source loader flash.
  • 3. Send Confirm → switch Spending → Savings: swipe-to-confirm does not dim or flash.
  • 4.regression: after Trezor is selected and loading ends: swipe-to-confirm keeps its gradient track and can still be swiped.
  • 5. Trezor Send Amount → Continue: the Trezor chip stays filled with no blue outline until Confirm.
  • 6. Trezor Send Confirm → Speed → pick another rate: Speed closes immediately like iOS, Confirm keeps the previous fee with a spinner, and speed, source, and swipe actions remain blocked until the new fee lands.
  • 7a.regression: Savings Send Confirm → Speed: Fast, Normal, and Slow still show estimates like master, and the current rate stays selected.
    • 7b.regression: Savings Send Confirm → Speed → pick Fast, Normal, or Slow: returns to Confirm and the fee/speed row updates.
    • 7c.regression: Savings Send Confirm → Speed → Custom → set a valid rate → Continue: Confirm shows the custom fee.
    • 7d.regression: Savings Send Fee Custom → rate below min or above max: toast blocks continue, same as master.
    • 7e.regression: Savings Send Confirm → Speed → back without changing: Confirm fee and speed stay the same.
  • 8.regression: unified Send Confirm → Speed → Instant: still switches to Spending like master.

Automated Checks

  • Unit tests added or extended in AppViewModelSendFlowTest.kt: cover hardware-only source loading, keeping a valid amount while Savings refreshes, retaining the previous on-chain fee while estimates refresh, returning from Speed before hardware max finishes, resetting selected UTXOs from the previous rate, and confirming that a missing hardware fee does not block navigation to signing.
  • Instrumented tests added or updated in SendAmountContentTest.kt: use the funding-source loading flag to disable source and continue, and ignore source-chip taps while Amount Continue is loading.
  • Unit tests updated in SendFeeViewModelTest.kt: fee-sheet init still disables unaffordable rates and validates custom min/max against the unified on-chain fee estimates.
  • CI: standard compile, unit test, and detekt checks run by the PR bot.

@ovitrifovitrif changed the title fix: polish send source and fee uifix: send source & fee loading ui/uxAug 28, 2026
@ovitrifovitrif changed the title fix: send source & fee loading ui/uxfix: send source & fee progress ui/uxAug 28, 2026
@ovitrif
ovitrif marked this pull request as ready for review August 28, 2026 21:40
@ovitrifovitrif self-assigned this Aug 28, 2026
Base automatically changed from feat/trezor-send to masterAugust 28, 2026 21:41
@ovitrifovitrif added this to the 2.5.0 milestone Aug 28, 2026
@greptile-apps

Copy link
Copy Markdown

Greptile Summary

The PR refines send-flow loading presentation and consolidates on-chain fee data into a single UI state while making fee selection return to confirmation immediately.

  • Keeps funding-source labels and swipe tracks visible during Trezor preparation.
  • Adds tinted inline progress indicators for source and fee refreshes.
  • Refactors on-chain estimates, selected fee, and loading status into OnchainFeeUi.
  • Updates send-flow and fee-selection tests for the new state model.

Confidence Score: 4/5

The hardware send path should not be merged until failed fee estimates stop turning swipe-to-confirm into a silent no-op.

The refactor filters unsuccessful hardware fee estimates to null, while the confirmation path treats null as an unconditional return without navigation, retry, or user-visible error.

Files Needing Attention: app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

Important Files Changed

FilenameOverview
app/src/main/java/to/bitkit/viewmodels/AppViewModel.ktConsolidates send fee state and adjusts asynchronous source/speed refreshes, but failed hardware estimates can now silently block confirmation.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.ktReworks source and fee loading presentation around the unified fee state.
app/src/main/java/to/bitkit/ui/components/NumberPadActionButton.ktReplaces the Material button wrapper with a stable custom row that preserves its label and track while loading.
app/src/main/java/to/bitkit/ui/components/SwipeToConfirm.ktMoves disabled alpha to inner content so the gradient track remains fully visible.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendFeeViewModel.ktReads selected rate and estimates from the new unified on-chain fee state.
app/src/test/java/to/bitkit/viewmodels/AppViewModelSendFlowTest.ktAdds coverage for source loading, retained fee display, immediate navigation, and UTXO reset behavior.

Sequence Diagram

sequenceDiagram
participant User
participant FeeSheet
participant AppVM as AppViewModel
participant Wallet as Fee estimator
participant Confirm
User->>FeeSheet: Select transaction speed
FeeSheet->>AppVM: setTransactionSpeed(speed)
AppVM->>AppVM: Set speed and loading state
AppVM-->>Confirm: Pop back immediately
AppVM->>Wallet: Refresh max spendable and fee estimates
Wallet-->>AppVM: Updated estimates
AppVM->>AppVM: Replace OnchainFeeUi
AppVM-->>Confirm: Render selected fee
Loading

Reviews (1): Last reviewed commit: "test: cover amount continue and speed re..." | Re-trigger Greptile

Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

@piotr-iohkpiotr-iohk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

Source chip stays filled with an icon-only spinner on Trezor, no flash switching back to Spending/Savings, swipe keeps its track after load, and Speed pops immediately while the previous fee stays until the new estimate lands.

@ovitrif
ovitrif merged commit 7e0b4c4 into masterAug 31, 2026
18 checks passed
Sign up for freeto 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.

Trezor send UI polish

3 participants

@ovitrif@ben-kaufman@piotr-iohk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: send source & fee progress ui/ux - #1195

Merged
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui
Aug 31, 2026
Merged

fix: send source & fee progress ui/ux#1195
ovitrif merged 13 commits into
masterfrom
fix/trezor-send-ui

Conversation

@ovitrif

@ovitrifovitrif commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

Description

This PR polishes the Trezor send UI from #1187, where switching to hardware left a rough loading chip: the track vanished, the label disappeared behind a spinner, and a Material ripple flashed while the device warmed up.

This PR:

  1. Rebuilds that funding-source chip so switching to Trezor keeps the filled track, animates the label width as the name appears, and swaps only the transfer icon for a small tinted spinner. Savings and Spending switches stay instant, with no loader flash.
  2. Replaces the fee-rate icon with a matching spinner and keeps the previous fee text until the next estimate lands.
  3. Keeps swipe-to-confirm's gradient track visible after switching to Trezor.
  4. Refactors onchain fee UI logic to group fee rate, sats, estimates, and loading into one state.
  5. Pops Speed immediately after a rate is chosen, matching iOS's tap-to-select flow, while blocking conflicting hardware send actions until the new maximum and fee are ready.
  6. Keeps the Trezor source chip filled while Amount Continue prepares the hardware fee.

Preview

hwwSendUiFix.mp4

Linked Issues/Tasks

Fixes#1203

QA Notes

Manual Tests

  • 1. Send Amount or Confirm → switch to Trezor: the chip keeps its filled track, the label stays visible and animates to the Trezor name, and a small tinted spinner replaces only the transfer icon until the device fee is ready.
  • 2a. Send Confirm → switch Trezor → Spending: no source loader flash.
    • 2b. Send Confirm → switch Trezor → Savings: no source loader flash.
  • 3. Send Confirm → switch Spending → Savings: swipe-to-confirm does not dim or flash.
  • 4.regression: after Trezor is selected and loading ends: swipe-to-confirm keeps its gradient track and can still be swiped.
  • 5. Trezor Send Amount → Continue: the Trezor chip stays filled with no blue outline until Confirm.
  • 6. Trezor Send Confirm → Speed → pick another rate: Speed closes immediately like iOS, Confirm keeps the previous fee with a spinner, and speed, source, and swipe actions remain blocked until the new fee lands.
  • 7a.regression: Savings Send Confirm → Speed: Fast, Normal, and Slow still show estimates like master, and the current rate stays selected.
    • 7b.regression: Savings Send Confirm → Speed → pick Fast, Normal, or Slow: returns to Confirm and the fee/speed row updates.
    • 7c.regression: Savings Send Confirm → Speed → Custom → set a valid rate → Continue: Confirm shows the custom fee.
    • 7d.regression: Savings Send Fee Custom → rate below min or above max: toast blocks continue, same as master.
    • 7e.regression: Savings Send Confirm → Speed → back without changing: Confirm fee and speed stay the same.
  • 8.regression: unified Send Confirm → Speed → Instant: still switches to Spending like master.

Automated Checks

  • Unit tests added or extended in AppViewModelSendFlowTest.kt: cover hardware-only source loading, keeping a valid amount while Savings refreshes, retaining the previous on-chain fee while estimates refresh, returning from Speed before hardware max finishes, resetting selected UTXOs from the previous rate, and confirming that a missing hardware fee does not block navigation to signing.
  • Instrumented tests added or updated in SendAmountContentTest.kt: use the funding-source loading flag to disable source and continue, and ignore source-chip taps while Amount Continue is loading.
  • Unit tests updated in SendFeeViewModelTest.kt: fee-sheet init still disables unaffordable rates and validates custom min/max against the unified on-chain fee estimates.
  • CI: standard compile, unit test, and detekt checks run by the PR bot.

@ovitrifovitrif changed the title fix: polish send source and fee uifix: send source & fee loading ui/uxAug 28, 2026
@ovitrifovitrif changed the title fix: send source & fee loading ui/uxfix: send source & fee progress ui/uxAug 28, 2026
@ovitrif
ovitrif marked this pull request as ready for review August 28, 2026 21:40
@ovitrifovitrif self-assigned this Aug 28, 2026
Base automatically changed from feat/trezor-send to masterAugust 28, 2026 21:41
@ovitrifovitrif added this to the 2.5.0 milestone Aug 28, 2026
@greptile-apps

Copy link
Copy Markdown

Greptile Summary

The PR refines send-flow loading presentation and consolidates on-chain fee data into a single UI state while making fee selection return to confirmation immediately.

  • Keeps funding-source labels and swipe tracks visible during Trezor preparation.
  • Adds tinted inline progress indicators for source and fee refreshes.
  • Refactors on-chain estimates, selected fee, and loading status into OnchainFeeUi.
  • Updates send-flow and fee-selection tests for the new state model.

Confidence Score: 4/5

The hardware send path should not be merged until failed fee estimates stop turning swipe-to-confirm into a silent no-op.

The refactor filters unsuccessful hardware fee estimates to null, while the confirmation path treats null as an unconditional return without navigation, retry, or user-visible error.

Files Needing Attention: app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

Important Files Changed

FilenameOverview
app/src/main/java/to/bitkit/viewmodels/AppViewModel.ktConsolidates send fee state and adjusts asynchronous source/speed refreshes, but failed hardware estimates can now silently block confirmation.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.ktReworks source and fee loading presentation around the unified fee state.
app/src/main/java/to/bitkit/ui/components/NumberPadActionButton.ktReplaces the Material button wrapper with a stable custom row that preserves its label and track while loading.
app/src/main/java/to/bitkit/ui/components/SwipeToConfirm.ktMoves disabled alpha to inner content so the gradient track remains fully visible.
app/src/main/java/to/bitkit/ui/screens/wallets/send/SendFeeViewModel.ktReads selected rate and estimates from the new unified on-chain fee state.
app/src/test/java/to/bitkit/viewmodels/AppViewModelSendFlowTest.ktAdds coverage for source loading, retained fee display, immediate navigation, and UTXO reset behavior.

Sequence Diagram

sequenceDiagram
participant User
participant FeeSheet
participant AppVM as AppViewModel
participant Wallet as Fee estimator
participant Confirm
User->>FeeSheet: Select transaction speed
FeeSheet->>AppVM: setTransactionSpeed(speed)
AppVM->>AppVM: Set speed and loading state
AppVM-->>Confirm: Pop back immediately
AppVM->>Wallet: Refresh max spendable and fee estimates
Wallet-->>AppVM: Updated estimates
AppVM->>AppVM: Replace OnchainFeeUi
AppVM-->>Confirm: Render selected fee
Loading

Reviews (1): Last reviewed commit: "test: cover amount continue and speed re..." | Re-trigger Greptile

Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
Comment threadapp/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

@piotr-iohkpiotr-iohk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

Source chip stays filled with an icon-only spinner on Trezor, no flash switching back to Spending/Savings, swipe keeps its track after load, and Speed pops immediately while the previous fee stays until the new estimate lands.

@ovitrif
ovitrif merged commit 7e0b4c4 into masterAug 31, 2026
18 checks passed
Sign up for freeto 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.

Trezor send UI polish

3 participants

@ovitrif@ben-kaufman@piotr-iohk