Skip to content

Merge upstream Base v1.5.0 - #34

Merged
sduchesneau merged 300 commits into
release/1.xfrom
bump/v1.5.0
Oct 16, 2026
Merged

sduchesneau merged 300 commits into
release/1.xfrom
bump/v1.5.0

Conversation

@sduchesneau

Copy link
Copy Markdown

Merges upstream Base v1.5.0 and moves reth to streamingfast/reth base-v2.5.2.8-fh3.1 (streamingfast/reth#72). Base Sepolia nodes must run this release before the Denim hardfork on 2026-10-21 18:00 UTC.

Firehose impact

  • Denim produces a block every 200 ms, so up to 5 consecutive blocks share the same header timestamp, and every block gets a BaseTime deposit at transaction index 1.
  • Denim activation block: the node installs the BaseTime predeploy straight into the state DB before the first transaction, so the tracer did not see it. BasePreExecutionWrites lists the locations Base writes this way (Canyon create2deployer, Denim BaseTime, Everest nonce manager). reth-firehose emits them: code as block-level code changes, storage in a system call to the written account.
  • Everest now gates EIP-8130 transactions (type 0x79), and an L1 signal can schedule it without a release. Firehose cannot represent them yet; the node stops on the first one with an error naming the transaction. No network has scheduled Everest. See ACTIVATIONS.md.

Changes

  • Upstream removed the runner's BaseAddOns (it now uses base-node-core's). The engine-event hook the fork had added there is gone; FirehoseFlashblocksExtension subscribes to add_ons_handle.engine_events from its node-started hook instead.
  • crates/execution/payload/src/builder.rs, crates/execution/node/src/node.rs, crates/builder/multiplex/src/service_builder.rs: fork hunks re-applied on upstream's new versions (upstream dropped the payload builder's Txs parameter). The built-block trace stays gated on no_tx_pool.
  • reth-errors added to the base/reth patch list; firehose-prestate sets the new everest upgrade field.
  • Conflicted files the fork never changed were set to their exact v1.5.0 content.

Testing

  • cargo check --workspace --all-targets passes.
  • reth-firehose / reth-firehose-tests, base-execution-firehose, base-firehose-tests, base-firehose-flashblocks, base-firehose-prestate and base-node-runner live tracing pass.
  • Docker-backed firehose_b20, firehose_cobalt_b20 and the new firehose_denim pass. firehose_denim fails without BasePreExecutionWrites.
  • Battlefield op-reth-devnet with base-reth-node: 79 passing, 0 failing, 15 pending. compare-blocks-rpc over blocks 1–685 is identical.

Release

Changelog section is v1.5.0-fh3.1.

BrianBland and others added 30 commits September 17, 2026 21:49
Co-authored-by: Toshi <toshi-noreply@coinbase.com>
* chore(consensus): remove legacy sync request shim

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

* test(gossip): drop redundant V4 shim removal coverage

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

---------

Co-authored-by: Codex <codex-noreply@coinbase.com>
* fix(rpc): include EIP-8130 transaction hash

* style(rpc): apply nightly rustfmt grouping
…5131)

* feat(bench): support auto-deployed swap harness workload

* style(bench): format swap harness tests

* fix(bench): make harness deploy async and harden log parsing
…ase#4600)

* feat(txpool): accept MeterBundleResponse on builder insert wire

Carry metering as a first-class field on ValidatedTransaction so u128
timing survives JSON (flatten cannot). Builders apply it on insert;
forwarder copies it from the pooled tx. Absent when None.

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

* feat(builder): write insert metering into the builder cache

base_insertValidatedTransaction is the write path now that
base_setMeteringInformation is going away. On inbound metering, clone
into MeteringProvider so payload selection can keep using get(tx_hash).

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

* fix(txpool): clippy and call-site nits after 3/n rebase

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

* fix(txpool): write metering cache only after pool accept

Rejected inserts no longer pollute the builder cache. Fold BuilderApiExtensionArgs Debug into the derive.

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

---------

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

* fix(batcher): keep tracking in-flight submissions across pipeline resets

* docs(batcher): state the stale-id rule once, on BatchPipeline::reset
Co-authored-by: Claude <noreply@anthropic.com>
* ci(bench): add opt-in fresh-devnet advisory workflow

