diff --git a/crates/provider/src/blocks.rs b/crates/provider/src/blocks.rs index 213edee2489..de01b50610c 100644 --- a/crates/provider/src/blocks.rs +++ b/crates/provider/src/blocks.rs @@ -193,30 +193,35 @@ impl NewBlocks { // Then try to fill as many blocks as possible. // TODO: Maybe use `join_all` - let mut retries = MAX_RETRIES; - for number in self.next_yield..=block_number { + 'fill: for number in self.next_yield..=block_number { debug!(number, "fetching block"); - let block = match client.request("eth_getBlockByNumber", (U64::from(number), false)).await { - Ok(Some(block)) => block, - Err(RpcError::Transport(err)) if retries > 0 && err.recoverable() => { - debug!(number, %err, "failed to fetch block, retrying"); - retries -= 1; - continue; - } - Ok(None) if retries > 0 => { - debug!(number, "failed to fetch block (doesn't exist), retrying"); - retries -= 1; - continue; - } - Err(err) => { - error!(number, %err, "failed to fetch block"); - break; - } - Ok(None) => { - error!(number, "failed to fetch block (doesn't exist)"); - break; + let mut retries = MAX_RETRIES; + let block = loop { + match client.request("eth_getBlockByNumber", (U64::from(number), false)).await { + Ok(Some(block)) => break Some(block), + Err(RpcError::Transport(err)) if retries > 0 && err.recoverable() => { + debug!(number, %err, "failed to fetch block, retrying"); + retries -= 1; + continue; + } + Ok(None) if retries > 0 => { + debug!(number, "failed to fetch block (doesn't exist), retrying"); + retries -= 1; + continue; + } + Err(err) => { + error!(number, %err, "failed to fetch block"); + break None; + } + Ok(None) => { + error!(number, "failed to fetch block (doesn't exist)"); + break None; + } } }; + let Some(block) = block else { + break 'fill; + }; self.known_blocks.put(number, block); if self.known_blocks.len() == BLOCK_CACHE_SIZE.get() { // Cache is full, should be consumed before filling more blocks.