| 479 | return Ok(status); |
| 480 | } |
| 481 | |
| 482 | // Block is valid - store both status and block data |
| 483 | let status = PayloadStatus::new(PayloadStatusEnum::Valid, Some(parent_hash)); |
| 484 | state.known_blocks.insert(block_hash, status.clone()); |
| 485 | state |
| 486 | .validated_blocks |
| 487 | .insert(block_hash, block.payload.clone()); |
| 488 | Ok(status) |
| 489 | } |
| 490 | |
| 491 | async fn commit_hash( |
| 492 | &mut self, |
| 493 | fork_choice_state: ForkchoiceState, |
| 494 | ) -> Result<ForkchoiceUpdated, summit_types::EngineClientError> { |
| 495 | let mut state = self.state.lock().unwrap(); |
| 496 | |
| 497 | if let Some(override_response) = state.commit_hash_overrides.pop_front() { |
| 498 | return Ok(override_response); |
| 499 | } |
| 500 | |
| 501 | // Update current head |
| 502 | state.current_head = fork_choice_state.head_block_hash; |
| 503 | |
| 504 | // First, try to find the block in our building payloads (blocks we built) |
| 505 | let matching_block = state |
| 506 | .building_payloads |
| 507 | .values() |
| 508 | .find(|envelope| { |
| 509 | envelope |
| 510 | .envelope_inner |
| 511 | .execution_payload |
| 512 | .payload_inner |
| 513 | .payload_inner |
| 514 | .block_hash |
| 515 | == fork_choice_state.head_block_hash |
| 516 | }) |
| 517 | .map(|envelope| envelope.envelope_inner.execution_payload.clone()); |
| 518 | |
| 519 | if let Some(block) = matching_block { |
| 520 | let block_number = block.payload_inner.payload_inner.block_number; |
| 521 | let block_hash = block.payload_inner.payload_inner.block_hash; |
| 522 | |
| 523 | // Add to canonical chain if it's the next expected block |
| 524 | if block_number == state.next_block_number { |
| 525 | state.canonical_blocks.insert(block_hash, block); |
| 526 | state.canonical_by_number.insert(block_number, block_hash); |
| 527 | state.next_block_number += 1; |
| 528 | } |
| 529 | } else { |
| 530 | // Block not in building_payloads - check if we validated it via check_payload |
| 531 | let validated_block = state |
| 532 | .validated_blocks |
| 533 | .get(&fork_choice_state.head_block_hash) |
| 534 | .cloned(); |
| 535 | |
| 536 | if let Some(block) = validated_block { |
| 537 | let block_number = block.payload_inner.payload_inner.block_number; |
| 538 | let block_hash = block.payload_inner.payload_inner.block_hash; |