Skip to content

Prototype: Houdini private-send reorg (Proposal A)#6054

Open
j0ntz wants to merge 11 commits into
developfrom
prototype/houdini-send-reorg-a
Open

Prototype: Houdini private-send reorg (Proposal A)#6054
j0ntz wants to merge 11 commits into
developfrom
prototype/houdini-send-reorg-a

Conversation

@j0ntz

@j0ntz j0ntz commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

CHANGELOG

Does this branch warrant an entry to the CHANGELOG?

  • Yes
  • No

Dependencies

none

Requirements

If you have made any visual changes to the GUI. Make sure you have:

  • Tested on iOS device
  • Tested on Android device
  • Tested on small-screen device (iPod Touch)
  • Tested on large-screen device (tablet)

Description

Prototype of the redesigned Houdini send and swap flows, Proposal A. Review-only and fully navigable; nothing talks to Houdini and every value is hard-coded so a reviewer can walk every branch.

Asana: https://app.asana.com/0/1215088146871429/1216019112895453

Send scene (HoudiniSendScene, reached from a wallet's Send button)

  • The "Send from Wallet" tile is shown from the start. The You send amount and Network Fee rows appear only after a recipient address or asset is selected.
  • Two initial-state variants: A1 shows the Recipient receives row before any selection; A2 hides it until a selection is made (the only difference between them).
  • Recipient receives asset picker over a hard-coded chain list (BTC, ETH, XMR, SOL).
  • A plain same-asset, non-stealth send uses the standard add-recipient-address affordance; routing through Houdini (stealth or cross-asset) shows the estimated amount with a conversion percent (swap-scene style, no rate tile) and a locked address. A memo-needed chain (XMR) shows a Destination Tag row.
  • Stealth Send toggle; when enabled the toggle tile expands in place with messaging.

Swap flow (the production swap scenes, reached from a wallet's Trade -> Swap action)

  • SwapCreateScene gains an Stealth Swap toggle in a card during amount entry; when enabled the card expands in place with messaging.
  • When stealth is on, SwapConfirmationScene renders a fixed-provider, non-tappable Powered by Houdini card (no chevron, no "tap to change provider") via an optional onPress on the shared PoweredByCard. The quote itself is a real provider quote; only the provider chrome is re-skinned for the prototype.

The send scene is parameterized by layout: 'a' | 'b' and variant: 'a1' | 'a2'; this branch routes layout: 'a'.

Testing
Driven end to end on the iOS simulator via maestro (maestro/14-houdini/houdini-send-a.yaml, houdini-swap-a.yaml). The current screenshots are in the latest review comment; older proposal screenshots were removed.


Note

Medium Risk
Wallet Send is globally rerouted to a non-production scene; swap confirmation UI changes are gated on a prototype flag but still touch live swap screens.

Overview
Adds a review-only Houdini “Stealth Send” prototype and wires the wallet Send button to houdiniSend instead of send2. The new HoudiniSendScene uses hard-coded rates, fees, and addresses (no Houdini API); it supports Proposal A layout, recipient-asset picking, progressive disclosure of amount/fee rows, Stealth Send, and completion via success modal vs swapSuccess when stealth or cross-asset.

The production swap path gains a Stealth Swap card on SwapCreateScene; an incognito flag is passed through to SwapConfirmationScene, which shows a static Powered by Houdini card when enabled. PoweredByCard now treats onPress as optional (no chevron / “tap to change” when omitted).

Maestro flows under maestro/14-houdini/ and new houdini_* strings document the walkthrough.

Reviewed by Cursor Bugbot for commit 00daea5. Bugbot is set up for automated code reviews on this repo. Configure here.


@j0ntz j0ntz force-pushed the prototype/houdini-send-reorg-a branch from c4a2ca2 to bf8eef7 Compare June 24, 2026 22:57
Comment thread src/components/scenes/HoudiniSendScene.tsx Outdated
Comment thread src/components/scenes/HoudiniSendScene.tsx Outdated
Comment thread src/components/scenes/HoudiniSendScene.tsx
Comment thread src/components/themed/TransactionListTop.tsx Outdated
Comment thread src/components/scenes/HoudiniSendScene.tsx
j0ntz added 2 commits June 24, 2026 16:00
Adds a review-only, fully navigable prototype of the redesigned Houdini
private send flow, reachable from a wallet's Send button. The scene
reorganizes the send-to-address experience with two linked amounts
(You send / Recipient gets) computed from a hard-coded rate, a
recipient-asset picker over a hard-coded chain list, a Private send
toggle, an inline quote row, a network fee row, and a conditional
destination-tag row. Cross-asset or private sends complete on
SwapSuccessScene; same-asset sends show the transaction success modal.
Nothing talks to Houdini; all values are hard-coded. The card grouping
uses Proposal A (From -> To grouping).
Walks the prototype from the wallet Send button through the reorganized
scene, recipient-asset picker, cross-asset XMR destination tag, Private
send toggle, and both success paths (Transaction Success modal and
SwapSuccessScene), capturing review screenshots along the way.
@j0ntz j0ntz force-pushed the prototype/houdini-send-reorg-a branch from bf8eef7 to ecd9a88 Compare June 24, 2026 23:00
Comment thread src/components/scenes/HoudiniSendScene.tsx
Address Proposal A review feedback: the Houdini provider tile no longer
renders on a plain same-asset, non-private send. It appears only when the
send is private or converts between assets, with the title 'Houdini Private
Exchange' (private) or 'Houdini Exchange' (cross-asset). A plain BTC send now
shows the standard add-recipient-address UI and hides the estimated recipient
amount.
Comment thread src/components/scenes/HoudiniSendScene.tsx
j0ntz added 2 commits June 26, 2026 14:57
Apply review feedback on the redesigned send flow:
- Drop the conversion-rate tile. Show a conversion percent on the estimated
  side instead (swap-scene style), saving a tile.
- Rename 'Private send' to 'Incognito send' throughout. The incognito toggle
  tile now expands with explanatory messaging while enabled.
- A plain same-asset, non-incognito send is treated as an ordinary on-chain
  send: standard add-recipient-address UI, no exchange rows. Routing through
  Houdini (incognito or cross-asset) shows the estimated amount, conversion
  percent, and a locked recipient address.
- Update the maestro walk to cover all branches (plain, incognito, swap) and
  both success paths.
Bugbot: on the cross-asset / incognito completion path the slider reset was
called synchronously before navigating, which left the control active and let
a second slide fire another navigation. Drop the early reset so SafeSlider
locks after completion, and add a submission guard so the handler runs once.
Comment thread src/components/scenes/HoudiniSendScene.tsx
Comment thread src/components/themed/TransactionListTop.tsx
Apply the next round of design-review feedback:
- The send scene reveals the amount and network-fee rows only after a recipient
  address or asset is selected. Add an a1/a2 variant for the initial state: a1
  shows the Recipient receives row up front, a2 hides it until a selection.
- Add a Houdini swap prototype reachable from a wallet's Trade -> Swap action:
  an amount-entry scene with the incognito toggle in an expanding card, then a
  mock quote scene that shows 'Powered by Houdini' with no tappable chevron.
- Add maestro walks for both flows.
@j0ntz

j0ntz commented Jun 26, 2026

Copy link
Copy Markdown
Contributor Author

📸 Design review v4 — send reveal-on-selection + A1/A2 variants (Proposal A)

The swap-flow screenshots from this round were superseded: the swap prototype was rebuilt on the production swap flow. See the v5 comment below for the current swap screenshots.

a1 plain initial

a1 plain initial

a2 plain initial

a2 plain initial

a1 after address

a1 after address

a1 incognito

a1 incognito

asset picker

asset picker

cross asset xmr

cross asset xmr

Captured by the agent's in-app test run (build-and-test).

Comment thread src/components/scenes/HoudiniSwapScene.tsx Outdated
Per design review, the swap prototype now modifies the production swap
scenes instead of standalone scenes:

- Add an incognito toggle in a card to SwapCreateScene during amount entry.
- Thread the incognito flag to SwapConfirmationScene, which shows a
  fixed-provider, non-tappable 'Powered by Houdini' card (no chevron).
- PoweredByCard supports an optional onPress: without it the card is static
  (no chevron, no 'tap to change provider').
- Remove the from-scratch HoudiniSwapScene and HoudiniSwapQuoteScene plus
  their routes, registrations and now-unused strings; restore the wallet
  Trade -> Swap action to the production swap flow.
- Update the maestro walk to the production swap path.
@j0ntz

j0ntz commented Jun 29, 2026

Copy link
Copy Markdown
Contributor Author

📸 📸 Design review v5 — Houdini swap built on the existing swap flow (Proposal A)

agent proof 1216019116944855 v5 01 swap create incognito card

agent proof 1216019116944855 v5 01 swap create incognito card

agent proof 1216019116944855 v5 02 incognito card expanded

agent proof 1216019116944855 v5 02 incognito card expanded

agent proof 1216019116944855 v5 03 quote powered by houdini no chevron

agent proof 1216019116944855 v5 03 quote powered by houdini no chevron

Captured by the agent's in-app test run (build-and-test).

Apply the operator-provided privacy copy to the incognito send and swap
info cards, and label the swap-scene toggle 'Incognito Swap' (was reusing
the send label). Refresh the maestro assertions to the new strings.
Comment thread src/components/scenes/HoudiniSendScene.tsx
@j0ntz

j0ntz commented Jun 30, 2026

Copy link
Copy Markdown
Contributor Author

📸 📸 Design review v6 — updated incognito copy + swap title (Proposal A)

agent proof 1216019116944855 v6 01 swap incognito swap card

agent proof 1216019116944855 v6 01 swap incognito swap card

agent proof 1216019116944855 v6 02 swap incognito copy

agent proof 1216019116944855 v6 02 swap incognito copy

agent proof 1216019116944855 v6 03 send incognito copy

agent proof 1216019116944855 v6 03 send incognito copy

Captured by the agent's in-app test run (build-and-test).

Addresses a Bugbot finding: the prototype send slider was always active
(disabled={false}), so a plain same-asset send with no recipient could
slide to the success modal. Gate it on revealDetails.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit eb9994e. Configure here.

Comment thread src/components/scenes/HoudiniSendScene.tsx
…posal A)

Update the incognito prototype copy per operator feedback: rename the
Send/Swap cards to 'Silent Send' / 'Silent Swap', replace the info copy,
and add an inline, non-operational green 'Learn more' link on both cards.
@j0ntz

j0ntz commented Jul 1, 2026

Copy link
Copy Markdown
Contributor Author

📸 Test evidence (v7): Silent Send/Swap copy + inline Learn more

agent proof 1216019116944855 v7 01 send empty a1

agent proof 1216019116944855 v7 01 send empty a1

agent proof 1216019116944855 v7 06 send empty a2

agent proof 1216019116944855 v7 06 send empty a2

agent proof 1216019116944855 v7 02 send populated

agent proof 1216019116944855 v7 02 send populated

agent proof 1216019116944855 v7 03 send incognito copy

agent proof 1216019116944855 v7 03 send incognito copy

agent proof 1216019116944855 v7 04 swap start

agent proof 1216019116944855 v7 04 swap start

agent proof 1216019116944855 v7 05 swap incognito copy

agent proof 1216019116944855 v7 05 swap incognito copy

Captured by the agent's in-app test run (build-and-test).

@j0ntz

j0ntz commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

📸 Test evidence (v8: Silent -> Stealth rename)

agent proof 1216019116944855 v8 01 send empty a1

agent proof 1216019116944855 v8 01 send empty a1

agent proof 1216019116944855 v8 06 send empty a2

agent proof 1216019116944855 v8 06 send empty a2

agent proof 1216019116944855 v8 02 send populated

agent proof 1216019116944855 v8 02 send populated

agent proof 1216019116944855 v8 03 send incognito copy

agent proof 1216019116944855 v8 03 send incognito copy

agent proof 1216019116944855 v8 04 swap start

agent proof 1216019116944855 v8 04 swap start

agent proof 1216019116944855 v8 05 swap incognito copy

agent proof 1216019116944855 v8 05 swap incognito copy

Captured by the agent's in-app test run (build-and-test).

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.

1 participant