From f17eaf48f207365170bd673d22a7a0eef4bc1d76 Mon Sep 17 00:00:00 2001 From: Florent Tapponnier <160007691+Flotapponnier@users.noreply.github.com> Date: Wed, 29 Jul 2026 03:12:13 +0200 Subject: [PATCH] drop pm-geographic-access and pm-fee-comparison benches, fix predictit/smarkets logos --- benchmarks/pm-fee-comparison.yml | 126 ---------------- benchmarks/pm-geographic-access.yml | 142 ------------------ harnesses/pm-fee-comparison/Dockerfile | 22 --- .../pm-fee-comparison/cmd/script/fees.go | 140 ----------------- .../pm-fee-comparison/cmd/script/main.go | 43 ------ .../pm-fee-comparison/cmd/script/metrics.go | 58 ------- harnesses/pm-fee-comparison/go.mod | 17 --- harnesses/pm-fee-comparison/go.sum | 24 --- harnesses/pm-geographic-access/Dockerfile | 22 --- .../pm-geographic-access/cmd/script/main.go | 72 --------- .../cmd/script/metrics.go | 58 ------- .../pm-geographic-access/cmd/script/probe.go | 109 -------------- harnesses/pm-geographic-access/go.mod | 17 --- harnesses/pm-geographic-access/go.sum | 24 --- public/logos/predictit.svg | 25 ++- public/logos/smarkets.jpg | Bin 0 -> 87741 bytes public/logos/smarkets.svg | 4 - src/lib/logo-manifest.ts | 2 +- 18 files changed, 23 insertions(+), 882 deletions(-) delete mode 100644 benchmarks/pm-fee-comparison.yml delete mode 100644 benchmarks/pm-geographic-access.yml delete mode 100644 harnesses/pm-fee-comparison/Dockerfile delete mode 100644 harnesses/pm-fee-comparison/cmd/script/fees.go delete mode 100644 harnesses/pm-fee-comparison/cmd/script/main.go delete mode 100644 harnesses/pm-fee-comparison/cmd/script/metrics.go delete mode 100644 harnesses/pm-fee-comparison/go.mod delete mode 100644 harnesses/pm-fee-comparison/go.sum delete mode 100644 harnesses/pm-geographic-access/Dockerfile delete mode 100644 harnesses/pm-geographic-access/cmd/script/main.go delete mode 100644 harnesses/pm-geographic-access/cmd/script/metrics.go delete mode 100644 harnesses/pm-geographic-access/cmd/script/probe.go delete mode 100644 harnesses/pm-geographic-access/go.mod delete mode 100644 harnesses/pm-geographic-access/go.sum create mode 100644 public/logos/smarkets.jpg delete mode 100644 public/logos/smarkets.svg diff --git a/benchmarks/pm-fee-comparison.yml b/benchmarks/pm-fee-comparison.yml deleted file mode 100644 index 3951ebf5..00000000 --- a/benchmarks/pm-fee-comparison.yml +++ /dev/null @@ -1,126 +0,0 @@ -# OpenChainBench. Bench 112 - -slug: pm-fee-comparison -number: "112" -title: Prediction market fees, Polymarket vs Kalshi and more -seo_title: "Prediction market fees 2026: Polymarket, Kalshi, Limitless compared" -seo_description: "What does it cost to trade on Polymarket, Kalshi, Limitless and Myriad? Maker and taker fees, protocol cuts, total cost to trade, sourced from each venue's published fee schedule." -subtitle: Maker and taker fees, protocol cuts and net cost to trade across five prediction market venues, sourced from official fee schedules and verified from fills data. - -category: Trading -status: retired -metric: Effective taker fee -unit: pct -higher_is_better: false - -seo_intro: | - Nobody publishes a clean side-by-side of what it actually costs to trade prediction markets. Polymarket charges a flat percentage fee on each trade. Kalshi charges per-contract on a published schedule. Limitless embeds a fee in the AMM spread. Manifold uses play money. Myriad varies by market type. This bench parses each venue's fills data and official fee schedule so the comparison is based on measured values rather than marketing copy. - -abstract: | - Prediction market venues charge fees in ways that resist direct comparison. Polymarket charges 2% of - potential payout on every trade, regardless of contract price. Kalshi charges a per-contract fee on - a published schedule that scales with contract price and is capped at extremes, making near-certainty - contracts very cheap in percentage terms. Limitless charges fees through its CLOB spread. Manifold - uses play-money (mana) and has no real-money fee. Myriad charges a protocol fee on settlement. This - bench normalizes all fee structures to effective basis points of notional, measured at three - representative contract price points: at-the-money (50 cents), near-certainty (5 cents or 95 cents), - and mid-skewed (30 cents). The resulting leaderboard answers which venue is cheapest for a given - market condition, not just which venue has the lowest headline number. - -methodology: - - "Fee normalization: all fees are expressed as basis points of gross notional (contract price times contract count times $1 resolution value) at three price points: $0.50 (at-the-money), $0.05/$0.95 (near-certainty), and $0.30/$0.70 (mid-skewed). This converts Kalshi's per-contract dollar fee and Polymarket's payout-percentage fee to a common unit." - - "Polymarket fee measurement: the 2% fee is deducted from potential payout. A YES share bought at $0.50 pays $0.98 on resolution, not $1.00. Effective fee in basis points = 200 at all price points because the fee percentage is flat. No maker rebate exists on the public CLOB." - - "Kalshi fee measurement: Kalshi publishes a tiered per-contract fee schedule. Fees are capped at low and high price extremes. The harness reads the published schedule and computes the fee at each price point as fee/contract_price in basis points. Near-certainty markets benefit most from the cap." - - "Limitless and Myriad fee measurement: CLOB spread is used as a proxy for effective fee where explicit fee schedules are not published. The half-spread on the pinned market at each price tier is recorded as the effective round-trip cost." - - "Manifold is play-money and carries no real-money fee. It is included in the cohort for completeness but its fee row reads zero and it is excluded from the real-money fee rankings." - - "Data cadence: fee schedules are polled once per hour. Per-contract fees on Kalshi are re-read whenever the published schedule changes (detected via hash of the fee schedule endpoint). Effective fee rows on the leaderboard update within 1 hour of any venue publishing a fee change." - -findings: - - "Polymarket charges a flat 2% fee on each trade, one of the more transparent structures in the cohort since the rate does not vary by market or counterparty type." - - "Kalshi's per-contract fee means the effective percentage cost depends on where the contract trades relative to par. Fees are highest in percentage terms on near-certainty markets." - - "Manifold is play-money only. No real capital is at risk and no real fee is charged." - -disclaimer: "Fee schedules change without notice. Verify current fees directly with each venue before trading. This bench measures published and observed fees; it is not an endorsement of any venue." - -source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/pm-fee-comparison - -prometheus: - window: 24h - expected_freshness_seconds: 7200 - -rank_matrix_query: label_replace(pm_fee_taker_bps / 100, "provider", "$1", "venue", "(.+)") - -providers: - - slug: polymarket - name: Polymarket - tag: 2% fee on potential payout, no maker rebate, flat across all price points - formula: "Flat 200 bps of gross notional ($1 resolution value) at all price points. Fee = 2% × $1 payout = $0.02/contract. Source: Polymarket published fee schedule." - queries: - p50: pm_fee_taker_bps{venue="polymarket"} / 100 - p90: pm_fee_taker_bps{venue="polymarket"} / 100 - p99: pm_fee_taker_bps{venue="polymarket"} / 100 - mean: pm_fee_taker_bps{venue="polymarket"} / 100 - success: vector(1) - sample_size: vector(1) - series: pm_fee_taker_bps{venue="polymarket"} / 100 - - - slug: kalshi - name: Kalshi - tag: Per-contract fee on published schedule, capped at price extremes, US-regulated - formula: "Approximately 700 bps ($0.07/contract ÷ $1 resolution value) at ATM ($0.50 contract price). Source: Kalshi published fee schedule. Fees are capped at price extremes." - queries: - p50: pm_fee_taker_bps{venue="kalshi"} / 100 - p90: pm_fee_taker_bps{venue="kalshi"} / 100 - p99: pm_fee_taker_bps{venue="kalshi"} / 100 - mean: pm_fee_taker_bps{venue="kalshi"} / 100 - success: vector(1) - sample_size: vector(1) - series: pm_fee_taker_bps{venue="kalshi"} / 100 - - - slug: limitless - name: Limitless - tag: Live half-spread from active USDC markets, refreshed hourly - formula: "Median half-spread in bps across active USDC binary markets, computed from tradePrices.buy.market[0] and tradePrices.sell.market[0]. Half-spread = ((ask - bid) / 2) × 10000. Refreshed hourly." - queries: - p50: pm_fee_taker_bps{venue="limitless"} / 100 - p90: pm_fee_taker_bps{venue="limitless"} / 100 - p99: pm_fee_taker_bps{venue="limitless"} / 100 - mean: pm_fee_taker_bps{venue="limitless"} / 100 - success: pm_fee_last_refresh_seconds{venue="limitless"} > bool 0 - sample_size: vector(1) - series: pm_fee_taker_bps{venue="limitless"} / 100 - - - slug: manifold - name: Manifold - tag: Play-money (mana), no real-money fee, included for completeness - formula: "0 bps. Manifold uses play-money (mana) only. No real capital is at risk and no real fee is charged." - queries: - p50: pm_fee_taker_bps{venue="manifold"} / 100 - p90: pm_fee_taker_bps{venue="manifold"} / 100 - p99: pm_fee_taker_bps{venue="manifold"} / 100 - mean: pm_fee_taker_bps{venue="manifold"} / 100 - success: vector(1) - sample_size: vector(1) - series: pm_fee_taker_bps{venue="manifold"} / 100 - - - slug: myriad - name: Myriad - tag: Protocol fee on settlement, single-region US East - formula: "200 bps (2% protocol settlement fee). Source: Myriad published protocol documentation." - queries: - p50: pm_fee_taker_bps{venue="myriad"} / 100 - p90: pm_fee_taker_bps{venue="myriad"} / 100 - p99: pm_fee_taker_bps{venue="myriad"} / 100 - mean: pm_fee_taker_bps{venue="myriad"} / 100 - success: vector(1) - sample_size: vector(1) - series: pm_fee_taker_bps{venue="myriad"} / 100 - -faq: - - q: "What is the Polymarket trading fee?" - a: "Polymarket charges a 2% fee on each trade, deducted from the potential payout. If you buy YES shares at $0.50, each share pays out $0.98 rather than $1.00 if you win. The fee applies to both sides of the trade. There is no maker rebate on the public CLOB at the time of writing." - - q: "What is the Kalshi trading fee?" - a: "Kalshi charges a per-contract fee that scales with the contract's settlement price. The fee schedule is published on Kalshi's documentation. At mid-range prices ($0.40 to $0.60 per contract) the fee is typically around $0.07 per contract. Fees are capped, which makes very-low-price or very-high-price contracts cheaper in percentage terms." - - q: "Is Polymarket or Kalshi cheaper to trade?" - a: "It depends on the market. Polymarket's flat 2% fee is predictable. Kalshi's per-contract fee is cheaper on near-certainty markets where the cap kicks in, and more expensive on mid-book markets. The live fee comparison will show side-by-side numbers once the harness is running." - diff --git a/benchmarks/pm-geographic-access.yml b/benchmarks/pm-geographic-access.yml deleted file mode 100644 index cae066d4..00000000 --- a/benchmarks/pm-geographic-access.yml +++ /dev/null @@ -1,142 +0,0 @@ -# OpenChainBench. Bench 113 - -slug: pm-geographic-access -number: "113" -status: retired -title: Prediction market geographic access, which countries can reach each venue -subtitle: HTTP probes from regional nodes checking 200 OK vs blocked or redirect for Polymarket, Kalshi, Limitless, Myriad and ForecastEx, reported as percent of regions returning a successful response. -category: Trading -metric: Geographic accessibility rate -unit: pct -higher_is_better: true - -abstract: | - Prediction market venues operate under different regulatory regimes and enforce access restrictions - at the HTTP layer. Polymarket's international exchange has geoblocked US IP addresses since a 2022 - CFTC settlement. Kalshi is CFTC-regulated and accessible to US users without restriction. ForecastEx, - operated by Interactive Brokers and CFTC-regulated, is targeted at US users and may exhibit - geo-restrictions for non-US regions. Myriad Protocol is an onchain venue on the Abstract L2 with - no documented geographic restrictions. This bench probes each venue's market listing endpoint every - 15 minutes from probe nodes in EU West (VPS Paris), US East, and Singapore and records the HTTP - response code. A 200 OK counts as accessible; a 403, redirect to a block page, or connection reset - counts as blocked. The result is expressed as the percentage of probe time the endpoint returned 200 - from each region. The bench does not assess legal access rights, only observable HTTP-level behavior. - -methodology: - - "Probe design: the harness sends an HTTP GET to each venue's public market listing endpoint from dedicated probe nodes (EU West VPS Paris, US East and Singapore on Railway) every 15 minutes. The request carries an identifying User-Agent and no VPN or proxy. HTTP status codes are recorded." - - "Blocked classification: a response is classified as blocked if the HTTP status code is not 200 (403, 4xx, 5xx, or a redirect to a block page). Timeouts over 10 seconds are classified as unreachable (also blocked). Only 200 OK counts as accessible." - - "Metric definition: pm_geo_accessible{venue, region} = 1 when the probe returns 200 OK, 0 otherwise. The displayed pct is the avg_over_time of this gauge over the trailing 24 hours, representing the fraction of the day the venue was accessible from that probe region." - - "Legal access vs HTTP access: this bench measures what the API returns to an HTTP request, not what a person in a given jurisdiction is legally permitted to do. A 200 OK from a probe on a venue's endpoint does not mean users in that region are legally permitted to trade. Consult venue terms of service and qualified legal counsel for legal access questions." - - "Regulatory events: when a regulatory event changes HTTP-level access (such as the Polymarket US geoblock in 2022), the probe series reflects the change within one probe cycle (15 minutes)." - -findings: - - "Polymarket's international exchange (polymarket.com) geoblocks US IP addresses following a 2022 CFTC settlement in which Polymarket LLC paid a $1.4M fine. US probes receive a 403 or redirect. The international exchange scores below 100 pct by design on this bench." - - "Polymarket US (QCX), a separate CFTC-regulated entity, launched December 3, 2025 and is accessible to US users. It initially launched iOS-only with a waitlist; the waitlist dropped in May 2026." - - "Kalshi (Kalshi Exchange LLC) is CFTC-regulated and accessible to US users from all US probe regions. It is the primary regulated US-accessible real-money prediction market." - - "Minnesota enacted a law banning prediction markets effective August 1, 2026. The CFTC is challenging this law in court. The bench monitors Minnesota-region probes for HTTP-level changes as the legal challenge progresses." - -disclaimer: "Geographic access status changes as regulatory environments evolve. Verify current access directly with each venue before depositing funds. This bench measures API-level HTTP responses, not legal access rights." - -source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/pm-geographic-access - -prometheus: - window: 24h - expected_freshness_seconds: 1800 - -rank_matrix_query: 100 * label_replace(avg by (venue) (avg_over_time(pm_geo_accessible[1h])), "provider", "$1", "venue", "(.+)") - -dimensions: - region: - - { value: all, label: All regions } - - { value: eu-west, label: EU West } - - { value: us-east, label: US East } - - { value: sgp, label: Singapore } - -metric_panels: - - id: accessible_eu - label: EU West accessible - description: "Fraction of probe cycles from EU West (Paris VPS) where the venue's market listing endpoint returned HTTP 200 OK in the last 24 hours." - metric: 100 * avg_over_time(pm_geo_accessible{region="eu-west"}[24h]) - label_key: venue - unit: pct - higher_is_better: true - - id: accessible_us - label: US East accessible - description: "Fraction of probe cycles from US East where the venue's market listing endpoint returned HTTP 200 OK. Polymarket international exchange blocks US IPs by design." - metric: 100 * avg_over_time(pm_geo_accessible{region="us-east"}[24h]) - label_key: venue - unit: pct - higher_is_better: true - - id: accessible_sgp - label: Singapore accessible - description: "Fraction of probe cycles from Singapore where the venue's market listing endpoint returned HTTP 200 OK." - metric: 100 * avg_over_time(pm_geo_accessible{region="sgp"}[24h]) - label_key: venue - unit: pct - higher_is_better: true - -providers: - - slug: polymarket - name: Polymarket - tag: International exchange geoblocked for US IPs since 2022 CFTC settlement - formula: "Fraction of 15-minute probe cycles returning HTTP 200 OK from each probe region, averaged over 24 hours. US probes return 403 by design (CFTC settlement geoblock)." - queries: - p50: 100 * avg_over_time(pm_geo_accessible{venue="polymarket"}[24h]) - p90: 100 * avg_over_time(pm_geo_accessible{venue="polymarket",region="eu-west"}[24h]) - p99: 100 * avg_over_time(pm_geo_accessible{venue="polymarket",region="eu-west"}[24h]) - mean: 100 * avg_over_time(pm_geo_accessible{venue="polymarket"}[24h]) - success: vector(1) - sample_size: increase(pm_geo_probe_total{venue="polymarket"}[24h]) - series: 100 * avg_over_time(pm_geo_accessible{venue="polymarket"}[1h]) - - - slug: kalshi - name: Kalshi - tag: CFTC-regulated, accessible to US users, all regions - formula: "Fraction of 15-minute probe cycles returning HTTP 200 OK from each probe region, averaged over 24 hours." - queries: - p50: 100 * avg_over_time(pm_geo_accessible{venue="kalshi"}[24h]) - p90: 100 * avg_over_time(pm_geo_accessible{venue="kalshi",region="eu-west"}[24h]) - p99: 100 * avg_over_time(pm_geo_accessible{venue="kalshi",region="eu-west"}[24h]) - mean: 100 * avg_over_time(pm_geo_accessible{venue="kalshi"}[24h]) - success: vector(1) - sample_size: increase(pm_geo_probe_total{venue="kalshi"}[24h]) - series: 100 * avg_over_time(pm_geo_accessible{venue="kalshi"}[1h]) - - - slug: limitless - name: Limitless - tag: CLOB venue, no documented geographic restrictions - formula: "Fraction of 15-minute probe cycles returning HTTP 200 OK from each probe region, averaged over 24 hours." - queries: - p50: 100 * avg_over_time(pm_geo_accessible{venue="limitless"}[24h]) - p90: 100 * avg_over_time(pm_geo_accessible{venue="limitless",region="eu-west"}[24h]) - p99: 100 * avg_over_time(pm_geo_accessible{venue="limitless",region="eu-west"}[24h]) - mean: 100 * avg_over_time(pm_geo_accessible{venue="limitless"}[24h]) - success: vector(1) - sample_size: increase(pm_geo_probe_total{venue="limitless"}[24h]) - series: 100 * avg_over_time(pm_geo_accessible{venue="limitless"}[1h]) - - - slug: forecastex - name: ForecastEx - tag: CFTC-regulated by Interactive Brokers, US users only - formula: "Fraction of 15-minute probe cycles returning HTTP 200 OK from each probe region, averaged over 24 hours." - queries: - p50: 100 * avg_over_time(pm_geo_accessible{venue="forecastex"}[24h]) - p90: 100 * avg_over_time(pm_geo_accessible{venue="forecastex",region="eu-west"}[24h]) - p99: 100 * avg_over_time(pm_geo_accessible{venue="forecastex",region="eu-west"}[24h]) - mean: 100 * avg_over_time(pm_geo_accessible{venue="forecastex"}[24h]) - success: vector(1) - sample_size: increase(pm_geo_probe_total{venue="forecastex"}[24h]) - series: 100 * avg_over_time(pm_geo_accessible{venue="forecastex"}[1h]) - - - slug: myriad - name: Myriad - tag: Single-region US East, no documented geographic restrictions - formula: "Fraction of 15-minute probe cycles returning HTTP 200 OK from each probe region, averaged over 24 hours." - queries: - p50: 100 * avg_over_time(pm_geo_accessible{venue="myriad"}[24h]) - p90: 100 * avg_over_time(pm_geo_accessible{venue="myriad",region="eu-west"}[24h]) - p99: 100 * avg_over_time(pm_geo_accessible{venue="myriad",region="eu-west"}[24h]) - mean: 100 * avg_over_time(pm_geo_accessible{venue="myriad"}[24h]) - success: vector(1) - sample_size: increase(pm_geo_probe_total{venue="myriad"}[24h]) - series: 100 * avg_over_time(pm_geo_accessible{venue="myriad"}[1h]) diff --git a/harnesses/pm-fee-comparison/Dockerfile b/harnesses/pm-fee-comparison/Dockerfile deleted file mode 100644 index 01d7ac64..00000000 --- a/harnesses/pm-fee-comparison/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM golang:1.24-alpine AS builder - -WORKDIR /app -RUN apk add --no-cache git - -COPY go.mod go.sum* ./ -RUN go mod download || true - -COPY . . - -RUN CGO_ENABLED=0 GOOS=linux go build -o /app/pm-fee-comparison ./cmd/script - -FROM debian:bookworm-slim - -WORKDIR /app -RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/* - -COPY --from=builder /app/pm-fee-comparison /app/pm-fee-comparison - -EXPOSE 2112 - -CMD ["/app/pm-fee-comparison"] diff --git a/harnesses/pm-fee-comparison/cmd/script/fees.go b/harnesses/pm-fee-comparison/cmd/script/fees.go deleted file mode 100644 index f735f40f..00000000 --- a/harnesses/pm-fee-comparison/cmd/script/fees.go +++ /dev/null @@ -1,140 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "sort" - "time" -) - -const ( - feesLimitlessBase = "https://api.limitless.exchange" - feesUA = "OpenChainBench/1.0 (+https://openchainbench.com/methodology; contact@mobula.io)" -) - -var httpClientFees = &http.Client{Timeout: 20 * time.Second} - -// setStaticFees publishes known fixed fees once at startup. These are refreshed -// only when the published fee schedules change (manual update required). -func setStaticFees() { - now := float64(time.Now().Unix()) - - // Polymarket: 2% fee deducted from potential payout ($1 resolution). - // Fee = 2% × $1 = $0.02/contract → 200 bps of $1 gross notional. - pmFeeTakerBps.WithLabelValues("polymarket").Set(200) - pmFeeLastRefresh.WithLabelValues("polymarket").Set(now) - - // Kalshi: per-contract fee schedule, approximately $0.07/contract at $0.50 price. - // $0.07 / $1 resolution value = 7% = 700 bps. Source: kalshi.com published schedule. - pmFeeTakerBps.WithLabelValues("kalshi").Set(700) - pmFeeLastRefresh.WithLabelValues("kalshi").Set(now) - - // Manifold: play-money (mana) only, no real-money fee. - pmFeeTakerBps.WithLabelValues("manifold").Set(0) - pmFeeLastRefresh.WithLabelValues("manifold").Set(now) - - // Myriad: 2% protocol settlement fee = 200 bps. - pmFeeTakerBps.WithLabelValues("myriad").Set(200) - pmFeeLastRefresh.WithLabelValues("myriad").Set(now) - - fmt.Println("[fees] static: polymarket=200 kalshi=700 manifold=0 myriad=200 (bps)") -} - -// tradePricesSlice deserializes tradePrices.buy.market / tradePrices.sell.market. -// Each slice element is the price for one outcome (YES=index 0, NO=index 1). -type tradePricesBranch struct { - Market []float64 `json:"market"` -} - -type tradePrices struct { - Buy tradePricesBranch `json:"buy"` - Sell tradePricesBranch `json:"sell"` -} - -type limitlessFeeMarket struct { - Status string `json:"status"` - TradePrices tradePrices `json:"tradePrices"` - CollateralToken struct { - Symbol string `json:"symbol"` - } `json:"collateralToken"` - WinningOutcomeIndex *int `json:"winningOutcomeIndex"` -} - -type limitlessFeeResp struct { - Data []limitlessFeeMarket `json:"data"` -} - -// fetchLimitlessFee polls /markets/active page 1, computes the median -// half-spread in basis points across active USDC binary markets, and sets -// the pm_fee_taker_bps{venue="limitless"} gauge. -// -// Half-spread bps = ((bestAsk - bestBid) / 2) × 10000, where prices are -// expressed as fractions of the $1 resolution value. This is directly -// comparable to Polymarket's 200 bps (2% of $1 payout). -func fetchLimitlessFee() { - url := fmt.Sprintf("%s/markets/active?page=1&limit=25&sortBy=newest", feesLimitlessBase) - req, _ := http.NewRequest("GET", url, nil) - req.Header.Set("User-Agent", feesUA) - req.Header.Set("Accept", "application/json") - - resp, err := httpClientFees.Do(req) - if err != nil { - pmFeeFetchErrors.WithLabelValues("limitless", "network").Inc() - fmt.Printf("[fees][limitless] request error: %v\n", err) - return - } - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - - if resp.StatusCode != 200 { - pmFeeFetchErrors.WithLabelValues("limitless", fmt.Sprintf("http_%d", resp.StatusCode)).Inc() - fmt.Printf("[fees][limitless] status %d\n", resp.StatusCode) - return - } - - var r limitlessFeeResp - if err := json.Unmarshal(body, &r); err != nil { - pmFeeFetchErrors.WithLabelValues("limitless", "parse").Inc() - fmt.Printf("[fees][limitless] parse error: %v\n", err) - return - } - - var halfSpreads []float64 - for _, m := range r.Data { - if m.CollateralToken.Symbol != "USDC" { - continue - } - if m.WinningOutcomeIndex != nil { - continue - } - buy := m.TradePrices.Buy.Market - sell := m.TradePrices.Sell.Market - if len(buy) == 0 || len(sell) == 0 { - continue - } - ask := buy[0] - bid := sell[0] - // Sanity: bid < ask, both in (0, 1) - if bid <= 0 || ask <= 0 || bid >= ask || ask > 1 { - continue - } - halfSpreadBps := ((ask - bid) / 2) * 10000 - halfSpreads = append(halfSpreads, halfSpreadBps) - } - - if len(halfSpreads) == 0 { - fmt.Printf("[fees][limitless] no valid spread data (markets=%d)\n", len(r.Data)) - return - } - - sort.Float64s(halfSpreads) - median := halfSpreads[len(halfSpreads)/2] - - pmFeeTakerBps.WithLabelValues("limitless").Set(median) - pmFeeLastRefresh.WithLabelValues("limitless").Set(float64(time.Now().Unix())) - - fmt.Printf("[fees][limitless] markets_with_spread=%d median_half_spread_bps=%.1f\n", - len(halfSpreads), median) -} diff --git a/harnesses/pm-fee-comparison/cmd/script/main.go b/harnesses/pm-fee-comparison/cmd/script/main.go deleted file mode 100644 index 733b4394..00000000 --- a/harnesses/pm-fee-comparison/cmd/script/main.go +++ /dev/null @@ -1,43 +0,0 @@ -package main - -import ( - "fmt" - "os" - "os/signal" - "syscall" - "time" -) - -func main() { - fmt.Println("=== pm-fee-comparison harness ===") - fmt.Println("Effective taker fees in basis points per venue. Static for most venues; live spread for Limitless.") - fmt.Println("Exposes /metrics on :2112.") - - go func() { - if err := StartMetricsServer(":2112"); err != nil { - fmt.Printf("[pm-fee-comparison] metrics server error: %v\n", err) - os.Exit(1) - } - }() - - // Set static fees immediately at startup. - setStaticFees() - // Fetch Limitless live spread at startup then every hour. - fetchLimitlessFee() - - sigChan := make(chan os.Signal, 1) - signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM) - - ticker := time.NewTicker(1 * time.Hour) - defer ticker.Stop() - - for { - select { - case <-sigChan: - fmt.Println("[pm-fee-comparison] shutting down") - return - case <-ticker.C: - fetchLimitlessFee() - } - } -} diff --git a/harnesses/pm-fee-comparison/cmd/script/metrics.go b/harnesses/pm-fee-comparison/cmd/script/metrics.go deleted file mode 100644 index 46a921a4..00000000 --- a/harnesses/pm-fee-comparison/cmd/script/metrics.go +++ /dev/null @@ -1,58 +0,0 @@ -package main - -import ( - "net/http" - - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" -) - -var ( - // pm_fee_taker_bps{venue} is the effective taker fee in basis points - // of gross notional ($1 resolution value per contract). - // - // Static venues (set once at startup): - // polymarket = 200 bps (flat 2% of potential payout) - // kalshi = 700 bps (approx $0.07/contract at $0.50; from published schedule) - // manifold = 0 bps (play-money, no real fee) - // myriad = 200 bps (2% protocol settlement fee) - // - // Live venue (refreshed hourly): - // limitless = median half-spread across active USDC markets (from tradePrices API) - pmFeeTakerBps = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Name: "pm_fee_taker_bps", - Help: "Effective taker fee in basis points of gross notional ($1 resolution value per contract). Polymarket=200 (2% of payout, flat). Kalshi=700 (approx $0.07/contract at ATM, from published schedule). Limitless=live median half-spread across active USDC markets. Manifold=0 (play-money). Myriad=200 (2% settlement protocol fee).", - }, - []string{"venue"}, - ) - - pmFeeLastRefresh = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Name: "pm_fee_last_refresh_seconds", - Help: "Unix timestamp of the last successful fee measurement per venue.", - }, - []string{"venue"}, - ) - - pmFeeFetchErrors = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "pm_fee_fetch_errors_total", - Help: "Total fetch failures per venue and error type.", - }, - []string{"venue", "error_type"}, - ) -) - -func init() { - prometheus.MustRegister(pmFeeTakerBps, pmFeeLastRefresh, pmFeeFetchErrors) -} - -func StartMetricsServer(addr string) error { - mux := http.NewServeMux() - mux.Handle("/metrics", promhttp.Handler()) - mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { - _, _ = w.Write([]byte("OK")) - }) - return http.ListenAndServe(addr, mux) -} diff --git a/harnesses/pm-fee-comparison/go.mod b/harnesses/pm-fee-comparison/go.mod deleted file mode 100644 index 1c3a0392..00000000 --- a/harnesses/pm-fee-comparison/go.mod +++ /dev/null @@ -1,17 +0,0 @@ -module github.com/mobula/pm-fee-comparison - -go 1.24 - -require github.com/prometheus/client_golang v1.20.5 - -require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/klauspost/compress v1.17.9 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.55.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect - golang.org/x/sys v0.22.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect -) diff --git a/harnesses/pm-fee-comparison/go.sum b/harnesses/pm-fee-comparison/go.sum deleted file mode 100644 index d5318cf8..00000000 --- a/harnesses/pm-fee-comparison/go.sum +++ /dev/null @@ -1,24 +0,0 @@ -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= diff --git a/harnesses/pm-geographic-access/Dockerfile b/harnesses/pm-geographic-access/Dockerfile deleted file mode 100644 index a2cdfb58..00000000 --- a/harnesses/pm-geographic-access/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM golang:1.24-alpine AS builder - -WORKDIR /app -RUN apk add --no-cache git - -COPY go.mod go.sum* ./ -RUN go mod download || true - -COPY . . - -RUN CGO_ENABLED=0 GOOS=linux go build -o /app/pm-geographic-access ./cmd/script - -FROM debian:bookworm-slim - -WORKDIR /app -RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/* - -COPY --from=builder /app/pm-geographic-access /app/pm-geographic-access - -EXPOSE 2112 - -CMD ["/app/pm-geographic-access"] diff --git a/harnesses/pm-geographic-access/cmd/script/main.go b/harnesses/pm-geographic-access/cmd/script/main.go deleted file mode 100644 index 945e8af5..00000000 --- a/harnesses/pm-geographic-access/cmd/script/main.go +++ /dev/null @@ -1,72 +0,0 @@ -package main - -import ( - "fmt" - "os" - "os/signal" - "strings" - "syscall" - "time" -) - -func main() { - region := loadRegion() - fmt.Printf("=== pm-geographic-access harness (region=%s) ===\n", region) - fmt.Println("HTTP probes to each venue's market listing endpoint. 200 OK = accessible, 4xx/error = blocked.") - fmt.Println("Exposes /metrics on :2112.") - - go func() { - if err := StartMetricsServer(":2112"); err != nil { - fmt.Printf("[pm-geographic-access] metrics server error: %v\n", err) - os.Exit(1) - } - }() - - // First probe immediately at startup. - runAllProbes(region) - - sigChan := make(chan os.Signal, 1) - signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM) - - ticker := time.NewTicker(15 * time.Minute) - defer ticker.Stop() - - for { - select { - case <-sigChan: - fmt.Println("[pm-geographic-access] shutting down") - return - case <-ticker.C: - runAllProbes(region) - } - } -} - -// loadRegion reads the probe region from env vars. Same resolution order -// as pm-rate-limits so the Prometheus label space is consistent. -func loadRegion() string { - if r := strings.TrimSpace(os.Getenv("REGION")); r != "" { - return r - } - if r := normalizeRailwayRegion(os.Getenv("RAILWAY_REPLICA_REGION")); r != "" { - return r - } - return "eu-west" -} - -func normalizeRailwayRegion(raw string) string { - raw = strings.ToLower(strings.TrimSpace(raw)) - if raw == "" { - return "" - } - switch { - case strings.HasPrefix(raw, "us-"), strings.HasPrefix(raw, "northamerica"): - return "us-east" - case strings.HasPrefix(raw, "europe"), strings.HasPrefix(raw, "eu-"): - return "eu-west" - case strings.HasPrefix(raw, "asia"), strings.HasPrefix(raw, "ap-"): - return "sgp" - default: - return raw - } -} diff --git a/harnesses/pm-geographic-access/cmd/script/metrics.go b/harnesses/pm-geographic-access/cmd/script/metrics.go deleted file mode 100644 index 47d0ff8a..00000000 --- a/harnesses/pm-geographic-access/cmd/script/metrics.go +++ /dev/null @@ -1,58 +0,0 @@ -package main - -import ( - "net/http" - - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" -) - -var ( - // pm_geo_accessible{venue, region} = 1 if the venue's public market - // listing endpoint returned HTTP 200 from the probe region, 0 otherwise. - // Probe frequency: every 15 minutes. - pmGeoAccessible = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Name: "pm_geo_accessible", - Help: "1 if the venue's public market listing endpoint returned HTTP 200 from the probe region, 0 if blocked (403), redirected to a block page, or timed out. Probed every 15 minutes. Does not assess legal access rights.", - }, - []string{"venue", "region"}, - ) - - pmGeoLastRefresh = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Name: "pm_geo_last_refresh_seconds", - Help: "Unix timestamp of the last probe attempt per venue and region.", - }, - []string{"venue", "region"}, - ) - - pmGeoProbeTotal = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "pm_geo_probe_total", - Help: "Total probe attempts per venue and region.", - }, - []string{"venue", "region"}, - ) - - pmGeoFetchErrors = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "pm_geo_fetch_errors_total", - Help: "Total probe failures (network errors, timeouts) per venue and error type.", - }, - []string{"venue", "error_type"}, - ) -) - -func init() { - prometheus.MustRegister(pmGeoAccessible, pmGeoLastRefresh, pmGeoProbeTotal, pmGeoFetchErrors) -} - -func StartMetricsServer(addr string) error { - mux := http.NewServeMux() - mux.Handle("/metrics", promhttp.Handler()) - mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { - _, _ = w.Write([]byte("OK")) - }) - return http.ListenAndServe(addr, mux) -} diff --git a/harnesses/pm-geographic-access/cmd/script/probe.go b/harnesses/pm-geographic-access/cmd/script/probe.go deleted file mode 100644 index f32c45ce..00000000 --- a/harnesses/pm-geographic-access/cmd/script/probe.go +++ /dev/null @@ -1,109 +0,0 @@ -package main - -import ( - "fmt" - "io" - "net/http" - "time" -) - -const ( - probeUA = "OpenChainBench/1.0 (+https://openchainbench.com/methodology; contact@mobula.io)" - probeTimeout = 10 * time.Second -) - -type venueProbe struct { - Venue string - URL string -} - -// venueProbes is the list of market-listing endpoints to probe. -// Each URL returns a 200 when the venue is accessible from the probe region, -// a 403 when geo-blocked, or a redirect to a block page. -// -// Manifold is intentionally excluded: it is play-money (no real money at -// stake) and has no documented geographic restrictions — it would always -// score 100% from every region, making it uninteresting for this bench. -// ForecastEx (Interactive Brokers CFTC-regulated exchange) is included -// because it is US-regulated and may exhibit geo restrictions from non-US -// regions, mirroring the Kalshi vs Polymarket story for a third regulated venue. -var venueProbes = []venueProbe{ - { - Venue: "polymarket", - URL: "https://gamma-api.polymarket.com/markets?closed=false&active=true&limit=1", - }, - { - Venue: "kalshi", - URL: "https://api.elections.kalshi.com/trade-api/v2/markets/?limit=1", - }, - { - Venue: "limitless", - URL: "https://api.limitless.exchange/markets/active?page=1&limit=1&sortBy=newest", - }, - { - Venue: "myriad", - URL: "https://api-v2.myriadprotocol.com/markets?state=open&limit=1", - }, - { - // ForecastEx (Interactive Brokers CFTC-regulated exchange). The root - // domain returns 200 when accessible, or a geo-block response for - // regions where IBKR restricts access. No public unauthenticated API - // endpoint exists; we probe the market listing page directly. - Venue: "forecastex", - URL: "https://forecastex.com/markets", - }, -} - -var httpClientProbe = &http.Client{ - Timeout: probeTimeout, - // Follow redirects but detect block pages (redirect to geo-block URL). - CheckRedirect: func(req *http.Request, via []*http.Request) error { - if len(via) >= 5 { - return http.ErrUseLastResponse - } - return nil - }, -} - -// runAllProbes fires one HTTP GET per venue and updates the accessibility gauge. -func runAllProbes(region string) { - for _, p := range venueProbes { - runProbe(p, region) - } -} - -func runProbe(p venueProbe, region string) { - pmGeoProbeTotal.WithLabelValues(p.Venue, region).Inc() - - req, err := http.NewRequest("GET", p.URL, nil) - if err != nil { - pmGeoAccessible.WithLabelValues(p.Venue, region).Set(0) - pmGeoFetchErrors.WithLabelValues(p.Venue, "request_build").Inc() - return - } - req.Header.Set("User-Agent", probeUA) - req.Header.Set("Accept", "application/json") - - resp, err := httpClientProbe.Do(req) - if err != nil { - pmGeoAccessible.WithLabelValues(p.Venue, region).Set(0) - pmGeoLastRefresh.WithLabelValues(p.Venue, region).Set(float64(time.Now().Unix())) - pmGeoFetchErrors.WithLabelValues(p.Venue, "network").Inc() - fmt.Printf("[geo][%s][%s] network error: %v\n", p.Venue, region, err) - return - } - defer resp.Body.Close() - // Drain body to reuse connection. - _, _ = io.Copy(io.Discard, resp.Body) - - accessible := 0.0 - if resp.StatusCode == 200 { - accessible = 1.0 - } - - pmGeoAccessible.WithLabelValues(p.Venue, region).Set(accessible) - pmGeoLastRefresh.WithLabelValues(p.Venue, region).Set(float64(time.Now().Unix())) - - fmt.Printf("[geo][%s][%s] status=%d accessible=%.0f\n", - p.Venue, region, resp.StatusCode, accessible) -} diff --git a/harnesses/pm-geographic-access/go.mod b/harnesses/pm-geographic-access/go.mod deleted file mode 100644 index 5ce85e9d..00000000 --- a/harnesses/pm-geographic-access/go.mod +++ /dev/null @@ -1,17 +0,0 @@ -module github.com/mobula/pm-geographic-access - -go 1.24 - -require github.com/prometheus/client_golang v1.20.5 - -require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/klauspost/compress v1.17.9 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.55.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect - golang.org/x/sys v0.22.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect -) diff --git a/harnesses/pm-geographic-access/go.sum b/harnesses/pm-geographic-access/go.sum deleted file mode 100644 index d5318cf8..00000000 --- a/harnesses/pm-geographic-access/go.sum +++ /dev/null @@ -1,24 +0,0 @@ -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= diff --git a/public/logos/predictit.svg b/public/logos/predictit.svg index 843795b6..4adac07c 100644 --- a/public/logos/predictit.svg +++ b/public/logos/predictit.svg @@ -1,4 +1,23 @@ - - - PI + + + + + + + + + + + + + + + + + + diff --git a/public/logos/smarkets.jpg b/public/logos/smarkets.jpg new file mode 100644 index 0000000000000000000000000000000000000000..81b82878132e88124c65a23ca59123c54f15bd1e GIT binary patch literal 87741 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 - - S - diff --git a/src/lib/logo-manifest.ts b/src/lib/logo-manifest.ts index f1691a86..96dcca7b 100644 --- a/src/lib/logo-manifest.ts +++ b/src/lib/logo-manifest.ts @@ -67,7 +67,7 @@ const RAW: Record = { manifold: "/logos/manifold.svg", myriad: "/logos/myriad.png", predictit: "/logos/predictit.svg", - smarkets: "/logos/smarkets.svg", + smarkets: "/logos/smarkets.jpg", // ─── Perp DEX cohort (perps hub /perps) ─── drift: "/logos/drift.png",