Skip to content

Bump Base to v1.5.1 - #40

Merged
dfuse-bot merged 19 commits into
release/1.xfrom
bump/base-1.5.1
Oct 29, 2026
Merged

dfuse-bot merged 19 commits into
release/1.xfrom
bump/base-1.5.1

Conversation

@dfuse-bot

@dfuse-bot dfuse-bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Merges upstream Base v1.5.1 into release/1.x. Tag v1.5.1-fh3.1 once merged.

v1.5.1 schedules the Denim hardfork on Base mainnet at 2026-11-05 18:00:00 UTC (1_793_901_600), so mainnet nodes must run this release before then. The merge had no conflicts. streamingfast/reth stays on base-v2.5.2.8-fh3.1-2 (upstream still pins base-v2.5.2.8) and firehose-tracer on 5.7.0. The Firehose block model is unchanged, so the tag keeps fh3.1. No other StreamingFast repository needs a release first.

Besides the merge:

  • A test that the built-in mainnet chain spec resolves the Denim schedule and gives the first Denim block (53_556_127) its millisecond FIRE BLOCK time.
  • ACTIVATIONS.md: Denim mainnet schedule, and two Denim notes (millisecond block time vs the new RPC timestampMs fields, and flashblocks stopping).
  • CHANGELOG entry below.

CHANGELOG

## v1.5.1-fh3.1

### Changed

* Rebased on upstream Base `v1.5.1`. It schedules the Denim hardfork on Base mainnet at
  2026-11-05 18:00:00 UTC, so mainnet operators must run this release before then.
  `streamingfast/reth` stays on `base-v2.5.2.8-fh3.1-2` and `firehose-tracer` on 5.7.0; the
  Firehose block model is unchanged.
* From Denim on, Base publishes no flashblocks, so a node started with `--firehose-flashblocks-url`
  emits no partial blocks after the activation; full blocks come every 200 ms instead.

Test Execution Summary

Branch bump/base-1.5.1 (release/1.x at v1.5.0-fh3.1-2 + git merge v1.5.1, no conflicts).

Build Status

  • cargo test --no-run -p base-execution-firehose -p base-firehose-tests -p base-firehose-flashblocks -p base-reth-node -p base-execution-chainspec -p base-common-genesis -p base-common-chains: PASSED
  • cargo build --release --package base-reth-node --bin base-reth-node --package base-consensus --bin base-consensus (same command as Dockerfile.sf): PASSED (10 min)
  • cargo clippy -p base-reth-node --tests: PASSED, no warnings in bin/node (existing doc-backtick warnings in base-execution-firehose and base-execution-flashblocks are unchanged)
  • Smoke run: base-reth-node node --chain base --datadir <empty dir> --disable-discovery for 90 s: PASSED. Prints FIRE INIT 3.1 reth base-1.5.1 and the genesis FIRE BLOCK 0, lists Denim @1793901600 in the hardforks, and starts without a Denim schedule error.

Unit Tests

Package Status Notes
cargo test -p base-firehose-tests PASSED 14 tests (prestate replay, EIP-8130 tracing)
cargo test -p base-firehose-flashblocks PASSED 44 tests
cargo test -p base-reth-node PASSED 2 tests, including the new mainnet_block_time_switches_to_milliseconds_at_denim
cargo test -p base-execution-firehose PASSED no unit tests in the crate
cargo test -p base-execution-chainspec PASSED 49 passed, 1 ignored (upstream)
cargo test -p base-common-genesis PASSED 103 tests
cargo test -p base-common-chains PASSED 52 passed, 1 ignored (upstream)
cargo test -p reth-firehose -p reth-firehose-tests PASSED 37 tests, run in a streamingfast/reth checkout at base-v2.5.2.8-fh3.1-2 (the pinned tag, unchanged by this bump); cargo cannot test a git dependency with dev-dependencies from this workspace

