mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 19:09:54 +00:00
fix: use pending state if available (#11391)
This commit is contained in:
@ -233,9 +233,8 @@ impl<N: ProviderNodeTypes> BlockchainProvider2<N> {
|
||||
/// This uses a given [`BlockState`] to initialize a state provider for that block.
|
||||
fn block_state_provider(
|
||||
&self,
|
||||
state: impl AsRef<BlockState>,
|
||||
state: &BlockState,
|
||||
) -> ProviderResult<MemoryOverlayStateProvider> {
|
||||
let state = state.as_ref();
|
||||
let anchor_hash = state.anchor().hash;
|
||||
let latest_historical = self.database.history_by_block_hash(anchor_hash)?;
|
||||
Ok(self.canonical_in_memory_state.state_provider_from_state(state, latest_historical))
|
||||
@ -1077,7 +1076,7 @@ impl<N: ProviderNodeTypes> StateProviderFactory for BlockchainProvider2<N> {
|
||||
// use latest state provider if the head state exists
|
||||
if let Some(state) = self.canonical_in_memory_state.head_state() {
|
||||
trace!(target: "providers::blockchain", "Using head state for latest state provider");
|
||||
Ok(self.block_state_provider(state)?.boxed())
|
||||
Ok(self.block_state_provider(&state)?.boxed())
|
||||
} else {
|
||||
trace!(target: "providers::blockchain", "Using database state for latest state provider");
|
||||
self.database.latest()
|
||||
@ -1103,7 +1102,7 @@ impl<N: ProviderNodeTypes> StateProviderFactory for BlockchainProvider2<N> {
|
||||
Ok(state)
|
||||
} else if let Some(state) = self.canonical_in_memory_state.state_by_hash(block_hash) {
|
||||
// ... or this could be tracked by the in memory state
|
||||
let state_provider = self.block_state_provider(state)?;
|
||||
let state_provider = self.block_state_provider(&state)?;
|
||||
Ok(Box::new(state_provider))
|
||||
} else {
|
||||
// if we couldn't find it anywhere, then we should return an error
|
||||
@ -1132,12 +1131,9 @@ impl<N: ProviderNodeTypes> StateProviderFactory for BlockchainProvider2<N> {
|
||||
fn pending(&self) -> ProviderResult<StateProviderBox> {
|
||||
trace!(target: "providers::blockchain", "Getting provider for pending state");
|
||||
|
||||
if let Some(block) = self.canonical_in_memory_state.pending_block_num_hash() {
|
||||
let historical = self.database.history_by_block_hash(block.hash)?;
|
||||
let pending_provider =
|
||||
self.canonical_in_memory_state.state_provider(block.hash, historical);
|
||||
|
||||
return Ok(Box::new(pending_provider));
|
||||
if let Some(pending) = self.canonical_in_memory_state.pending_state() {
|
||||
// we have a pending block
|
||||
return Ok(Box::new(self.block_state_provider(&pending)?));
|
||||
}
|
||||
|
||||
// fallback to latest state if the pending block is not available
|
||||
@ -1145,13 +1141,9 @@ impl<N: ProviderNodeTypes> StateProviderFactory for BlockchainProvider2<N> {
|
||||
}
|
||||
|
||||
fn pending_state_by_hash(&self, block_hash: B256) -> ProviderResult<Option<StateProviderBox>> {
|
||||
let historical = self.database.history_by_block_hash(block_hash)?;
|
||||
if let Some(block) = self.canonical_in_memory_state.pending_block_num_hash() {
|
||||
if block.hash == block_hash {
|
||||
let pending_provider =
|
||||
self.canonical_in_memory_state.state_provider(block_hash, historical);
|
||||
|
||||
return Ok(Some(Box::new(pending_provider)))
|
||||
if let Some(pending) = self.canonical_in_memory_state.pending_state() {
|
||||
if pending.hash() == block_hash {
|
||||
return Ok(Some(Box::new(self.block_state_provider(&pending)?)));
|
||||
}
|
||||
}
|
||||
Ok(None)
|
||||
|
||||
Reference in New Issue
Block a user