Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
214 changes: 214 additions & 0 deletions benchmarks/network-fees.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
# OpenChainBench. Bench № 031

slug: network-fees
number: "031"
title: Current native transfer fee across L1 blockchains
seo_title: "Cheapest blockchain transaction fee 2026: Ethereum, Solana, BNB, Avalanche, TRON, Cardano, SUI, TON, Stellar, Litecoin, Monero USD live"
seo_description: "Live USD cost of a native-token transfer on 11 L1 chains: Ethereum, Solana, BNB, Avalanche, TRON, Cardano, SUI, TON, Stellar, Litecoin, Monero. Slow/standard/fast tiers refreshed every 30s, USD price from Mobula."
subtitle: "Current USD cost of moving the chain's native asset, refreshed every 30 seconds for the same 11 L1s tracked on the finality bench."

seo_intro: |
This page shows the live USD cost of sending the native token on every major Layer-1 blockchain. We sample the chain-native fee market (eth_feeHistory for EVM chains, getRecentPrioritizationFees for Solana, koios protocol params for Cardano, fee_stats for Stellar, fee_estimate for Monero, mempool oracles for Litecoin, getChainParameters for TRON, sui_getReferenceGasPrice for SUI, hardcoded typical observed for TON), convert to the chain's smallest unit, then multiply by the native-token USD price pulled from Mobula every 30 seconds. The result is a head-to-head comparison of what it actually costs an end user to move one unit of value on each chain, rather than a gas-price comparison in gwei or lamports which is meaningless across protocols.

faq:
- q: "What does this benchmark measure?"
a: "The current USD cost of a single native-token transfer on each of the 11 tracked L1 chains. A native transfer is the simplest possible action: send the chain's main asset from one address to another. ETH on Ethereum, SOL on Solana, ADA on Cardano, XLM on Stellar, and so on. We do not measure ERC-20 transfers, DEX swaps, or contract calls."
- q: "Why USD instead of gas price?"
a: "Gas price in gwei (Ethereum) cannot be compared to lamports per CU (Solana) or stroops per operation (Stellar). The only honest cross-chain unit is the dollar cost of a user-facing action, computed at scrape time using a live USD price for each native token. Mobula's market API provides the prices we multiply by."
- q: "What do slow, standard, and fast tiers mean?"
a: "Tiers exist for chains with a priority market where users can pay more to get faster inclusion. Slow targets roughly the 25th percentile of recent priority bids, standard the 50th, fast the 90th. Chains with deterministic or near-deterministic fees (Cardano, Stellar, TON, TRON native transfer) emit a single tier because there is no priority market to bid into."
- q: "Why is the Solana fee so low?"
a: "Solana charges 5000 lamports per signature as a hard base, plus an optional priority fee priced in micro-lamports per compute unit. A simple SOL transfer uses around 200 compute units, so the priority component is typically dwarfed by the base. At current SOL prices the headline fee sits well under one cent for non-congested blocks."
- q: "Why is the Cardano fee always similar?"
a: "Cardano fees are deterministic. The protocol parameters (`min_fee_a` per byte, `min_fee_b` base) are set by governance and updated rarely; a standard ADA transfer is roughly 250 bytes, so the lovelace cost is essentially fixed until the next parameter vote. The USD figure on the leaderboard only moves because ADA's USD price moves."
- q: "How are L2 fees handled?"
a: "Not on this page. L2 fees are a separate measurement problem (rollup fee = L2 execution + L1 data posting, the latter being a non-trivial blob market). The L2 bench is in progress as a companion to this L1 page; once shipped, you'll be able to compare L1-fee vs L2-fee for any wallet decision in one click."
- q: "How often does the page refresh?"
a: "Every 30 seconds. The harness re-queries each chain's fee oracle and Mobula's price API every 30 seconds, so headline values are at most 30 seconds stale plus chain RPC latency (typically under a second)."
- q: "Why are some chains using single tier?"
a: "Cardano fees are protocol-deterministic. Stellar's base fee is 100 stroops per operation network-wide. TON's typical fee is a hardcoded conservative estimate because TON has no clean fee-estimate RPC. TRON native transfers consume bandwidth at the published rate per byte. None of these chains expose a priority market a user can bid into for a TRX, ADA, XLM or TON transfer, so emitting a single tier is more honest than fabricating three identical values."

category: Blockchains
status: live
metric: Native transfer fee USD
unit: usd
higher_is_better: false