Integration Tests

  • Status: PASSED
  • RUSTFLAGS="-C debug-assertions=off" RUST_MIN_STACK=33554432 cargo test -p base-system-tests --test firehose_denim --test firehose_b20 --test firehose_cobalt_b20, Docker-backed:
Test Status Time
firehose_b20::b20_transfer_is_traced PASSED 15.5 s
firehose_cobalt_b20::cobalt_b20_surfaces_are_traced PASSED 45.3 s
firehose_denim::denim_activation_block_traces_base_time_install PASSED 50.6 s

Battlefield Tests

  • Status: PASSED
  • Pass/Fail: 78 passing, 24 pending, 0 failing
  • streamingfast/battlefield-ethereum at ffd9260 (origin/HEAD), op-reth-devnet suite with this branch's release base-reth-node (1.5.1) as the Firehose node: ./scripts/optimism/run_optimism_devnet.sh, then OP_RETH_BINARY=<base>/target/release/base-reth-node RUST_MIN_STACK=33554432 ./scripts/run_firehose_op_reth_devnet.sh, then pnpm test:fh3.0:op-reth-devnet. All goldens matched; no golden changed.
  • The 24 pending tests are gated on forks or features this devnet does not have (Amsterdam/BAL, blobs, Arbitrum and BSC specifics, the Transfer-log and millisecond timestamp tests), plus the RPC comparison test, which skips because the devnet finalizes at head − 200 and nothing was final yet. I ran that comparison by hand once the blocks were final: fireeth tools compare-blocks-rpc -p localhost:8089 http://127.0.0.1:28545 1 160 gave 160 identical, 0 different (the tests wrote up to block 156).
  • No ERROR or panic in the node log.
  • The devnet runs the OP Stack forks up to Isthmus from genesis, not Base's own upgrades (Azul, Beryl, Cobalt, Denim, Everest). Denim's Firehose effects are covered by firehose_denim (see Integration Tests) and by the unit test above for the mainnet block time.

Firehose bug patterns

  1. Serial order: the txpool and forwarding changes (batch validation against one state provider, lazy lane invalidation, condition partitioning, opt-in --tx-forwarding-batched-insert) stay on the mempool and builder side and never reach the traced executor. The precompile calldata change only borrows the input instead of copying it. None found.
  2. Emit after accept: no change to crates/execution/consensus or the engine validation path in the range. None found.
  3. Activations: Denim is now scheduled on Base mainnet at 1_793_901_600 (2026-11-05 18:00 UTC). Its block content effects are traced since v1.5.0-fh3.1. The mainnet schedule resolves (first Denim block 53_556_127 at 1_793_901_601), so the millisecond FIRE BLOCK time applies on mainnet. New finding: Denim ends flashblocks, so the Firehose flashblocks partial-block stream goes quiet after activation. Everest and Zenith are unchanged. See ACTIVATIONS.md.
  4. Fields: no change to crates/common/consensus or crates/common/rpc-types in the range. None found.

Open questions

  • Firehose flashblocks after Denim. From Denim the sequencer builds with the basic builder and publishes no flashblocks, so a node started with --firehose-flashblocks-url emits no partial blocks after activation (already the case on Base Sepolia since 2026-10-21). Nothing breaks: the extension keeps its connection and only records canonical heads. We can drop the flag after activation in next versions.

