Skip to content

feat(receive): draft new desktop receive screen - #29708

Merged
OriginalEveres merged 5 commits into
developfrom
receive-desktop
Aug 5, 2026
Merged

feat(receive): draft new desktop receive screen#29708
OriginalEveres merged 5 commits into
developfrom
receive-desktop

Conversation

@OriginalEveres

@OriginalEveres OriginalEveres commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Description

Receive flow was completely redesigned following the Figma

Removed 12 translation keys orphaned by the redesign, including the BCH/LTC address-format
tooltips - the same guidance still fires on the send form via isAddressDeprecated, so nothing is
lost where it's actionable.

Notes for QA

❗ Share button is only available in the web flow as electron does not support native share API.

Happy paths

  • Receive tab, BTC account — address + QR visible immediately, no "reveal" step
  • Copy address — "Address copied. Verify before you send." modal opens with 2 steps
  • Modal → Verify on Trezor — button spins, modal stays open, closes after device confirm
  • Modal → Skip verification — modal closes, address stays in clipboard
  • Verify button on newest card — device shows "View the address on your Trezor"
  • "Show next" (+) on UTXO account — new address becomes newest, previous drops to history
  • Address history — index, address, received amount or "Not used"
  • Hover history row — copy / share / verify icons appear; verify prompts device
  • Successful verify — device modal just closes, no address modal afterwards

Edge cases

  • ETH / SOL account — "Receive address" title, no "+" button, no address-index label
  • BTC after 20 unused addresses — "+" disabled, tooltip "You can generate only 20 unused addresses."
  • Cardano — UTXO layout, "+" present, staking address unaffected
  • Suite Sync labeling on — inline label edit on newest card and history rows
  • Legacy metadata labeling on — same edit affordance, same row spacing

Related Issue

Resolves #29624
Resolves #29626

Screenshots:

To be added.

🌐 Preview deployments

🌐 Suite Web preview: https://dev.suite.sldev.cz/suite-web/receive-desktop/web/

🔍 Currents Test Results

🔍 Suite web test results: View in Currents

🔍 Suite native android test results: View in Currents

🔍 Suite desktop test results: View in Currents

🔒 Quarantined E2E Tests

Trezor Suite (web) — 3 test(s)
Test Type
Quarantine test: "Recovery - dry run,Recovery with device reconnection" 🙋 manual
Quarantine test: "TrezorConnect webextension -> Suite Web,second call after popup was closed by user should work" 🙋 manual
Quarantine test: "Recovery T2T1 - dry run,Recovery after partial recovery" 🙋 manual

Updated: 2026-08-05T13:17:12.468Z • 3 test(s) total

Trezor Suite (desktop) — 2 test(s)
Test Type
Quarantine test: "Recovery - dry run,Recovery after partial recovery" 🙋 manual
Quarantine test: "Recovery - dry run,Recovery with device reconnection" 🙋 manual

Updated: 2026-08-05T13:16:31.782Z • 2 test(s) total

🤖 LLM Test Recommendations

Summary: This PR touches the receive-address flow (Receive.tsx, ReceiveContent, AddressHistoryCard, NewestAddressCard, AddressCopiedModal, shareAddress, useReceiveAddresses), the address confirmation modal stack (ConfirmAddressModal, ConfirmUnverifiedAddressModal, DeviceContextModal, UserContextModal), and receive-related thunks/state (showAddressThunk, openAddressModal, suite/receive index, modal type definitions). The modal components map to 132 tests statically, but that is because they are globally shared UI infrastructure — only tests that actually exercise address reveal/verification/copy flows are meaningfully at risk. The recommended strategy is to run the dedicated wallet receive and passphrase-hidden-wallet receive tests (which directly exercise device address confirmation, address history display, and copy-to-clipboard) plus a few metadata tests that render labels on the receive screen; broad regression across unrelated flows (staking, trading, onboarding, etc.) is unlikely since those don't touch the receive/address-confirmation code paths.

