Repository navigation
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. 🗂️ Base branches to auto review (1)
Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Deploying tmp-boltz-upstream-mainnet-arkade-wallet with
|
| Latest commit: |
a521ed1
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://f8cbf075.tmp-boltz-upstream-mainnet-arkade-wallet.pages.dev |
| Branch Preview URL: | https://wt-send-flow-changes-2026052.tmp-boltz-upstream-mainnet-arkade-wallet.pages.dev |
Deploying wallet-mutinynet with
|
| Latest commit: |
a521ed1
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://bdc398ad.arkade-wallet.pages.dev |
| Branch Preview URL: | https://wt-send-flow-changes-2026052.arkade-wallet.pages.dev |
Deploying wallet-bitcoin with
|
| Latest commit: |
a521ed1
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://37f17ad9.wallet-bitcoin.pages.dev |
| Branch Preview URL: | https://wt-send-flow-changes-2026052.wallet-bitcoin.pages.dev |
ghost
left a comment
There was a problem hiding this comment.
Code Review — #629
Reviewed the full diff, read every changed file in context, checked cross-repo impact, git history, and test coverage.
🔴 MUST FIX
1. E2E tests will break — data-testid format changed (Form.tsx:913)
The asset option data-testid changed from asset-${asset.ticker.toLowerCase()}-option to asset-${asset.assetId}-option. The e2e tests at src/test/e2e/send.test.ts:157,193 select asset-tst-option (by ticker). After this PR, the test ID will be something like asset-a1b2c3...f4-option (a hex asset ID), so both e2e test cases will fail.
Either revert to the ticker-based test ID or update the e2e tests to use the new format.
2. AssetIcon is defined as a component inside the render body (Form.tsx:~712)
const AssetIcon = ({ asset }: { asset: AssetOption | null }) => { ... }This is declared inside SendForm(), which means React creates a new component type on every render. Every re-render (keystroke in amount field, etc.) will unmount and remount every <AssetIcon>, destroying DOM state and killing any CSS transitions on icons. It also defeats React's reconciliation.
Move AssetIcon outside SendForm (or at minimum, wrap it in useMemo/extract to module scope). It only depends on asset, which can be a prop.
3. resetDevWalletStorage infinite reload risk (index.tsx:47-68)
When VITE_DEV_RESET_WALLET_ON_BOOT === 'true' and localStorage is available but the setItem for the reset key silently fails (e.g., quota exceeded after removeItem calls), the guard localStorage.getItem(storageResetKey) will keep returning null on each boot, causing an infinite reload loop.
The try/catch around the storage block catches the error and falls through to the reload, but the setItem on line 53 is inside the same try block as the removeItem calls on lines 55-57 — if setItem throws, the storage still gets cleared but the guard key is never persisted → infinite reload. Consider setting the guard key before clearing storage, or using sessionStorage for the guard (like resetControlledDevServiceWorker does).
🟡 SHOULD FIX
4. value={value ?? ''} semantic change in InputAmount (InputAmount.tsx:~111)
The old code was value={value ? Number(value) : ''} — this converted truthy string values to numbers, which meant "0" would render as '' (empty). The new code value={value ?? ''} means "0" now renders as "0". This is arguably more correct, but it's a behavioral change that could affect the send flow UX (e.g., after clearing an amount, does value become "0" or undefined?). Verify this doesn't regress the "clear amount → type new amount" flow.
5. Haptic fires on every dropdown open/close, even programmatic (Form.tsx:~869)
onOpenChange={(open) => {
hapticLight()
setShowAssetSelector(open)
}}This fires hapticLight() unconditionally — including when the menu closes due to outside click, escape key, or selecting an item (which triggers its own haptic via DropdownMenuItem). Users get double-haptic on selection. Consider only firing haptic on open (if (open) hapticLight()).
6. Button disabled || loading guard is now double-enforced (Button.tsx:83-84)
The native <button disabled={disabled}> already prevents click events when disabled is true. The added if (disabled || loading) return in handleClick is fine as defense-in-depth for the loading case (since loading doesn't set the native disabled). But note: aria-busy={loading} doesn't prevent clicks — you might want aria-disabled={loading || undefined} too, so assistive tech knows the button is non-interactive during loading.
🟢 OBSERVATIONS (no action needed)
- The dev mnemonic auto-init path in
wallet.tsxcorrectly prioritizesdevMnemonicoverdevNsecand callsinitWallet({ mnemonic })which goes throughMnemonicIdentity.fromMnemonic()— no protocol concerns here. - The
getDevWalletStorageResetKeydjb2 hash is fine for a dev-only cache-bust key. - The
useEffectdependency array in wallet.tsx:265 now includes all referenced values — good fix. - CSS changes are purely cosmetic (styling the input shells, asset selector, dropdown menu). No functional concerns.
InputContainerreplacing<Shadow>with<div className='input-shell'>is a clean refactor.- No protocol-critical code (VTXOs, signing, forfeit, rounds, exits) is touched in this PR.
Summary
The PR is a solid UI refactor. The e2e test breakage (#1) and the component-inside-render (#2) are the blockers. The infinite reload edge case (#3) is a real bug in dev tooling. The rest are quality improvements.
ghost
left a comment
There was a problem hiding this comment.
Code Review — #629
Reviewed the full diff, read every changed file in context, checked cross-repo impact, git history, and test coverage.
🔴 MUST FIX
1. E2E tests will break — data-testid format changed (Form.tsx:913)
The asset option data-testid changed from asset-${asset.ticker.toLowerCase()}-option to asset-${asset.assetId}-option. The e2e tests at src/test/e2e/send.test.ts:157,193 select asset-tst-option (by ticker). After this PR, the test ID will be something like asset-a1b2c3...f4-option (a hex asset ID), so both e2e test cases will fail.
Either revert to the ticker-based test ID or update the e2e tests to use the new format.
2. `AssetIcon` is defined as a component inside the render body (Form.tsx:~712)
```tsx
const AssetIcon = ({ asset }: { asset: AssetOption | null }) => { ... }
```
This is declared inside `SendForm()`, which means React creates a new component type on every render. Every re-render (keystroke in amount field, etc.) will unmount and remount every ``, destroying DOM state and killing any CSS transitions on icons. It also defeats React's reconciliation.
Move `AssetIcon` outside `SendForm` (or at minimum, wrap it in `useMemo`/extract to module scope). It only depends on `asset`, which can be a prop.
3. `resetDevWalletStorage` infinite reload risk (index.tsx:47-68)
When `VITE_DEV_RESET_WALLET_ON_BOOT === 'true'` and `localStorage` is available but the `setItem` for the reset key silently fails (e.g., quota exceeded after `removeItem` calls), the guard `localStorage.getItem(storageResetKey)` will keep returning `null` on each boot, causing an infinite reload loop.
The `try/catch` around the storage block catches the error and falls through to the reload, but the `setItem` on line 53 is inside the same try block as the `removeItem` calls on lines 55-57 — if `setItem` throws, the storage still gets cleared but the guard key is never persisted → infinite reload. Consider setting the guard key before clearing storage, or using `sessionStorage` for the guard (like `resetControlledDevServiceWorker` does).
🟡 SHOULD FIX
4. `value={value ?? ''}` semantic change in InputAmount (InputAmount.tsx:~111)
The old code was `value={value ? Number(value) : ''}` — this converted truthy string values to numbers, which meant `"0"` would render as `''` (empty). The new code `value={value ?? ''}` means `"0"` now renders as `"0"`. This is arguably more correct, but it's a behavioral change that could affect the send flow UX (e.g., after clearing an amount, does `value` become `"0"` or `undefined`?). Verify this doesn't regress the "clear amount → type new amount" flow.
5. Haptic fires on every dropdown open/close, even programmatic (Form.tsx:~869)
```tsx
onOpenChange={(open) => {
hapticLight()
setShowAssetSelector(open)
}}
```
This fires `hapticLight()` unconditionally — including when the menu closes due to outside click, escape key, or selecting an item (which triggers its own haptic via `DropdownMenuItem`). Users get double-haptic on selection. Consider only firing haptic on open (`if (open) hapticLight()`).
6. Button `disabled || loading` guard is now double-enforced (Button.tsx:83-84)
The native `` already prevents click events when `disabled` is true. The added `if (disabled || loading) return` in `handleClick` is fine as defense-in-depth for the `loading` case (since `loading` doesn't set the native `disabled`). But note: `aria-busy={loading}` doesn't prevent clicks — you might want `aria-disabled={loading || undefined}` too, so assistive tech knows the button is non-interactive during loading.
🟢 OBSERVATIONS (no action needed)
- The dev mnemonic auto-init path in `wallet.tsx` correctly prioritizes `devMnemonic` over `devNsec` and calls `initWallet({ mnemonic })` which goes through `MnemonicIdentity.fromMnemonic()` — no protocol concerns here.
- The `getDevWalletStorageResetKey` djb2 hash is fine for a dev-only cache-bust key.
- The `useEffect` dependency array in wallet.tsx:265 now includes all referenced values — good fix.
- CSS changes are purely cosmetic (styling the input shells, asset selector, dropdown menu). No functional concerns.
- `InputContainer` replacing `` with `` is a clean refactor.
- No protocol-critical code (VTXOs, signing, forfeit, rounds, exits) is touched in this PR.
Summary
The PR is a solid UI refactor. The e2e test breakage (#1) and the component-inside-render (#2) are the blockers. The infinite reload edge case (#3) is a real bug in dev tooling. The rest are quality improvements.
🤖 Reviewed by Arkana
ghost
left a comment
There was a problem hiding this comment.
Review: feat(send): align send flow with redesign prototype
Verdict: Approve — no protocol-critical code touched. This is UI/UX only (send form styling, asset selector, dev tooling). No VTXO handling, transaction signing, forfeit paths, or exit logic affected.
Issues to address (non-blocking)
1. E2E test breakage — data-testid format changed
src/screens/Wallet/Send/Form.tsx — the asset option test ID changed from ticker-based to assetId-based:
// Before: data-testid={`asset-${asset.ticker.toLowerCase()}-option`}
// After: data-testid={`asset-${asset.assetId}-option`}
But src/test/e2e/send.test.ts:157 and :193 reference asset-tst-option (ticker-based). These e2e tests will fail. Either update the tests or keep the old test ID format.
2. AssetIcon defined inside render body (minor perf)
src/screens/Wallet/Send/Form.tsx:~710 — AssetIcon is declared as a function inside SendForm(), so it's recreated every render. This forces React to unmount/remount the icon subtree on each render cycle instead of reconciling. Extract it to module scope (it only needs asset as a prop, no closure over component state).
Observations (no action needed)
-
Button.tsx guard is a good fix — adding
if (disabled || loading) returnbeforehapticTap()/onClick()prevents clicks during loading state wheredisabledisn't set on the DOM element. Thearia-busyaddition is correct. -
InputAmount value fix is correct —
value={value ?? ''}preserves0as a valid input value, whereas the oldvalue ? Number(value) : ''treated0as falsy and cleared the field. -
Dev mnemonic support is clean —
VITE_DEV_MNEMONICis properly guarded behindimport.meta.env.DEV,initWalletalready accepts{ mnemonic }, and theresetDevWalletStoragefunction has adequate guards (DEV+VITE_DEV_RESET_WALLET_ON_BOOT=true+ per-credential idempotency key). -
No cross-repo impact —
InputContainer,InputAmount,Buttonare wallet-internal.Shadowis only removed fromInputContainer, not deleted. No downstream consumers. -
CSS
!importantproliferation in dark-mode overrides is a code smell but not a blocker.
🤖 Reviewed by Arkana
ghost
left a comment
There was a problem hiding this comment.
Review: feat(send): align send flow with redesign prototype
Verdict: Approve — no protocol-critical code touched. This is UI/UX only (send form styling, asset selector, dev tooling). No VTXO handling, transaction signing, forfeit paths, or exit logic affected.
Issues to address (non-blocking)
1. E2E test breakage — data-testid format changed
src/screens/Wallet/Send/Form.tsx — the asset option test ID changed from ticker-based to assetId-based:
// Before: data-testid={`asset-${asset.ticker.toLowerCase()}-option`}
// After: data-testid={`asset-${asset.assetId}-option`}
But src/test/e2e/send.test.ts:157 and :193 reference asset-tst-option (ticker-based). These e2e tests will fail. Either update the tests or keep the old test ID format.
2. AssetIcon defined inside render body (minor perf)
src/screens/Wallet/Send/Form.tsx:~710 — AssetIcon is declared as a function inside SendForm(), so it's recreated every render. This forces React to unmount/remount the icon subtree on each render cycle instead of reconciling. Extract it to module scope (it only needs asset as a prop, no closure over component state).
Observations (no action needed)
-
Button.tsx guard is a good fix — adding
if (disabled || loading) returnbeforehapticTap()/onClick()prevents clicks during loading state wheredisabledisn't set on the DOM element. Thearia-busyaddition is correct. -
InputAmount value fix is correct —
value={value ?? ''}preserves0as a valid input value, whereas the oldvalue ? Number(value) : ''treated0as falsy and cleared the field. -
Dev mnemonic support is clean —
VITE_DEV_MNEMONICis properly guarded behindimport.meta.env.DEV,initWalletalready accepts{ mnemonic }, and theresetDevWalletStoragefunction has adequate guards (DEV+VITE_DEV_RESET_WALLET_ON_BOOT=true+ per-credential idempotency key). -
No cross-repo impact —
InputContainer,InputAmount,Buttonare wallet-internal.Shadowis only removed fromInputContainer, not deleted. No downstream consumers. -
CSS
!importantproliferation in dark-mode overrides is a code smell but not a blocker.
🤖 Reviewed by Arkana
Port the draft send-flow field shell, asset selector, amount max control, and button safety polish on top of PR 627. Add dev mnemonic auto-init support so local wallets can boot from mnemonic-based seeds without falling back to stale nsec state.
6814ddf to
22d086b
Compare
ghost
left a comment
There was a problem hiding this comment.
Re-review after force push (22d086b)
All five findings from my previous review are addressed:
| # | Finding | Resolution |
|---|---|---|
| 1 | E2E data-testid format breakage |
✅ Kept ticker-based format — matches src/test/e2e/send.test.ts:157,193 |
| 2 | AssetIcon defined inside render body |
✅ Extracted to module scope (Form.tsx:~72) |
| 3 | resetDevWalletStorage infinite reload |
✅ Guard key setItem now precedes removeItem calls; catch block no longer falls through to reload |
| 4 | Double haptic on dropdown | ✅ if (open) hapticLight() guard added |
| 5 | Missing aria-disabled on loading button |
✅ `aria-disabled={loading |
No new concerns. No protocol-critical code touched (VTXOs, signing, forfeit, rounds, exits are untouched). UI-only changes — safe to merge with human approval.
🤖 Reviewed by Arkana
|
I would wait to incorporate the contact/friends functionalities, to redo the send. Also woudl be nice to divide the step of selection "who send money to" and "how much" |
why wait? this is just a light ui cleanup/polish |
…w-changes-20260521
…w-changes-20260521
ghost
left a comment
There was a problem hiding this comment.
Re-review after merge commits (471cc3d → a521ed1)
Two merge commits bringing the base branch (wt-wallet-redesign-followups-20260520) into this PR. No new feature code — just a rebase-via-merge.
New finding from merge
Duplicate VITE_DEV_MNEMONIC declaration — src/vite-env.d.ts
The merge introduced a duplicate readonly VITE_DEV_MNEMONIC?: string in the ImportMetaEnv interface. Both this PR and the base branch added it, and the merge kept both. Not a runtime bug (TS takes the last declaration for duplicate interface members), but it's a merge artifact that should be cleaned up.
Changes from base branch merge (look correct)
wallet.tsx:devAutoInitCredentialvariable extracted, useEffect deps expanded from[aspInfo.url, initialized, devAutoInitFailed]to includeisDevAutoInit,devAutoInitCredential,devMnemonic,devNsec. This is more correct (satisfies exhaustive-deps) and harmless since all the new deps are stableimport.meta.envreads that won't change between renders.
No protocol-critical code touched. Previous approval stands — all five original findings remain addressed.
🤖 Reviewed by Arkana
84ced7b
into
wt-wallet-redesign-followups-20260520
* feat(wallet): redesign bitcoin home Port the scoped home redesign foundation and bitcoin-only wallet home from the draft branch. Adds shared motion and haptics helpers, redesigned home header/hero/actions/assets/upsells/activity preview, hides bottom navigation for home-launched wallet flows, and wires scan/swap interactions without pulling in passkeys or prototype asset accounts. * fix(wallet): use real assets on redesigned home * fix(wallet): polish settings and activity follow-ups Remove the bottom nav from the redesigned wallet flow and align the settings screens with the draft redesign, including the Arkade Mint entry under General. Refresh the full Activity page before showing an empty state, keep the home activity preview hidden when empty, and use the shared secondary/drawer styling for the swap coming-soon sheet. * chore(deps): update pnpm lockfile * test(e2e): follow redesigned navigation Update Playwright helpers and specs to navigate through the redesigned home header, settings entry points, and Boltz deep link instead of the removed bottom nav. * test(e2e): align home and settings assertions Use the settings header text rendered by the shared Header component and assert the redesigned zero-balance home through stable test ids. * test(e2e): navigate app screens without reload * tests fixes * Guard BigInt coercion to prevent render-time crashes * fix polling leak * lint * Add a fallback for --pill-navbar-footer-clearance in settings padding * Remove overriding aria-label on settings rows. * fix(settings): address Arkade Mint review feedback * fix tests * fix test * feat(wallet): add bitcoin detail page (#630) * feat(wallet): add bitcoin detail page Add a bitcoin-only wallet detail screen opened from the home asset row, with the Liveline price chart, current price, percentage badge, holdings, wallet actions, and bitcoin-filtered recent activity. Share the existing swap coming-soon drawer between home and the detail page, and cover the bitcoin row navigation with a wallet screen regression test. * fix(wallet): harden bitcoin chart loading Remove the invalid fiat conversion path from the bitcoin detail chart, use CoinGecko max data for non-USD all-time charts, cache chart responses per fiat/range, fetch Coinbase all-time chunks sequentially, and guard the holdings balance before BigInt conversion. * fix(wallet): pause bitcoin chart while hovering * fix tests * fix test * use graph worker * default chart period one week * remove console.log * new marketData file * fixes --------- Co-authored-by: Sahil Chaturvedi <sahilc0@users.noreply.github.com> Co-authored-by: João Bordalo <bordalix@users.noreply.github.com> * feat(wallet): align recent activity with prototype (#628) * chore(dev): support mnemonic wallet auto-init Allow local dev auto-init to use VITE_DEV_MNEMONIC in addition to VITE_DEV_NSEC, so demo wallets can be restored from the current seed phrase without using the broken legacy default key. * feat(wallet): align recent activity with prototype Update the home recent activity list, full activity view, and transaction receipt details to match the prototype visuals while keeping the shared Activity header from PR 627. Add swap/account asset rendering, receipt-style detail rows, and measured virtual rows for taller activity entries. * fix(wallet): address activity review feedback Guard the round waiting screen when no info logs exist, cancel delayed polling on unmount, preserve the safer settlement status flow, remove incomplete BRL fiat support, and share token ticker mapping helpers across activity and asset views. * fix send max with fiat ' + tests --------- Co-authored-by: Sahil Chaturvedi <sahilc0@users.noreply.github.com> Co-authored-by: João Bordalo <bordalix@users.noreply.github.com> * feat(send): align send form with redesign prototype (#629) Port the draft send-flow field shell, asset selector, amount max control, and button safety polish on top of PR 627. Add dev mnemonic auto-init support so local wallets can boot from mnemonic-based seeds without falling back to stale nsec state. Co-authored-by: Sahil Chaturvedi <sahilc0@users.noreply.github.com> Co-authored-by: João Bordalo <bordalix@users.noreply.github.com> * feat(wallet): align recent activity with prototype (#628) * chore(dev): support mnemonic wallet auto-init Allow local dev auto-init to use VITE_DEV_MNEMONIC in addition to VITE_DEV_NSEC, so demo wallets can be restored from the current seed phrase without using the broken legacy default key. * feat(wallet): align recent activity with prototype Update the home recent activity list, full activity view, and transaction receipt details to match the prototype visuals while keeping the shared Activity header from PR 627. Add swap/account asset rendering, receipt-style detail rows, and measured virtual rows for taller activity entries. * fix(wallet): address activity review feedback Guard the round waiting screen when no info logs exist, cancel delayed polling on unmount, preserve the safer settlement status flow, remove incomplete BRL fiat support, and share token ticker mapping helpers across activity and asset views. * fix send max with fiat ' + tests --------- Co-authored-by: Sahil Chaturvedi <sahilc0@users.noreply.github.com> Co-authored-by: João Bordalo <bordalix@users.noreply.github.com> * fix tests * fix navigation * remove border from video container in scan * change toggle bg color when selected to purple * fix(wallet): address home redesign review feedback * fix flacky test * fix flacky test * contracts view: copy encoded params, empty state, active/inactive sections (#645) * show encoded contract params and allow copying * show encoded contract params and allow copying * improve contracts view: empty state, active/inactive sections, label and createdAt * address review: guard encodeArkContract, createdAt fallback, unique card key Wrap encodeArkContract in try/catch via useMemo and render the parameters row only when encoding succeeds, so a contract with missing/malformed params can no longer white-screen the Contracts screen. Show 'Unknown' instead of an empty string when createdAt is absent. Use contract.address as the React key. Update tests with createdAt/params and add an empty-state case. * fix buttons overflow in input * fix other value when bip21 has amount * remove excessive bottom padding on content-shell * less sensible pull-to-refresh * fix typescript build errors (tsc -b) (#646) * fix typescript build errors (tsc -b) * arkana fixes * build fixes * remove console.log * validate asset mint amount is not too large * validate asset mint amount * validate mint values * fixes * refactor mint form * remove console.log * fix e2e tests * feat(settings): move advanced tools into settings (#652) * feat(settings): move advanced tools into settings Remove the root Apps surface and keep developer-focused tools under Settings > Advanced. Add Boltz and Arkade Mint entries there, rename the main settings group to Display, and update navigation tab ownership so these flows return through settings instead of an apps tab. Also refresh bun.lock to match the dependency versions declared on the PR 627 base and update affected settings/e2e tests. * re-order menu options * fix e2e tests * fix test --------- Co-authored-by: Sahil Chaturvedi <sahilc0@users.noreply.github.com> Co-authored-by: João Bordalo <bordalix@users.noreply.github.com> * feat(settings): support bitcoin currency units (#653) * feat(settings): support bitcoin currency units Add BTC as a selectable currency and replace display preferences with bitcoin unit options for BTC, sats, and BIP-177 notation. Format wallet totals, transactions, send/receive flows, portfolio rows, and the Bitcoin detail view with the selected bitcoin unit while keeping the detail market price in fiat. Convert fiat-like asset balances into selected-currency totals and add focused coverage for CHF asset conversion, settings options, formatting, and Bitcoin detail display. * fix e2e test * Several fixes --------- Co-authored-by: Sahil Chaturvedi <sahilc0@users.noreply.github.com> Co-authored-by: João Bordalo <bordalix@users.noreply.github.com> * fallback to btc currency if price feed fails * add useEffect missing dependencies to InputAmount * fix e2e test * arkana fixes * Fix Settings / Display * change Fiats type to Currencies change Settings menu option names * fix(wallet): address arkana wallet review * fix other value when clicking send max * update regtest link * update price chart proxy url * fix build errors * style(settings): polish contracts screen (#664) Redesign the dev-mode contracts screen with a full-width summary, clearer contract cards, copyable code fields, and subtle motion feedback. Update the contracts screen tests to cover the new summary and metadata layout. Co-authored-by: Sahil Chaturvedi <sahilc0@users.noreply.github.com> * feat(settings): add currency icons (#663) Add reusable leading content support to the settings Select component and use it on the currency picker so each option shows a circular bitcoin or country currency mark. Extend TokenLogo with the remaining fiat currency marks used by settings, add selector icon styling, and update the fiat settings tests to distinguish row icons from the selected-state checkmark. Co-authored-by: Sahil Chaturvedi <sahilc0@users.noreply.github.com> * Fixes * Remove onboarding button (#678) * remove 'complete boarding' button * Upgrade ts-sdk 0.4.36 - boltz-swap 0.3.41 (#676) * prevent double keys in local storage (#677) * prevent double keys in local storage * fix circular dependency * add tests * fix SVGs * remove "Complete boarding button" --------- Co-authored-by: pietro909 <2094604+pietro909@users.noreply.github.com> * Clean qrcode (#681) * remove 'complete boarding' button * fix SVGs * remove "Complete boarding button" * clean qr code ui * remove console.log * clean Reminder (#683) * clean Reminder * fix color * fix duplicate init with devMnemonic * fix test * update regtest commit * mini fixes * fix test * fix test * persist value; fix toggle currency (#705) * fix bitcoin balance in btc page * fix server url input * add error messages inline * fix tests * fix import * fix secondary value when not useFiat * fix flash of unlock screen (#710) * bug fix in privacyAmount * remove dead code * click on asset card to view asset * add test for clicking asset card in homepage * fixes in input amount * lnurl fix * add unit tests * bug fix * fix test * remove currencyDisplay from config (#713) * remove currencyDisplay from config * rabbit fixes * fix test * remove option from upsellsSection * only show btc and registered assets on homepage * fix import path * rename config.fiat to config.currency * fix test --------- Co-authored-by: Sahil Chaturvedi <sahilc0@users.noreply.github.com> Co-authored-by: João Bordalo <bordalix@users.noreply.github.com> Co-authored-by: pietro909 <2094604+pietro909@users.noreply.github.com>
Summary
Shadowwrapper to the draftinput-shellsurface.Affected files and components
src/screens/Wallet/Send/Form.tsx- send form layout, asset selector, selector menu, haptics.src/components/InputContainer.tsx- shared input shell structure.src/components/InputAmount.tsx- Max pill control and controlled amount value preservation.src/components/Button.tsx- disabled/loading click and haptic guard.src/index.css- send form field, asset selector, dropdown, and dark-mode styling.src/App.tsx,src/index.tsx,src/providers/wallet.tsx,src/vite-env.d.ts- dev mnemonic auto-init support.Testing
bun run lintbun run test:unit src/test/screens/wallet/send.test.tsxbun run buildwt-send-flow-changes-20260521.arkade.localhostfor send form field shells, neutral pill labels, and bottom CTA.Notes