From 8280bff4a85801a578272c5d3dc2bbef64b83bb7 Mon Sep 17 00:00:00 2001 From: Florent Tapponnier <160007691+Flotapponnier@users.noreply.github.com> Date: Mon, 3 Aug 2026 14:40:08 +0200 Subject: [PATCH 1/2] fix: group headerActions in count-leaderboard to prevent justify-between spread --- src/components/count-leaderboard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/count-leaderboard.tsx b/src/components/count-leaderboard.tsx index a7941636..0888c716 100644 --- a/src/components/count-leaderboard.tsx +++ b/src/components/count-leaderboard.tsx @@ -54,7 +54,7 @@ export function CountLeaderboard({

Leaderboard

- {headerActions} +
{headerActions}
)} {/* Thin summary strip. matches the latency-bench layout. */} From a3279ffebd9e1be0220c41fe7850c3bd9a08d3a7 Mon Sep 17 00:00:00 2001 From: Florent Tapponnier <160007691+Flotapponnier@users.noreply.github.com> Date: Mon, 3 Aug 2026 14:40:20 +0200 Subject: [PATCH 2/2] fix: use Polymarket ticker mid_price as spread reference instead of (bestBid+bestAsk)/2 --- harnesses/perp-fees/cmd/script/polymarket.go | 49 +++++++++++--------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/harnesses/perp-fees/cmd/script/polymarket.go b/harnesses/perp-fees/cmd/script/polymarket.go index 4dfb0694..24e9d62d 100644 --- a/harnesses/perp-fees/cmd/script/polymarket.go +++ b/harnesses/perp-fees/cmd/script/polymarket.go @@ -35,6 +35,7 @@ type polymarketBook struct { type polymarketTickers []struct { Symbol string `json:"symbol"` + MidPrice string `json:"mid_price"` // exchange-published mid (robust vs outlier top-of-book orders) FundingRate string `json:"funding_rate"` // per 1h interval, decimal } @@ -63,9 +64,31 @@ func fetchPolymarket(v VenueConfig) PerpSample { return s } - // 2) Fee schedule — base (tier 0) taker rate. The published tiers go - // down to 2 bps at $25M 30d volume; the bench quotes the entry tier - // like every other venue. + // 2) Tickers — mid_price used as spread reference (robust vs outlier + // top-of-book orders that inflate (bestBid+bestAsk)/2), plus funding. + var tickers polymarketTickers + if err := polymarketGet(client, polymarketBase+"/tickers", &tickers); err != nil { + s.Err = fmt.Sprintf("tickers: %v", err) + s.FetchLatencyMs = time.Since(start).Milliseconds() + return s + } + var mid float64 + for _, t := range tickers { + if t.Symbol == v.Asset+"-USD" { + mid, _ = strconv.ParseFloat(t.MidPrice, 64) + rate, _ := strconv.ParseFloat(t.FundingRate, 64) + s.FundingRatePerHrBps = rate * 10000 + break + } + } + if mid <= 0 { + s.Err = "no_mid_price" + s.FetchLatencyMs = time.Since(start).Milliseconds() + return s + } + s.MidPrice = mid + + // 3) Fee schedule — base (tier 0) taker rate. var fees polymarketFees if err := polymarketGet(client, polymarketBase+"/fees", &fees); err != nil { s.Err = fmt.Sprintf("fees: %v", err) @@ -80,22 +103,18 @@ func fetchPolymarket(v VenueConfig) PerpSample { } } - // 3) Orderbook + // 4) Orderbook walk using the ticker mid_price as reference. var book polymarketBook if err := polymarketGet(client, fmt.Sprintf("%s/book?instrument_id=%d&depth=500", polymarketBase, instrumentID), &book); err != nil { s.Err = fmt.Sprintf("orderbook: %v", err) s.FetchLatencyMs = time.Since(start).Milliseconds() return s } - if len(book.Bids) == 0 || len(book.Asks) == 0 { + if len(book.Asks) == 0 { s.Err = "empty_orderbook" s.FetchLatencyMs = time.Since(start).Milliseconds() return s } - bestBid, _ := strconv.ParseFloat(book.Bids[0][0], 64) - bestAsk, _ := strconv.ParseFloat(book.Asks[0][0], 64) - mid := (bestBid + bestAsk) / 2 - s.MidPrice = mid levels := make([]bookLevel, 0, len(book.Asks)) for _, a := range book.Asks { @@ -113,18 +132,6 @@ func fetchPolymarket(v VenueConfig) PerpSample { s.AllInBps = s.TakerFeeBps + s.SpreadBps applyBookTiers(&s, levels, mid) - // 4) Funding — per 1h native interval, so per-hour bps is direct. - var tickers polymarketTickers - if err := polymarketGet(client, polymarketBase+"/tickers", &tickers); err == nil { - for _, t := range tickers { - if t.Symbol == v.Asset+"-USD" { - rate, _ := strconv.ParseFloat(t.FundingRate, 64) - s.FundingRatePerHrBps = rate * 10000 - break - } - } - } - s.FetchLatencyMs = time.Since(start).Milliseconds() return s }