* ci(bench): ignore unrelated label changes
* fix(ci): remove superseded review summary comments

Amp-Thread-ID: https://ampcode.com/threads/T-01a0c490-b863-70b8-8840-755728aa8a51
Co-authored-by: Amp <amp@ampcode.com>

* fix(ci): attempt every stale review summary deletion

Amp-Thread-ID: https://ampcode.com/threads/T-01a0c490-b863-70b8-8840-755728aa8a51
Co-authored-by: Amp <amp@ampcode.com>

* fix(ci): clear stale summaries after clean reviews

Amp-Thread-ID: https://ampcode.com/threads/T-01a0c564-f4f3-73ab-98d4-131818c60ac3
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>
…ase#5201)

* feat(cli): default Base Sepolia upgrade signal contract

Amp-Thread-ID: https://ampcode.com/threads/T-01a0c4ed-8f12-71bf-a2c5-016bb097c68c
Co-authored-by: Amp <amp@ampcode.com>

* fix(cli): correct upgrade contract defaults for all Base networks

Amp-Thread-ID: https://ampcode.com/threads/T-01a0c4fd-f5c4-709c-b924-c5204da3865b
Co-authored-by: Amp <amp@ampcode.com>

* fix(cli): update mainnet upgrade contract address

Amp-Thread-ID: https://ampcode.com/threads/T-01a0c4fd-f5c4-709c-b924-c5204da3865b
Co-authored-by: Amp <amp@ampcode.com>

* fix(cli): shut down the OTLP test node before process exit

Amp-Thread-ID: https://ampcode.com/threads/T-01a0c490-b863-70b8-8840-755728aa8a51
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>
* fix(consensus): retry sequencer EL sync probe

Recover derivation when the EL becomes ready after a Syncing bootstrap response without resetting while snap sync is incomplete.

BASE-676: https://linear.app/coinbase/issue/BASE-676/recover-sequencer-derivation-when-el-becomes-ready-after-bootstrap
Amp-Thread-ID: https://ampcode.com/threads/T-01a0c567-7237-729e-a0ee-93d7c65f38e4
Co-authored-by: Amp <amp@ampcode.com>

* fix(consensus): preserve engine wait metric

Stop receive-wait timing before running the periodic EL readiness probe.

Amp-Thread-ID: https://ampcode.com/threads/T-01a0c567-7237-729e-a0ee-93d7c65f38e4
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>
* docs: clarify BaseTime availability during block execution

Amp-Thread-ID: https://ampcode.com/threads/T-01a0c4ff-4775-7305-bde6-a73fbcdb43c1
Co-authored-by: Amp <amp@ampcode.com>

* docs: quote BaseTime in Rustdoc

Amp-Thread-ID: https://ampcode.com/threads/T-01a0c4ff-4775-7305-bde6-a73fbcdb43c1
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>
…ase#5144)

Introduce Enabled/Disabled variants for QueuedEngineDerivationClient and
QueuedL1WatcherDerivationClient. Both types now expose new() and disabled()
constructors and use a consistent Enabled { tx }/Disabled enum internally,
making the disabled state explicit in the type system.
* feat(precompiles): reject B20-prefix recipients at Denim

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

* test(precompiles): cover B20-prefix credit recipients

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

* style(precompiles): apply nightly formatting

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

* fix(precompiles): reject only the token as recipient

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

* style(precompiles): apply nightly formatting

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

* refactor(precompiles): rename credit recipient module

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

---------

Co-authored-by: Codex <codex-noreply@coinbase.com>
Co-authored-by: Stephan Cilliers <stephan.cilliers@coinbase.com>
Co-authored-by: OpenCode <opencode-noreply@coinbase.com>
* chore(ingress-rpc): remove service

Delete the Tips ingress-rpc service (bin/ingress-rpc and
crates/infra/ingress-rpc) and all of its build and devnet wiring:
workspace deps, Docker bake targets and Dockerfile stages, the compose
overlay service, proxyd ingress forwarding, scrape job, dashboard
panels, and docs.

