Skip to content

fix(cache): strip heavy fields from aggregate blob to pass 2MB limit - #2188

Merged
Flotapponnier merged 1 commit into
devfrom
fix/cosmos-directory-svg
Aug 28, 2026
Merged

fix(cache): strip heavy fields from aggregate blob to pass 2MB limit#2188
Flotapponnier merged 1 commit into
devfrom
fix/cosmos-directory-svg

Conversation

@Flotapponnier

Copy link
Copy Markdown
Collaborator

Summary

  • loadAggregateFromBlob was silently failing to cache because the serialized 80-bench aggregate was ~4.3 MB, above Next.js's 2 MB unstable_cache ceiling
  • Every page render using getBenchmarksSafe() (homepage, chains, products, category pages) was re-fetching the full blob from the CDN on every request
  • Fix: add slimForBlobAggregate() that strips fields only needed by bench detail pages: seriesByRegion24h, metricPanels, seoIntro, faq, findings, methodology, abstract, disclaimer, perChainExplainer
  • Hub pages never render these fields — they only need card data (title, results, extras.series24h, status, category)
  • Bumps cache key aggregate-blob-v2v3 to flush stale oversized entries

Test plan

  • Deploy to staging, check Vercel logs for absence of Failed to set Next.js data cache for unstable_cache warnings
  • Homepage and /benchmarks load with bench cards showing sparklines (series24h still present)
  • Bench detail pages still show full data (they use per-bench getBenchmark path, not the blob)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.
@Flotapponnier
Flotapponnier merged commit 2708d1a into dev Aug 28, 2026
1 check failed
Flotapponnier added a commit that referenced this pull request Aug 29, 2026
* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease
Flotapponnier added a commit that referenced this pull request Aug 29, 2026
* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)
Flotapponnier added a commit that referenced this pull request Aug 29, 2026
* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule
Flotapponnier added a commit that referenced this pull request Aug 29, 2026
* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* feat: Band Protocol #256 + cheqd #257 benches
Flotapponnier added a commit that referenced this pull request Aug 29, 2026
* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* feat: Shentu #254 + MANTRA Chain #255 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* fix: bench-blob revalidate 300s to fix perp ISR conflict
Flotapponnier added a commit that referenced this pull request Aug 29, 2026
* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* feat: Shentu #254 + MANTRA Chain #255 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* fix: bench-blob revalidate 300s to fix perp ISR conflict
Flotapponnier added a commit that referenced this pull request Aug 30, 2026
* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* feat: Shentu #254 + MANTRA Chain #255 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* feat: Band Protocol #256 + cheqd #257 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* feat: Band Protocol #256 + cheqd #257 benches