abstract: |
Every 30 seconds we ask each L1 chain its current native-transfer fee
in the chain's smallest unit (wei, lamport, lovelace, stroop, sun,
MIST, nanoton, litoshi, atomic), multiply by the live USD price of
the chain's native token from Mobula's market API, and publish the
result. Chains with a priority market expose three tiers (slow / std
/ fast) mapped to roughly the 25th, 50th and 90th percentile of the
recent fee distribution. Deterministic-fee chains emit a single tier.
The 11-chain list mirrors the L1 finality bench so users can compare
cost and speed head-to-head.

methodology:
- "Refresh cadence: 30 s. One process samples all 11 chains in parallel goroutines."
- "Ethereum / BNB / Avalanche (EVM): `eth_feeHistory` over the last 4 blocks at percentiles [25, 50, 90]. Cost = (base_fee + reward_percentile) × 21_000 gas, mapped to slow/std/fast."
- "Solana: `getRecentPrioritizationFees` percentiles 25/50/90 of micro-lamports per CU × 200 CU + 5_000 lamport base. Empty-fees response collapses to single std tier at the 5_000 base."
- "TRON: `getChainParameters.getTransactionFee` (currently 1_000 SUN/byte) × 268 bytes typical native transfer."
- "Cardano: koios `epoch_params.min_fee_a / min_fee_b` × 250 bytes typical native transfer. Deterministic, refreshes only when on-chain parameters change."
- "Stellar: horizon `fee_stats.last_ledger_base_fee` × 1 operation. Single tier."
- "SUI: `suix_getReferenceGasPrice` × 2_000_000 gas budget (typical observed for `Coin::transfer`). Single std tier."
- "TON: hardcoded 0.005 TON, the typical observed wallet-v4 transfer. TON's fee model is BoC-emulation only; a clean fee-estimate RPC does not exist."
- "Litecoin: litecoinspace.org `/api/v1/fees/recommended` (hourFee / halfHourFee / fastestFee in litoshi/vByte) × 225 vBytes typical 1-in-1-out P2WPKH transfer."
- "Monero: monero-rpc `get_fee_estimate.fees[0..2]` × 1500 bytes typical 1-in-2-out RingCT transaction."
- "USD prices: `api.mobula.io/api/1/market/multi-data` polled every 30 s for all 11 native tokens in one call."
- "Failures: any upstream error leaves the previous gauge in place, increments `tx_fee_fetch_errors_total{chain, error_type}`, and sets `tx_fee_health{chain}=0`."

findings:
- "{{best_name}} is the cheapest L1 native transfer at {{best_p50}} (std, 24h)."
- "{{name:ethereum}} sits at {{p50:ethereum}} (std, 24h), the most expensive L1 transfer on this leaderboard during normal congestion."
- "{{name:bnb}}, {{name:avalanche}}, {{name:stellar}}, {{name:solana}}, {{name:litecoin}} cluster near or below one cent for a standard transfer."
- "{{name:cardano}}, {{name:tron}}, {{name:monero}} use deterministic or near-deterministic fee models; USD movement on the leaderboard reflects native-token price movement, not network congestion."
- "USD costs are computed at scrape time. A 10% intraday move in the native token's USD price moves the headline by 10% even if the chain-native fee is flat. We surface that intentionally — the dollar cost is what a user actually pays."

source: https://github.com/MobulaFi/mobula-monorepo/tree/main/miniapps/transaction-fee

prometheus:
window: 24h

# Real metrics exposed by the transaction-fee harness:
# tx_fee_native_transfer_usd{chain, tier} gauge (USD)
# tx_fee_native_transfer_native{chain, tier} gauge (smallest unit)
# tx_fee_gas_price_gwei{chain, tier} gauge (EVM only)
# tx_fee_native_token_price_usd{chain} gauge (USD per token)
# tx_fee_last_refresh_timestamp_seconds{chain} gauge (unix s)
# tx_fee_fetch_errors_total{chain, error_type} counter
# tx_fee_health{chain} gauge (0|1)

providers:
- slug: ethereum
name: Ethereum
tag: EIP-1559 fee market, 21000 gas × (base + p50 priority)
formula: "Median USD cost of a native ETH transfer over 24h: (base_fee + p50 priority_fee) × 21000 gas × ETH USD price."
queries:
p50: quantile_over_time(0.50, tx_fee_native_transfer_usd{chain="ethereum",tier="std"}[24h])
p90: quantile_over_time(0.90, tx_fee_native_transfer_usd{chain="ethereum",tier="fast"}[24h])
p99: quantile_over_time(0.99, tx_fee_native_transfer_usd{chain="ethereum",tier="fast"}[24h])
mean: avg_over_time(tx_fee_native_transfer_usd{chain="ethereum",tier="std"}[24h])
success: avg_over_time(tx_fee_health{chain="ethereum"}[24h])
series: tx_fee_native_transfer_usd{chain="ethereum",tier="std"}

