What made this hard
The hardest problems came from the gap between how traders think and how the contract works. Here are three, with what I weighed and what each one cost. Team names and contract internals are left out.
Idle money a trader can't see
Proposal, waiting on contract answers
Traders think "my money is in the account". The protocol splits it into one Cross wallet and one Isolated envelope per market. Money left in an envelope can block a Cross order and shrink what looks withdrawable, with no visible reason.
| Choice | First proposal | What I proposed | Why |
| Placement | Banner across the order area | One line under the Margin button | Close to the decision. A wide banner gets skimmed like an ad. |
| Tone | Yellow warning with a triangle | Neutral, with an info icon | The money isn't lost, and a warning overstates the risk. |
| Action | Solid lime "Return to Cross" | Outline "Move to Cross" | Lime stays on one action per screen. The verb matches the Transfer dialog. |
| Copy | "is sitting in SOL-USD isolated margin with no position or order" | "3.81 USDM is idle in SOL-USDM Isolated." | Fits the narrow panel and drops system language. |
Trade-off. Switching to Isolated automatically surfaces the money but takes control away. So the mode never changes once someone has typed a size or picked a mode, and the line explains why it switched. If the contract can't hold Cross and Isolated together in one market, the planned default-on checkbox becomes a false choice, so the design falls back to a fixed line.
When the copy was wrong, not the UI
In Figma
Two descriptions disagreed with the contract. A trader reading them would misjudge what they stood to lose, however clean the screen looked.
| Where | It said | It now says | Why |
| Isolated margin | "won't affect your other positions or account balance" | "you can't open new positions or withdraw until you add margin" | A shortfall blocks more than the one position. |
| LXPO yield | "Fees + AMM PnL" | "Revenue share + trading results" | The pool does not take the other side of every trade. |
How. I batched coded questions for the engineer, drafted text for the PM to approve, and kept a list of old phrases to scan the file for. The Earn labels alone sat in about 60 places. Trade-off. The accurate Isolated text is longer, so the dialog grew to fit it.
One trigger price, one name
Tables in Figma, selector open
Trigger cells were written four different ways, and some named the wrong price: triggers run on Index, not Mark. Reading an order should not depend on which table it sits in.
Decision. One format everywhere, Index ≥ 80,500.0, changed in the shared components first so every copy follows. Still open. The Last and Mark selector in TP/SL waits on a product decision: if the contract only supports Index, it should go.