From 193f7c590f74275802ccacd43d2b82762a1fea85 Mon Sep 17 00:00:00 2001 From: Emmanuel Ikwuoma Date: Fri, 23 Jan 2026 06:33:13 +0100 Subject: [PATCH] fix mempool engine to correctly handle UserOpIncluded events --- .../src/services/mempool_engine.rs | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/crates/account-abstraction-core/src/services/mempool_engine.rs b/crates/account-abstraction-core/src/services/mempool_engine.rs index a4a8f665..6dc86061 100644 --- a/crates/account-abstraction-core/src/services/mempool_engine.rs +++ b/crates/account-abstraction-core/src/services/mempool_engine.rs @@ -44,7 +44,7 @@ impl MempoolEngine { self.mempool.write().await.add_operation(&user_op)?; } MempoolEvent::UserOpIncluded { user_op } => { - self.mempool.write().await.remove_operation(&user_op.hash)?; + self.mempool.write().await.add_operation(&user_op)?; } MempoolEvent::UserOpDropped { user_op, reason: _ } => { self.mempool.write().await.remove_operation(&user_op.hash)?; @@ -156,4 +156,28 @@ mod tests { let items: Vec<_> = mempool.read().await.get_top_operations(10).collect(); assert_eq!(items.len(), 0); } + + #[tokio::test] + async fn already_included_operation_should_be_noop() { + let mempool = Arc::new(RwLock::new(InMemoryMempool::new(PoolConfig::default()))); + let op_hash = [1u8; 32]; + let wrapped = make_wrapped_op(1_000, op_hash); + let add_event = MempoolEvent::UserOpAdded { + user_op: wrapped.clone(), + }; + let include_event = MempoolEvent::UserOpIncluded { + user_op: wrapped.clone(), + }; + let mock_source = Arc::new(MockEventSource::new(vec![add_event, include_event])); + + let engine = MempoolEngine::new(mempool.clone(), mock_source); + engine.process_next().await.unwrap(); + let items: Vec<_> = mempool.read().await.get_top_operations(10).collect(); + assert_eq!(items.len(), 1); + assert_eq!(items[0].hash, FixedBytes::from(op_hash)); + let result = engine.process_next().await; + assert!(result.is_ok()); + let items: Vec<_> = mempool.read().await.get_top_operations(10).collect(); + assert_eq!(items.len(), 1); + } }