The transaction-event vocabulary (ingress-rpc producer and ingress
lifecycle event types) plus audit retention mappings are intentionally
kept so historical audit-archiver rows still parse. Devnet overlay
naming (just devnet ingress, L2_INGRESS_RPC_URL) is unchanged; that URL
now refers to the proxyd entrypoint.

* chore(devnet): rename ingress stack to tx-observability

Follow-up to the ingress-rpc removal: the remaining devnet stack is
the transaction-observability pipeline plus the proxyd entrypoint, so
replace the stale ingress naming with what things are now.

- docker-compose.ingress.yml -> docker-compose.tx-observability.yml
- just devnet ingress[-down/-logs] -> just devnet
  tx-observability[-down/-logs]
- bake group ingress / INGRESS_TARGETS -> tx-observability /
  TX_OBSERVABILITY_TARGETS
- L2_INGRESS_HTTP_PORT / L2_INGRESS_RPC_URL -> L2_PROXYD_HTTP_PORT /
  L2_PROXYD_RPC_URL
- local-devnet-ingress config name, x-ingress-healthcheck anchor, and
  docs/comments updated to match; validity-forwarding 'ingress nodes'
  reworded to 'mempool nodes'.

Generic transaction-admission 'ingress' terminology in txpool,
builder, consensus, and systems tests is intentionally untouched.
…se#5145)

* feat(consensus): add disabled-mode derivation and L1 watcher clients

Introduce Enabled/Disabled variants for QueuedEngineDerivationClient and
QueuedL1WatcherDerivationClient. Both types now expose new() and disabled()
constructors and use a consistent Enabled { tx }/Disabled enum internally,
making the disabled state explicit in the type system.

* feat(rpc): reject admin_postUnsafePayload for isolated sequencers

* refactor(rpc): encode admin network access
* feat(consensus): wire isolated sequencer mode end to end

* refactor(consensus): adapt isolated-mode capability constructors
BrianBland and others added 25 commits October 7, 2026 20:19
* test(acceptance): stop health checks timing out on loaded CI runners

The HeadsHealthy unit tests ran every check under a 60 ms timeout (80 ms scenario deadline) against real local TCP servers. On a loaded runner the rounds can exceed that, so the RPC deadline fires and the check reports Error instead of Passed or Failed. Give these tests the 5 s RPC budget, and keep the 60 ms timeout only for the case that deliberately exercises the request deadline.

Co-authored-by: Toshi <toshi-noreply@coinbase.com>

* test(acceptance): shorten deadline-outcome waits in check tests

Co-authored-by: Toshi <toshi-noreply@coinbase.com>

---------

Co-authored-by: Toshi <toshi-noreply@coinbase.com>
Co-authored-by: Toshi <toshi-noreply@coinbase.com>
* fix(tx-forwarding): stop emitting TXPOOL_BUILDER_CONSUMED

