Skip to content

Merge upstream base v1.2.0 into the Firehose fork#18

Open
maoueh wants to merge 386 commits into
release/1.xfrom
feature/update-with-sf-chain-updater-skill-base-to-v1-2-0
Open

Merge upstream base v1.2.0 into the Firehose fork#18
maoueh wants to merge 386 commits into
release/1.xfrom
feature/update-with-sf-chain-updater-skill-base-to-v1-2-0

Conversation

@maoueh

@maoueh maoueh commented Jul 22, 2026

Copy link
Copy Markdown

Bumps the Firehose fork from v1.1.1-fh-1 to upstream base v1.2.0.

No reth release needed

Upstream v1.2.0 keeps the exact same pins as v1.1.1paradigmxyz/reth v2.3.0, revm 40.0.3, revm-inspectors 0.40.1, alloy-evm 0.36.0 — so the existing streamingfast/reth v2.3.0-fh-5 patch stays API-compatible. cargo check of base-reth-node plus every Firehose crate against it is clean.

Note: streamingfast/reth has a newer v2.3.0-fh-6 tag. This PR deliberately stays on -fh-5 so the upstream bump is the only variable. Adopting -fh-6 is a separate decision.

Conflict resolution

The merge base predates the releases/v1.1.0 backports, so 43 files conflicted — most of them files the fork never touches, where both sides carry the same backport applied at a different offset. Classification rule: compare fork HEAD against v1.1.1; identical means the fork never touched it, so take v1.2.0 wholesale. That covered 37 files. The 6 fork-modified files were resolved by hand:

File Resolution
Cargo.toml version → 1.2.0; kept fork-only alloy-rpc-types-trace, reth-db-models, reth-tokio-util; took upstream's alloy-rpc-types-txpool, reth-eth-wire-types, SP1 6.2.16.3.0
Cargo.lock regenerated from v1.2.0 under our patches
crates/common/evm/src/evm.rs took upstream's oversized-precompile assertion, aligned the surrounding rstest cases
crates/execution/node/src/node.rs took upstream's BaseDiscoveryConfig::new(false)
crates/common/consensus/src/reth_compat.rs took upstream's new test module
.github/workflows/base-std-fork-tests.yml took upstream's additions

reth-eth-wire-types was added to the [patch."https://github.com/paradigmxyz/reth"] table. Upstream v1.2.0 began depending on it directly; without the patch entry cargo would resolve a second copy from paradigmxyz/reth alongside the Firehose fork's copy and the types would not unify. Verified: all 105 reth crates in Cargo.lock resolve to streamingfast/reth, zero to paradigmxyz/reth.

Duplicate-apply artifacts the merge introduced were found and removed — .github/workflows/base-anvil-package.yml and base-std-fork-tests.yml each ended up with a doubled Set up Python 3.13 step, and the latter with a doubled cargo update block. Both reset to v1.2.0, then the fork's intentional workflow_dispatch:-only trigger re-applied.

To confirm nothing else double-applied, the per-file diffstat of merged tree vs v1.2.0 was checked against the fork's own diffstat (v1.1.1 vs 840391d1a) — they match line for line across all 26 modified upstream files, with the single intended exception of Cargo.toml at 147 added lines instead of 146 (the new patch entry).

Other changes

  • crates/execution/runner/tests/firehose_live_tracing.rs — set the new BasePayloadAttributes::timestamp_millis_part field to None (upstream added it in 620d22816).
  • Regenerated the stale nop_transfer golden. It had not been refreshed since it was created against reth v1.11.4-fh, so it still recorded gas_limit: 30000000 for the EIP-4788 beacon-roots system call where the current tracer reports 31566720. Confirmed pre-existing by parking the merged tree in a git object, resetting the worktree to v1.1.1-fh-1, re-running the test (byte-identical failure) and restoring. No other field of the captured block changed.
  • Stopped tracking .dev/ and added it to .gitignore.

