From e1f0581aba00f1ca3ce2ea91bb41748d43259c4f Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Thu, 4 Jul 2024 17:03:15 +0100 Subject: [PATCH] Revert "feat(hyp-ethereum): gas escalator middleware (#3852)" This reverts commit c3c002a8fe4870c7e462cd5073365a7f9a2235bc. --- rust/Cargo.lock | 22 ++++----- rust/Cargo.toml | 10 ++-- .../src/rpc_clients/trait_builder.rs | 47 +++---------------- rust/chains/hyperlane-ethereum/src/tx.rs | 3 +- rust/ethers-prometheus/src/middleware/mod.rs | 1 + rust/utils/run-locally/src/invariants.rs | 7 +-- 6 files changed, 28 insertions(+), 62 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 62d34df5b5..3f1fc7a5ef 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -2725,7 +2725,7 @@ dependencies = [ [[package]] name = "ethers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-06-27-2#df3510cdfdd18ee6e6e9b0d7bad61f405c8abc49" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-04-25#361b69b9561e11eb3cf8000a51de1985e2571785" dependencies = [ "ethers-addressbook", "ethers-contract", @@ -2739,7 +2739,7 @@ dependencies = [ [[package]] name = "ethers-addressbook" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-06-27-2#df3510cdfdd18ee6e6e9b0d7bad61f405c8abc49" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-04-25#361b69b9561e11eb3cf8000a51de1985e2571785" dependencies = [ "ethers-core", "once_cell", @@ -2750,7 +2750,7 @@ dependencies = [ [[package]] name = "ethers-contract" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-06-27-2#df3510cdfdd18ee6e6e9b0d7bad61f405c8abc49" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-04-25#361b69b9561e11eb3cf8000a51de1985e2571785" dependencies = [ "ethers-contract-abigen", "ethers-contract-derive", @@ -2768,7 +2768,7 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-06-27-2#df3510cdfdd18ee6e6e9b0d7bad61f405c8abc49" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-04-25#361b69b9561e11eb3cf8000a51de1985e2571785" dependencies = [ "Inflector", "cfg-if", @@ -2792,7 +2792,7 @@ dependencies = [ [[package]] name = "ethers-contract-derive" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-06-27-2#df3510cdfdd18ee6e6e9b0d7bad61f405c8abc49" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-04-25#361b69b9561e11eb3cf8000a51de1985e2571785" dependencies = [ "ethers-contract-abigen", "ethers-core", @@ -2806,7 +2806,7 @@ dependencies = [ [[package]] name = "ethers-core" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-06-27-2#df3510cdfdd18ee6e6e9b0d7bad61f405c8abc49" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-04-25#361b69b9561e11eb3cf8000a51de1985e2571785" dependencies = [ "arrayvec", "bytes", @@ -2836,7 +2836,7 @@ dependencies = [ [[package]] name = "ethers-etherscan" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-06-27-2#df3510cdfdd18ee6e6e9b0d7bad61f405c8abc49" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-04-25#361b69b9561e11eb3cf8000a51de1985e2571785" dependencies = [ "ethers-core", "getrandom 0.2.12", @@ -2852,7 +2852,7 @@ dependencies = [ [[package]] name = "ethers-middleware" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-06-27-2#df3510cdfdd18ee6e6e9b0d7bad61f405c8abc49" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-04-25#361b69b9561e11eb3cf8000a51de1985e2571785" dependencies = [ "async-trait", "auto_impl 0.5.0", @@ -2900,7 +2900,7 @@ dependencies = [ [[package]] name = "ethers-providers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-06-27-2#df3510cdfdd18ee6e6e9b0d7bad61f405c8abc49" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-04-25#361b69b9561e11eb3cf8000a51de1985e2571785" dependencies = [ "async-trait", "auto_impl 1.1.0", @@ -2936,7 +2936,7 @@ dependencies = [ [[package]] name = "ethers-signers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-06-27-2#df3510cdfdd18ee6e6e9b0d7bad61f405c8abc49" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-04-25#361b69b9561e11eb3cf8000a51de1985e2571785" dependencies = [ "async-trait", "coins-bip32", @@ -4086,7 +4086,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.5", "tokio", "tower-service", "tracing", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 54a840ac31..bfe2564f00 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -197,27 +197,27 @@ cosmwasm-schema = "1.2.7" [workspace.dependencies.ethers] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-06-27-2" +tag = "2024-04-25" [workspace.dependencies.ethers-contract] features = ["legacy"] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-06-27-2" +tag = "2024-04-25" [workspace.dependencies.ethers-core] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-06-27-2" +tag = "2024-04-25" [workspace.dependencies.ethers-providers] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-06-27-2" +tag = "2024-04-25" [workspace.dependencies.ethers-signers] features = ["aws"] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-06-27-2" +tag = "2024-04-25" [patch.crates-io.curve25519-dalek] branch = "v3.2.2-relax-zeroize" diff --git a/rust/chains/hyperlane-ethereum/src/rpc_clients/trait_builder.rs b/rust/chains/hyperlane-ethereum/src/rpc_clients/trait_builder.rs index ca53aaf1ae..04894aa496 100644 --- a/rust/chains/hyperlane-ethereum/src/rpc_clients/trait_builder.rs +++ b/rust/chains/hyperlane-ethereum/src/rpc_clients/trait_builder.rs @@ -3,7 +3,6 @@ use std::sync::Arc; use std::time::Duration; use async_trait::async_trait; -use ethers::middleware::gas_escalator::{Frequency, GasEscalatorMiddleware, GeometricGasPrice}; use ethers::middleware::gas_oracle::{ GasCategory, GasOracle, GasOracleMiddleware, Polygon, ProviderOracle, }; @@ -11,8 +10,6 @@ use ethers::prelude::{ Http, JsonRpcClient, Middleware, NonceManagerMiddleware, Provider, Quorum, QuorumProvider, SignerMiddleware, WeightedProvider, Ws, WsClientError, }; -use ethers::types::Address; -use ethers_signers::Signer; use hyperlane_core::rpc_clients::FallbackProvider; use reqwest::{Client, Url}; use thiserror::Error; @@ -213,19 +210,10 @@ pub trait BuildableWithProvider { M: Middleware + 'static, { Ok(if let Some(signer) = signer { - // The signing provider is used for sending txs, which may end up stuck in the mempool due to - // gas pricing issues. We first wrap the provider in a signer middleware, to sign any new txs sent by the gas escalator middleware. - // We keep nonce manager as the outermost middleware, so that every new tx with a higher gas price reuses the same nonce. - let signing_provider = wrap_with_signer(provider, signer.clone()) + let signing_provider = wrap_with_signer(provider, signer) .await .map_err(ChainCommunicationError::from_other)?; - let gas_escalator_provider = wrap_with_gas_escalator(signing_provider); - let nonce_manager_provider = - wrap_with_nonce_manager(gas_escalator_provider, signer.address()) - .await - .map_err(ChainCommunicationError::from_other)?; - - self.build_with_provider(nonce_manager_provider, conn, locator) + self.build_with_provider(signing_provider, conn, locator) } else { self.build_with_provider(provider, conn, locator) } @@ -246,19 +234,15 @@ pub trait BuildableWithProvider { async fn wrap_with_signer( provider: M, signer: Signers, -) -> Result, M::Error> { +) -> Result, Signers>, M::Error> { let provider_chain_id = provider.get_chainid().await?; let signer = ethers::signers::Signer::with_chain_id(signer, provider_chain_id.as_u64()); - Ok(SignerMiddleware::new(provider, signer)) -} + let address = ethers::prelude::Signer::address(&signer); + let provider = NonceManagerMiddleware::new(provider, address); -async fn wrap_with_nonce_manager( - provider: M, - signer_address: Address, -) -> Result, M::Error> { - let nonce_manager_provider = NonceManagerMiddleware::new(provider, signer_address); - Ok(nonce_manager_provider) + let signing_provider = SignerMiddleware::new(provider, signer); + Ok(signing_provider) } fn build_polygon_gas_oracle(chain: ethers_core::types::Chain) -> ChainResult> { @@ -290,20 +274,3 @@ where }; Ok(GasOracleMiddleware::new(provider, gas_oracle)) } - -fn wrap_with_gas_escalator(provider: M) -> GasEscalatorMiddleware -where - M: Middleware + 'static, -{ - // Increase the gas price by 12.5% every 60 seconds - // (These are the default values from ethers doc comments) - const COEFFICIENT: f64 = 1.125; - const EVERY_SECS: u64 = 60u64; - // 550 gwei is the limit we also use for polygon, so we reuse for consistency - const MAX_GAS_PRICE: u128 = 550 * 10u128.pow(9); - let escalator = GeometricGasPrice::new(COEFFICIENT, EVERY_SECS, MAX_GAS_PRICE.into()); - // Check the status of sent txs every eth block or so. The alternative is to subscribe to new blocks and check then, - // which adds unnecessary load on the provider. - const FREQUENCY: Frequency = Frequency::Duration(Duration::from_secs(12).as_millis() as _); - GasEscalatorMiddleware::new(provider, escalator, FREQUENCY) -} diff --git a/rust/chains/hyperlane-ethereum/src/tx.rs b/rust/chains/hyperlane-ethereum/src/tx.rs index f45a9ab0ba..5ec0ebd386 100644 --- a/rust/chains/hyperlane-ethereum/src/tx.rs +++ b/rust/chains/hyperlane-ethereum/src/tx.rs @@ -44,7 +44,8 @@ where .cloned() .unwrap_or_else(|| NameOrAddress::Address(Default::default())); - info!(?to, %data, tx=?tx.tx, "Dispatching transaction"); + info!(?to, %data, "Dispatching transaction"); + // We can set the gas higher here! let dispatch_fut = tx.send(); let dispatched = dispatch_fut .await? diff --git a/rust/ethers-prometheus/src/middleware/mod.rs b/rust/ethers-prometheus/src/middleware/mod.rs index c646a13e1f..592e6a200f 100644 --- a/rust/ethers-prometheus/src/middleware/mod.rs +++ b/rust/ethers-prometheus/src/middleware/mod.rs @@ -227,6 +227,7 @@ impl Middleware for PrometheusMiddleware { ) -> Result, Self::Error> { let start = Instant::now(); let tx: TypedTransaction = tx.into(); + let chain = { let data = self.conf.read().await; chain_name(&data.chain).to_owned() diff --git a/rust/utils/run-locally/src/invariants.rs b/rust/utils/run-locally/src/invariants.rs index e751bebdf6..91866415b2 100644 --- a/rust/utils/run-locally/src/invariants.rs +++ b/rust/utils/run-locally/src/invariants.rs @@ -80,12 +80,9 @@ pub fn termination_invariants_met( // EDIT: Having had a quick look, it seems like there are some legitimate reverts happening in the confirm step // (`Transaction attempting to process message either reverted or was reorged`) // in which case more gas expenditure logs than messages are expected. - let gas_expenditure_log_count = log_counts.get(GAS_EXPENDITURE_LOG_MESSAGE).unwrap(); assert!( - gas_expenditure_log_count >= &total_messages_expected, - "Didn't record gas payment for all delivered messages. Got {} gas payment logs, expected at least {}", - gas_expenditure_log_count, - total_messages_expected + log_counts.get(GAS_EXPENDITURE_LOG_MESSAGE).unwrap() >= &total_messages_expected, + "Didn't record gas payment for all delivered messages" ); // These tests check that we fixed https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/3915, where some logs would not show up assert!(