Complete flow — all required screens
Every state the limit order UI must handle, left to right. Same pair throughout: 50 USDC → BRACKY, current $1.00, trigger $0.75 (−25%).
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.
$741.07
▲ $10.82 (2.33%)
Deposit
Send
Trade
Tokens
Collect.
History
Orders
B
BRACKY Buy
63% complete
$1,575 of $2,500
Out of range
B
BRACKY Sell
Completed
$2,500
B
BRACKY Sell
Pending
$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.
$741.07
▲ $10.82 (2.33%)
↓ Deposit
↑ Send
⇄ Trade
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.
Limit Buy
B
Bracky
BRACKY · 11mo
$1.00
▼ −6%
When price reaches
$1.00
↘ −0%
Buy
$0
$
$100.00 available
Expiry 7d
10%
25%
50%
Max
1
2
3
4
5
6
7
8
9
.
0
Place limit order
Screen 1b
Spend token selection
User taps the "available" token pill. Bottom sheet shows available spend tokens. Default is USDC on Base.
Limit Buy
Spend with
$
USDC ✓ Default
$100.00 available · Base
Ξ
ETH
0.023 ETH · $59.80
W
WETH
0.00 WETH
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.
Limit Buy
1d
1 day
7d
7 days ✓ Selected
30d
30 days
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.
Swap
Market
Limit
Buy (estimated)
~66.67
B
BRACKY
if BRACKY hits $0.75
Spend
50
$
USDC ›
US$50.00
When BRACKY reaches
$0.75
↘ −25%
25% below current · $1.00 now
Expected PnL if fills +$16.67
Expires in
1d
7d
30d
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%).
Swap
Market
Limit
Buy
B
BRACKY
Spend
50
$
USDC ›
When BRACKY reaches
$1.20
↗ +18%
Limit buy must be below current price ($1.00). To buy above market, use a market order.
Expires in
1d
7d
30d
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.
Limit Buy
B
Bracky
BRACKY · 11mo
$1.00
▼ −6%
When price reaches
$0.20
↘ −80% ⚠
Price is more than 75% below market. Double-check your trigger.
Buy
$50
$
$100.00 available
Expiry 7d
10%
25%
50%
Max
1
2
3
4
5
6
7
8
9
.
0
Place limit order
Screen 3
Review & sign
Confirm screen. Surfaces UniswapX constraints: offline fill, no gas until filled, 7d expiry, cancel-while-open only.
← Back
Review order
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
View orders
Done
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.
Wallet
+
↓ Deposit
↑ Send
⇄ Trade
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.
Wallet
+
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.
Swap
Market
Limit
Sell
50
$
USDC
Receive
G
GRAPPA
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.
Swap
Market
Limit
Sell
50
$
USDC
Receive (estimated)
~66.67
B
BRACKY
When BRACKY reaches
$0.75
↓ Falls to
Expires in
1d
7d
30d
∞ ⚠
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.
Wallet
+
↓ Deposit
↑ Send
⇄ Trade
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.
Swap
Sell
50 USDC
Receive
~34.50 USDC
⚠ 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.
Limit sell
Sell
2,500
D
BRACKY
Balance: 8,420 BRACKY
Receive — at target
≈ $49.75
$
USDC
When BRACKY reaches
$1.33
↑ Rises to
Current: $1.00 · +33% above market
1d
7d
30d
Never
Review & sign
Screen 12
Limit sell — review
Direction explicit: "↑ Rises to (above market)". Non-custodial: "your BRACKY was never moved."
Review order
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

Limit order — form variations