* test(tx-forwarding): assert the full event journal across mempool and builder nodes
… the writer thread (base#5627)

* perf(observability-events): build and serialize transaction events on the writer thread

TransactionEventWriter now queues a deferred event builder instead of a
serialized line. The writer thread finishes the event ID, validates and
serializes the event, then appends it, so producers only pay for the
enqueue. The flashblocks builder also defers its event data serialization,
taking it out of the payload build loop.

The bounded queue stays lossy: a full queue drops the event and counts it
under the backpressure reason. Validation and serialization failures are
counted on the writer thread instead of being returned to the caller, and a
panicking event builder is caught and dropped rather than unwinding the
caller. tracing-appender is no longer needed.

Co-authored-by: Toshi <toshi-noreply@coinbase.com>

* fix(observability-events): preserve explicit event_time in emit_to

Also move payload_id into the deferred builder closure instead of cloning it.

---------

Co-authored-by: Toshi <toshi-noreply@coinbase.com>
…base#5631)

* feat(batcher): add a quadratic throttle strategy and --throttle-strategy

* feat(batcher): default the DA throttle to the quadratic strategy

* feat(batcher): split the throttle threshold into a start and a full one
…ng (base#5526)

Co-authored-by: Toshi <toshi-noreply@coinbase.com>
…rover-port (base#5609)

A zero attestation age made every Nitro attestation fail the freshness
check, so no signer was ever registered, and a zero prover port made every
instance poll target port 0. Both now fail at argument parsing.

Co-authored-by: Toshi <toshi-noreply@coinbase.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Activate Denim on Base Sepolia at 1792605600 (Wed Oct 21 2026 18:00:00 UTC),
the same time of day as the Sepolia Cobalt activation.

(cherry picked from commit 25bc0ce)
* feat(txpool): backport signed validity predicates to v1.5.0

Backport the net changes from base#5645 at 8857633, excluding unrelated main-branch merges.

* fix(ci): resolve release-version fork-test patches

Refresh the pinned base-anvil lockfile with the local crate patches before building. Without an explicit update, Cargo retains the locked 0.0.0 git crates and ignores the 1.5.0 release crates, running historical fork tests against stale precompiles.
(cherry picked from commit e3513cd)

Co-authored-by: Brian Bland <brian.bland@coinbase.com>
Co-authored-by: Toshi <toshi-noreply@coinbase.com>
Backport of base#5777 to releases/v1.5.0.

(cherry picked from commit fce8b55)
…ase#5722)

(cherry picked from commit 01e21f1)

Co-authored-by: Toshi <toshi-noreply@coinbase.com>
…se#5713) (base#5723)

* perf(bin): enable keccak-cache-global by default in node binaries



* chore: format default feature ordering for zepter

---------


(cherry picked from commit ba1a17d)

Co-authored-by: Toshi <toshi-noreply@coinbase.com>
Release v1.5.0

# Conflicts:
#	.depot/workflows/base-std-fork-tests.yml
#	.github/workflows/build-release.yml
#	CLAUDE.md
#	Cargo.lock
#	Cargo.toml
#	bin/base/Cargo.toml
#	bin/base/src/cli.rs
#	bin/base/src/commands/rpc.rs
#	bin/base/src/commands/sequencer.rs
#	bin/base/src/main.rs
#	bin/builder/src/main.rs
#	crates/batcher/cli/src/metrics.rs
#	crates/builder/cli/src/args.rs
#	crates/builder/core/benches/tx_selection.rs
#	crates/builder/core/src/config.rs
#	crates/builder/core/src/extension.rs
#	crates/builder/core/src/flashblocks/context.rs
#	crates/builder/core/src/shadow_validity.rs
#	crates/builder/core/tests/rpc.rs
#	crates/builder/multiplex/src/service_builder.rs
#	crates/common/chains/src/chain.rs
#	crates/common/chains/src/config.rs
#	crates/common/chains/src/upgrade.rs
#	crates/common/genesis/src/chain/upgrade.rs
#	crates/execution/cli/src/commands/download.rs
#	crates/execution/cli/src/standard_node.rs
#	crates/execution/node/src/node.rs
#	crates/execution/payload/src/builder.rs
#	crates/execution/payload/src/validity.rs
#	crates/execution/runner/Cargo.toml
#	crates/execution/runner/src/add_ons.rs
#	crates/execution/runner/src/lib.rs
#	crates/execution/tx-forwarding/tests/forwarding.rs
#	crates/execution/txpool-rpc/README.md
#	crates/execution/txpool-rpc/src/extension.rs
#	crates/execution/txpool-rpc/src/lib.rs
#	crates/execution/txpool-rpc/src/rpc.rs
#	crates/execution/txpool/src/transaction.rs
#	crates/infra/load-tests/README.md
#	crates/utilities/reth-cli/src/snapshots.rs
#	etc/systems/src/l2/in_process_builder.rs
#	etc/systems/src/l2/in_process_client.rs
Canyon, Denim and Everest install code and storage straight to the state DB, so
the tracer missed them. List them for reth-firehose to emit.
@sduchesneau
sduchesneau marked this pull request as ready for review October 16, 2026 18:36

@UlysseCorbeil UlysseCorbeil left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Checked the Firehose side: pre-execution writes are wired on the live, backfill and flashblocks paths, and the list matches the three installs v1.5.0 does outside the EVM lgtm.

@sduchesneau
sduchesneau merged commit f49b276 into release/1.x Oct 16, 2026
2 checks passed
@sduchesneau
sduchesneau deleted the bump/v1.5.0 branch October 16, 2026 18:47
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.