Skip to content

v0.10.0

Latest

Choose a tag to compare

@arnaubennassar arnaubennassar released this 21 Jul 13:59
6f102fc

🚀 What's New

  • Support for backward / forward LocalExitRoot (LER):

    • Backward / forward LocalExitRoot (LER) recovery tool (#1502, #1570): New CLI tool (tools/backward_forward_let) that allows operators to diagnose and recover from scenarios where the Agglayer or L1 state becomes inconsistent with the L2 Local Exit Root — either by rolling the LER back to a previous valid state (backward) or by advancing it to match the expected state (forward).
    • See the runbook for full operational guidance and e2e tests.
  • Support for remove GlobalExitRoot (GER):

    • Remove GlobalExitRoot (GER) recovery tool (#1496, #1563): New CLI tool (tools/remove_ger) to diagnose and recover from invalid GER injections on L2. The tool classifies affected claims into categories (A, B.1, B.2) and guides operators through interactive recovery steps: freeze bridge, remove the invalid GER, unset/re-set or force-emit claims, and restore the bridge. See the runbook for full operational guidance.
    • Improved GER scanning (#1563): New scan-invalid-claims subcommand that scans L2 claim logs, reconstructs the GER used by each claim, validates it against L1, and reports invalid GERs still tied to active claims. Supports both DetailedClaimEvent and legacy ClaimEvent logs.
  • Support Full-node RPC for L1 and L2:

    • BridgeSyncer + ClaimSyncer split (#1539, #1554): The bridge syncer has been split into two independent components — BridgeSyncer (deposits) and ClaimSyncer (claims). On first startup, existing claim data is automatically migrated to the new ClaimSyncer DB.
    • L2NetworkConfig with InitialLER override (#1558): New config section to optionally override the initial Local Exit Root instead of querying it from the RollupManager contract on L1.
    • See the runbook for full operational guidance
  • Fast synchronization for L1InfoTree and improvement reorg detections:

    • Multidownloader reorg detection + L1InfoTree integration (#1462): The L1 multidownloader now supports reorg detection and is enabled by default. It is now integrated with the L1 info tree synchronizer.
  • Treat already-monitored GER tx as expected (#1503): AggOracle no longer errors on GER transactions that are already being tracked, reducing spurious errors in steady state.

  • Unset claims max log range (#1520): Removed the upper bound on the log block range for claim fetching. Calls are now automatically chunked on RPC block-range errors.

  • Adjusted REST timeouts (#1557): ReadTimeout and WriteTimeout increased from 2s to 5m to handle slow clients reliably.

⚠️ Breaking Changes

There are no breaking changes. All configuration updates are backward compatible.

📋 Config Updates

📣 All configuration updates are backward compatible. Therefore, there is no need to update any config file

  • 🛠️ Config: Two new top-level sections are required: [ClaimL1Sync] and [ClaimL2Sync]. The [BridgeL1Sync] and [BridgeL2Sync] sections gain two new fields: SyncFromInBridges and EmbeddedClaimSync. See Configuration Updates below.
  • 🛠️ Config: L1Multidownloader.Enabled defaults to true (was false). Nodes not wanting to run it must explicitly set Enabled = false.
  • 🛠️ Config: defaultDBQueryTimeout increased from 60s to 5m, and REST timeouts from 2s to 5m.
  • 🛠️ Config: New optional MaxL2BlockRange config field in aggsender

New fields summary:

# New section
[L2NetworkConfig]
# InitialLER =   # optional override

[BridgeL1Sync]
# New fields in BridgeL1Sync / BridgeL2Sync
SyncFromInBridges = "auto"
EmbeddedClaimSync = "auto"

[ClaimL1Sync]
DBPath = "{{PathRWData}}/claiml1sync.sqlite"
DBQueryTimeout = "{{BridgeL1Sync.DBQueryTimeout}}"

BlockFinality = "{{BridgeL1Sync.BlockFinality}}"
InitialBlockNum = {{BridgeL1Sync.InitialBlockNum}}
AutoStart = "auto"

BridgeAddr = "{{BridgeL1Sync.BridgeAddr}}"
SyncBlockChunkSize = {{BridgeL1Sync.SyncBlockChunkSize}}
RetryAfterErrorPeriod = "{{BridgeL1Sync.RetryAfterErrorPeriod}}"
MaxRetryAttemptsAfterError = {{BridgeL1Sync.MaxRetryAttemptsAfterError}}
WaitForNewBlocksPeriod = "{{BridgeL1Sync.WaitForNewBlocksPeriod}}"
RequireStorageContentCompatibility = {{BridgeL1Sync.RequireStorageContentCompatibility}}

[BridgeL2Sync]
SyncFromInBridges = "auto"
EmbeddedClaimSync = "auto"

[ClaimL2Sync]
DBPath = "{{PathRWData}}/claiml2sync.sqlite"
DBQueryTimeout = "{{BridgeL2Sync.DBQueryTimeout}}"

BlockFinality = "{{BridgeL2Sync.BlockFinality}}"
InitialBlockNum = {{BridgeL2Sync.InitialBlockNum}}
AutoStart = "auto"

BridgeAddr = "{{BridgeL2Sync.BridgeAddr}}"
SyncBlockChunkSize = {{BridgeL2Sync.SyncBlockChunkSize}}
RetryAfterErrorPeriod = "{{BridgeL2Sync.RetryAfterErrorPeriod}}"
MaxRetryAttemptsAfterError = {{BridgeL2Sync.MaxRetryAttemptsAfterError}}
WaitForNewBlocksPeriod = "{{BridgeL2Sync.WaitForNewBlocksPeriod}}"
RequireStorageContentCompatibility = {{BridgeL2Sync.RequireStorageContentCompatibility}}

# L1Multidownloader now enabled by default + new fields
[L1Multidownloader]
Enabled = true
DeveloperMode = false
PeriodToCheckReorgs = "5s"

🐞 Bug Fixes

  • #1469 — Error when 2 GERs are injected in the same block due to missing block_pos discriminator in the imported_global_exit_root table.
  • #1471 — Config typo DelayBeetweenCertificates corrected to DelayBetweenCertificates in AggSender.TriggerASAP.
  • #1452 — BridgeSyncer migration conflicts between v0.8.1 and v0.9.0 caused by overlapping migration files.
  • #1511 — Validator metrics were not being registered on startup, causing missing observability data.
  • #1522 — Error backfilling claims when a single transaction contains multiple bridge events (addresses were read as strings instead of common.Address).
  • #1574 — ClaimSyncer determined a wrong starting block on fresh deployments; now resolved by looking up the earliest settled reference.
  • #1570 — Fixes to the backward/forward LET tool discovered during e2e testing.
  • #1475 — Go bumped to 1.23.7 to address a security vulnerability (GO-2026-4511).

✅ Testing & Validation

  • New e2e test setup (#1474) including fake GER generation (#1500) and Remove GER tool e2e tests (#1496).
  • Backward/forward LET test cases (#1502, #1570).

📦 Full Changelog

New Contributors

Full Changelog: v0.7.0...v0.10.0