{"slug":"gas-estimation","title":"Most accurate gas oracle, live gap vs realized priority fee","subtitle":"Absolute gap in gwei between each oracle's predicted priority-fee tier and the realized percentile in the next mined block, measured per chain. Ranked on the p99 gap, the worst 1% of blocks, because that is where gas spikes hurt integrations.","category":"RPCs","metric":"Gap vs realized","unit":"gwei","status":"live","higherIsBetter":false,"filters":null,"value":8e-9,"leader":{"name":"PublicNode","slug":"publicnode-feehistory","value":8e-9},"rankings":[{"name":"PublicNode","slug":"publicnode-feehistory","ms":{"p50":8e-9,"p90":8e-9,"p99":0,"mean":0.0000266724},"successRate":99.6353,"sampleSize":28798},{"name":"Owlracle","slug":"owlracle","ms":{"p50":0.000027992,"p90":0.000027992,"p99":0.000027992,"mean":0.000027992},"successRate":99.63539999999999,"sampleSize":5762},{"name":"MetaMask","slug":"metamask","ms":{"p50":0.010134,"p90":0.010134,"p99":8e-9,"mean":0.00210774},"successRate":99.9826,"sampleSize":28798}],"sparkline":[12.1431,5.1779,0.0394385,0.0920404,5.37869,26.3964,0.0119781,0.00639702,0.010686,0.693008,17.9722,18.1329,0.722085,3.8686,0.00684306,0.00945136,5.42002,3.22029,12.4676,0.0109111,0.0269533,0.680411,0.094367,0.0129951,0.00216959,2.07291,0.0166042,0.0532461,0.000207664,0.00702942,0.025,0.0147923,17.7179,8.98831,0.0162694,0.323674,0.286713,5.70722,18.8119,12.1139,1.16814,0.248021,0.0117999,0.00752483,9.00422,0.0243854,3.0663,10.8644,6.37182,1.42171,8.94081,0.584567,0.523251,0.95575,0.124974,1.56937,14.1296,0.0235203,13.9209,0.0758108,0.0772509,2.98567,5.30457,1.59678,0.0752157,0.0150116,1.23849,0.0341164,0.0209516,0.0283584,12.0009,0.00556053,0.0645314],"sampleSize":80638,"asOf":"2026-09-15T21:46:31.175Z","headline":"PublicNode posts the lowest gap vs realized at ~0 gwei (p50, 24h) on Most accurate gas oracle, live gap vs realized priority fee.","quote":"PublicNode posts the lowest gap vs realized at ~0 gwei (p50, 24h) on Most accurate gas oracle, live gap vs realized priority fee. Source: OpenChainBench (https://openchainbench.com/benchmarks/gas-estimation).","cite":{"plain":"OpenChainBench. \"Most accurate gas oracle, live gap vs realized priority fee\". Retrieved 2026-09-15. https://openchainbench.com/benchmarks/gas-estimation","bibtex":"@misc{ocb_gas_estimation,\n  author = {OpenChainBench},\n  title  = {Most accurate gas oracle, live gap vs realized priority fee},\n  year   = {2026},\n  url    = {https://openchainbench.com/benchmarks/gas-estimation},\n  note   = {Retrieved 2026-09-15}\n}","apa":"OpenChainBench. (2026). Most accurate gas oracle, live gap vs realized priority fee. Retrieved September 15, 2026, from https://openchainbench.com/benchmarks/gas-estimation","ris":"TY  - GEN\r\nAU  - OpenChainBench\r\nTI  - Most accurate gas oracle, live gap vs realized priority fee\r\nPY  - 2026\r\nUR  - https://openchainbench.com/benchmarks/gas-estimation\r\nY2  - 2026-09-15\r\nER  - \r\n"},"pageUrl":"https://openchainbench.com/benchmarks/gas-estimation","ogImage":"https://openchainbench.com/api/og/gas-estimation","source":"https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/gas-estimation","methodology":["Chains: Ethereum (chainid=1), Polygon PoS (chainid=137), Arbitrum One (chainid=42161). Ethereum and Polygon are EIP-1559 with dynamic base fee. Arbitrum is included as an L2 reference where priority fee converges to ~0 (centralised sequencer, no MEV auction); the bench shows this empirically. Actually-meaningful L2 cost is L1 data fee, planned for a separate bench. BNB Chain excluded (not EIP-1559). Avalanche C-Chain also collapses to ~0 priority.","Oracles per chain. Ethereum + Polygon: PublicNode feeHistory, Owlracle, Etherscan v2 (free tier), MetaMask. Avalanche: same set minus Etherscan (free plan restricted for chainid 43114).","Per-oracle endpoints. PublicNode `eth_feeHistory` on each chain's RPC; Owlracle `/v4/{eth|poly|avax}/gas` (slug per chain); Etherscan v2 `?chainid=<N>&module=gastracker&action=gasoracle`; MetaMask `gas.api.cx.metamask.io/networks/<N>/suggestedGasFees` (public no-key, EIP-1559 low/medium/high mapped to p25/p50/p90).","Cadences. PublicNode feeHistory and MetaMask every 12s per chain; Owlracle every 60s per chain (free quota ceiling); Etherscan every 15s per chain with a global rate-gate enforcing ≥6s between any two Etherscan requests across chains (no-key limit is 1 req/5s per IP, shared).","Tier normalization. Each oracle's named tiers (fast / standard / slow / safe / propose) are mapped onto a unified p25 / p50 / p75 / p90 / p99 scheme. The leaderboard ranks the p50 tier (the standard speed wallets use by default).","Realized priority fee. For each pending block, the harness pulls the full block via `eth_getBlockByNumber(.., true)` on the chain's primary RPC and computes p25/p50/p75/p90/p99 directly from the actual effective `maxPriorityFeePerGas` values across every included transaction. Every tier is a real percentile of the mined block, none are interpolated. Empty or low-tx blocks (`gas_realized_tx_count` near zero) are surfaced separately because the realized percentile is noisy when tx count is low.","Realized-side independence check. Each chain configures a second RPC on a different upstream (dRPC / native chain RPC) as `GAS_REALIZED_RPC_VERIFY_<CHAIN>`; on each block the harness cross-checks baseFee and increments `gas_realized_quorum_disagreement_total{chain, kind}` on mismatch. Primary is still trusted; the counter makes visible whether our ground truth is actually independent across upstreams.","Realized base fee. Recorded for completeness as `gas_realized_base_gwei{chain}` and per-oracle baseFee error as `gas_error_base_gwei{oracle, chain}`. Not the ranking signal since every EIP-1559 oracle inherits this from `eth_feeHistory` and converges.","Pending buffer. Per (oracle, chain) in-memory map of predictions waiting on a realized block. TTL is ~25 blocks (~5 minutes on Ethereum, ~50 seconds on Polygon due to faster blocks). Beyond that, predictions are dropped as no-longer-informative. Buffer growth surfaces via `gas_pending_buffer_size{oracle, chain}`.","Polling result classification. `ok`, `http_err`, `parse_err`, `throttled` (HTTP 429 or oracle-specific quota message), `timeout`. Counter `gas_oracle_call_total{oracle, result, chain}` powers the reliability column.","Ranking metric. The table ranks on the p99 of the absolute gap over 24h, not the p50. At current fee levels the typical-minute gaps are fractions of a micro-gwei apart across oracles (ranking noise); the p99 captures behaviour during the volatile minutes where a wrong prediction either overpays or misses the block. The typical p50 and p90 gaps stay visible as secondary columns.","Prediction age disclosure. `gas_prediction_age_seconds{oracle, chain}` records the wall-clock time between an oracle's poll returning and the realized block being graded. This surfaces the free-tier cadence asymmetry (Owlracle at 60s vs PublicNode at 12s vs Etherscan at 15s) so readers can see how much of an oracle's error is stale-sample rather than model quality; it is not part of the ranking, only a diagnostic column.","Over/under split. In parallel with the absolute-error histogram, the harness emits `gas_error_priority_over_gwei_histogram` (predicted > realized, cost = overpay) and `gas_error_priority_under_gwei_histogram` (predicted < realized, cost = transaction stuck). Same buckets. The two branches lets the leaderboard decompose asymmetric behaviour: inclusion-confidence oracles skew fat on the over side by design, percentile trackers skew fat on the under side during spikes.","Lag=2 secondary grade. `gas_error_priority_lag2_gwei_histogram` grades each prediction against the block 2 slots after its target, not the very-next block. Removes the latency-race bias where whoever scraped the mempool 100ms before us wins by construction; closer to the wallet UX (sign, broadcast, propagate) than block+1. Same buckets as the primary histogram so a leaderboard column can plot the two side by side.","Asymmetric Pinball Loss (APL). `gas_error_priority_apl_gwei_histogram` emits a proper scoring rule (Koenker & Bassett 1978): per sample `(1-τ)·over_gap` if the oracle over-predicted, else `τ·under_gap`, with τ=0.9. Encodes wallet UX asymmetry: under-prediction (tx stuck) is 9× more costly than over-prediction (small overpay). Same buckets as the abs error histogram. Rank-stable at n=few-hundred samples where p99 of abs error is still dominated by 2-3 tail blocks.","Covered rate. Share of time (24h) each oracle's posted p50-tier prediction was at or above the realized p50 priority fee, recorded as `ocb:gas_p50_covered:pct_24h` via a recording rule. Same-instant gauge comparison (current prediction vs latest realized block), a proxy pending a harness-side matched counter. High = errs on the side of inclusion; low = under-bids vs the block's realized median.","Excluded by design. (a) BNB Chain (not EIP-1559). (b) L2 OP Stack chains (Optimism, Base, Arbitrum), priority fee ≈ 0 there because sequencer is centralised, the relevant cost is L1 data fee which is a different metric and belongs in a separate bench. (c) Rough median oracles that publish only a single number (no tier breakdown). (d) Solana, different fee model entirely (lamports per CU, MEV via Jito), separate bench needed."],"license":"CC-BY-4.0"}