Verification

  • cargo check -p base-reth-node -p base-execution-firehose -p base-firehose-tests -p base-firehose-flashblocks — clean, no warnings.
  • cargo test across base-execution-firehose, base-firehose-tests, base-firehose-flashblocks, base-common-evm, base-common-consensus, base-node-core, base-node-runner, base-engine-tree260 passed, 0 failed.
  • Firehose wiring verified intact after the merge: the OpFirehoseEvmConfig wrapper in node.rs, the execute_and_trace_block hooks in engine-tree, the SignatureFields impl on BaseTxEnvelope, the flashblocks peek hooks, and the bin/node tracer bootstrap.
  • Not run: Battlefield and devnet validation.

Known gap

Upstream v1.2.0 lands EIP-8130 (account abstraction) with phased transaction execution — one transaction runs multiple call phases, each with its own status — plus a Cobalt irregular state transition that plants a 0xEF code stub on code-less senders.

This is not a problem today: EIP-8130 is gated behind the Cobalt upgrade, and cobalt_timestamp is None for mainnet, sepolia, devnet and zeronet. But the Firehose tracer does not model multiple root call frames per transaction, and the Cobalt state transition is not emitted as a system call. This must be addressed before Cobalt activates. Note the local Docker devnet does schedule Cobalt (L2_BASE_COBALT_BLOCK=22), so tracing a local devnet past block 22 will hit the unsupported path.

refcell and others added 30 commits June 11, 2026 13:33
Prevent worker session record retries from reopening or duplicating backend sessions that have already reached a terminal state. Lock matching session rows before writes and return a terminal-session outcome so retries remain idempotent.