Changed files (16)
  • packages/suite/src/components/suite/modals/ReduxModal/ConfirmAddressModal.tsx
  • packages/suite/src/components/suite/modals/ReduxModal/DeviceContextModal/DeviceContextModal.tsx
  • packages/suite/src/components/suite/modals/ReduxModal/UserContextModal/ConfirmUnverifiedAddressModal.tsx
  • packages/suite/src/components/suite/modals/ReduxModal/UserContextModal/UserContextModal.tsx
  • packages/suite/src/views/wallet/receive/Receive.tsx
  • packages/suite/src/views/wallet/receive/components/AddressCopiedModal.tsx
  • packages/suite/src/views/wallet/receive/components/AddressHistoryCard.tsx
  • packages/suite/src/views/wallet/receive/components/NewestAddressCard.tsx
  • packages/suite/src/views/wallet/receive/components/ReceiveContent.tsx
  • packages/suite/src/views/wallet/receive/components/shareAddress.ts
  • packages/suite/src/views/wallet/receive/hooks/useReceiveAddresses.ts
  • suite-common/suite-types/src/modal.ts
  • suite/intl/src/messages.ts
  • suite/receive/src/index.ts
  • suite/receive/src/openAddressModal.ts
  • suite/receive/src/showAddressThunk.ts

Recommended tests (10)

🔴 High priority (6)
  • suite/e2e/tests/wallet/receive.test.ts — This test directly exercises the core receive address flow (reveal, copy, verify address on device) which maps directly to Receive.tsx, ReceiveContent.tsx, AddressCopiedModal.tsx, shareAddress.ts, useReceiveAddresses.ts, ConfirmAddressModal.tsx, and the showAddressThunk/openAddressModal changes - the exact files changed in this PR.
  • suite/e2e/tests/wallet/global-receive-send.test.ts — Directly tests the global receive flow, address reveal/verification on device, and copy address functionality, which is the primary functionality touched by Receive.tsx, ReceiveContent.tsx, and the address confirmation modals changed in this PR.
  • suite/e2e/tests/passphrase/passphrase.test.ts — This test extensively exercises revealing receive addresses across multiple hidden wallets, on-device confirmation, address history table, and copy-to-clipboard - all core paths through Receive.tsx, AddressHistoryCard.tsx, NewestAddressCard.tsx and ConfirmAddressModal.tsx that were modified.
  • suite/e2e/tests/passphrase/passphrase-cardano.test.ts — Tests Cardano receive address verification flow including correct/incorrect passphrase scenarios, verify address error toast, and reveal-address modal - directly touching Receive.tsx, ConfirmUnverifiedAddressModal.tsx, and showAddressThunk.ts changes.
  • suite/e2e/tests/passphrase/passphrase-reconnection.test.ts — Exercises revealing a receive address, device reconnection re-prompting passphrase confirmation, and repeated address reveals without re-prompting - directly covering the modal and thunk logic changed in ConfirmAddressModal.tsx, DeviceContextModal.tsx, and showAddressThunk.ts.
  • suite/e2e/tests/wallet/receive.test.ts — Duplicate entry removed
🟡 Medium priority (4)
  • suite/e2e/tests/wallet/cardano.test.ts — Includes a Cardano receive flow (reveal address, confirm on device, copy address) that touches Receive.tsx and the address confirmation modal logic, though the majority of the test covers unrelated account-detail behaviors.
  • suite/e2e/tests/metadata/legacy/address-metadata.test.ts — Uses the receive screen and address list UI (AddressHistoryCard) to add/edit address labels, so changes to Receive.tsx and AddressHistoryCard.tsx could affect label placement/rendering, though the core focus is metadata not address confirmation.
  • suite/e2e/tests/metadata/suite-sync/sync-from-relay.test.ts — Verifies address labels synced via Suite Sync are visible on the receive screen, which depends on Receive.tsx and AddressHistoryCard rendering logic that was modified.
  • suite/e2e/tests/metadata/suite-sync/update-and-remove-labels.test.ts — Updates and removes address labels on the receive screen, exercising the same Receive.tsx/AddressHistoryCard rendering paths affected by this change.

⚠️ Changes with no test coverage (2)

  • suite-common/suite-types/src/modal.ts
  • suite/intl/src/messages.ts

Updated: 2026-07-20T14:44:45.410Z

@OriginalEveres
OriginalEveres force-pushed the receive-reducer-usages branch 9 times, most recently from 1f7c63d to c2467d9 Compare July 16, 2026 12:55
@OriginalEveres
OriginalEveres changed the base branch from receive-reducer-usages to develop July 16, 2026 13:00
@trezor-bot

trezor-bot Bot commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

