From e26ede21f1044c61e28a1b50c1e332320a0cc409 Mon Sep 17 00:00:00 2001 From: James Prestwich <10149425+prestwich@users.noreply.github.com> Date: Wed, 28 Dec 2022 20:05:08 -0500 Subject: [PATCH] fix: don't override user-set 1559 attributes (#1980) * fix: don't override user-set 1559 attributes * fix: enforce cap on prioirity fee per gas --- ethers-providers/src/provider.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/ethers-providers/src/provider.rs b/ethers-providers/src/provider.rs index cde771cc..97d5a995 100644 --- a/ethers-providers/src/provider.rs +++ b/ethers-providers/src/provider.rs @@ -352,8 +352,19 @@ impl Middleware for Provider

{ if inner.max_fee_per_gas.is_none() || inner.max_priority_fee_per_gas.is_none() { let (max_fee_per_gas, max_priority_fee_per_gas) = self.estimate_eip1559_fees(None).await?; - inner.max_fee_per_gas = Some(max_fee_per_gas); - inner.max_priority_fee_per_gas = Some(max_priority_fee_per_gas); + // we want to avoid overriding the user if either of these + // are set. In order to do this, we refuse to override the + // `max_fee_per_gas` if already set. + // However, we must preserve the constraint that the tip + // cannot be higher than max fee, so we override user + // intent if that is so. We override by + // - first: if set, set to the min(current value, MFPG) + // - second, if still unset, use the RPC estimated amount + let mfpg = inner.max_fee_per_gas.get_or_insert(max_fee_per_gas); + inner + .max_priority_fee_per_gas + .map(|tip| std::cmp::min(tip, *mfpg)) + .get_or_insert(max_priority_fee_per_gas); }; } }