Status: Draft Last updated: 2026-02-02 Related: PRD, Engineering
- Single window, no popups: overlays/drawers inside the main view
- Always show provenance: origin, network, account, and data source (Remote vs Local)
- State diffs > raw calldata: show what changes, then details
- Progressive disclosure: defaults simple, "Advanced" reveals traces/logs
- Tabs
- URL bar with ENS/Basename resolution and safety indicator
- Nav controls
- Wallet/network chip
- Global status (sync, indexing mode)
- Agent history (conversations)
- Bookmarks
- Wallet panel (accounts, approvals, recent activity)
- Home agent conversation
- Webview (dApp)
- Explorer views (native pages)
- Top bar: Misty logo, network badge ("Base"), wallet chip (locked/unlocked), overflow menu
- Main: conversation thread + composer
- Left sidebar: conversation history + search
- "Quick actions" chips below composer (swap, balance, last tx, approvals)
- Text messages (agent explanations, warnings)
- Rendered components (typed UI blocks)
- Action prompts (confirm/cancel, connect/disconnect)
- Inline citations (what data source was used: RPC, Index Supply, Local index)
- Components are first-party and defined by Misty
- Agent output references components via schema (
type,props) - Components cannot embed raw HTML/JS
- Components are deterministic given props
Agent produces:
- SwapQuoteCard:
- From token + amount
- To token + quote amount
- Venue selector (Aerodrome vs Uniswap)
- Slippage
- Estimated gas
- "Simulate" (always run) + "Confirm Swap"
UX contract
- The "Confirm" button is disabled until simulation result is returned (or simulation fails with explicit reason + "Proceed anyway (unsafe)" gated behind advanced toggle).
The wallet prioritizes Smart Wallet with passkeys for frictionless onboarding, while supporting traditional HD wallets for power users.
New user flow (passkey):
- "Create Wallet" → prompt Face ID / Touch ID
- Passkey created, Smart Wallet deployed (gasless via Paymaster)
- User is ready — no seed phrase, no password
Import flow (existing mnemonic):
- "Import Wallet" → enter 12/24 word phrase
- EOA derived from mnemonic
- Smart Wallet deployed with EOA as owner
- User can optionally add passkey as backup
Wallet panel shows:
- Smart Wallet address (primary)
- Owner type indicator: "Passkey" / "Seed Phrase" / "Multiple owners"
- Add owner button (for recovery setup)
┌─────────────────────────────────────────┐
│ Wallet Owners │
├─────────────────────────────────────────┤
│ ✓ Passkey (this device) [Active] │
│ Face ID • Added Jan 15 │
│ │
│ ✓ Recovery phrase [Backup] │
│ HD Wallet • Added Jan 15 │
│ │
│ + Add another owner │
│ (passkey, hardware wallet, contact) │
└─────────────────────────────────────────┘
When sending transactions, show:
- "Gasless" badge when Paymaster is sponsoring
- "Batch" indicator when combining multiple actions
- Owner who will sign (passkey icon vs key icon)
- No wallet → show create (passkey) / import (mnemonic) options
- Wallet exists but locked → prompt biometric or password
- Unlocked
- Connect request (per-origin)
- Sign message / typed data request
- Send transaction request (always includes simulation)
- Approval management
- Owner management (add/remove owners, recovery setup)
- Account list with labels + Basename/ENS display
- Network selector (Base default; others in "Advanced Networks")
- "Lock now" + auto-lock timer display
- Permissions: list of connected sites, revoke
All overlays must show:
- Origin (domain + verified)
- Network (Base)
- Account
- Human-readable summary
- Simulation delta (for tx)
- Expandable raw details
- URL bar: supports
0x…, ENS, Basenames, tx hash - Home quick action: "View transaction"
- Right-click address in any component: "Open in Explorer"
Smart Wallet detection: If address is a Coinbase Smart Wallet, show enhanced view:
┌─────────────────────────────────────────────────────────────────┐
│ 0x1234...abcd [Smart Wallet v1.1] │
├─────────────────────────────────────────────────────────────────┤
│ Owners (2) │
│ ├─ Passkey: keys.coinbase.com (credential: abc123...) │
│ └─ EOA: 0x5678...efgh │
│ │
│ Account Abstraction Activity │
│ ├─ UserOperations: 47 │
│ ├─ Gas sponsored: 0.12 ETH (via Coinbase Paymaster) │
│ └─ Batched transactions: 12 │
└─────────────────────────────────────────────────────────────────┘
Tabs:
- Overview (balances snapshot, approvals summary, owners for Smart Wallets)
- Transactions (decode UserOperations to show inner transactions)
- Token transfers
- Approvals
- Contracts (if verified)
- Owners (Smart Wallet only — add/remove history)
- Analytics (optional later)
Important: Address page must show Data Source badge:
- "Local (TrueBlocks)" or "Remote (Index Supply)" or "RPC (direct)"
This is core to user trust and to debugging.
- Summary: status, block, timestamp, from/to, value, fee
- Simulation diff (if tx is pending or if simulated before)
- Decoded actions (protocol-aware where possible)
- Logs/events (expandable)
- "Copy share link"
By default, Misty builds a local TrueBlocks index in the background. While syncing, it falls back to Index Supply for instant data. Once the local index catches up, all queries stay local.
User-facing modes:
-
Standard (default)
- TrueBlocks builds locally in background
- Index Supply provides data until local is ready
- Automatic switchover when synced
-
Private
- Local TrueBlocks only — no remote fallback
- May show partial results until fully synced
A persistent chip near network badge:
- "Index: Remote" (green)
- "Index: Building (12%)" (yellow)
- "Index: Local" (green)
Click opens "Index Settings" sheet:
- Progress bar
- Disk usage estimate
- RPC requirements ("local node recommended")
- Toggle for "Allow remote fallback"
Note: Local indexing via TrueBlocks requires time and resources to build. UX should be transparent about sync progress and resource usage.
- Auto-lock timeout
- Require simulation before tx confirm (default ON)
- Block "unlimited approvals" without extra confirmation (default ON)
- Index mode: Standard / Private
- Fallback provider: Index Supply (used during TrueBlocks sync), BYO key option
- Clear local cached history
- Optional telemetry (off by default)
All server-side data requires explicit user approval before applying.
Update notification:
┌─────────────────────────────────────────────────────────────────┐
│ 🔄 Update Available │
│ │
│ 47 new labels • 3 app updates • 2 blocklist entries │
│ │
│ [Review Changes] [Dismiss] [Update Now] │
└─────────────────────────────────────────────────────────────────┘
Review changes screen:
┌─────────────────────────────────────────────────────────────────┐
│ Review Update [Apply All] │
├─────────────────────────────────────────────────────────────────┤
│ New Labels (47) [Accept All]│
│ ├─ ☑ 0x1234...abcd → "Aerodrome: Router v2" │
│ ├─ ☑ 0x5678...efgh → "Morpho: Blue Pool" │
│ ├─ ☐ 0x9abc...ijkl → "Unknown DEX" [Reject] │
│ └─ ... 44 more │
│ │
│ Blocklist Additions (2) [Accept All]│
│ ├─ ☑ 0xdead...beef → "Known phishing contract" │
│ └─ ☑ fake-uniswap.com → "Phishing site" │
│ │
│ App Updates (3) [Accept All]│
│ ├─ ☑ Aerodrome integration updated │
│ └─ ... 2 more │
└─────────────────────────────────────────────────────────────────┘
Users can:
- Accept all changes at once
- Review and cherry-pick individual changes
- Reject specific items
- Dismiss and review later
Index Supply can send a cursor/block height lower than previously received; UI should show:
- "Chain reorg detected — refreshing activity feed"
…and then reinitialize state per crash-only guidance. (Index Supply)
- "Remote history temporarily unavailable"
- Suggest: retry, switch to local-only (if enabled)
- "Local index requires a dedicated RPC endpoint. Add one in Settings."
(Do not auto-start local indexing silently.)
When a dApp requests connection via the Misty extension:
- Extension forwards
eth_requestAccountsto Misty desktop - Misty shows connection dialog (even if minimized — brings window to front)
- User selects account(s) to connect
- Approval sent back through extension to dApp
- dApp calls
eth_sendTransactionvia extension - Extension routes to Misty desktop
- Misty shows full transaction review (same as internal webview):
- Origin (e.g., "uniswap.org")
- Simulation results
- Decoded calldata
- Warnings
- User approves/rejects in native UI
- Result returns to dApp
Extension popup shows:
- Connection status: "Connected to Misty" / "Misty not running"
- Current account + network
- Quick actions: lock wallet, switch account
For dApps that only detect MetaMask:
- Toggle in extension settings
- Sets
window.ethereum.isMetaMask = true - Maintains Misty functionality underneath