From 6bc9d36748f9f34d94ab5f48d58144c2552adbe0 Mon Sep 17 00:00:00 2001 From: segfault-magnet Date: Tue, 1 Oct 2024 09:42:45 +0200 Subject: [PATCH] add temp code to get a tx unstuck --- packages/eth/src/websocket/connection.rs | 32 ++++++++++++++++++++---- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/packages/eth/src/websocket/connection.rs b/packages/eth/src/websocket/connection.rs index 34865ee0..510f77ec 100644 --- a/packages/eth/src/websocket/connection.rs +++ b/packages/eth/src/websocket/connection.rs @@ -1,7 +1,14 @@ -use std::{cmp::min, num::NonZeroU32}; +use std::{ + cmp::min, + num::NonZeroU32, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, +}; use alloy::{ - eips::eip4844::BYTES_PER_BLOB, + eips::eip4844::{BYTES_PER_BLOB, DATA_GAS_PER_BLOB}, network::{Ethereum, EthereumWallet, TransactionBuilder, TransactionBuilder4844, TxSigner}, primitives::{Address, U256}, providers::{Provider, ProviderBuilder, WsConnect}, @@ -64,6 +71,7 @@ sol!( #[derive(Clone)] pub struct WsConnection { provider: WsProvider, + first_blob_tx_sent: Arc, blob_provider: Option, address: Address, blob_signer_address: Option
, @@ -186,11 +194,24 @@ impl EthApi for WsConnection { let limited_fragments = fragments.into_iter().take(num_fragments); let sidecar = Eip4844BlobEncoder::decode(limited_fragments)?; - let blob_tx = TransactionRequest::default() - .with_blob_sidecar(sidecar) - .with_to(*blob_signer_address); + let blob_tx = if self.first_blob_tx_sent.load(Ordering::Relaxed) { + TransactionRequest::default() + .with_blob_sidecar(sidecar) + .with_to(*blob_signer_address) + } else { + // Temporary hard coded gas to unblock a pending transaction. + // Work is being done ATM to have code that will replace stuck txs automatically. + TransactionRequest::default() + .with_max_fee_per_blob_gas( + (974728630076u128.div_ceil(DATA_GAS_PER_BLOB as u128 * 6) as f64 * 1.5) as u128, + ) + .with_blob_sidecar(sidecar) + .with_to(*blob_signer_address) + }; let tx = blob_provider.send_transaction(blob_tx).await?; + self.first_blob_tx_sent.store(true, Ordering::Relaxed); + self.metrics.blobs_per_tx.observe(num_fragments as f64); for bytes in used_bytes_per_fragment { @@ -266,6 +287,7 @@ impl WsConnection { contract, commit_interval, metrics: Default::default(), + first_blob_tx_sent: Arc::new(AtomicBool::new(false)), }) }