Skip to content

fix: sitemap aggregate timeout + CDN caching - #2090

Merged
Flotapponnier merged 3 commits into
devfrom
fix/sitemap-aggregate-timeout
Aug 26, 2026
Merged

fix: sitemap aggregate timeout + CDN caching#2090
Flotapponnier merged 3 commits into
devfrom
fix/sitemap-aggregate-timeout

Conversation

@Flotapponnier

Copy link
Copy Markdown
Collaborator

Summary

  • /api/aggregate route had cache: \"no-store\" on its internal fetch, which caused Next.js to treat the route as dynamic and strip s-maxage from the response header — so Vercel CDN always returned x-vercel-cache: MISS, fetching 7.6 MB from the Paris VPS on every request
  • FETCH_TIMEOUT_MS in aggregate-blob.ts was 20 s, but the Paris VPS takes 37–49 s uncompressed (18 s compressed). The aggregate blob fetch always timed out → loadAggregateFromBlob() always returned null → sitemap fell back to 192-URL static fallback → Google Search Console dropped from 650 to 18 indexed pages around Aug 8
  • Sitemap internal timeout was 45 s, not enough when the aggregate cold-fetch can take 50+ s

Changes

  • api/aggregate/route.ts: remove cache: \"no-store\" (lets Next.js keep s-maxage=60 in the response → Vercel CDN can cache it), add export const revalidate = 60 for ISR-style caching, raise UPSTREAM_TIMEOUT_MS 25 s → 70 s
  • aggregate-blob.ts: raise FETCH_TIMEOUT_MS 20 s → 65 s (above measured VPS response time)
  • sitemap-builder.ts: raise sitemap build timeout 45 s → 120 s

Expected result

After one cold-cache request (first hit after deployment, ~18 s compressed), /api/aggregate is ISR-cached for 60 s. All subsequent sitemap builds within that window use cached data and complete in < 10 s, returning 750+ URLs instead of 192.

Test plan

  • Deploy to staging, check curl -sI https://<preview>/api/aggregate | grep cache — should show s-maxage=60
  • Check x-vercel-cache: HIT on second request to /api/aggregate
  • Check curl -s https://<preview>/sitemap.xml | grep -o '<url>' | wc -l returns 750+

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown
@Flotapponnier
Flotapponnier merged commit 07719f0 into dev Aug 26, 2026
1 check failed
Flotapponnier added a commit that referenced this pull request Aug 26, 2026
* feat: shareable wallet URLs + HL fee/funding breakdown

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown

* fix: remove 'No activity found' text from crossSim projection side

