diff --git a/crates/revm/src/context.rs b/crates/revm/src/context.rs index f3c776a01c..aa2ae4be9c 100644 --- a/crates/revm/src/context.rs +++ b/crates/revm/src/context.rs @@ -110,39 +110,37 @@ impl Host for Context { } fn block_hash(&mut self, number: U256) -> Option { - let block_number = self.env().block.number; - - match block_number.checked_sub(number) { - // blockhash should push zero if number is same as current block number. - Some(diff) if !diff.is_zero() => { - let diff = as_usize_saturated!(diff); - - if diff <= BLOCK_HASH_HISTORY { - return self - .evm - .block_hash(number) - .map_err(|e| self.evm.error = Err(e)) - .ok(); - } - - if self.evm.journaled_state.spec.is_enabled_in(PRAGUE) - && diff <= BLOCKHASH_SERVE_WINDOW - { - let index = number.wrapping_rem(U256::from(BLOCKHASH_SERVE_WINDOW)); - return self - .evm - .db - .storage(BLOCKHASH_STORAGE_ADDRESS, index) - .map_err(|e| self.evm.error = Err(EVMError::Database(e))) - .ok() - .map(|v| v.into()); - } - } - _ => { - // If blockhash is requested for the current block, the hash should be 0, so we fall - // through. - } + let block_number = as_usize_saturated!(self.env().block.number); + let requested_number = as_usize_saturated!(number); + + let Some(diff) = block_number.checked_sub(requested_number) else { + return Some(B256::ZERO); + }; + + // blockhash should push zero if number is same as current block number. + if diff == 0 { + return Some(B256::ZERO); + } + + if diff <= BLOCK_HASH_HISTORY { + return self + .evm + .block_hash(number) + .map_err(|e| self.evm.error = Err(e)) + .ok(); } + + if self.evm.journaled_state.spec.is_enabled_in(PRAGUE) && diff <= BLOCKHASH_SERVE_WINDOW { + let index = number.wrapping_rem(U256::from(BLOCKHASH_SERVE_WINDOW)); + return self + .evm + .db + .storage(BLOCKHASH_STORAGE_ADDRESS, index) + .map_err(|e| self.evm.error = Err(EVMError::Database(e))) + .ok() + .map(|v| v.into()); + } + Some(B256::ZERO) }