Skip to content

bench 264: dedicated Solana quote-latency to prod - #2328

Merged
Flotapponnier merged 2 commits into
mainfrom
promote/solana-bench-main
Sep 11, 2026
Merged

bench 264: dedicated Solana quote-latency to prod#2328
Flotapponnier merged 2 commits into
mainfrom
promote/solana-bench-main

Conversation

@Flotapponnier

Copy link
Copy Markdown
Collaborator

Promotes the Solana quote-latency bench (SOL to Base/Arb/BNB/Ethereum) + the SOL-source quote routes to prod. Recording rules already live on ocb-prom. Live data: SOL->Base p50 mobula 88ms (leads). Build + validate green.

@Flotapponnier
Flotapponnier merged commit 78bfdf6 into main Sep 11, 2026
Flotapponnier added a commit that referenced this pull request Sep 11, 2026
* fix(rpc): SpecSchema-compliant YAMLs for benches 256-258 (#2211)

* 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

* fix(bench-243): probe keyed-rpc-robinhood from Singapore

* fix(bench-243): prod is Singapore-only — no dims inherited from snapshot, abstract names the probe region

* fix(bench-243): by-region grid driven by live spec, Singapore only on prod

* feat: add OG image cards for all hub pages missing dedicated cards (#2234) (#2235)

* feat: add OG image cards for dynamic routes

* Merge pull request #2236 from ChainBench/fix/og-cache-ssr-home

perf(seo): OG cache + SSR home ticker + fee-compare JSON-LD

(cherry picked from commit bc88d16)

* report: publish Robinhood Chain RPC benchmark (figures as of 2026-09-04) (#2256)

* fix(reports): default og:image to per-report dynamic image (#2257)

* report: bump Robinhood RPC publish date to 2026-09-04 (#2258)

* fix(agg): remove chromium from Dockerfile, use sidecar for Codex JWE

* ci: trigger Railway redeploy agg-head-lag

* Merge pull request #2259 from ChainBench/fix/solana-dex-volume-scope

fix(bench-205): apples-to-apples Solana scoping

(cherry picked from commit c9557df)

* fix(243): scope every Robinhood Chain RPC claim to the Singapore probe (#2272)

The page and the report presented a single-origin measurement as a
chain-wide ranking ("fastest on Robinhood Chain", "the best of any
keyed provider on the chain") and justified the origin with an
unsourced claim about the chain's Asia-Pacific infrastructure.

Round-trip latency to a keyed RPC depends on where the probe sits
relative to the provider's serving node, so the ranking is
origin-dependent. Every title, headline, FAQ and report sentence now
says "from Singapore" and states that scope explicitly. The
Asia-Pacific justification is removed everywhere. The bench remains
pinned to the Singapore probe (aggregate_filters unchanged).


Claude-Session: https://claude.ai/code/session_01CpArutAtXuBb1BVNUDXoYA

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>

* fix: keep single-origin bench payloads to their pinned region, and list only servable product URLs in the sitemap (#2274)

Two leaks between the worker's checkout (dev) and this build (main).

1. A bench pinned to one region with no region dimension declared
   still shipped every region the worker computed inside the page
   payload (extras.regions, seriesByRegion24h, cellRanks), readable in
   view-source though nothing rendered it. The guard keeps the pinned
   region's cells only. Benches that declare region tabs are untouched.

2. The sitemap listed /products/<slug> for every provider in the blob,
   including providers only declared on the worker's branch; the page
   404s on this build and the deploy's sitemap smoke blocks the release
   (2026-09-08: /products/serialized). Provider URLs are now filtered to
   slugs declared in this build's specs, plus registry parents.


Claude-Session: https://claude.ai/code/session_01CpArutAtXuBb1BVNUDXoYA

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>

* fix: confine single-origin benches to their pinned region inside overlayEditorial (#2276)

The previous guard lived in page.tsx and only reached the `benchmark`
prop; `variants` was seeded from the unfiltered aggregate a few lines
earlier and shipped every region the worker computed into the RSC
payload (us-east series and ranks for keyed-rpc-robinhood, on a page
that only shows Singapore).

Moving the confinement into overlayEditorial, where this build's spec is
already overlaid on the stored snapshot, scopes the object at the source:
aggregate, variants, filtered variants and list views all inherit it.
Benches that declare region tabs, or pin nothing, are untouched. Also
covers the 7d and 30d per-region series the page guard missed.


Claude-Session: https://claude.ai/code/session_01CpArutAtXuBb1BVNUDXoYA

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>

* feat(rpc): probe NOWNodes on ethereum and bnb (harness only) (#2284)

Config half of the NOWNodes onboarding (dev PR #2283 carries the specs
and registry). Adds the keyless public-eth / public-bsc endpoints so the
Railway rpc-capabilities services start emitting provider="nownodes"
into Prom. Verified fresh and fast against publicnode before shipping.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* feat(rpc): probe Bitcoin, LUKSO and Coreum-via-NOWNodes (harness only) (#2288)

Harness half of the Bitcoin/LUKSO/Coreum onboarding (dev PR #2287 carries
the specs + registry). Adds the bitcoin Kind (getblockcount), the LUKSO
and Bitcoin chains, NOWNodes on Coreum, and the cosmos REST fallback so
the Railway rpc-capabilities services emit the new provider=chain series
into Prom. Verified fresh vs references before shipping.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* feat(rpc): surface NOWNodes, Bitcoin and LUKSO on prod (#2293)

Site + spec half of the NOWNodes onboarding, cherry-picked to main
(the harness was already shipped via #2284 and #2288; Railway is
already emitting the data). Nothing else from dev is included.

- bitcoin-rpc (#259) and lukso-rpc (#260): new benches.
- NOWNodes added to ethereum-rpc, bnb-rpc, coreum-rpc and the
  cross-chain rpc-capabilities list.
- Real NOWNodes brand mark and official LUKSO logo; Bitcoin and LUKSO
  registered in CHAINS so they display capitalized; lukso-official
  registry entry; NOWNodes X handle corrected to @NOWNodes.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* bridge-monitor: 3/30 tiers + 5-route conserving loop + HL withdraw (#2294) (#2295)

* bridge-monitor: 3/30 tiers, 5-route conserving loop, HL withdraw, proactive equalizer

* bridge-monitor: use api.mobula.io (was demo-api), configurable via MOBULA_API_BASE

* bridge-monitor: keep quote-loop notionals at 5/50/300 (execution tiers 3/30 are separate)

* bench 002: scope region tabs to EU-West while us-east/sgp probes are paused

* bench 001 bridge-fee: scope region tabs to EU-West while us-east/sgp probes are paused

* bench 001/002: display EU-West only (single region) + methodology copy while us/sgp paused

* feat(001): Base measured against the flashblock reference, Serialized re-added (#2296)

* fix(001): measure head lag against a node we hold, not the provider's clock (#2267)

The spec promises "Reference: archive nodes per chain, validated against
block hashes" in three places. The harness never did that: both provider
paths compute receiveTime minus the timestamp the provider itself sent.
grep for archive/getBlockByNumber/blockTimestamp over the harness returns
nothing.

Measured consequence: on the same transaction hash, Serialized and Mobula
disagree about when it happened by 707 ms on Solana and 1,000 ms on Base,
so the leaderboard partly ranks where each vendor puts its clock.

Adds one WebSocket subscription per monitored pool straight to a node,
timestamping every swap on receipt, matched to provider emissions by
transaction hash. Published as head_lag_ref_seconds beside the legacy
series so the old one keeps its history while the two are compared.

Validated before shipping at a 100% hash match rate on Base and Solana.
That validation also surfaced the binding constraint: against public
endpoints the reference node is SLOWER than the providers, so the series
carries the node's own latency as an offset and must be read as a
relative comparison until REF_WS_URL_<CHAIN> points at a paid node. All
of this is documented at the call site.


Claude-Session: https://claude.ai/code/session_01CpArutAtXuBb1BVNUDXoYA

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat(001): measure Base against the flashblock reference, re-add Serialized

Base was the only chain whose zero point was wrong, and measurably so: a
block becomes queryable ~0.36 s after the timestamp it carries (median over
25 consecutive blocks) while the sequencer publishes flashblock
preconfirmations every 200 ms inside the 2 s interval. Measuring against the
block timestamp therefore described the chain's stamping convention, not the
provider's pipeline, and charged anything reading preconfirmations with a
negative lag: 99% of Serialized's Base emissions, 140 of 147.

base_flashblock_ref.go feeds the existing reference clock from that stream.
The clock already keeps the first observation, so the preconfirmation wins
over the sealed-block logs subscription without further change. The endpoint
is public and anycast: 1.1 ms RTT from both the Paris and Singapore boxes,
the same distance as the provider endpoints, so no region is handicapped
against the feeds it measures.

headlineLag applies the substitution in one place, so it lands on all four
providers at once. Re-basing one provider and leaving the others on the old
ruler is the asymmetry this change exists to remove. A Base emission with no
flashblock match is dropped, not measured against a different ruler: a dead
reference must show up as missing data, never as quietly different numbers.

Verified from two vantage points before shipping. Serialized on Base moves
from -1.016 to +0.239 (Paris) and -1.081 to +0.244 (laptop), stable, with 4
negatives out of 125 left as network jitter. Mobula's old-reference figure
from Paris (+1.070) matches production (0.951), which is what makes the
vantage trustworthy.

Only Base changes. Solana, BNB and Robinhood carry no preconfirmation layer
a provider consumes and their chain-supplied timestamps sit within ~60 ms of
the observable moment, so they keep the on-chain timestamp.

Serialized is re-added with the pinned Robinhood token address corrected:
the old value acked and delivered nothing, which is what produced the "they
publish nothing on Robinhood" report. With the address /v1/pool returns,
they deliver 98 events in 5 minutes at p50 +0.596 s.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* copy(001): name Serialized in the headline, drop the stale per-chain claims (#2301) (#2302)

The title, subtitle, seo_description and seo_intro still listed three
providers while a fourth led the bench. Two findings asserted "Mobula
leads on three of four chains" and "Codex leads on Base" as hardcoded
prose; neither is true now and neither was placeholder-driven, so they
would have read wrong forever. Replaced with statements that describe the
mechanism and defer to the per-chain placeholders for who leads.

The Base finding and the measurement FAQ now describe the flashblock
reference shipped in #2296, and state the measured floor: a sealed-block
reader carries about 1.6 s (median over 21,538 transactions) between a
trade's preconfirmation and its block becoming queryable, before any
pipeline work. Without that sentence the Base column reads as an
eightfold speed gap where the pipelines differ by a few hundred
milliseconds. The p99 finding now includes Serialized.

Slug unchanged, so URLs and indexed pages are stable; only the title text
moves.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* bridge-monitor: fix nil-interface panic in evmClientFor (crash-looped VPS when portfolio API down) (#2299) (#2303)

* feat(001): defer reference matching so a late reference still matches (#2304) (#2305)

Every provider monitor looked the trade up in the reference clock at the
instant it received the emission. That only works when the reference is
earlier than the provider. On Solana it is not: our logsSubscribe
observation lands ~0.2 s after Mobula and Serialized, who read a geyser, so
at lookup time the entry does not exist yet. Measured in production: Codex,
the slowest, matched 5% of its Solana emissions; Mobula and Serialized,
faster, matched 0%. The asymmetry is the order of arrival, not rate
limiting.

Emissions now wait in a buffer and are resolved by a 200 ms sweeper when
the reference catches up, or expired as a miss after 8 s. The match no
longer depends on which side arrives first, which is the property a
reference clock needs on every chain, not just on Base where the flashblock
stream happens to precede everyone.

emitHeadLag is the single entry point for all four monitors; the per-chain
rule (reference-based headline or provider-timestamp headline) lives in one
map, referenceChains. Base only for now. Solana is the next candidate and is
deliberately held back: flipping its headline onto a reference series that
matched 0-5% would blank the chain on the bench. Point REF_WS_URL_SOLANA at
an endpoint that delivers, confirm the match rate per region, then add it.

The Solana reference subscription moves from confirmed to processed,
measured 56 ms earlier on the same pool; the deferred matcher makes that
ordering safe.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* bridge-monitor: switch triangle to all-USDC (Arb leg USDT->USDC), avoids USDT0 routing gap (#2307) (#2308)

* bridge-monitor: capture exec-cost metrics (realized output, quote-vs-realized slippage, our gas, refund split) (#2309) (#2310)

* bridge-monitor: enable Near Intents executing bridge on main (USDC triangle, opt-in via ENABLE_NEARINTENTS_EXEC) (#2311)

* bridge-monitor: run Near Intents triangle in single-test too when opted in (#2312)

* series: densify 90d/1y resolution so young benches show all available data (#2313)

* bench: publish bridge-execution-latency (real on-chain settlement latency + success rate, EU) (#2315)

* bridge-monitor: reliability metrics (stuck + refund latency) + 0-baseline pre-seed to main (#2319)

* mcp: allowlist bridge execution metrics for query_prom (#2320)

* bridge-monitor: only record slippage-vs-quote on a real fill (skip revert/refund/fail) (#2322)

* bridge: exact execution latency + Near Intents (prod) (#2324)

* bridge-monitor: exact exec-latency gauge (no bucket interpolation) + pre-seed near-intents corridors

* bench 261: exact latency via quantile_over_time gauge + add Near Intents provider

* bench 261 exec latency: read from ocb: recording rules (prod) (#2326)

* bench 261: read exec latency from ocb: recording rules (always-fresh, survives sparse runs)

* infra: track bridge-execution recording rules (deployed to ocb-prom /opt/ocb/prom-rules)

* bench 264: dedicated Solana quote-latency to prod (#2328)

* bridge-monitor: add SOL->Arb/BNB/Ethereum quote-only routes for the Solana quote bench

* bench 264: dedicated Solana quote-latency (SOL to Base/Arb/BNB/Ethereum) + from_chain=Solana recording rules

* bench 264: add SOL->Robinhood Chain (chainId 4663, USDG cross-asset) as a destination (#2330)

* bench 264: correct Robinhood methodology — only Mobula quotes SOL->Robinhood (others reject USDC->USDG) (#2332)

* revert: keep bridge-execution-latency + bridge-quote-latency-solana benches on dev only (remove from prod) (#2333)

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
bakabhai993 pushed a commit to bakabhai993/OpenChainBench that referenced this pull request Sep 12, 2026
* bridge-monitor: add SOL->Arb/BNB/Ethereum quote-only routes for the Solana quote bench

* bench 264: dedicated Solana quote-latency (SOL to Base/Arb/BNB/Ethereum) + from_chain=Solana recording rules
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