* fix: sitemap aggregate timeout + CDN caching (s-maxage stripped by dynamic route)
Flotapponnier added a commit that referenced this pull request Aug 27, 2026
* feat: fee-compare tool — Hyperliquid vs Gains wallet analysis (#2054)

* feat: HL vs Gains wallet fee comparison tool

* feat: HL vs Gains wallet fee comparison

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* fix: fetch Gains fee rates live, drop hardcoded rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* feat: fee-compare per-trade breakdown + live Gains rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings (#2046)

* perf: reduce Vercel invocations - live-prices 1s->5s CDN TTL, alternatives+perp ISR 300s

* fix: double-counted notional in HL vs Gains comparison (#2048)

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings

* fix: double-counted notional in HL vs Gains comparison — use per-side rate

* fix: rename Gains.trade -> Gains, HL -> Hyperliquid in UI (#2049)

* feat: always show Gains simulated, bold winner, pro design (#2051)

* fix: mobile responsive — stack VS card vertically, hide overflow columns (#2052)

* fix: symmetric HL/Gains display + winner logic for single-platform wallets (#2053)

* fix: mobile table Gains fee column always visible, symmetric panels (#2057)

* fix: revalidate hl-cohort + hl-history on aggregate purge (#2069)

* fix(app-store-ratings): last_over_time[31m] on reviews panel for 7d+ staleness (#2073)

* fix: sitemap 90s timeout — maxDuration=60 + tighten internal deadline to 20s

* fix: suppress orphaned buildFullSitemap rejection + guard unhandled getProvider throws

* feat(rpc): add Dogecoin bench #235 (Tatum, dRPC, BlockCypher)

* fix(dogecoin-rpc): remove em-dash from seo_intro

* fix(dogecoin-rpc): em-dash in seo_intro

* fix: sitemap aggregate timeout + CDN caching (#2090) (#2092)

* feat: shareable wallet URLs + HL fee/funding breakdown

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown

* fix: remove 'No activity found' text from crossSim projection side

* fix: sitemap aggregate timeout + CDN caching (s-maxage stripped by dynamic route)

* fix: raise maxDuration to 300s and extend sitemap JS timeout to 240s

SIGKILL (signal 9) was killing the function at 60s. The aggregate blob
(4.25MB) exceeds Next.js Data Cache's 2MB cap, so unstable_cache never
caches it and every request re-fetches from /api/aggregate (FETCH_TIMEOUT_MS
= 65s > maxDuration = 60s). SIGKILL discards the buffered response -> 500.

- maxDuration 60 -> 300: gives full build time on cold starts
- JS timeout 55s -> 240s: allows aggregate fetch + HL-builder Prometheus
  sweeps to finish before falling back to the static sitemap

* feat(zcash): add bench #236 with Tatum zcashd, Tatum Zebra, Blockchair

* fix: include pre-window HL positions in carry projection
Flotapponnier added a commit that referenced this pull request Aug 27, 2026
* feat: fee-compare tool — Hyperliquid vs Gains wallet analysis (#2054)

* feat: HL vs Gains wallet fee comparison tool

* feat: HL vs Gains wallet fee comparison

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* fix: fetch Gains fee rates live, drop hardcoded rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* feat: fee-compare per-trade breakdown + live Gains rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings (#2046)

* perf: reduce Vercel invocations - live-prices 1s->5s CDN TTL, alternatives+perp ISR 300s

* fix: double-counted notional in HL vs Gains comparison (#2048)

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings

* fix: double-counted notional in HL vs Gains comparison — use per-side rate

* fix: rename Gains.trade -> Gains, HL -> Hyperliquid in UI (#2049)

* feat: always show Gains simulated, bold winner, pro design (#2051)

* fix: mobile responsive — stack VS card vertically, hide overflow columns (#2052)

* fix: symmetric HL/Gains display + winner logic for single-platform wallets (#2053)

* fix: mobile table Gains fee column always visible, symmetric panels (#2057)

* fix: revalidate hl-cohort + hl-history on aggregate purge (#2069)

* fix(app-store-ratings): last_over_time[31m] on reviews panel for 7d+ staleness (#2073)

* fix: sitemap 90s timeout — maxDuration=60 + tighten internal deadline to 20s

* fix: suppress orphaned buildFullSitemap rejection + guard unhandled getProvider throws

* feat(rpc): add Dogecoin bench #235 (Tatum, dRPC, BlockCypher)

* fix(dogecoin-rpc): remove em-dash from seo_intro

* fix(dogecoin-rpc): em-dash in seo_intro

* fix: sitemap aggregate timeout + CDN caching (#2090) (#2092)

* feat: shareable wallet URLs + HL fee/funding breakdown

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown

* fix: remove 'No activity found' text from crossSim projection side

* fix: sitemap aggregate timeout + CDN caching (s-maxage stripped by dynamic route)

* fix: raise maxDuration to 300s and extend sitemap JS timeout to 240s

SIGKILL (signal 9) was killing the function at 60s. The aggregate blob
(4.25MB) exceeds Next.js Data Cache's 2MB cap, so unstable_cache never
caches it and every request re-fetches from /api/aggregate (FETCH_TIMEOUT_MS
= 65s > maxDuration = 60s). SIGKILL discards the buffered response -> 500.

- maxDuration 60 -> 300: gives full build time on cold starts
- JS timeout 55s -> 240s: allows aggregate fetch + HL-builder Prometheus
  sweeps to finish before falling back to the static sitemap

* feat(zcash): add bench #236 with Tatum zcashd, Tatum Zebra, Blockchair

* fix: sitemap JS timeout 240s -> 75s so smoke gate (<90s) can receive response

JS timeout was 240s which exceeds the smoke script's 90s per-attempt window
(scripts/sitemap-smoke.mjs getTextWithRetry). Every smoke attempt would abort
at 90s before the function returned, causing 3-retry failure and auto-rollback.

75s: aggregate FETCH_TIMEOUT_MS is 65s, so cold-cache fallback fires at ~75s,
returns static sitemap at ~76s — within the 90s smoke window. maxDuration=300s
means the process exits cleanly at ~76s with no SIGKILL.

* feat: add dYdX + Paradex carry projection for all HL/Gains crossSims

* fix: filter Paradex to perp markets only in carry rate fetch
Flotapponnier added a commit that referenced this pull request Aug 27, 2026
* feat: fee-compare tool — Hyperliquid vs Gains wallet analysis (#2054)

* feat: HL vs Gains wallet fee comparison tool

* feat: HL vs Gains wallet fee comparison

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* fix: fetch Gains fee rates live, drop hardcoded rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* feat: fee-compare per-trade breakdown + live Gains rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings (#2046)

* perf: reduce Vercel invocations - live-prices 1s->5s CDN TTL, alternatives+perp ISR 300s

* fix: double-counted notional in HL vs Gains comparison (#2048)

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings

* fix: double-counted notional in HL vs Gains comparison — use per-side rate

* fix: rename Gains.trade -> Gains, HL -> Hyperliquid in UI (#2049)

* feat: always show Gains simulated, bold winner, pro design (#2051)

* fix: mobile responsive — stack VS card vertically, hide overflow columns (#2052)

* fix: symmetric HL/Gains display + winner logic for single-platform wallets (#2053)

* fix: mobile table Gains fee column always visible, symmetric panels (#2057)

* fix: revalidate hl-cohort + hl-history on aggregate purge (#2069)

* fix(app-store-ratings): last_over_time[31m] on reviews panel for 7d+ staleness (#2073)

* fix: sitemap 90s timeout — maxDuration=60 + tighten internal deadline to 20s

* fix: suppress orphaned buildFullSitemap rejection + guard unhandled getProvider throws

* feat(rpc): add Dogecoin bench #235 (Tatum, dRPC, BlockCypher)

* fix(dogecoin-rpc): remove em-dash from seo_intro

* fix(dogecoin-rpc): em-dash in seo_intro

* fix: sitemap aggregate timeout + CDN caching (#2090) (#2092)

* feat: shareable wallet URLs + HL fee/funding breakdown

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown

* fix: remove 'No activity found' text from crossSim projection side

* fix: sitemap aggregate timeout + CDN caching (s-maxage stripped by dynamic route)

* fix: raise maxDuration to 300s and extend sitemap JS timeout to 240s

SIGKILL (signal 9) was killing the function at 60s. The aggregate blob
(4.25MB) exceeds Next.js Data Cache's 2MB cap, so unstable_cache never
caches it and every request re-fetches from /api/aggregate (FETCH_TIMEOUT_MS
= 65s > maxDuration = 60s). SIGKILL discards the buffered response -> 500.

- maxDuration 60 -> 300: gives full build time on cold starts
- JS timeout 55s -> 240s: allows aggregate fetch + HL-builder Prometheus
  sweeps to finish before falling back to the static sitemap

* feat(zcash): add bench #236 with Tatum zcashd, Tatum Zebra, Blockchair

* fix: sitemap JS timeout 240s -> 75s so smoke gate (<90s) can receive response

JS timeout was 240s which exceeds the smoke script's 90s per-attempt window
(scripts/sitemap-smoke.mjs getTextWithRetry). Every smoke attempt would abort
at 90s before the function returned, causing 3-retry failure and auto-rollback.

75s: aggregate FETCH_TIMEOUT_MS is 65s, so cold-cache fallback fires at ~75s,
returns static sitemap at ~76s — within the 90s smoke window. maxDuration=300s
means the process exits cleanly at ~76s with no SIGKILL.

* feat: GMX v2 carry rates — borrow projection for all GMX crossSims
Flotapponnier added a commit that referenced this pull request Aug 27, 2026
* feat: fee-compare tool — Hyperliquid vs Gains wallet analysis (#2054)

* feat: HL vs Gains wallet fee comparison tool

* feat: HL vs Gains wallet fee comparison

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* fix: fetch Gains fee rates live, drop hardcoded rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* feat: fee-compare per-trade breakdown + live Gains rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings (#2046)

* perf: reduce Vercel invocations - live-prices 1s->5s CDN TTL, alternatives+perp ISR 300s

* fix: double-counted notional in HL vs Gains comparison (#2048)

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings

* fix: double-counted notional in HL vs Gains comparison — use per-side rate

* fix: rename Gains.trade -> Gains, HL -> Hyperliquid in UI (#2049)

* feat: always show Gains simulated, bold winner, pro design (#2051)

* fix: mobile responsive — stack VS card vertically, hide overflow columns (#2052)

* fix: symmetric HL/Gains display + winner logic for single-platform wallets (#2053)

* fix: mobile table Gains fee column always visible, symmetric panels (#2057)

* fix: revalidate hl-cohort + hl-history on aggregate purge (#2069)

* fix(app-store-ratings): last_over_time[31m] on reviews panel for 7d+ staleness (#2073)

* fix: sitemap 90s timeout — maxDuration=60 + tighten internal deadline to 20s

* fix: suppress orphaned buildFullSitemap rejection + guard unhandled getProvider throws

* feat(rpc): add Dogecoin bench #235 (Tatum, dRPC, BlockCypher)

* fix(dogecoin-rpc): remove em-dash from seo_intro

* fix(dogecoin-rpc): em-dash in seo_intro

* fix: sitemap aggregate timeout + CDN caching (#2090) (#2092)

* feat: shareable wallet URLs + HL fee/funding breakdown

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown

* fix: remove 'No activity found' text from crossSim projection side

* fix: sitemap aggregate timeout + CDN caching (s-maxage stripped by dynamic route)

* fix: raise maxDuration to 300s and extend sitemap JS timeout to 240s

SIGKILL (signal 9) was killing the function at 60s. The aggregate blob
(4.25MB) exceeds Next.js Data Cache's 2MB cap, so unstable_cache never
caches it and every request re-fetches from /api/aggregate (FETCH_TIMEOUT_MS
= 65s > maxDuration = 60s). SIGKILL discards the buffered response -> 500.

- maxDuration 60 -> 300: gives full build time on cold starts
- JS timeout 55s -> 240s: allows aggregate fetch + HL-builder Prometheus
  sweeps to finish before falling back to the static sitemap

* feat(zcash): add bench #236 with Tatum zcashd, Tatum Zebra, Blockchair

* fix: sitemap JS timeout 240s -> 75s so smoke gate (<90s) can receive response

JS timeout was 240s which exceeds the smoke script's 90s per-attempt window
(scripts/sitemap-smoke.mjs getTextWithRetry). Every smoke attempt would abort
at 90s before the function returned, causing 3-retry failure and auto-rollback.

75s: aggregate FETCH_TIMEOUT_MS is 65s, so cold-cache fallback fires at ~75s,
returns static sitemap at ~76s — within the 90s smoke window. maxDuration=300s
means the process exits cleanly at ~76s with no SIGKILL.

* feat(bench): Bitcoin Cash RPC bench #245 — Blockchair, Bitcore, BiggestFan
Flotapponnier added a commit that referenced this pull request Sep 11, 2026
* feat: shareable wallet URLs + HL fee/funding breakdown

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown

* fix: remove 'No activity found' text from crossSim projection side

* fix: sitemap aggregate timeout + CDN caching (s-maxage stripped by dynamic route)
bakabhai993 pushed a commit to bakabhai993/OpenChainBench that referenced this pull request Sep 12, 2026
* feat: shareable wallet URLs + HL fee/funding breakdown

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown

* fix: remove 'No activity found' text from crossSim projection side

* fix: sitemap aggregate timeout + CDN caching (s-maxage stripped by dynamic route)
bakabhai993 pushed a commit to bakabhai993/OpenChainBench that referenced this pull request Sep 12, 2026
…Bench#2121)

* feat: fee-compare tool — Hyperliquid vs Gains wallet analysis (ChainBench#2054)

* feat: HL vs Gains wallet fee comparison tool

* feat: HL vs Gains wallet fee comparison

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* fix: fetch Gains fee rates live, drop hardcoded rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* feat: fee-compare per-trade breakdown + live Gains rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings (ChainBench#2046)

* perf: reduce Vercel invocations - live-prices 1s->5s CDN TTL, alternatives+perp ISR 300s

* fix: double-counted notional in HL vs Gains comparison (ChainBench#2048)

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings

* fix: double-counted notional in HL vs Gains comparison — use per-side rate

* fix: rename Gains.trade -> Gains, HL -> Hyperliquid in UI (ChainBench#2049)

* feat: always show Gains simulated, bold winner, pro design (ChainBench#2051)

* fix: mobile responsive — stack VS card vertically, hide overflow columns (ChainBench#2052)

* fix: symmetric HL/Gains display + winner logic for single-platform wallets (ChainBench#2053)

* fix: mobile table Gains fee column always visible, symmetric panels (ChainBench#2057)

* fix: revalidate hl-cohort + hl-history on aggregate purge (ChainBench#2069)

* fix(app-store-ratings): last_over_time[31m] on reviews panel for 7d+ staleness (ChainBench#2073)

* fix: sitemap 90s timeout — maxDuration=60 + tighten internal deadline to 20s

* fix: suppress orphaned buildFullSitemap rejection + guard unhandled getProvider throws

* feat(rpc): add Dogecoin bench ChainBench#235 (Tatum, dRPC, BlockCypher)

* fix(dogecoin-rpc): remove em-dash from seo_intro

* fix(dogecoin-rpc): em-dash in seo_intro

* fix: sitemap aggregate timeout + CDN caching (ChainBench#2090) (ChainBench#2092)

* feat: shareable wallet URLs + HL fee/funding breakdown

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown

* fix: remove 'No activity found' text from crossSim projection side

* fix: sitemap aggregate timeout + CDN caching (s-maxage stripped by dynamic route)

* fix: raise maxDuration to 300s and extend sitemap JS timeout to 240s

SIGKILL (signal 9) was killing the function at 60s. The aggregate blob
(4.25MB) exceeds Next.js Data Cache's 2MB cap, so unstable_cache never
caches it and every request re-fetches from /api/aggregate (FETCH_TIMEOUT_MS
= 65s > maxDuration = 60s). SIGKILL discards the buffered response -> 500.

- maxDuration 60 -> 300: gives full build time on cold starts
- JS timeout 55s -> 240s: allows aggregate fetch + HL-builder Prometheus
  sweeps to finish before falling back to the static sitemap

* feat(zcash): add bench ChainBench#236 with Tatum zcashd, Tatum Zebra, Blockchair

* fix: include pre-window HL positions in carry projection
bakabhai993 pushed a commit to bakabhai993/OpenChainBench that referenced this pull request Sep 12, 2026
* feat: fee-compare tool — Hyperliquid vs Gains wallet analysis (ChainBench#2054)

* feat: HL vs Gains wallet fee comparison tool

* feat: HL vs Gains wallet fee comparison

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* fix: fetch Gains fee rates live, drop hardcoded rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* feat: fee-compare per-trade breakdown + live Gains rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings (ChainBench#2046)

* perf: reduce Vercel invocations - live-prices 1s->5s CDN TTL, alternatives+perp ISR 300s

* fix: double-counted notional in HL vs Gains comparison (ChainBench#2048)

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings

* fix: double-counted notional in HL vs Gains comparison — use per-side rate

* fix: rename Gains.trade -> Gains, HL -> Hyperliquid in UI (ChainBench#2049)

* feat: always show Gains simulated, bold winner, pro design (ChainBench#2051)

* fix: mobile responsive — stack VS card vertically, hide overflow columns (ChainBench#2052)

* fix: symmetric HL/Gains display + winner logic for single-platform wallets (ChainBench#2053)

* fix: mobile table Gains fee column always visible, symmetric panels (ChainBench#2057)

* fix: revalidate hl-cohort + hl-history on aggregate purge (ChainBench#2069)

* fix(app-store-ratings): last_over_time[31m] on reviews panel for 7d+ staleness (ChainBench#2073)

* fix: sitemap 90s timeout — maxDuration=60 + tighten internal deadline to 20s

* fix: suppress orphaned buildFullSitemap rejection + guard unhandled getProvider throws

* feat(rpc): add Dogecoin bench ChainBench#235 (Tatum, dRPC, BlockCypher)

* fix(dogecoin-rpc): remove em-dash from seo_intro

* fix(dogecoin-rpc): em-dash in seo_intro

* fix: sitemap aggregate timeout + CDN caching (ChainBench#2090) (ChainBench#2092)

* feat: shareable wallet URLs + HL fee/funding breakdown

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown

* fix: remove 'No activity found' text from crossSim projection side

* fix: sitemap aggregate timeout + CDN caching (s-maxage stripped by dynamic route)

* fix: raise maxDuration to 300s and extend sitemap JS timeout to 240s

SIGKILL (signal 9) was killing the function at 60s. The aggregate blob
(4.25MB) exceeds Next.js Data Cache's 2MB cap, so unstable_cache never
caches it and every request re-fetches from /api/aggregate (FETCH_TIMEOUT_MS
= 65s > maxDuration = 60s). SIGKILL discards the buffered response -> 500.

- maxDuration 60 -> 300: gives full build time on cold starts
- JS timeout 55s -> 240s: allows aggregate fetch + HL-builder Prometheus
  sweeps to finish before falling back to the static sitemap

* feat(zcash): add bench ChainBench#236 with Tatum zcashd, Tatum Zebra, Blockchair

* fix: sitemap JS timeout 240s -> 75s so smoke gate (<90s) can receive response

JS timeout was 240s which exceeds the smoke script's 90s per-attempt window
(scripts/sitemap-smoke.mjs getTextWithRetry). Every smoke attempt would abort
at 90s before the function returned, causing 3-retry failure and auto-rollback.

75s: aggregate FETCH_TIMEOUT_MS is 65s, so cold-cache fallback fires at ~75s,
returns static sitemap at ~76s — within the 90s smoke window. maxDuration=300s
means the process exits cleanly at ~76s with no SIGKILL.

* feat: add dYdX + Paradex carry projection for all HL/Gains crossSims

* fix: filter Paradex to perp markets only in carry rate fetch
bakabhai993 pushed a commit to bakabhai993/OpenChainBench that referenced this pull request Sep 12, 2026
* feat: fee-compare tool — Hyperliquid vs Gains wallet analysis (ChainBench#2054)

* feat: HL vs Gains wallet fee comparison tool

* feat: HL vs Gains wallet fee comparison

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* fix: fetch Gains fee rates live, drop hardcoded rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* feat: fee-compare per-trade breakdown + live Gains rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings (ChainBench#2046)

* perf: reduce Vercel invocations - live-prices 1s->5s CDN TTL, alternatives+perp ISR 300s

* fix: double-counted notional in HL vs Gains comparison (ChainBench#2048)

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings

* fix: double-counted notional in HL vs Gains comparison — use per-side rate

* fix: rename Gains.trade -> Gains, HL -> Hyperliquid in UI (ChainBench#2049)

* feat: always show Gains simulated, bold winner, pro design (ChainBench#2051)

* fix: mobile responsive — stack VS card vertically, hide overflow columns (ChainBench#2052)

* fix: symmetric HL/Gains display + winner logic for single-platform wallets (ChainBench#2053)

* fix: mobile table Gains fee column always visible, symmetric panels (ChainBench#2057)

* fix: revalidate hl-cohort + hl-history on aggregate purge (ChainBench#2069)

* fix(app-store-ratings): last_over_time[31m] on reviews panel for 7d+ staleness (ChainBench#2073)

* fix: sitemap 90s timeout — maxDuration=60 + tighten internal deadline to 20s

* fix: suppress orphaned buildFullSitemap rejection + guard unhandled getProvider throws

* feat(rpc): add Dogecoin bench ChainBench#235 (Tatum, dRPC, BlockCypher)

* fix(dogecoin-rpc): remove em-dash from seo_intro

* fix(dogecoin-rpc): em-dash in seo_intro

* fix: sitemap aggregate timeout + CDN caching (ChainBench#2090) (ChainBench#2092)

* feat: shareable wallet URLs + HL fee/funding breakdown

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown

* fix: remove 'No activity found' text from crossSim projection side

* fix: sitemap aggregate timeout + CDN caching (s-maxage stripped by dynamic route)

* fix: raise maxDuration to 300s and extend sitemap JS timeout to 240s

SIGKILL (signal 9) was killing the function at 60s. The aggregate blob
(4.25MB) exceeds Next.js Data Cache's 2MB cap, so unstable_cache never
caches it and every request re-fetches from /api/aggregate (FETCH_TIMEOUT_MS
= 65s > maxDuration = 60s). SIGKILL discards the buffered response -> 500.

- maxDuration 60 -> 300: gives full build time on cold starts
- JS timeout 55s -> 240s: allows aggregate fetch + HL-builder Prometheus
  sweeps to finish before falling back to the static sitemap

* feat(zcash): add bench ChainBench#236 with Tatum zcashd, Tatum Zebra, Blockchair

* fix: sitemap JS timeout 240s -> 75s so smoke gate (<90s) can receive response

JS timeout was 240s which exceeds the smoke script's 90s per-attempt window
(scripts/sitemap-smoke.mjs getTextWithRetry). Every smoke attempt would abort
at 90s before the function returned, causing 3-retry failure and auto-rollback.

75s: aggregate FETCH_TIMEOUT_MS is 65s, so cold-cache fallback fires at ~75s,
returns static sitemap at ~76s — within the 90s smoke window. maxDuration=300s
means the process exits cleanly at ~76s with no SIGKILL.

* feat: GMX v2 carry rates — borrow projection for all GMX crossSims
bakabhai993 pushed a commit to bakabhai993/OpenChainBench that referenced this pull request Sep 12, 2026
* feat: fee-compare tool — Hyperliquid vs Gains wallet analysis (ChainBench#2054)

* feat: HL vs Gains wallet fee comparison tool

* feat: HL vs Gains wallet fee comparison

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* fix: fetch Gains fee rates live, drop hardcoded rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* feat: fee-compare per-trade breakdown + live Gains rates

* feat: HL vs Gains wallet fee comparison tool

* fix: fetch Gains fee rates live, drop hardcoded 0.12%

* feat: per-trade table, live Gains rates per coin, PnL column

* fix: remove duplicate gainsFeeCache declaration

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings (ChainBench#2046)

* perf: reduce Vercel invocations - live-prices 1s->5s CDN TTL, alternatives+perp ISR 300s

* fix: double-counted notional in HL vs Gains comparison (ChainBench#2048)

* redesign: fee-compare UI — logos, VS card, trade table, per-fill savings

* fix: double-counted notional in HL vs Gains comparison — use per-side rate

* fix: rename Gains.trade -> Gains, HL -> Hyperliquid in UI (ChainBench#2049)

* feat: always show Gains simulated, bold winner, pro design (ChainBench#2051)

* fix: mobile responsive — stack VS card vertically, hide overflow columns (ChainBench#2052)

* fix: symmetric HL/Gains display + winner logic for single-platform wallets (ChainBench#2053)

* fix: mobile table Gains fee column always visible, symmetric panels (ChainBench#2057)

* fix: revalidate hl-cohort + hl-history on aggregate purge (ChainBench#2069)

* fix(app-store-ratings): last_over_time[31m] on reviews panel for 7d+ staleness (ChainBench#2073)

* fix: sitemap 90s timeout — maxDuration=60 + tighten internal deadline to 20s

* fix: suppress orphaned buildFullSitemap rejection + guard unhandled getProvider throws

* feat(rpc): add Dogecoin bench ChainBench#235 (Tatum, dRPC, BlockCypher)

* fix(dogecoin-rpc): remove em-dash from seo_intro

* fix(dogecoin-rpc): em-dash in seo_intro

* fix: sitemap aggregate timeout + CDN caching (ChainBench#2090) (ChainBench#2092)

* feat: shareable wallet URLs + HL fee/funding breakdown

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown

* fix: remove 'No activity found' text from crossSim projection side

* fix: sitemap aggregate timeout + CDN caching (s-maxage stripped by dynamic route)

* fix: raise maxDuration to 300s and extend sitemap JS timeout to 240s

SIGKILL (signal 9) was killing the function at 60s. The aggregate blob
(4.25MB) exceeds Next.js Data Cache's 2MB cap, so unstable_cache never
caches it and every request re-fetches from /api/aggregate (FETCH_TIMEOUT_MS
= 65s > maxDuration = 60s). SIGKILL discards the buffered response -> 500.

- maxDuration 60 -> 300: gives full build time on cold starts
- JS timeout 55s -> 240s: allows aggregate fetch + HL-builder Prometheus
  sweeps to finish before falling back to the static sitemap

* feat(zcash): add bench ChainBench#236 with Tatum zcashd, Tatum Zebra, Blockchair

* fix: sitemap JS timeout 240s -> 75s so smoke gate (<90s) can receive response

JS timeout was 240s which exceeds the smoke script's 90s per-attempt window
(scripts/sitemap-smoke.mjs getTextWithRetry). Every smoke attempt would abort
at 90s before the function returned, causing 3-retry failure and auto-rollback.

75s: aggregate FETCH_TIMEOUT_MS is 65s, so cold-cache fallback fires at ~75s,
returns static sitemap at ~76s — within the 90s smoke window. maxDuration=300s
means the process exits cleanly at ~76s with no SIGKILL.

* feat(bench): Bitcoin Cash RPC bench ChainBench#245 — Blockchair, Bitcore, BiggestFan
bakabhai993 pushed a commit to bakabhai993/OpenChainBench that referenced this pull request Sep 12, 2026
…Bench#2092)

* feat: shareable wallet URLs + HL fee/funding breakdown

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown

* fix: remove 'No activity found' text from crossSim projection side

* fix: sitemap aggregate timeout + CDN caching (s-maxage stripped by dynamic route)
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