github-actions Bot and others added 19 commits October 15, 2026 10:44
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* fix(batcher): time out every RPC call after --network-timeout (base#5630)

* fix(batcher): time out the L2 reads of a sequencer after 10 seconds

* docs(batcher): keep the sequencer timeouts out of the CLI README

* fix(batcher): time out every RPC call after --network-timeout

* refactor(batcher): name the RPC client builder for what it builds

* fix(batcher): log the L1 WS origin and document the network timeout

* refactor(batcher): expose the tx manager settings as batcher config fields

(cherry picked from commit f348cb6)

* fix(batcher): keep the buffer when a node behind on L1 reports a lower safe head (base#5660)

* fix(batcher): keep the buffer when a node behind on L1 reports a lower safe head

* docs(batcher): state the ordering a derivation status guarantees

* fix(batcher): wait for a starting rollup node at startup instead of exiting

* refactor(batcher): name the empty derivation status check after what it checks

* docs(batcher): name both causes of a lower safe head past the last L1 block

(cherry picked from commit 85af58b)

* fix(batcher): give each blob count and low blob fill its own histogram bucket (base#5773)

(cherry picked from commit e9edf70)

* fix(batcher): compare shadow parity only up to the validator safe head (base#5832)

(cherry picked from commit 68cb0ec)

* fix(batcher): measure the DA backlog in estimated compressed bytes (base#5833)

(cherry picked from commit 2cebe4b)

* feat(batcher): expose the throttle DA limits as flags with calibrated defaults (base#5835)

* feat(batcher): expose the throttle DA limits as flags

* feat(batcher): calibrate the throttle defaults for estimated DA bytes

(cherry picked from commit 6e64f37)

* fix(batcher): let the driver drain when a background task exits (base#5855)

(cherry picked from commit 4fe6ef4)
…-e2e step back to v1.5.1 (base#5877)

* fix(proof): use each game's intermediate block interval (base#5794)

* fix(proof): use each game's intermediate block interval

* fix(prover-service): reject rows without a request payload instead of rebuilding one

(cherry picked from commit d918f45)

* fix(snark-e2e): step back 100 L2 blocks at a time for 200ms blocks (base#5840)

(cherry picked from commit 65a7646)
…the table to v1.5.1 (base#6064)

* [backport] fix(disc): ping unverifiable ENRs so NATed peers can join the table to v1.5.1 (base#6025)

Squashed cherry-pick of base#6025:
(cherry picked from commit ef1835e)
(cherry picked from commit a37ab29)

* fix(disc): verify the actual ping destination

Amp-Thread-ID: https://ampcode.com/threads/T-01a14beb-8703-76a8-86fe-4e5a5c08f8f1
Co-authored-by: Amp <amp@ampcode.com>
(cherry picked from commit 6a5356a)

* fix(disc): test verification without IPv6 sockets

Amp-Thread-ID: https://ampcode.com/threads/T-01a14beb-8703-76a8-86fe-4e5a5c08f8f1
Co-authored-by: Amp <amp@ampcode.com>
(cherry picked from commit 17ad249)

---------

Co-authored-by: Amp <amp@ampcode.com>
…#5669) (base#6102)

* refactor(txpool): partition validity conditions after ingestion

* fix(txpool): borrow state predicates during validity checks

* fix(txpool): require compiled validity conditions

* perf(validity): evaluate compiled bounds directly

(cherry picked from commit 02550c5)
* fix(tx-manager): always raise a zero fee in a replacement (base#6085)

(cherry picked from commit f3685f3)

* fix(batcher): let the shutdown signal handler own SIGINT (base#6087)

* fix(batcher): let the shutdown signal handler own SIGINT

* fix(batcher): stop setup on the shutdown signal

(cherry picked from commit 7ae6633)

* fix(batcher): reject a batcher hash that derivation rejects (base#6086)

(cherry picked from commit 41a702d)
Activate Denim on Base Mainnet at 1793901600 (Thu Nov 5 2026 18:00:00 UTC),
the same time of day as the Mainnet Cobalt activation.
)

Mainnet now schedules Denim, so the two-second snapshot cadence inherited it and
switched the local schedule to 200ms blocks. Clear Denim on both the rollup config
and the chain spec for the two-second cadence, and reject snapshot heads that are
already past Denim.
…uilder cutover (base#6132) (base#6136)

The cutover router sends every build to the unselected builder with
no_tx_pool set. The native builder recorded inclusion histograms for
those shadow builds, doubling txs_included_per_block and its sibling
gas and fee-revenue histograms. Record them only for pool builds,
matching the flashblocks builder.


(cherry picked from commit e603fbf)

Co-authored-by: Toshi <toshi-noreply@coinbase.com>
…ert them in one builder call (base#5816) (base#6142)

* perf(txpool): validate transaction batches in one job with one state provider

BaseTransactionPool::add_transactions validated and admitted each
transaction separately, so a batch paid one validation-task round trip and
one latest-state provider per transaction. Validate the protocol
transactions of a batch with a single validate_transactions call that
shares one state provider, then admit each in submission order. Batches
containing EIP-8130 sidecar transactions keep the per-transaction path.



* test(txpool): cover batch replacements, mixed origins and sidecar fallback

Also qualify the batch outcome comment: outcomes match per-transaction adds
unless the canonical head or the pool changes during the batch.



* perf(txpool): insert forwarded transaction batches in one builder call

Add base_insertValidatedTransactions, which admits up to 1024 validated
transactions as one pool batch through add_transactions_with_origins and
returns the single-call result for each, in order. The builder then
validates a forwarded batch against one state provider instead of one per
transaction.

Forwarders use it behind --tx-forwarding-batched-insert, which defaults to
off; with it off they send JSON-RPC batches of single calls as before. Roll
out in two steps: deploy builders and sequencers that serve the method,
then enable the flag on mempool nodes. With the flag on, batches over the
limit or with requests lacking a batched form keep using single calls.



---------


(cherry picked from commit 508a4a2)

Co-authored-by: Brian Bland <brian.bland@coinbase.com>
Co-authored-by: Toshi <toshi-noreply@coinbase.com>
…e#5817) (base#6140)

`UnifiedTipPriority::cmp` cross-multiplied with `U256::saturating_mul`. When a
product saturated (tips above 2^192 wei), distinct bids compared equal and
equality was no longer transitive, so sorted and ordered collections could
order the same bids differently depending on insertion history.

Priority-fee bids (gas 1 on both sides) now compare tips directly, and other
pairs compare exact 320-bit U256 x u64 products. A gas of 0 compares as 1.
Ordering is unchanged for every pair whose product fits in 256 bits; only
ordering among unpayable tips above 2^192 wei changes.


(cherry picked from commit 792cb64)

Co-authored-by: Toshi <toshi-noreply@coinbase.com>
base#5717) (base#6175)

Lane invalidation compared every parked and ready entry by recomputing
BestTransactionLane::for_transaction. Store the lane alongside each entry
(and the source head) so invalidation compares a stored value and yielding
no longer recomputes the lane already derived when the source head was filled.


(cherry picked from commit 2a0ebfe)

Co-authored-by: Brian Bland <brian.bland@coinbase.com>
Co-authored-by: Toshi <toshi-noreply@coinbase.com>
invalidate_lane only marks the lane Invalid. Members of an invalid lane
are dropped when promote, discard_parked, ready_priority, or pop_ready
touches them, so a rejection no longer scans every parked and ready entry.


(cherry picked from commit 80b926a)

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

The wrapper copied the full call input into a new buffer before dispatch.
Every dispatcher already takes `&[u8]`, so pass the borrowed input through.
Gas charged, return data, and state are unchanged.

Co-authored-by: Chris Hunter <chris.hunter@coinbase.com>
Cargo.lock also picks up the 1.5.1 version of the Firehose crates.
@dfuse-bot dfuse-bot closed this Oct 29, 2026
@dfuse-bot dfuse-bot reopened this Oct 29, 2026
@dfuse-bot
dfuse-bot marked this pull request as ready for review October 29, 2026 14:27
@dfuse-bot
dfuse-bot merged commit 865de0f into release/1.x Oct 29, 2026
4 checks passed
@dfuse-bot
dfuse-bot deleted the bump/base-1.5.1 branch October 29, 2026 14:50
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.

9 participants