From 9232f69507175f5cbbb3c8cd432ab7200bd54bc7 Mon Sep 17 00:00:00 2001 From: Ragnar Date: Wed, 7 May 2025 17:00:14 +0200 Subject: [PATCH 1/6] Update progress.rs --- crates/script/src/progress.rs | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/crates/script/src/progress.rs b/crates/script/src/progress.rs index a0a5ba5609030..c002e905230ac 100644 --- a/crates/script/src/progress.rs +++ b/crates/script/src/progress.rs @@ -207,20 +207,30 @@ impl ScriptProgress { let mut tasks = futures::stream::iter(futs).buffer_unordered(10); let mut errors: Vec = vec![]; + let mut discarded_transactions = false; while let Some((tx_hash, result)) = tasks.next().await { match result { Err(err) => { - errors.push(format!("Failure on receiving a receipt for {tx_hash:?}:\n{err}")); - - seq_progress.inner.write().finish_tx_spinner(tx_hash); + // Check if the error is about an empty receipt + if err.to_string().contains("Received an empty receipt") { + discarded_transactions = true; + // Special handling for empty receipts - we'll mark these for retrying + deployment_sequence.remove_pending(tx_hash); + let msg = format!("Transaction {tx_hash:?} was discarded by RPC. It will be retried when using --resume."); + seq_progress.inner.write().finish_tx_spinner_with_msg(tx_hash, &msg)?; + } else { + errors.push(format!("Failure on receiving a receipt for {tx_hash:?}:\n{err}")); + seq_progress.inner.write().finish_tx_spinner(tx_hash); + } } Ok(TxStatus::Dropped) => { // We want to remove it from pending so it will be re-broadcast. deployment_sequence.remove_pending(tx_hash); - errors.push(format!("Transaction dropped from the mempool: {tx_hash:?}")); - - seq_progress.inner.write().finish_tx_spinner(tx_hash); + discarded_transactions = true; + + let msg = format!("Transaction {tx_hash:?} dropped from the mempool. It will be retried when using --resume."); + seq_progress.inner.write().finish_tx_spinner_with_msg(tx_hash, &msg)?; } Ok(TxStatus::Success(receipt)) => { trace!(tx_hash=?tx_hash, "received tx receipt"); @@ -249,11 +259,17 @@ impl ScriptProgress { // print any errors if !errors.is_empty() { let mut error_msg = errors.join("\n"); - if !deployment_sequence.pending.is_empty() { - error_msg += "\n\n Add `--resume` to your command to try and continue broadcasting - the transactions." + + // Add information about using --resume if necessary + if !deployment_sequence.pending.is_empty() || discarded_transactions { + error_msg += "\n\n Add `--resume` to your command to try and continue broadcasting "; + error_msg += "the transactions. This will attempt to resend transactions that were discarded by the RPC."; } + eyre::bail!(error_msg); + } else if discarded_transactions { + // If we have discarded transactions but no errors, still inform the user + sh_warn!("Some transactions were discarded by the RPC node. Use `--resume` to retry these transactions.")?; } Ok(()) From 5ba3cdd101e2622f73e3cdb8e191cbefe548b721 Mon Sep 17 00:00:00 2001 From: Ragnar Date: Wed, 7 May 2025 17:00:27 +0200 Subject: [PATCH 2/6] Update receipts.rs --- crates/script/src/receipts.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/crates/script/src/receipts.rs b/crates/script/src/receipts.rs index 605cdf9ddb0de..5fd7f88e36993 100644 --- a/crates/script/src/receipts.rs +++ b/crates/script/src/receipts.rs @@ -37,7 +37,27 @@ pub async fn check_tx_status( .get_receipt() .await { - Ok(receipt) => Ok(receipt.into()), + Ok(receipt) => { + // Check if the receipt has valid block information + if receipt.block_number.is_none() || receipt.block_hash.is_none() || receipt.transaction_index.is_none() { + // Receipt is empty, possibly due to RPC discarding the transaction + match provider.get_transaction_by_hash(hash).await { + Ok(_) => { + // Transaction is still known to the node, so we should wait + Err(RetryError::Continue(eyre!( + "Received an empty receipt for {hash}, but transaction is still known to the node, waiting for full receipt" + ))) + } + Err(_) => { + // Transaction is not known to the node, mark it as dropped + Ok(TxStatus::Dropped) + } + } + } else { + // Receipt has valid block information, proceed normally + Ok(receipt.into()) + } + } Err(e) => match provider.get_transaction_by_hash(hash).await { Ok(_) => match e { PendingTransactionError::TxWatcher(WatchTxError::Timeout) => { From cc10e7f4f0aa046ed34ba5909f1af1dbdff09296 Mon Sep 17 00:00:00 2001 From: Ragnar Date: Thu, 8 May 2025 12:18:48 +0200 Subject: [PATCH 3/6] Update receipts.rs --- crates/script/src/receipts.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/crates/script/src/receipts.rs b/crates/script/src/receipts.rs index 5fd7f88e36993..97d2daaee98ba 100644 --- a/crates/script/src/receipts.rs +++ b/crates/script/src/receipts.rs @@ -40,12 +40,14 @@ pub async fn check_tx_status( Ok(receipt) => { // Check if the receipt has valid block information if receipt.block_number.is_none() || receipt.block_hash.is_none() || receipt.transaction_index.is_none() { - // Receipt is empty, possibly due to RPC discarding the transaction + // Receipt is empty, try to sleep and retry a few times match provider.get_transaction_by_hash(hash).await { Ok(_) => { - // Transaction is still known to the node, so we should wait - Err(RetryError::Continue(eyre!( - "Received an empty receipt for {hash}, but transaction is still known to the node, waiting for full receipt" + // Sleep for a short time to allow the transaction to be mined + tokio::time::sleep(Duration::from_millis(500)).await; + // Transaction is still known to the node, retry + Err(RetryError::Retry(eyre!( + "Received an empty receipt for {hash}, but transaction is still known to the node, retrying" ))) } Err(_) => { From e30313aad7301214b7167943020975715bbd82c3 Mon Sep 17 00:00:00 2001 From: Ragnar Date: Thu, 8 May 2025 12:19:03 +0200 Subject: [PATCH 4/6] Update progress.rs --- crates/script/src/progress.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/script/src/progress.rs b/crates/script/src/progress.rs index c002e905230ac..01fb12dc0793f 100644 --- a/crates/script/src/progress.rs +++ b/crates/script/src/progress.rs @@ -212,12 +212,12 @@ impl ScriptProgress { while let Some((tx_hash, result)) = tasks.next().await { match result { Err(err) => { - // Check if the error is about an empty receipt + // Check if this is a retry error for empty receipts if err.to_string().contains("Received an empty receipt") { + // We've already retried several times with sleep, but the receipt is still empty discarded_transactions = true; - // Special handling for empty receipts - we'll mark these for retrying deployment_sequence.remove_pending(tx_hash); - let msg = format!("Transaction {tx_hash:?} was discarded by RPC. It will be retried when using --resume."); + let msg = format!("Transaction {tx_hash:?} was discarded by RPC despite multiple retry attempts. It will be retried when using --resume."); seq_progress.inner.write().finish_tx_spinner_with_msg(tx_hash, &msg)?; } else { errors.push(format!("Failure on receiving a receipt for {tx_hash:?}:\n{err}")); From ae67499431c6ac6ed21215a8e5636e2074745143 Mon Sep 17 00:00:00 2001 From: Ragnar Date: Sat, 10 May 2025 11:30:02 +0200 Subject: [PATCH 5/6] Update receipts.rs --- crates/script/src/receipts.rs | 39 ++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/crates/script/src/receipts.rs b/crates/script/src/receipts.rs index 97d2daaee98ba..93b9a69052256 100644 --- a/crates/script/src/receipts.rs +++ b/crates/script/src/receipts.rs @@ -38,26 +38,27 @@ pub async fn check_tx_status( .await { Ok(receipt) => { - // Check if the receipt has valid block information - if receipt.block_number.is_none() || receipt.block_hash.is_none() || receipt.transaction_index.is_none() { - // Receipt is empty, try to sleep and retry a few times - match provider.get_transaction_by_hash(hash).await { - Ok(_) => { - // Sleep for a short time to allow the transaction to be mined - tokio::time::sleep(Duration::from_millis(500)).await; - // Transaction is still known to the node, retry - Err(RetryError::Retry(eyre!( - "Received an empty receipt for {hash}, but transaction is still known to the node, retrying" - ))) - } - Err(_) => { - // Transaction is not known to the node, mark it as dropped - Ok(TxStatus::Dropped) - } + // Check if the receipt is pending (missing block information) + let is_pending = receipt.block_number.is_none() || receipt.block_hash.is_none() || receipt.transaction_index.is_none(); + + if !is_pending { + return Ok(receipt.into()); + } + + // Receipt is pending, try to sleep and retry a few times + match provider.get_transaction_by_hash(hash).await { + Ok(_) => { + // Sleep for a short time to allow the transaction to be mined + tokio::time::sleep(Duration::from_millis(500)).await; + // Transaction is still known to the node, retry + Err(RetryError::Retry(eyre!( + "Received a pending receipt for {hash}, but transaction is still known to the node, retrying" + ))) + } + Err(_) => { + // Transaction is not known to the node, mark it as dropped + Ok(TxStatus::Dropped) } - } else { - // Receipt has valid block information, proceed normally - Ok(receipt.into()) } } Err(e) => match provider.get_transaction_by_hash(hash).await { From 31a148f0516d3218af0ac61fd7bed90bf14c7255 Mon Sep 17 00:00:00 2001 From: Ragnar Date: Sat, 10 May 2025 11:30:15 +0200 Subject: [PATCH 6/6] Update progress.rs --- crates/script/src/progress.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crates/script/src/progress.rs b/crates/script/src/progress.rs index 01fb12dc0793f..08a94ed02c53d 100644 --- a/crates/script/src/progress.rs +++ b/crates/script/src/progress.rs @@ -212,9 +212,9 @@ impl ScriptProgress { while let Some((tx_hash, result)) = tasks.next().await { match result { Err(err) => { - // Check if this is a retry error for empty receipts - if err.to_string().contains("Received an empty receipt") { - // We've already retried several times with sleep, but the receipt is still empty + // Check if this is a retry error for pending receipts + if err.to_string().contains("Received a pending receipt") { + // We've already retried several times with sleep, but the receipt is still pending discarded_transactions = true; deployment_sequence.remove_pending(tx_hash); let msg = format!("Transaction {tx_hash:?} was discarded by RPC despite multiple retry attempts. It will be retried when using --resume."); @@ -262,8 +262,9 @@ impl ScriptProgress { // Add information about using --resume if necessary if !deployment_sequence.pending.is_empty() || discarded_transactions { - error_msg += "\n\n Add `--resume` to your command to try and continue broadcasting "; - error_msg += "the transactions. This will attempt to resend transactions that were discarded by the RPC."; + error_msg += r#" + +Add `--resume` to your command to try and continue broadcasting the transactions. This will attempt to resend transactions that were discarded by the RPC."#; } eyre::bail!(error_msg);