A — Persistent mode toggle
Market | Limit tab always visible at top of swap
Baseline
Swap
Market
Limit
Sell
500
$
USDC
≈ $500.00
Buy
Ξ
ETH
At limit price
When ETH price reaches
$2,800
Falls to ↓
Current: $3,421 · −18%
1d
7d
30d
Never
Min. received 0.178 ETH
Protocol UniswapX
Set limit order
Familiar pattern (Binance/OKX) Mode always accessible Toggle adds UI weight to market swap Limit is a minority action — prominent placement may mislead Farcaster wallet is not a trading app
B — Impact warning + opt-in limit
Warning is honest about liquidity; limit order offered as a separate choice, not the fix
Proposed
Swap
Sell
10,000
$
USDC
≈ $10,000.00
Buy
6,820
D
DEGEN
−31.8% price impact
Low liquidity pool. Your $10,000 trade moves the price — you'll receive ~$6,820 worth of DEGEN, not $10,000. This isn't a fee; it's slippage from pool depth.
You send 10,000 USDC
You receive (min.) 6,820 DEGEN
Swap anyway
Wait for a lower price →
Warning is accurate — slippage explained, not conflated with price timing Limit order offered as a separate intent, not the cure "Wait for a lower price" is honest copy — doesn't promise slippage goes away Danger CTA hierarchy discourages reckless confirm Requires threshold logic (when to show this vs. normal warning) Limit order only works if token is on allowlist — not guaranteed for illiquid tokens "Wait for lower price" → limit order; "swap anyway" → normal flow. Two clear exits.
B2 — Limit form (after bridge tap)
Pre-filled from market swap context, direction inferred
Proposed
Limit order
Sell
10,000
$
USDC
Buy — at target price
≈ 10,150
D
DEGEN
Buy when DEGEN price reaches
$0.00098
↓ Below
Current market: $0.00141 · −31%
1d
7d
30d
Never
Fills offline via UniswapX when DEGEN reaches $0.00098. No gas unless filled.
Review & sign
Pre-filled target reduces setup friction Direction auto-inferred (below = buy dip) Offline fill explained inline — trust signal Target price pre-fill logic needs design rule (current market? −30%?) Suggested default: current market price, user edits
C — Sign & confirm preview
Pre-signing summary before UniswapX payload is created
Supporting state
Review order
10,000 USDC
Sell when DEGEN reaches $0.00098
≈ 10,150 DEGEN
Min. received · based on 1% tolerance
Trigger price $0.00098 / DEGEN
Direction ↓ Falls to (below market)
Expires 7 days
Protocol UniswapX
Fill Offline · no gas
Cancel Before submission only
Signing creates an order, not a transaction. Funds are reserved until filled or expired.
Sign order
Surfaces all UniswapX constraints clearly Cancel caveat set correctly (pre-submission only) "Offline fill" framing builds trust Out of scope this pass: gas estimation, wallet selector, network mismatch states

Open orders — history & cancel

D — Orders history
Accessible from wallet or swap history
Supporting state
Limit orders
+ New
Open
History
USDC → DEGEN
Buy 10,000 USDC · target $0.00098 · expires 6d
Open
Cancel
USDC → ETH
Sell 500 USDC · target $2,800 · expires 5d
Open
Cancel
ETH → USDC
Sell 0.5 ETH · target $3,800 · filled 2h ago
Filled ✓
Open orders can be cancelled before they're submitted to the network.
Cancel affordance gated to open orders only Filled/expired clearly distinguished Out of scope: pagination, submitted-cannot-cancel edge state, push notification on fill
E — Unsupported token fallback
Token not on limit order allowlist — price alert + normal swap path
Edge state
Swap
Sell
1,000
$
USDC
Buy
W
WIF
Limit orders not available for WIF. This token isn't on the supported list yet. You can swap at market price, or set a price alert.
🔔 Price alert instead
Notify me when WIF hits a target
Set →
Price impact −6.2%
Swap at market price
Doesn't dead-end user — offers price alert as value-add Market swap still available, not blocked Price alert feature is a nice follow-on if not already in product Alert path needs its own design (out of scope this pass)

Order statuses — all 7 states

