Skip to content

release: Gains and Lighter back on the perp boards (cherry-pick #2963, #3035, #3036) - #3037

Merged
Flotapponnier merged 3 commits into
mainfrom
release/perp-gains-lighter-main
Oct 18, 2026
Merged

Flotapponnier merged 3 commits into
mainfrom
release/perp-gains-lighter-main

Conversation

@Flotapponnier

Copy link
Copy Markdown
Collaborator

Cherry-picks (-x) from dev, applied clean, tree identical to dev on the touched paths.

The harness already runs this code on the VPS (deployed from dev). On main this ships the spec copy of the three perp boards; the rest keeps main's harness source in step.

Gates: go build, go test, pnpm validate green.

pairMinLeverage and pairMaxLeverage both read 500x on pairs 300 and 313,
so 500x is their only legal value. The publisher refused only a leverage
ABOVE the maximum, so the 10x, 25x, 50x, 100x and 200x tabs each carried
a Gains row for a position that cannot be opened.

The fix is also the more useful bench. A trader who wants 50x on BTC is
not locked out of Gains, they use the standard pair: 1.1x to 200x, a 90
percent threshold interpolating to 75 between 25x and 60x, and a 0.035
percent fee a leg against the degen pair's 0.02. So Gains now reads both
products per market and each leverage publishes the one a trader could
actually open, taking the one that leaves more room where both qualify.

What the tabs say now on BTC:

  10x   standard  8.9300%
  25x   standard  3.5300%
  100x  standard  0.6800%
  200x  standard  0.3050%
  500x  degen     0.1200%
  1000x neither, so Gains is absent

The max leverage column is the venue ceiling across its products, which
is what that column means, and no longer the ceiling of whichever
product happened to serve the tab.

pairMinLeverage's selector is derived from the signature rather than
guessed, and checked by deriving pairMaxLeverage the same way and
matching the known good 0x281b693c. A failed read leaves the minimum at
zero, which termsAt treats as no minimum, so a missing selector degrades
to the previous behaviour rather than hiding every row.

(cherry picked from commit e9a363a)
… is gone (#3035)

* the max leverage tab printed Gains at 500x beside its 200x room

#2963 lets each product answer the "Each venue at its max" tab at its own
ceiling and keeps the larger room. Gains' standard pair at 200x leaves
0.305% and the degen pair at 500x 0.12%, so the tab published 500x in the
max leverage column next to the standard pair's room. Only the product
that reaches the venue's ceiling answers that tab now.

* Gains and Lighter read their own markets: Mobula's perp pairs catalog is gone

GET api.mobula.io/api/2/perp/pairs answers 404 since 2026-10-12; Mobula
deprecated it. It was the only source of Gains' active market count and
of the asset-class split for Gains and Lighter, so three boards
(perp-active-markets, perp-asset-breadth, perp-capital-efficiency) have
shown Gains, and perp-asset-breadth Lighter, as unresponsive for six days.

Gains: backend-arbitrum.gains.trade/trading-variables. Gains delists a
pair by setting its max leverage override to 1 (0.001x) and never removes
it, so those are left out: 178 tradable pairs of 493 (Mobula listed 355).
The pair groups give the class; an unknown group withholds the split.
Gains also seeds the cohort's crypto and RWA symbol sets that Mobula used
to seed for the HIP-3 dexes.

Lighter: no class in the payload, so its symbols go through the router's
cross-venue classification, with crypto as the default for a symbol no
venue tags (it is a crypto-first venue, unlike a HIP-3 RWA dex).

The copy of the three specs stops citing Mobula as the source.

(cherry picked from commit 59c886b)
/info/markets returns about 1 MB and takes 4 to 15 s from the VPS. The
client's 15 s budget expired mid-body, io.ReadAll's error was dropped,
and the truncated JSON was logged as a parse error: perp_venue_health for
Extended fell to 0.5 on those ticks. The budget is 45 s (sources run
concurrently inside a 60 s tick) and a short read is reported as one.

(cherry picked from commit f59ce7f)
@Flotapponnier
Flotapponnier merged commit 86b3901 into main Oct 18, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant