diff --git a/crates/optimism/flashblocks/src/service.rs b/crates/optimism/flashblocks/src/service.rs index 2a9ef0db54b..36f8ed32a6c 100644 --- a/crates/optimism/flashblocks/src/service.rs +++ b/crates/optimism/flashblocks/src/service.rs @@ -37,6 +37,7 @@ pub struct FlashBlockService< rx: S, current: Option>, blocks: FlashBlockSequence, + rebuild: bool, evm_config: EvmConfig, provider: Provider, canon_receiver: CanonStateNotifications, @@ -71,6 +72,7 @@ where canon_receiver: provider.subscribe_to_canonical_state(), provider, cached_state: None, + rebuild: false, } } @@ -187,17 +189,13 @@ where fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { let this = self.get_mut(); - let mut new_flashblock = false; // consume new flashblocks while they're ready while let Poll::Ready(Some(result)) = this.rx.poll_next_unpin(cx) { match result { - Ok(flashblock) => { - if let Err(err) = this.blocks.insert(flashblock) { - debug!(%err, "Failed to prepare flashblock"); - } else { - new_flashblock = true; - } - } + Ok(flashblock) => match this.blocks.insert(flashblock) { + Ok(_) => this.rebuild = true, + Err(err) => debug!(%err, "Failed to prepare flashblock"), + }, Err(err) => return Poll::Ready(Some(Err(err))), } } @@ -216,9 +214,8 @@ where } } - if !new_flashblock && this.current.is_none() { - // no new flashbblocks received since, block is still unchanged - return Poll::Pending + if !this.rebuild && this.current.is_some() { + return Poll::Pending; } // try to build a block on top of latest @@ -226,6 +223,7 @@ where Ok(Some(new_pending)) => { // built a new pending block this.current = Some(new_pending.clone()); + this.rebuild = false; return Poll::Ready(Some(Ok(Some(new_pending)))); } Ok(None) => {