Screen 0
Wallet — Orders tab
Neutral starting state. User is on the Orders tab. Three wallet actions: Deposit, Send, Trade. Order cards: token avatar, name + status dot + status text left; amounts + range label right. No progress bar.
Tokens
Collect.
History
Orders
B
$1,575 of $2,500
Out of range
B
$0 of $2,500
Out of range
Screen 0b
Trade bottom sheet
Tap Trade → 5-item bottom sheet. Buy/Sell are market (instant). Limit variants are conditional. Swap is convert/bridge. Tapping Limit Buy closes this sheet and opens the full-height Limit Buy drawer.
Tokens
Collect.
History
Orders
+
Buy
Instant buy at current market price
↓̲
Limit Buy
Set a target to buy when price drops
−
Sell
Instant sell at current market price
↑̲
Limit Sell
Set a target to sell when price rises
⇄
Swap
Convert or bridge on token to another
Screen 1
Limit Buy — default
Full-height bottom sheet opens. Trade sheet closes. Drag handle at top. "Limit Buy" static header (no dropdown — the Trade sheet was the selector). Token context row shows BRACKY current price + 24h change. Trigger defaults to current price. "Place limit order" disabled until trigger is edited.
Screen 1b
Spend token selection
User taps the "available" token pill. Bottom sheet shows available spend tokens. Default is USDC on Base.
Spend with
$
USDC ✓ Default
$100.00 available · Base
Screen 1c
Expiry selection
User taps the "Expiry 7d ›" pill. Bottom sheet with 4 options, same row style as the Trade sheet. No expiry has a plain description, no warning.
∞
No expiration
Stays active until filled or manually cancelled
Screen 2
Trigger price set
User edits trigger to $0.75 — 25% below market. Direction badge updates live: ↘ −25%. Receive estimate appears. CTA enabled.
Buy (estimated)
if BRACKY hits $0.75
When BRACKY reaches
25% below current · $1.00 now
Expected PnL if fills
+$16.67
Expires in
Place limit order
Screen 2b
Out-of-band price error
User sets trigger above market price for a buy order — not allowed. Inline error shown. CTA blocked. Also shows max deviation error (>75%).
Limit buy must be below current price ($1.00). To buy above market, use a market order.
Expires in
Place limit order
📋 Price bounds cheatsheet — design ref only
Why only one direction per order type?
A limit order means "wait until the price is better for me." Better for a buyer = cheaper. Better for a seller = more expensive.
If you set it in the wrong direction you're just describing a market order (do it now, at a worse price) — so it's blocked.
✓ Limit BUY
Trigger below current price
e.g. current $1.00 → trigger $0.75 (↘ −25%)
"Buy when it gets cheaper"
✓ Limit SELL
Trigger above current price
e.g. current $1.00 → trigger $1.43 (↗ +43%)
"Sell when it gets more expensive"
✗ Limit BUY above market
Trigger above current price
Would fill immediately or never — just use market order. Error + CTA blocked.
✗ Limit SELL below market
Trigger below current price
Would fill immediately at a worse price than available now. Error + CTA blocked.
What about stop orders?
Stop-loss sell (sell if it drops further) and stop-buy (buy if it breaks upward) are the reverse — they exist as products but are out of scope for v1 here.
Max deviation — 75% cap
⚠ Max deviation exceeded
Trigger set more than 75% from current price. Shown inline, CTA blocked.
e.g. current $1.00, trigger $0.20 = −80% → error
Why 75%?
Safety guard against typos (e.g. $0.006 instead of $0.06). Order would sit indefinitely and lock an intent the user probably didn't mean to sign.
Uniswap caps at 99%, shows warning at ~50%. 75% is conservative but reasonable for v1.
Error message pattern
Direction error: "Limit buy must be below current price ($X). To buy above market, use a market order."
Max deviation: "Price is more than 75% below current. Double-check your trigger."
Both: red field border + red badge (↗/↘ %) + inline error alert + CTA disabled.
Screen 2c
Max deviation — soft warning
Trigger is >75% below market ($0.20 = −80%). Amber treatment throughout — badge, inline line, CTA. CTA stays enabled. This is a typo guard, not a hard constraint.
When price reaches
Price is more than 75% below market. Double-check your trigger.
Screen 3
Review & sign
Confirm screen. Surfaces UniswapX constraints: offline fill, no gas until filled, 7d expiry, cancel-while-open only.
50 USDC
when BRACKY reaches
$0.75
Direction↘ −25% (below market)
Your fundsUS$50.00 · not held
Expires7 days
GasNone until filled
Fills offline via UniswapX. Signing now doesn't execute — your order waits until a filler matches your price. Cancel any time while open.
If the price doesn't reach your trigger before expiry, the order expires unfilled — your USDC was never moved.
Sign & place order
Cancel
Screen 4
Order placed
Success state. Order is open, not executed. Copy breaks the async mechanic: "waiting", not "done".
⏳
Order is set
Your 50 USDC is waiting.
Buys BRACKY automatically
when the price hits $0.75.
StatusOpen
Trigger$0.75 · ↘ −25%
Your fundsUS$50.00 · not held
GasNone until filled
Screen 5
Orders tab
Wallet → Orders. Pending state = 0% complete. No "Submitting" or "Cancelling" states — those go directly to open/cancelled. Filled orders move to History, not Orders. "Trade" replaces "Swap" in wallet actions.
Tokens
Collect.
History
Orders
Open (2)
BRACKY Buy
50 USDC · trigger $0.75
Open
$25 of $50 filled · in range
ETH Buy
200 USDC · trigger $2,600
Open
0% complete · out of range
Screen 6
Cancel order
Tap open order → full-height bottom sheet. Links back to History for all txs. "Your funds" copy is token-agnostic.
Tokens
Collect.
History
Orders
BRACKY Buy
50 USDC · trigger $0.75
Open
Out of range · BRACKY at $1.00
BRACKY Buy order
50 USDC · trigger $0.75 · expires in 6d 23h
StatusOpen
Your fundsUS$50.00 · not held
Trigger$0.75 · ↘ −25%
GasNone until filled
See all transactions →
Terminate order
Keep order
Screen 7
Unsupported token
Token not on UniswapX allowlist — common, not edge case. Dead-end is wrong: offer market swap or price alert.
Limit orders not available for GRAPPA
This token isn't on the supported pairs list. Swap immediately at market price, or set a price alert to notify you.
Set price alert
Swap at market price
Screen 8
Never expires — warning
User selects "Never". Warn inline: signed order sits in queue indefinitely. Security implication, needs acknowledgement.
Expires in
This order never cancels. Your intent stays valid indefinitely — if the price eventually hits $0.75, it will fill even months from now. Set an expiry to stay in control.
Place limit order
Screen 9
Expired order
Orders tab with expired card. Intent expired — funds were never moved. "Trade" replaces "Swap" in wallet actions. Filled orders already in History.
Tokens
Collect.
History
Orders
Open (0)
No open orders
Expired (1)
BRACKY Buy
50 USDC · trigger $0.75 · 7d
Expired
Price never reached $0.75 · your funds were never moved
Screen 10
Price impact bridge
RED proposal. High price impact on a limit-eligible pair — secondary CTA offers limit order as an alternative strategy, not a fix.
⚠ Low liquidity
Price impact−31%
Effective rate$1 → ~$0.69
This pool is thin — your trade moves the market. You'll receive less than expected.
Swap anyway
Wait for a lower price →
Screen 11
Limit sell — input
Mirror of buy. Qty in tokens (not USD). Balance shown in token. Direction badge ↑ Above.
Sell
Balance: 8,420 BRACKY
When BRACKY reaches
Current: $1.00 · +33% above market
Screen 12
Limit sell — review
Direction explicit: "↑ Rises to (above market)". Non-custodial: "your BRACKY was never moved."
2,500 BRACKY
sell when BRACKY reaches
$1.33
Direction↗ +0% (above market)
Your funds2,500 BRACKY · not held
Receive (est.)≈ $49.75 USDC
Expires7 days
GasNone until filled
Fills offline via UniswapX. Signing doesn't execute — your order waits for a filler. Cancel any time while open.
If the price doesn't reach your trigger before expiry, the order expires unfilled — your BRACKY was never moved.
Sign & place order
Cancel