* fix: bench-blob revalidate 300s to fix perp ISR conflict (#2206)

* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* feat: Shentu #254 + MANTRA Chain #255 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* fix: bench-blob revalidate 300s to fix perp ISR conflict

* fix(fee-compare): total position value + inline vault fee explanation

* fix(fee-compare): remove vault fee — carry fees settled per-action, not OI surcharge (#2209)

* feat(rpc): ICON bench #258 — new icon probe kind, 3 keyless providers
Flotapponnier added a commit that referenced this pull request Aug 30, 2026
* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* feat: Band Protocol #256 + cheqd #257 benches

* fix: bench-blob revalidate 300s to fix perp ISR conflict (#2206)

* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* feat: Shentu #254 + MANTRA Chain #255 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* fix: bench-blob revalidate 300s to fix perp ISR conflict

* fix(fee-compare): clearer Gains labels — Position size + vault fee (#2207)

* fix(fee-compare): rename Volume→Position size + clearer vault fee label

* fix(fee-compare): show total position value + inline vault fee explanation

* fix(fee-compare): total position value + inline vault fee explanation (#2208)

* fix(fee-compare): rename Volume→Position size + clearer vault fee label

* fix(fee-compare): show total position value + inline vault fee explanation

* fix(fee-compare): remove vault fee — carry fees settled per-action, not OI surcharge (#2209)

* feat(rpc): ICON bench #258 (#2210)

* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* feat: Shentu #254 + MANTRA Chain #255 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* feat: Band Protocol #256 + cheqd #257 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* feat: Band Protocol #256 + cheqd #257 benches

* fix: bench-blob revalidate 300s to fix perp ISR conflict (#2206)

* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* feat: Shentu #254 + MANTRA Chain #255 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* fix: bench-blob revalidate 300s to fix perp ISR conflict

* fix(fee-compare): total position value + inline vault fee explanation

* fix(fee-compare): remove vault fee — carry fees settled per-action, not OI surcharge (#2209)

* feat(rpc): ICON bench #258 — new icon probe kind, 3 keyless providers
Flotapponnier added a commit that referenced this pull request Aug 30, 2026
* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* feat: Band Protocol #256 + cheqd #257 benches

* fix: bench-blob revalidate 300s to fix perp ISR conflict (#2206)

* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* feat: Shentu #254 + MANTRA Chain #255 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* fix: bench-blob revalidate 300s to fix perp ISR conflict

* fix(fee-compare): clearer Gains labels — Position size + vault fee (#2207)

* fix(fee-compare): rename Volume→Position size + clearer vault fee label

* fix(fee-compare): show total position value + inline vault fee explanation

* fix(fee-compare): total position value + inline vault fee explanation (#2208)

* fix(fee-compare): rename Volume→Position size + clearer vault fee label

* fix(fee-compare): show total position value + inline vault fee explanation

* fix(fee-compare): remove vault fee — carry fees settled per-action, not OI surcharge (#2209)

* feat(rpc): ICON bench #258 (#2210)

* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* feat: Shentu #254 + MANTRA Chain #255 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* feat: Band Protocol #256 + cheqd #257 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* feat: Band Protocol #256 + cheqd #257 benches

* fix: bench-blob revalidate 300s to fix perp ISR conflict (#2206)

* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* feat: Shentu #254 + MANTRA Chain #255 benches

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML (#2196)

* feat(rpc): Shentu #254 + MANTRA Chain #255 (#2199)

* feat(rpc): add Shentu bench #254 and MANTRA Chain bench #255

* fix: remove accidental dev-portal submodule

* fix: bench-blob revalidate 300s to fix perp ISR conflict

* fix(fee-compare): total position value + inline vault fee explanation

* fix(fee-compare): remove vault fee — carry fees settled per-action, not OI surcharge (#2209)

* feat(rpc): ICON bench #258 — new icon probe kind, 3 keyless providers

* fix(rpc): rewrite bench YAMLs 256-258 with proper SpecSchema format
Flotapponnier added a commit that referenced this pull request Aug 30, 2026
* merge: dev → main (Gains carry fix + vault fee split) (#2191)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* feat(rpc): Union bench #253 (#2195)

* fix(harnesses): cap LZ/CCIP/Axelar cardinality to bench-tracked chains only (#2187)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit (#2188)

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection (#2189)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains action names v5→v6, handle position size increases (#2190)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: Gains carry projection (v6 action names + still-open positions)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column for long tickers (xyz:NVDA)

* fix(cache): strip heavy fields from aggregate blob to pass 2MB limit

Hub pages only need card data. Drop seriesByRegion24h, metricPanels,
editorial text (seoIntro/faq/findings/methodology/disclaimer/abstract/
perChainExplainer) from the blob aggregate slim. Cuts serialized size
from ~4.3 MB to under 2 MB so unstable_cache actually persists the
entry instead of silently dropping it on every render.

* fix: include still-open Gains positions in carry projection

* fix: update Gains open action names to v6 API, handle TradePosSizeIncrease

* fix: widen coin name column in top markets to fit xyz:NVDA

* feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax, High Stakes) (#2194)

* fix(union-rpc): remove em dashes from YAML

* feat(union): add provider SVG logos and brand colors

* fix(citation): allow negative p50 for deviation benches
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