✅ Previously successful run of [Test] suite-native Android E2E workflow has been found.
⏭️ Skipping tests for this run.
💡 If you are unsure about your latest changes, please rerun the workflow manually. (Use the Re-run all jobs option)

@OriginalEveres
OriginalEveres force-pushed the receive-desktop branch 3 times, most recently from aab9182 to 3e8a612 Compare July 22, 2026 23:18
@OriginalEveres
OriginalEveres force-pushed the receive-desktop branch 5 times, most recently from fc93311 to d3f0df7 Compare August 3, 2026 08:29
Comment thread suite/receive/src/AddressHistory.tsx
Comment thread suite/receive/src/verification/useVerifyAddress.ts Outdated
Comment thread suite/receive/src/address/deriveCurrentFreshAddressThunk.ts Outdated
Comment thread suite/receive/src/verification/verificationTypes.ts Outdated
Comment thread suite-common/address/src/getReceiveAddressHistory.ts Outdated
@OriginalEveres
OriginalEveres force-pushed the receive-desktop branch 4 times, most recently from c85cc73 to 1eaeff9 Compare August 4, 2026 00:25
Comment thread suite/receive/src/receive.ts Outdated
Comment thread suite-common/wallet-types/src/account.ts Outdated
Comment thread suite/receive/src/analytics/useReceiveAddressAnalytics.ts Outdated
@OriginalEveres
OriginalEveres force-pushed the receive-desktop branch 2 times, most recently from 61ba6ee to f461da6 Compare August 4, 2026 15:01
},
TR_BCH_ADDRESS_INFO: {
defaultMessage:
'Bitcoin Cash changed the address format to cashaddr. Find more info about how to convert your address on our blog. {TR_LEARN_MORE}',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

sus

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

unused strings.

address: string;
};

type CopyReceiveAddressThunkDeps = { services: DesktopAnalyticsDep };

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

❤️


type ShareReceiveAddressThunkDeps = { services: DesktopAnalyticsDep };

export const shareReceiveAddressThunk =

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

is this needed?

ReceiveRootState &
SelectLabeledUnusedAddressesState;

export const deriveCurrentFreshAddressThunk =

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Native already has setCurrentFreshAddressForFlowEntryThunk, while this PR adds a desktop-only deriveCurrentFreshAddressThunk that reimplements the same job with slightly different logic. Since the behavior is not platform-specific, it should live in common and be called by both platforms.

I wasn't sure what you'd need and hoped we would sync before merging this so you could reuse the already existing functionality rather than reinventing it. I believe it should be reusable with slight parametrization if necessary.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

There is a platform difference, desktop needs to be able to re-derivate and native is trigged on entry.

I want to unify it / refactor in followup PR.


type RevealNextAddressThunkDeps = { services: DesktopAnalyticsDep };

export const revealNextAddressThunk =

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please check addReceiveAddressThunk from native. I believe these can also be unified in common.

Comment thread suite/receive/src/NewestAddressCard.tsx Outdated
intent="neutral"
priority="secondary"
icon={PlusIcon}
isDisabled={isAddressLimitReached}

@juriczech juriczech Aug 5, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In ReceiveContent you are using isReceiveDisabled when device is isAuthenticityCheckFailed || isDeviceBackupUnfinished || deviceLocked. Is that not relevant here as well? I'm not sure actually.

Comment on lines +26 to +29
const handleVerify = async () => {
await onVerify(addressPath);
onDismiss();
};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should this dismiss on failed verification as well? I guess there will be at least a toast notification automagically from connect?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Failed IMHO means only "Canceled" verification, which is a user decision. In any other device fails - the device error should be present

Comment thread suite/intl/src/messages.ts Outdated
defaultMessage: 'Show full address',
RECEIVE_ADDRESS_COPIED_TITLE: {
id: 'RECEIVE_ADDRESS_COPIED_TITLE',
defaultMessage: 'Address copied. Verify before you send.',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Could we please unify this translation string to match the mobile version?
Context here: https://satoshilabs.slack.com/archives/C07D260JB4H/p1785854122548179

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

fixed

@OriginalEveres
OriginalEveres merged commit 7dc28a9 into develop Aug 5, 2026
63 of 65 checks passed
@OriginalEveres
OriginalEveres deleted the receive-desktop branch August 5, 2026 13:42
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.

Epic: desktop receive flow Receive EVM desktop screen

3 participants