- slug: bnb
name: BNB Chain
tag: EIP-1559 fee market, 21000 gas
formula: "Median USD cost of a native BNB transfer over 24h."
queries:
p50: quantile_over_time(0.50, tx_fee_native_transfer_usd{chain="bnb",tier="std"}[24h])
p90: quantile_over_time(0.90, tx_fee_native_transfer_usd{chain="bnb",tier="fast"}[24h])
p99: quantile_over_time(0.99, tx_fee_native_transfer_usd{chain="bnb",tier="fast"}[24h])
mean: avg_over_time(tx_fee_native_transfer_usd{chain="bnb",tier="std"}[24h])
success: avg_over_time(tx_fee_health{chain="bnb"}[24h])
series: tx_fee_native_transfer_usd{chain="bnb",tier="std"}

- slug: avalanche
name: Avalanche
tag: C-Chain EIP-1559 fee market, 21000 gas
formula: "Median USD cost of a native AVAX transfer over 24h."
queries:
p50: quantile_over_time(0.50, tx_fee_native_transfer_usd{chain="avalanche",tier="std"}[24h])
p90: quantile_over_time(0.90, tx_fee_native_transfer_usd{chain="avalanche",tier="fast"}[24h])
p99: quantile_over_time(0.99, tx_fee_native_transfer_usd{chain="avalanche",tier="fast"}[24h])
mean: avg_over_time(tx_fee_native_transfer_usd{chain="avalanche",tier="std"}[24h])
success: avg_over_time(tx_fee_health{chain="avalanche"}[24h])
series: tx_fee_native_transfer_usd{chain="avalanche",tier="std"}

- slug: solana
name: Solana
tag: 5000 lamport base + getRecentPrioritizationFees × 200 CU
formula: "Median USD cost of a native SOL transfer over 24h: 5000 lamports + p50 priority × 200 CU × SOL USD price."
queries:
p50: quantile_over_time(0.50, tx_fee_native_transfer_usd{chain="solana",tier="std"}[24h])
p90: quantile_over_time(0.90, tx_fee_native_transfer_usd{chain="solana",tier="fast"}[24h])
p99: quantile_over_time(0.99, tx_fee_native_transfer_usd{chain="solana",tier="fast"}[24h])
mean: avg_over_time(tx_fee_native_transfer_usd{chain="solana",tier="std"}[24h])
success: avg_over_time(tx_fee_health{chain="solana"}[24h])
series: tx_fee_native_transfer_usd{chain="solana",tier="std"}

- slug: tron
name: TRON
tag: Bandwidth model, 268 bytes × getTransactionFee SUN/byte
formula: "Deterministic USD cost of a native TRX transfer using the bandwidth-rate parameter × 268 bytes typical transfer × TRX USD price."
queries:
p50: quantile_over_time(0.50, tx_fee_native_transfer_usd{chain="tron",tier="single"}[24h])
p90: quantile_over_time(0.90, tx_fee_native_transfer_usd{chain="tron",tier="single"}[24h])
p99: quantile_over_time(0.99, tx_fee_native_transfer_usd{chain="tron",tier="single"}[24h])
mean: avg_over_time(tx_fee_native_transfer_usd{chain="tron",tier="single"}[24h])
success: avg_over_time(tx_fee_health{chain="tron"}[24h])
series: tx_fee_native_transfer_usd{chain="tron",tier="single"}

- slug: cardano
name: Cardano
tag: min_fee_b + size × min_fee_a, deterministic
formula: "Protocol-deterministic ADA transfer cost: koios live min_fee_a/b × 250 bytes typical × ADA USD price."
queries:
p50: quantile_over_time(0.50, tx_fee_native_transfer_usd{chain="cardano",tier="single"}[24h])
p90: quantile_over_time(0.90, tx_fee_native_transfer_usd{chain="cardano",tier="single"}[24h])
p99: quantile_over_time(0.99, tx_fee_native_transfer_usd{chain="cardano",tier="single"}[24h])
mean: avg_over_time(tx_fee_native_transfer_usd{chain="cardano",tier="single"}[24h])
success: avg_over_time(tx_fee_health{chain="cardano"}[24h])
series: tx_fee_native_transfer_usd{chain="cardano",tier="single"}

