(
&self,
prev_pending_blocks: &Arc<PendingBlocks>,
flashblock: &Flashblock,
)
| 567 | ) |
| 568 | )] |
| 569 | fn build_pending_state_for_same_block( |
| 570 | &self, |
| 571 | prev_pending_blocks: &Arc<PendingBlocks>, |
| 572 | flashblock: &Flashblock, |
| 573 | ) -> Result<Option<Arc<PendingBlocks>>> { |
| 574 | let latest_block_base = prev_pending_blocks.latest_block_base().clone(); |
| 575 | let latest_block_l1_block_info = prev_pending_blocks.latest_block_l1_block_info().clone(); |
| 576 | let latest_flashblock_tx_start = prev_pending_blocks.pending_transaction_count(); |
| 577 | |
| 578 | let mut live_state = self.lock_live_state(); |
| 579 | let Some(LivePendingState { mut db, state_overrides }) = live_state.take() else { |
| 580 | warn!( |
| 581 | message = "live pending state unavailable, falling back to full rebuild", |
| 582 | block_number = flashblock.metadata.block_number, |
| 583 | flashblock_index = flashblock.index, |
| 584 | path = "same_block" |
| 585 | ); |
| 586 | let mut flashblocks = prev_pending_blocks.get_flashblocks(); |
| 587 | flashblocks.push(flashblock.clone()); |
| 588 | return self.build_pending_state(Some(Arc::clone(prev_pending_blocks)), &flashblocks); |
| 589 | }; |
| 590 | drop(live_state); |
| 591 | |
| 592 | let latest_header = prev_pending_blocks.latest_header(); |
| 593 | let mut latest_block_flashblocks = prev_pending_blocks.latest_block_flashblocks(); |
| 594 | latest_block_flashblocks.push(flashblock.clone()); |
| 595 | let latest_block_header = |
| 596 | BlockAssembler::refresh_same_block_header(&latest_header, &latest_block_flashblocks)?; |
| 597 | |
| 598 | db.block_hashes.insert(latest_block_base.block_number - 1, latest_block_base.parent_hash); |
| 599 | |
| 600 | let evm_config = BaseEvmConfig::base(self.client.chain_spec()); |
| 601 | let evm_env = evm_config |
| 602 | .evm_env(&latest_header) |
| 603 | .map_err(|e| ExecutionError::EvmEnv(e.to_string()))?; |
| 604 | let evm = evm_config.evm_with_env(db, evm_env); |
| 605 | |
| 606 | let previous_block_transaction_count = prev_pending_blocks.latest_block_transaction_count(); |
| 607 | let pending_block = Block { |
| 608 | header: Header { |
| 609 | parent_hash: latest_block_base.parent_hash, |
| 610 | number: latest_block_base.block_number, |
| 611 | timestamp: latest_block_base.timestamp, |
| 612 | gas_limit: latest_block_base.gas_limit, |
| 613 | base_fee_per_gas: Some(latest_block_base.base_fee_per_gas.saturating_to()), |
| 614 | ..Default::default() |
| 615 | }, |
| 616 | body: BlockBody { |
| 617 | transactions: flashblock |
| 618 | .diff |
| 619 | .transactions |
| 620 | .iter() |
| 621 | .map(|tx| { |
| 622 | base_common_consensus::decode_2718_canonical::<BaseTxEnvelope>(tx.as_ref()) |
| 623 | }) |
| 624 | .collect::<std::result::Result<_, _>>() |
| 625 | .map_err(|e| ExecutionError::BlockConversion(e.to_string()))?, |
| 626 | ..Default::default() |
no test coverage detected