H — Order status reference
All 8 statuses. Cancel affordance only on open. Submitted + cancel_pending are transitional.
Eng reference
Tokens Plus Collectibles Orders History
B
BRACKY (Buy)
50% complete
$25 of $50
3d left
B
BRACKY (Sell)
Pending
$2,500
10h left
Ξ
ETH (Buy)
Submitting…
$200
D
DEGEN (Sell)
Filled
$352
W
WIF (Buy)
Cancelling…
$100
A
ARB (Buy)
Cancelled
$75
B
BRACKY (Buy)
Expired
$50
Ξ
ETH (Buy)
Failed
$500
Cancel only on Open — not on Submitted, cancel_pending, or terminal states Dimmed icon + text for terminal states (cancelled/expired) Submitting… / Cancelling… are transitional — no user action Failed needs retry path — out of scope v1 API statuses: open · submitted · filled · cancel_pending · cancelled · expired · failed
H2 — Submitted (transitional)
Order matched by filler, awaiting on-chain confirmation. No cancel.
Edge state
ETH Buy
Status
Amount$200 USDC
Target$2,800 / ETH
Tx hash0x4f2a…9c11 ↗
A filler matched your order. Waiting for on-chain confirmation — this usually takes a few seconds.
Order can no longer be cancelled once submitted.
Tx hash appears as soon as submitted — links to Basescan Explicit "can no longer be cancelled" — prevents user confusion This state is brief (~seconds). May not need its own screen in practice — poll and jump to Filled.
H3 — Failed
Fill attempted on-chain but failed. Funds not moved.
Edge state
ETH Buy
StatusFailed
Amount$500 USDC
Target$2,800 / ETH
Failed tx0x9a1c…3d44 ↗
The fill was attempted but failed on-chain. Your USDC was never moved. You can try placing a new order.
Place new order
Non-custodial framing: "your USDC was never moved" Failed tx hash still shows — links to Basescan for transparency Retry path ("Place new order") navigates back to the form — needs eng to pre-fill Failed is rare in practice. v1 acceptable to just show the state + tx hash, no retry.
──────────────────────────────────────── -->

Sell flow

F — Limit sell input
Sell quantity in tokens, trigger above market
Supporting state
Limit sell
Sell
2,500
D
DEGEN
Balance: 8,420 DEGEN
Receive — at target price
≈ $352
$
USDC
Sell when DEGEN price reaches
$0.00141
↑ Above
Current: $0.00098 · +44% above market
1d
7d
30d
Never
Fills offline via UniswapX when DEGEN reaches $0.00141. No gas unless filled.
Review & sign
Qty in tokens — correct for sell (not USD spend) Direction badge ↑ above — distinct from buy ↓ Balance shown in token, not USD Direction inferred from price vs market; user can toggle via badge tap
G — Review sell order
Copy mirrors buy review, direction explicit
Supporting state
Review order
2,500 DEGEN
Sell when DEGEN reaches $0.00141
≈ $352 USDC
Min. received · based on 1% tolerance
Trigger price $0.00141 / DEGEN
Direction ↑ Rises to (above market)
Expires 7 days
Protocol UniswapX
Fill Offline · no gas
Cancel Before submission only
Signing creates an order, not a transaction. Your intent stays valid — your DEGEN was never moved.
Sign order
Direction row explicitly says "Rises to (above market)" Non-custodial copy: "your intent stays valid — DEGEN never moved" Structure identical to buy review — one shared component in production

Light mode

All screens available in light mode
Toggle the ☀ light / 🌙 dark button (top right) — all phone screens switch via CSS custom properties. The phone bezel stays dark (it's a device chrome, not UI). Every screen on this page works in both modes.
──────────────────────────────────────── -->
Proposal — pending approval
Ship Options B + B2 + C as the primary flow: high price impact warning surfaces the limit order CTA (NEYN-11039 + 11022 together), tapping it pre-fills the limit form, review/sign screen surfaces all UniswapX constraints. Mode toggle (Option A) is deprioritised — it adds UI weight to a minority action. Option D (orders history) is required but not blocking. Option E (unsupported token) needed for completeness.
Out of scope this pass: gas estimation, wallet selector, network mismatch, push notification on fill, submitted-order cancel (v1 constraint), price alert feature, pagination in orders history.
Benchmark
Reference screens via Mobbin
Limit order UI
OKX
OKX
Binance
Binance
OKX
OKX
Binance
Binance
OKX
OKX
Binance
Binance
Solflare
Solflare
Binance
Binance
Market / Limit toggle
Binance
Binance
Binance
Binance
Stake
Stake
Stake
Stake
Binance
Binance
Binance
Binance