- slug: sui
name: Sui
tag: suix_getReferenceGasPrice × 2_000_000 gas budget
formula: "USD cost of a native SUI transfer: live reference gas price × 2M gas budget × SUI USD price."
queries:
p50: quantile_over_time(0.50, tx_fee_native_transfer_usd{chain="sui",tier="std"}[24h])
p90: quantile_over_time(0.90, tx_fee_native_transfer_usd{chain="sui",tier="std"}[24h])
p99: quantile_over_time(0.99, tx_fee_native_transfer_usd{chain="sui",tier="std"}[24h])
mean: avg_over_time(tx_fee_native_transfer_usd{chain="sui",tier="std"}[24h])
success: avg_over_time(tx_fee_health{chain="sui"}[24h])
series: tx_fee_native_transfer_usd{chain="sui",tier="std"}

- slug: ton
name: TON
tag: Hardcoded 0.005 TON typical wallet-v4 transfer
formula: "Conservative typical-observed cost of a TON wallet transfer × TON USD price. TON has no fee-estimate RPC; this is the observed median."
queries:
p50: quantile_over_time(0.50, tx_fee_native_transfer_usd{chain="ton",tier="single"}[24h])
p90: quantile_over_time(0.90, tx_fee_native_transfer_usd{chain="ton",tier="single"}[24h])
p99: quantile_over_time(0.99, tx_fee_native_transfer_usd{chain="ton",tier="single"}[24h])
mean: avg_over_time(tx_fee_native_transfer_usd{chain="ton",tier="single"}[24h])
success: avg_over_time(tx_fee_health{chain="ton"}[24h])
series: tx_fee_native_transfer_usd{chain="ton",tier="single"}

- slug: stellar
name: Stellar
tag: 100 stroops base per operation, surge during congestion
formula: "Live horizon fee_stats.last_ledger_base_fee × 1 op × XLM USD price."
queries:
p50: quantile_over_time(0.50, tx_fee_native_transfer_usd{chain="stellar",tier="single"}[24h])
p90: quantile_over_time(0.90, tx_fee_native_transfer_usd{chain="stellar",tier="single"}[24h])
p99: quantile_over_time(0.99, tx_fee_native_transfer_usd{chain="stellar",tier="single"}[24h])
mean: avg_over_time(tx_fee_native_transfer_usd{chain="stellar",tier="single"}[24h])
success: avg_over_time(tx_fee_health{chain="stellar"}[24h])
series: tx_fee_native_transfer_usd{chain="stellar",tier="single"}

- slug: litecoin
name: Litecoin
tag: litecoinspace fee oracle × 225 vBytes
formula: "Mempool-based litoshi/vByte × 225 vBytes typical P2WPKH transfer × LTC USD price."
queries:
p50: quantile_over_time(0.50, tx_fee_native_transfer_usd{chain="litecoin",tier="std"}[24h])
p90: quantile_over_time(0.90, tx_fee_native_transfer_usd{chain="litecoin",tier="fast"}[24h])
p99: quantile_over_time(0.99, tx_fee_native_transfer_usd{chain="litecoin",tier="fast"}[24h])
mean: avg_over_time(tx_fee_native_transfer_usd{chain="litecoin",tier="std"}[24h])
success: avg_over_time(tx_fee_health{chain="litecoin"}[24h])
series: tx_fee_native_transfer_usd{chain="litecoin",tier="std"}

- slug: monero
name: Monero
tag: get_fee_estimate × 1500 bytes RingCT
formula: "Monero-rpc fee per byte × 1500 bytes typical 1-in-2-out RingCT × XMR USD price."
queries:
p50: quantile_over_time(0.50, tx_fee_native_transfer_usd{chain="monero",tier="std"}[24h])
p90: quantile_over_time(0.90, tx_fee_native_transfer_usd{chain="monero",tier="fast"}[24h])
p99: quantile_over_time(0.99, tx_fee_native_transfer_usd{chain="monero",tier="fast"}[24h])
mean: avg_over_time(tx_fee_native_transfer_usd{chain="monero",tier="std"}[24h])
success: avg_over_time(tx_fee_health{chain="monero"}[24h])
series: tx_fee_native_transfer_usd{chain="monero",tier="std"}
Loading