Hanzo AI 40262dfc3d feat(web/send): form, asset picker, fee preview, confirm-with-reauth, broadcast result
Send flow per SCREENS.md §2:

- Send.tsx: form (to/amount/memo) with per-chain validation. Insufficient-
  balance check is part of the same gate so the UI never lets a doomed tx
  leave the form. Resets state on mount.

- AssetPicker.tsx: bottom-sheet modal. Re-uses portfolio's Asset rows;
  caller passes the canonical asset list (one obvious way — same prop
  pattern as Swap's TokenSelector).

- FeePreview.tsx: wagmi useEstimateGas × useGasPrice for EVM; static flat
  fees for Lux P/X (no gas market) and Solana (5000 lamports).

- ConfirmSend.tsx: re-auth via getPinAuth().verifyPin() before broadcast.
  Re-auth is required even when the wallet is unlocked — high-trust action,
  fresh check at the moment of broadcast (defends against shoulder-surfer
  on an unlocked tab).

- BroadcastResult.tsx: pending → confirmed/failed/timeout. EVM uses wagmi's
  useWaitForTransactionReceipt; non-EVM has bounded 60s poll with manual
  retry path.

- useSend.ts / useSendAsync.ts: orchestration hook + chain dispatch. Errors
  always transition to status='error' with error populated, never to 'done'.

- usePortfolioAssets.ts: contract with Auth-Portfolio Blue's portfolio
  store; collapses to one line when that store lands.

- index.tsx: nested <Routes> for /send, /send/confirm, /send/result/:hash.
  Foundation router needs the path: 'send' → 'send/*' one-line change to
  unlock the children.
2026-04-30 13:16:18 -07:00
S
Description
Open Source Lux DeFi Wallet.
187 MiB
Languages
TypeScript 88%
Swift 4.2%
Kotlin 4.1%
JavaScript 1.2%
Go 0.8%
Other 1.6%