From 58af1c493de0a620f164ac025f10c58280af36b1 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 1 Aug 2025 17:46:27 +0000 Subject: [PATCH] fee_policy: lower min relay fee from 1 sat/byte to 0.1 s/b - minrelayfee is still server-reported, but the clamps are changed from [1, 50] to [0.1, 50] sat/vbyte - dynamic feerates coming from the estimator are still clamped to [1, 1500] sat/vbyte ref https://github.com/bitcoin/bitcoin/pull/33106 --- electrum/bitcoin.py | 4 ++-- electrum/fee_policy.py | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/electrum/bitcoin.py b/electrum/bitcoin.py index 01440a757..562b53ee4 100644 --- a/electrum/bitcoin.py +++ b/electrum/bitcoin.py @@ -325,14 +325,14 @@ def construct_script( def relayfee(network: 'Network' = None) -> int: """Returns feerate in sat/kbyte.""" - from .fee_policy import FEERATE_DEFAULT_RELAY, FEERATE_MAX_RELAY + from .fee_policy import FEERATE_MIN_RELAY, FEERATE_DEFAULT_RELAY, FEERATE_MAX_RELAY if network and network.relay_fee is not None: fee = network.relay_fee else: fee = FEERATE_DEFAULT_RELAY # sanity safeguards, as network.relay_fee is coming from a server: fee = min(fee, FEERATE_MAX_RELAY) - fee = max(fee, FEERATE_DEFAULT_RELAY) + fee = max(fee, FEERATE_MIN_RELAY) return fee diff --git a/electrum/fee_policy.py b/electrum/fee_policy.py index f02e545c8..9e8e660e1 100644 --- a/electrum/fee_policy.py +++ b/electrum/fee_policy.py @@ -25,8 +25,10 @@ FEERATE_MAX_DYNAMIC = 1500000 FEERATE_WARNING_HIGH_FEE = 600000 FEERATE_FALLBACK_STATIC_FEE = 150000 FEERATE_REGTEST_STATIC_FEE = FEERATE_FALLBACK_STATIC_FEE # hardcoded fee used on regtest -FEERATE_DEFAULT_RELAY = 1000 +FEERATE_MIN_RELAY = 100 +FEERATE_DEFAULT_RELAY = 1000 # conservative "min relay fee" FEERATE_MAX_RELAY = 50000 +assert FEERATE_MIN_RELAY <= FEERATE_DEFAULT_RELAY <= FEERATE_MAX_RELAY # warn user if fee/amount for on-chain tx is higher than this FEE_RATIO_HIGH_WARNING = 0.05 @@ -288,6 +290,8 @@ def impose_hard_limits_on_fee(func): if fee is None: return fee fee = min(FEERATE_MAX_DYNAMIC, fee) + # Clamp dynamic feerates with conservative min relay fee, + # to ensure txs propagate well: fee = max(FEERATE_DEFAULT_RELAY, fee) return fee return get_fee_within_limits @@ -359,7 +363,7 @@ class FeeHistogram: slot = min(item[1], bytes_limit-bytes_current) bytes_current += slot capped_histogram.append([ - max(FEERATE_DEFAULT_RELAY/1000, item[0]), # clamped to [FEERATE_DEFAULT_RELAY/1000,inf[ + max(FEERATE_MIN_RELAY/1000, item[0]), # clamped to [FEERATE_MIN_RELAY/1000,inf[ slot, # width of bucket bytes_current, # cumulative depth at far end of bucket ])