From 507c03959dfafd3b11b86995f75c933c4b37e428 Mon Sep 17 00:00:00 2001 From: Uncle Stretch Date: Fri, 24 Jan 2025 16:00:36 +0300 Subject: [PATCH] decrement stored nonce if tx failed for any reason Signed-off-by: Uncle Stretch --- src/network/mod.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/network/mod.rs b/src/network/mod.rs index 0edaab7..215ca25 100644 --- a/src/network/mod.rs +++ b/src/network/mod.rs @@ -26,6 +26,7 @@ pub use subscriptions::{FinalizedSubscription, BestSubscription}; struct TxToWatch { tx_progress: TxProgress>, + sender: String, target: ActionTarget, } @@ -82,6 +83,13 @@ impl Network { } } + fn remove_transaction_and_decrement_nonce(&mut self, index: usize) { + let removed = self.transactions_to_watch.remove(index); + self.senders + .get_mut(&removed.sender) + .map(|nonce| *nonce = nonce.saturating_sub(1)); + } + pub async fn handle_network_event(&mut self, io_event: Action) -> Result<()> { match io_event { Action::NewBestHash(hash) => { @@ -123,21 +131,21 @@ impl Network { } TxStatus::Error { message } => { self.action_tx.send(Action::EventLog(format!("transaction {} error, something get wrong: {message}", ext_hash), ActionLevel::Error, log_target))?; - self.transactions_to_watch.remove(i); + self.remove_transaction_and_decrement_nonce(i); } TxStatus::Invalid { message } => { self.action_tx.send(Action::EventLog(format!("transaction {} invalid: {message}", ext_hash), ActionLevel::Error, log_target))?; - self.transactions_to_watch.remove(i); + self.remove_transaction_and_decrement_nonce(i); } TxStatus::Dropped { message } => { self.action_tx.send(Action::EventLog(format!("transaction {} was dropped: {message}", ext_hash), ActionLevel::Error, log_target))?; - self.transactions_to_watch.remove(i); + self.remove_transaction_and_decrement_nonce(i); } } }, _ => { self.action_tx.send(Action::EventLog(format!("transaction {} was dropped", ext_hash), ActionLevel::Error, log_target))?; - self.transactions_to_watch.remove(i); + self.remove_transaction_and_decrement_nonce(i); } } } @@ -212,6 +220,7 @@ impl Network { } } Action::TransferBalance(sender, receiver, amount) => { + let sender_cloned = sender.clone(); let maybe_nonce = self.senders.get_mut(&sender); let sender: [u8; 32] = hex::decode(sender) @@ -230,6 +239,7 @@ impl Network { ).await { self.transactions_to_watch.push(TxToWatch { tx_progress, + sender: sender_cloned, target: ActionTarget::WalletLog, }); }