Co-authored-by: Codex <codex-noreply@coinbase.com>
…pe bytes (base#3311)

* refactor(consensus): rename EIP-8130 owner to actor

Align the EIP-8130 consensus and txpool terminology with the updated
spec, which renames the account-abstraction "owner" primitive to "actor"
throughout. Pure rename with no behavioral change:

- InitialOwner -> InitialActor
- OwnerChange / OwnerChangeType -> ActorChange / ActorChangeType
- owner_id -> actor_id, initial_owners -> initial_actors,
  owner_changes -> actor_changes
- OWNER_CHANGE_AUTHORIZE/REVOKE -> ACTOR_CHANGE_AUTHORIZE/REVOKE
- MAX_OWNERS_PER_ENTRY -> MAX_ACTORS_PER_ENTRY
- validate_owner_iter -> validate_actor_iter

RLP encoding, op-byte values, and scope semantics are unchanged.

* chore(consensus): pin EIP-8130 tx type bytes and align authenticator terminology

Fold the remaining EIP-8130 realignment changes onto the owner->actor
rename so the spec-alignment lands as a single change:

- Pin the AA transaction type bytes to the EIP-8130 constant table:
  EIP8130_TX_TYPE 0x7D -> 0x7B and EIP8130_PAYER_TYPE 0xFA -> 0x7C.
  Updated atomically across every type-byte reference so the inner tx,
  envelope, receipt and RPC surfaces stay consistent:
  * Eip8130Constants (constants.rs), drop the stale "TBD" wording
  * EIP8130_TX_TYPE_ID (125 -> 123) and the RPC rejection message
  * BaseTxEnvelope / BasePooledTransaction `#[envelope(ty = 123)]`
  * BaseReceipt / receipt envelope serde rename "0x7d" -> "0x7b"
  * rpc-types and rpc error doc/test expectations
- Rename the EIP-8130 authenticator terminology to match the spec
  ("verifier" -> "authenticator"): ECRECOVER_AUTHENTICATOR,
  REVOKED_AUTHENTICATOR, AccountChange/ConfigChange `authenticator`
  field, validator helpers and docs. Scoped to the EIP-8130 types only;
  the unrelated consensus/TEE "verifier" components are untouched.
- Fix the import ordering left unsorted by the owner->actor rename.

RLP encoding remains positional; the field rename is non-behavioral.
The type-byte pin changes the wire/serde type tag to the final values.

Test plan:
- cargo test -p base-common-consensus --lib (81 passed)
- cargo test -p base-execution-txpool --lib (79 passed)

* chore(consensus): complete owner->actor rename in envelope.rs

Three "configured-owner" references in transaction/envelope.rs were left
unchanged by the owner->actor rename: the debug_assert wrap-guard message,
the k256-gated recovery test name, and a path comment. Rename them to
"configured-actor" for terminology consistency. No behavioral change.
…nd Mainnet (base#3450)

* fix(chains): update B20 activation admin addresses for Base Sepolia and Mainnet

Replaces the old admin addresses with the newly provisioned coreKMS keys
for activation testing and smoke tests on Base Sepolia and Base Mainnet.

Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(chainspec): update activation_admin_matches_chain_config test addresses

Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
base#3170)

Reject EIP-8130 (account abstraction, type 0x7D) transactions before the
Cobalt upgrade is active, both at mempool admission and at block inclusion:

- txpool validator rejects EIP-8130 transactions with `TxTypeNotSupported`
  unless `is_cobalt_active_at_timestamp(head_timestamp)`, closing the devp2p
  admission path (RPC ingress already rejects unconditionally).
- batch derivation (single + span) drops batches containing an EIP-8130
  transaction before Cobalt, mirroring the existing `Eip7702PreIsthmus`
  gate via a new `BatchDropReason::Eip8130PreCobalt`.

Adds a `cobalt_activated()` chain-spec builder helper to exercise the
post-Cobalt side of the gate in tests.
* feat(basectl): add destructive p2p peer commands

* fix(basectl): support CL multiaddr add-peer targets

* warn on ignored p2p RPC overrides

* model p2p action output by layer

* document libp2p id len check
…ase#3468)

* fix(precompiles): return halt instead of Fatal for oversized crypto precompile inputs

Size guards for BN254 pairing (Granite/Jovian) and BLS12-381 G1MSM, G2MSM,
and pairing (Isthmus/Jovian) were returning PrecompileError::Fatal, which
revm treats as unrecoverable and aborts the whole EVM transaction. An
oversized input should only fail the CALL, not the transaction. Switch all
8 sites to return Ok(PrecompileOutput::halt(...)) with the appropriate typed
PrecompileHalt variant so only the subcall fails.

* test(precompiles): align provider oversized-input assertions

Amp-Thread-ID: https://ampcode.com/threads/T-019ead38-ae00-727a-80ea-1e2a61ca6861
Co-authored-by: Amp <amp@ampcode.com>

* test(evm): expect halts for oversized precompile inputs

Amp-Thread-ID: https://ampcode.com/threads/T-019ead38-ae00-727a-80ea-1e2a61ca6861
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Eric Shenghsiung Liu <ericliu121187@gmail.com>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: Codex <codex-noreply@coinbase.com>
* chore: update reth to v2.3.0

Align the workspace with the reth v2.3.0 release and migrate the related alloy and revm API changes.

Also fix the follow-up clippy and test breakages surfaced by the requested Justfile validation targets.

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* Fix reth 2.3 CI fallout

Persist test-harness canonical blocks immediately so follow-up payloads can resolve parent headers under reth 2.3.0, and update Jovian fixture headers plus deny skips for the new dependency graph.

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* Drop dead BAL post-execution check

Reth 2.3.0 added a BAL hash argument to post-execution consensus validation for Amsterdam-capable Ethereum paths. Base does not have an execution-derived BAL hash to compare, so stop threading the header value through and remove the tautological check.

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* Keep BAL hash at the trait boundary only

Accept the reth 2.3.0 BAL hash argument in the Base consensus trait impl, but stop threading it through Base-only helpers and tests where it is unused.

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* Fix rustfmt fallout in engine-tree validator

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* Use branch-based base-anvil workflow checkouts

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* Fix Jovian blob gas mismatch test fixture

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* ci: use default base-anvil branch

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* test(runner): avoid finalizing harness blocks

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* test(runner): trim harness persistence workaround

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* docs(execution): clarify reth 2.3 migration notes

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* fix(consensus): drop post-exec requests hash check

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* refactor(reth): trim non-essential migration behavior

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* ci: revert workflow-only reth migration changes

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* refactor(engine-tree): inline overlay builder construction

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

* ci: bump base-anvil workflow pin

Amp-Thread-ID: https://ampcode.com/threads/T-019eb1f4-e95e-7346-b575-6af1be02f038
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>
Adds worker-facing RPC, client, and server support for recording and fetching backend proof sessions, so ZK workers can persist backend session IDs and resume in-flight work while preserving worker lock ownership checks.

Co-authored-by: Codex <codex-noreply@coinbase.com>
Co-authored-by: Codex <codex-noreply@coinbase.com>
Apply Base-specific execution peer defaults in the execution CLI runtime config so EL nodes default to 80 inbound peers and 80 outbound peers when operators do not pass explicit overrides.

Add regression tests to verify the new defaults and preserve explicit CLI values.

Amp-Thread-ID: https://ampcode.com/threads/T-019eb8fc-371b-71ab-901d-499925b7f017

Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: Codex <codex-noreply@coinbase.com>
* refactor(proof): remove optimism rpc re-export indirection

Co-authored-by: Codex <codex-noreply@coinbase.com>

* fix(system-tests): import optimism rpc directly

Co-authored-by: Codex <codex-noreply@coinbase.com>

---------

Co-authored-by: Codex <codex-noreply@coinbase.com>
* feat(prover): add zk host binary skeleton

Co-authored-by: Codex <codex-noreply@coinbase.com>

* chore(prover): remove unused zk host tokio dependency

Co-authored-by: Codex <codex-noreply@coinbase.com>

---------

Co-authored-by: Codex <codex-noreply@coinbase.com>
* refactor(proof): add shared worker claim primitives

Co-authored-by: Codex <codex-noreply@coinbase.com>

* refactor(proof): add shared worker heartbeat

Co-authored-by: Codex <codex-noreply@coinbase.com>

---------

Co-authored-by: Codex <codex-noreply@coinbase.com>
* refactor(proof): add shared worker claim primitives

Co-authored-by: Codex <codex-noreply@coinbase.com>

* refactor(proof): add shared worker heartbeat

Co-authored-by: Codex <codex-noreply@coinbase.com>

* refactor(proof): add shared worker job discovery

Co-authored-by: Codex <codex-noreply@coinbase.com>

---------

Co-authored-by: Codex <codex-noreply@coinbase.com>
* feat(proposer): add collector orchestration

* review: guard collector zero block interval

* review: handle collector retry build failures

* review: restart collector on retry exhaustion

* review: restart collector on discard exhaustion

* review: propagate collector retry exhaustion

* review: preserve collector retry attempt accounting

* review: restart collector on root retry build failure

* review: restart collector on replacement dispatch failure

* review: preserve discard retry sessions on dispatch failure

* review: restart collector on discard retry build failure

* review: restart collector on discard retry dispatch failure

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* review: use recovered state after collector submit

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* review: clean up discard retry session state

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

---------

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>
…with_account_info (base#3386)

* fix(precompile-storage): hydrate bytecode in with_account_info (BOP-343)

with_account_info called load_account which populates code_hash lazily
but never fetches the actual bytecode from the database, so info.code was
always None in the callback even for accounts with real bytecode.

Switch to load_account_code which calls load_code on the journaled account
before returning, ensuring info.code is fully hydrated. This matches the
upstream tempo implementation and fixes the latent bug that any future
caller reading info.code would silently observe empty bytecode.

Adds a regression test using CacheDB to verify the code field is present
after the call.

* ci: retrigger after sccache rate-limit failure

* fix(precompile-storage): remove redundant clone in test

* revert(precompile-storage): revert load_account_code back to load_account

Callers of with_account_info only read is_empty_code_hash(), which
inspects the code_hash field (always eagerly populated by load_account).
No caller reads info.code, so load_account_code is unnecessary overhead
that fetches bytecode from the database for no benefit. Per refcell's
review comment: drop the hydration.

* docs(precompile-storage): tighten with_account_info comment precision

code_hash not info.code is what every caller needs. Saying
is_empty_code_hash() was slightly imprecise since is_b20_initialized
accesses code_hash directly.
* feat(txpool): add eip8130 2d nonce sidecar

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* chore(txpool): satisfy clippy in 2d nonce pool

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* fix(txpool): address PR review feedback

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* fix(txpool): tighten sidecar review follow-ups

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* fix(txpool): harden sidecar invalidation paths

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* chore(txpool): address small review follow-ups

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* fix(txpool): tighten sidecar ordering and promotions

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* fix(txpool): remove eip8130 downcast path

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* fix(txpool): address latest review nits

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* test(txpool): cover sidecar subscription delivery

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* fix(txpool): address remaining review nits

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* fix(txpool): harden sidecar removal and live views

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* perf(txpool): tighten sidecar pool access

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* fix(txpool): keep sender nonce APIs protocol-only

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* perf(txpool): bound pending transaction lookups

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* fix(txpool): preserve sidecar index invariants

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* refactor(txpool): drop dead mined promotion path

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* fix(txpool): skip nonce checks for nonce-free eip8130

Amp-Thread-ID: https://ampcode.com/threads/T-019e6f1e-1cd0-77d9-b249-dd18f8516cb4
Co-authored-by: Amp <amp@ampcode.com>

* fix(workspace): restore reth-eth-wire-types

Amp-Thread-ID: https://ampcode.com/threads/T-019ebc5d-b92a-719d-acdb-4b78f5a1a7e8
Co-authored-by: Amp <amp@ampcode.com>

* fix(txpool): adapt wrapper to reth 2.3.0 APIs

Amp-Thread-ID: https://ampcode.com/threads/T-019ebc5d-b92a-719d-acdb-4b78f5a1a7e8
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>
* feat(proposer): wire proving pipeline orchestration

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* review: prioritize task exits in pipeline sessions

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* review: honor submit timeout configuration

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

---------

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>
Co-authored-by: Codex <codex-noreply@coinbase.com>
* feat(proposer): wire proving pipeline orchestration

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* review: prioritize task exits in pipeline sessions

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* review: honor submit timeout configuration

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* refactor(proposer): extract recovery orchestration

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* review: share proposal interval calculation

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

---------

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>
* refactor(registrar): simplify registration manager dedupe

Co-authored-by: Codex <codex-noreply@coinbase.com>

* docs(registrar): update proof task dedupe comment

Co-authored-by: Codex <codex-noreply@coinbase.com>

---------

Co-authored-by: Codex <codex-noreply@coinbase.com>
chunter-cb and others added 30 commits July 8, 2026 19:33
…#3887)

Update the EIP-8130 account-abstraction transaction type byte from 0x7B
(123) to 0x79 (121) and the payer signature magic prefix byte from 0x7C
to 0x7A, aligning with the revised EIP-8130 constant-table values. Covers
the canonical constants, envelope/pooled type derives, receipt serde
tags, and all doc/test references.
* fix(nitro-host): decouple proof generation heartbeats

Co-authored-by: Codex <codex-noreply@coinbase.com>

* add heartbeat thread

* address review comments

* address review comments

* address review comments

* address review comments

* address review comments

* address review comments

* address review comments

* address review comments

* address review comments

* address review comments

* address review comments

* address review comments

---------

Co-authored-by: Codex <codex-noreply@coinbase.com>
…oy (base#3889)

* feat(eip8130): repin system-contract addresses to latest Sepolia deploy

Update the enshrined EIP-8130 contract addresses and their init-code
hashes to the latest Base Sepolia deployment following the account
hierarchy restructure. Adds the newly deployed UpgradeableAccount
implementation (and extends the CREATE2 drift guard to cover it).
DefaultAccount remains the code-less-EOA auto-delegation target at its
new address.

* feat(eip8130): drop UpgradeableAccount from enshrined contracts

UpgradeableAccount is an external-only implementation the node does not
need to be aware of, so remove its address/init-code constant and the
corresponding CREATE2 drift-guard case.
* Improve snapshotter progress and upload resiliency

Reuse previous manifest metadata for finalized chunk hashes to avoid long serial pre-passes, add component-level compression progress logging, and improve upload observability with active-operation stall warnings and richer structured retry logs. Keep large multipart uploads retrying on transient S3 or Cloudflare failures without imposing aggressive client-side timeouts.

* Add upload-only mode for existing snapshot runs

Allow the snapshotter CLI to upload a prebuilt run-<timestamp> directory from the configured output dir without stopping the EL or regenerating artifacts. Reuse the normal upload path, validate the existing run directory, and cover the container-lifecycle bypass with an orchestrator test.

* Add live snapshotter progress tables

* Clean up snapshotter review follow-ups

* Fix snapshotter clippy warnings

* Address snapshotter API and progress review comments
* feat(registrar): add Boundless progress metrics

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* chore: format zepter features

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* fix(registrar): avoid ambiguous proof failure metrics

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* fix(registrar): skip pre-start cancel durations

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* fix(registrar): avoid blocked recovery double count

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* fix(registrar): satisfy metrics doc clippy

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

---------

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>
* feat(protocol): add BaseTime metadata deposit plumbing

* style: format BaseTime metadata deposit plumbing

* refactor: trim BaseTime plumbing helpers

* refactor: split BaseTime foundation from follow-up plumbing

* refactor(protocol): share Regolith deposit gas limit

* feat(protocol): align BaseTime deposit inputs with L1 info

* docs(protocol): clarify BaseTime deposit gating

* refactor(protocol): remove dead BaseTime regolith branch

* refactor(protocol): localize regolith gas constant

* docs(protocol): clarify BaseTime invariants

* fix(protocol): use Regolith deposit settings for BaseTime

* refactor(protocol): inline BaseTime deposit gas

* refactor(protocol): share Regolith deposit gas constant

* fix(protocol): enforce BaseTime millis invariant

* fix(protocol): resolve clippy doc warnings

* fix format

* update based on comments
* plumb basetime millis through payload attributes

* better code position

* improve

* update

* test to ensure parity without ms timestamp

* fix nostd

* add gate for timestamp millis

* fix format

* fix CI

* fix ci

* fix ci

* fix ci

* fix ci

* fix ci
* fix(ci): harden SP1 setup download

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* fix(ci): pin SP1 installer ref

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

---------

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>
* feat(prover-service): tag heartbeat metrics by worker

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

* chore(prover-service): debug log worker heartbeats (base#3873)

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>

---------

Co-authored-by: OpenCode <opencode-noreply@coinbase.com>
…#3863)

Drive proving as a linear sequence of stages: every request proves a range
(STARK) proof, and Groth16 requests then aggregate it into a SNARK via the new
ZkProver::submit_next. Each stage is driven to completion by drive_stage, which
resumes any session recorded on a previous run and reuses an already-completed
stage without re-polling a possibly-purged backend session.

The ZkProver trait gains submit_next (defaulting to Unimplemented) and a
session_type argument on download, so a backend returns the ProofResult variant
matching the stage. poll is left unchanged, since session status never depends
on the stage.

Co-authored-by: Cursor <cursoragent@cursor.com>
* add init_snapshots for download urls

* update URL to actually deployed demo version
…n_finalized (base#3883)

* refactor(proof): always propose against finalized head, drop allow_non_finalized

* test(proof): simplify dispatcher test helper to finalized-only heads

* fix(proof): bound proposer recovery walk by finalized head
…on base (base#3897)

* refactor(zk-host): narrow ZkProver::submit to the range request

Every proving job's first stage is a compressed range proof, so submit
only ever receives a Compressed request. Narrow the trait method to take
&ZkProofRequest directly instead of the broader ZkProofRequestKind enum.

This drops the SnarkGroth16 rejection branches in the cluster, network,
and dry-run backends and lets the host caller pass the range request
without re-wrapping it into a Compressed variant.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(zk-backend): add shared groth16 aggregation witness helper

Add OpSuccinctWitnessProvider::generate_aggregation_witness so the cluster
and network backends can build aggregation stdin from a completed
compressed range proof without duplicating the logic. Placing it in this
base lets the per-backend aggregation PRs (cluster, network) stack on top
independently rather than one depending on the other.

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor(zk-backend): address review nits on aggregation base

- Extract BootInfoStruct via SP1's public_values.read() instead of a manual
  bincode legacy decode, matching the existing aggregation code and staying
  resilient to SDK serialization changes.
- Import ZkProofRequest in the backend modules instead of referencing it by
  fully-qualified path, for consistency with the other imports.
- Fix generate_aggregation_witness doc to say a single range proof.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
…on (base#3892)

* feat(eip8130-rpc): accept senderActorId hint for estimateGas simulation

Estimation never recovers a signature, so simulate published the account's
self-actor to TxContext — policy-gated session-key calls then looked up the
wrong policy and reverted. Accept an optional senderActorId on the estimate
request (orthogonal to the existing senderAuth shape hint), thread it onto
simulation parts, and resolve that actor's policy after applying
accountChanges so same-tx authorizations are visible.

* fix(eip8130): address review nits on senderActorId estimate hint

Trim the verbose simulate_resolve docs, correct the revocation comment
(get_policy does treat a revoked default-EOA self as ungated), and add a
simulate test that proves the hint changes policy resolution after
accountChanges apply.

* fix(eip8130-rpc): exclude senderActorId from EIP-8130 detection gate

senderActorId is simulation-only metadata about an 8130 request, not a
defining field — a lone hint must not route onto the AA path.
* test(consensus): cover startup with pruned reth history

Add a base-system-tests regression case for validator startup when reth returns 4444 pruned history unavailable while hydrating the finalized block during the initial engine reset.

Co-authored-by: Codex <codex-noreply@coinbase.com>

* test(consensus): address pruned history review comments

Remove the imported EngineRequestReceiver name from the system test and call the trait explicitly at the processor start site. Rename the mock get_l2_block request kind binding now that the full-block branch reads it.

Co-authored-by: Codex <codex-noreply@coinbase.com>

* refactor(engine): unify mock L2 block errors by BlockId

Drop the duplicate full-block-only error path and make MockL2BlockError
per-block so forkchoice unit tests and the pruned-history system test
share one API.

Co-authored-by: Cursor <cursoragent@cursor.com>

* chore: address comments

---------

Co-authored-by: Codex <codex-noreply@coinbase.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat: add zombie pseudo fork

* just fix

* fix: reject Zombie at runtime-override write side

Enforce the 'Zombie is never stored as active' invariant at the source
by dropping Zombie writes in UpgradeActivationOverrides::set_activation,
which also covers the RuntimeUpgradeRegistry paths. Previously the raw
override map would store a dead Zombie->Timestamp entry that consumers
had to keep short-circuiting.

* docs: clarify Zombie is intentionally not resolvable in from_contract_fork_name

contract_id emits "zombie" but the reverse lookup deliberately drops it
so the L1 upgrade signal can never address the permanently-off gate.

* update based on comments
Add two-stage (STARK range -> SNARK aggregation) dry-run support, trim
docs/tests to essentials, and re-parent onto the narrowed submit base.

Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(zk-backend): cluster groth16 aggregation

Add two-stage (STARK range -> SNARK aggregation) support to the SP1
cluster backend, wiring aggregation cycle/gas limits through the CLI.
Re-parent onto the narrowed submit base, use the short ZkProofRequest
import, trim doc comments, and make download's SessionType dispatch an
exhaustive match.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(zk-backend): log aggregation witness prep duration

Track and log witness_gen_duration_ms across the aggregation download +
witness generation, matching the range-proof path for operational
latency visibility.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Add two-stage (STARK range -> SNARK aggregation) support to the SP1
network backend, wiring aggregation cycle/gas limits through the CLI.
Re-parent onto the narrowed submit base, use the short ZkProofRequest
import, and make download's SessionType dispatch an exhaustive match.

Co-authored-by: Cursor <cursoragent@cursor.com>
* refactor(proof): extract anchor updater

Co-authored-by: Codex <codex-noreply@coinbase.com>

* address review comments

* address review comments

* address review comments

---------

Co-authored-by: Codex <codex-noreply@coinbase.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…se#3944 to releases/v1.2.0] (base#3984)

* fix(trie): initialize proofs from storage-v2 trie tables

Select the matching Reth trie codecs during bootstrap so fresh proofs stores retain canonical paths and can resume safely.

* fix(trie): avoid copies in proofs initialization

---------

Co-authored-by: Niran Babalola <niran.babalola@coinbase.com>
* fix(reth-cli): update snapshot API URL

* fix(reth-cli): update snapshot download URLs
…base#4043)

* fix(consensus): wait for peer connection state

Keep peer RPC callers blocked until libp2p state reflects the requested transition, preventing registry retries from flooding pending outbound dials.

Co-authored-by: Niran Babalola <niran.babalola@coinbase.com>

* fix(consensus): filter non-retryable peer state errors

Retry only peer-state polling failures so disconnected RPC channels fail fast.

Co-authored-by: Niran Babalola <niran.babalola@coinbase.com>

* refactor(consensus): clarify peer state wait helpers

Own the peer-map check in named helpers and document why InvalidParams is the retryable signal.

Co-authored-by: Niran Babalola <niran.babalola@coinbase.com>

---------

Co-authored-by: Niran Babalola <niran.babalola@coinbase.com>
Bump the Firehose fork to upstream base v1.2.0.

No reth release is required: upstream v1.2.0 keeps the same pins as v1.1.1
(paradigmxyz/reth v2.3.0, revm 40.0.3, alloy-evm 0.36.0), so the existing
streamingfast/reth v2.3.0-fh-5 patch stays API-compatible.

Conflict resolution
-------------------
The merge base predates the releases/v1.1.0 backports, so 43 files conflicted —
most of them files the fork never touched, where both sides carry the same
backport applied at different offsets. Those 37 files were taken wholesale from
v1.2.0. The 6 fork-modified files were resolved by hand:

* Cargo.toml — workspace version to 1.2.0; kept the fork-only alloy-rpc-types-trace,
  reth-db-models and reth-tokio-util deps; took upstream's alloy-rpc-types-txpool,
  reth-eth-wire-types and the SP1 6.2.1 -> 6.3.0 bump. Added reth-eth-wire-types to
  the paradigmxyz/reth patch table so it resolves through the Firehose fork rather
  than pulling a second copy.
* Cargo.lock — regenerated from v1.2.0 under our patches; all 105 reth crates
  resolve to streamingfast/reth, none to paradigmxyz/reth.
* crates/common/evm/src/evm.rs — took upstream's oversized-precompile assertion and
  aligned the surrounding rstest cases with it. The file's only remaining delta is
  the Firehose one: routing system calls through InspectSystemCallEvm when inspect
  is set.
* crates/execution/node/src/node.rs — took upstream's BaseDiscoveryConfig::new(false)
  after the base-discovery flag removal.
* crates/common/consensus/src/reth_compat.rs and
  .github/workflows/base-std-fork-tests.yml — took upstream's additions.

Duplicate-apply artifacts introduced by the merge were found and removed from
.github/workflows/base-anvil-package.yml and base-std-fork-tests.yml (a doubled
Python setup step and a doubled cargo update block). Both were reset to v1.2.0,
then the fork's intentional workflow_dispatch-only trigger was re-applied.

Other changes
-------------
* crates/execution/runner/tests/firehose_live_tracing.rs — set the new
  BasePayloadAttributes::timestamp_millis_part field to None.
* Regenerated the stale base-firehose-tests nop_transfer golden. It had not been
  refreshed since it was created against reth v1.11.4-fh and still recorded
  gas_limit 30000000 for the EIP-4788 beacon-roots system call, where the current
  tracer reports 31566720. Confirmed pre-existing by re-running the test on the
  pre-merge tree; no other field of the captured block changed.
* Stopped tracking .dev/ and added it to .gitignore.

Verification
------------
* cargo check of base-reth-node and all Firehose crates: clean.
* cargo test across base-execution-firehose, base-firehose-tests,
  base-firehose-flashblocks, base-common-evm, base-common-consensus, base-node-core,
  base-node-runner and base-engine-tree: 260 passed, 0 failed.
* Battlefield and devnet validation not run.

Known gap: upstream v1.2.0 lands EIP-8130 phased transaction execution. It is gated
behind the Cobalt upgrade, which is unscheduled on all real networks, but the
Firehose tracer does not yet model multiple root call frames per transaction.
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.