Release 017
Release 017 · VEX 0.2.14
Unstuck.
0.2.13 put the Lighter desk in your hands; 0.2.14 is about what happens when something goes wrong on it. The lock-ups people hit after 0.2.13 (a close refused on every market, a nonce that never advanced, a key registration that "belonged to another session") now clear themselves, and only once Vex can prove what they held can no longer execute. Orders are sized against what Lighter will actually accept, the desk says plainly when it could not reach Lighter, and a click on the chart now sets your limit price.
Since 0.2.13, two pull requests landed, across Lighter's recovery paths, its order sizing, the desk, and the approval lane.
01 · Lock-ups that clear themselves
Lock-ups that clear themselves
Every lock-up reported after 0.2.13 had the same shape: a record that held something (the account's one nonce, its one live close, the wallet's one key registration) and that nothing could release. Each is now released automatically, and only from evidence that what it held can no longer execute. Nothing added here signs, submits or retries.
A close that refused on every market. "A live close_position action already exists" came from a close that expired before it was ever sent, and it blocked every close on the account, on every market. The background sweep and the next status check now retire it themselves.
"The live Lighter nonce has not advanced." An order, grouped order, close, leverage change or fee authorization that reserved the account's nonce but never reached the chain (a quit mid-sign, a crash, a send that never landed) now releases it on its own once its signed transaction has expired. Background sweeps and startup recovery do this with no action from you, including for accounts that were already stuck on 0.2.13.
Recovered before refused. The desk, the start of a mission and an approved order each run one recovery pass before they refuse, so a stale reservation is cleared at the moment you act. The interim "Check pending actions" button is gone; there is nothing to press.
No more "Settings → Lighter → Reconcile". The agent no longer sends you to a screen. It checks the order's status itself and says in plain words what is still settling.
Released only on proof. A reservation is released only when Lighter's live nonce shows the transaction never executed, and it is either past its signed expiry (after which Lighter refuses it) or provably never left Vex.
02 · Setup that can always finish
Setup that can always finish
Owned by the wallet, not the session. A key registration left half-way by a closed session is picked up by any session on the same wallet, which asks you to approve it again. "Belongs to another session and cannot be safely resumed" no longer happens.
A failed registration can start again. Once Vex can prove a failed registration never executed and never can, "Continue setup" reserves a fresh slot and asks for a new approval. A failed deposit, or a registration that may be on chain, is left alone.
An interrupted registration finishes. A registration that was signed but interrupted before its send was recorded is completed from the setup modal once its signed transaction has expired: the key activates if it landed.
Checked before a retry. Setup whose outcome was uncertain is reconciled first, so a retry never repeats a step that already went through.
03 · Orders sized to what Lighter will fill
Orders sized to what Lighter will fill
On 0.2.13 an ETH order at the ticket's 100% could come back "canceled with no fill. Lighter did not allow the margin for this order." Lighter checks every fill against your account at the mark price and charges your account's own fee tier; the ticket was sizing against the market's published fee and the last trade.
Your fee tier, the mark and the book. Max Size and 100% now account for your account's actual fee tier, the live mark price and the book levels the order would take. 100% fills.
Refused before signing, with the size that fits. An order Lighter would cancel is refused before any card or signature, on the desk and in chat, with the numbers behind it and the largest size that fits: "Reduce the size to 0.00114 BTC or less, or add margin." Reduce-only orders and closes are never held back.
Flips counted properly. Reversing a position credits the margin the closed side frees, so a flip near full margin goes through.
Cross margin, shown. Cross positions show their margin and ROE instead of "0.00".
04 · When the connection is not there
When the connection is not there
Plain words when Lighter cannot be reached. If Lighter cannot be reached before an approved order is sent, the desk says "Vex couldn't reach Lighter before sending, so nothing was signed or sent" within ten seconds, not after thirty, and no nonce is left held. A card that could not be prepared says nothing was prepared, and a network failure is no longer reported as "fee setup is required".
Approvals keep working offline. The approval card no longer freezes while your machine reports offline. An approval that cannot go through fails fast and the card closes, instead of sitting for minutes and firing later on its own.
Reload the market in one click. When the header is not Live, a small reload button after the update time rebuilds the book, trades, stats and chart and re-reads your account. A market stream that gave up during a long outage reconnects when the market is opened again.
Deep books stay live. BTC on Robinhood Chain showed "Unavailable" even on a good connection: its order book had grown past the 5,000 price levels the desk accepted. The desk now takes books up to 25,000 levels.
05 · Approval cards that never strand a row
Approval cards that never strand a row
An expired card lets go. When a close or order card times out, its row unlocks within seconds with "The close request expired before it was approved. Nothing was sent." The next close goes through.
Status where you clicked. "Awaiting approval" sits under the ✕ or Cancel that raised it, and the row stays locked until the close or cancel resolves.
Refusals in plain words. A refusal shows the reason itself, not "approval card could not be prepared (CODE - …)". Cancelled orders and unavailable closes are explained plainly too.
A tidier ticket and account table. Timed notices sit below the Long and Short buttons with a dismiss control, position values no longer overlap their columns, and Close stays in view.
06 · Click the chart to set a limit price
Click the chart to set a limit price
Type it or click it. With Limit selected, click anywhere on the chart and that price, rounded to the market's tick, fills the limit price. Your side and time in force stay as set. On Market a click does nothing, and panning never picks a price.
The crosshair tells you first. The crosshair now follows the pointer instead of snapping to the nearest close, so the price on the axis is the price a click picks. Nothing is sent from a click; the order still goes through the ticket and its approval card.
07 · The account your wallet owns
The account your wallet owns
With several wallets each holding a Lighter trading key, the desk, order previews and the agent now always use the account the session's own wallet owns. A request for an account that wallet does not own is refused before any read or signature, and a read with several accounts and no session refuses instead of guessing.
08 · Elsewhere in the app
Elsewhere in the app
History after compaction. Messages from before "conversation compacted into memory" scroll back into view again.
Private key export. The export dialog can be dismissed.
09 · Before you update
Before you update
Two migrations run automatically on first start: the signed expiry of each order and grouped order (169), which is what lets a lost send release its nonce, and Lighter setup results that can move to the archive during compaction (170). No manual action is required.
Two honest limits. A stuck reservation is released only after its signed transaction has expired plus a safety margin, so it clears minutes after the action was signed, not instantly. And the pre-signing margin check reads the book, the mark and your fee tier when the order is prepared; in a fast market Lighter's own check still has the final word.