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
}