Skip to content

chore: devnet base v1 support#1489

Draft
danyalprout wants to merge 9 commits intomainfrom
danyal/fusaka-support-5
Draft

chore: devnet base v1 support#1489
danyalprout wants to merge 9 commits intomainfrom
danyal/fusaka-support-5

Conversation

@danyalprout
Copy link
Collaborator

Description

  • Devnet Base V1 support
  • Log hardfork activations

* feat: add get_payload_v5 engine API method and BlobsBundleV2 re-export

* feat: add ExecutionPayloadEnvelopeV5 engine type and payload builder V5 conversion

* feat: add EngineGetPayloadVersion::V5 for Base V1, wire get_payload_v5 through consensus engine

* fix: add Vec import for no_std and fix import ordering

* fix: clarify EngineNewPayloadVersion V4 doc comment
@vercel
Copy link

vercel bot commented Mar 19, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
base Ignored Ignored Mar 19, 2026 6:30am

Request Review

Comment on lines +298 to +314
/// Logs hardfork activation when building the first block of a fork.
fn log_hardfork_activation(&self, timestamp: u64) {
if self.rollup_config.is_first_ecotone_block(timestamp) {
info!(target: "sequencer", "Sequencing ecotone upgrade block");
} else if self.rollup_config.is_first_fjord_block(timestamp) {
info!(target: "sequencer", "Sequencing fjord upgrade block");
} else if self.rollup_config.is_first_granite_block(timestamp) {
info!(target: "sequencer", "Sequencing granite upgrade block");
} else if self.rollup_config.is_first_holocene_block(timestamp) {
info!(target: "sequencer", "Sequencing holocene upgrade block");
} else if self.rollup_config.is_first_isthmus_block(timestamp) {
info!(target: "sequencer", "Sequencing isthmus upgrade block");
} else if self.rollup_config.is_first_jovian_block(timestamp) {
info!(target: "sequencer", "Sequencing jovian upgrade block");
} else if self.rollup_config.is_first_base_v1_block(timestamp) {
info!(target: "sequencer", "Sequencing base v1 upgrade block");
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should_use_tx_pool disables the tx pool for the first block of every fork from Ecotone through Jovian, but there's no corresponding check for is_first_base_v1_block. The logging was moved here, but the tx-pool-disable guard was not added for Base V1.

If the Base V1 activation block should be deposit-only (consistent with every other fork), should_use_tx_pool needs:

// Do not include transactions in the first Base V1 block.
if self.rollup_config.is_first_base_v1_block(attributes.payload_attributes.timestamp) {
    return false;
}

If this is intentionally different for Base V1, a comment in should_use_tx_pool explaining why would prevent future readers from assuming it's a bug.

if [ -f "$OUTPUT_DIR/genesis.json" ] && [ -f "$OUTPUT_DIR/rollup.json" ]; then
echo "=== L2 Genesis already exists, skipping generation ==="
exit 0
if [ -n "$L2_BASE_V1_BLOCK" ] && ! [[ "$L2_BASE_V1_BLOCK" =~ ^[0-9]+$ ]]; then
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The early-exit guard that skipped genesis regeneration when genesis.json and rollup.json already exist was removed:

# Skip if L2 genesis already exists (for restarts)
if [ -f "$OUTPUT_DIR/genesis.json" ] && [ -f "$OUTPUT_DIR/rollup.json" ]; then
  echo "=== L2 Genesis already exists, skipping generation ==="
  exit 0
fi

Without this, every container restart will re-run the full genesis generation including op-deployer apply --deployment-target live, which re-deploys contracts to L1. Was this removal intentional? If so, it may be worth adding a comment explaining why idempotency is no longer needed. If not, the guard should be restored (possibly moved below the L2_BASE_V1_BLOCK validation).

@github-actions
Copy link
Contributor

Review Summary

2 findings across the Rust sequencer code and devnet setup script.

1. Missing Base V1 tx pool guard (correctness)

log_hardfork_activation correctly includes Base V1, but should_use_tx_pool does not disable the tx pool for the first Base V1 block. Every other fork (Ecotone → Jovian) produces a deposit-only activation block. If Base V1 follows the same pattern, a is_first_base_v1_block check is missing in should_use_tx_pool. If this is intentionally different, a comment explaining the deviation would help.

File: crates/consensus/service/src/actors/sequencer/actor.rs

2. Removed genesis-exists guard (devnet reliability)

The early-exit check that skipped genesis regeneration on container restarts was removed. Without it, op-deployer apply --deployment-target live will re-deploy L1 contracts on every restart, which could fail or produce inconsistent state. If the removal is intentional, a comment explaining idempotency guarantees would be helpful.

File: etc/scripts/devnet/setup-l2.sh

@danyalprout danyalprout force-pushed the danyal/fusaka-support-4 branch 2 times, most recently from cc7439f to 6657f4e Compare March 19, 2026 17:23
Base automatically changed from danyal/fusaka-support-4 to main March 19, 2026 18:28
@cb-heimdall
Copy link
Collaborator

🟡 Heimdall Review Status

Requirement Status More Info
Reviews 🟡 0/1
Denominator calculation
Show calculation
1 if user is bot 0
1 if user is external 0
2 if repo is sensitive 0
From .codeflow.yml 1
Additional review requirements
Show calculation
Max 0
0
From CODEOWNERS 0
Global minimum 0
Max 1
1
1 if commit is unverified 0
Sum 1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants