Tempo shipped a protocol-level consensus context addition to block headers (TIP-1031), refactored AA transaction validity bounds to use Option<NonZeroU64>, and completed a major dependency upgrade to alloy 2.0 and updated reth, affecting header parsing, transaction construction, and downstream tooling.
> impact
**What changed.** Three significant changes landed in Tempo this cycle. First, TIP-1031 (PR #3254) adds consensus context directly into the block header structure, giving validators and clients richer protocol-level metadata at the header layer. Second, the validity bounds on Account Abstraction (AA) transactions — `valid_before` and `valid_after` — were refactored from plain `u64` fields to `Option<NonZeroU64>`. This eliminates an ambiguity where a zero value was indistinguishable from an omitted bound in RLP encoding and serde serialization; zero-valued bounds are now explicitly rejected when constructing AA transactions. Third, Tempo bumped its core dependencies: alloy moves to 2.0.0, reth updates to revision bfb7ab7, and several related crates advance (reth-codecs 0.2.0, reth-primitives-traits 0.2.0, alloy-evm 0.31.0, revm-inspectors 0.37.0).
**Why it matters.** TIP-1031 is a consensus-critical change — any tooling that parses, constructs, or validates block headers must account for the new consensus context field or risk deserialization failures. The validity bounds refactor closes a subtle correctness gap: previously, an AA transaction with `valid_after: 0` looked identical on the wire to one with no bound at all, which could lead to unexpected mempool behavior or replay edge cases. The alloy 2.0 upgrade is a breaking release that splits `TransactionBuilder` into `TransactionBuilder` and `NetworkTransactionBuilder` traits, introduces new `BlockHeader` methods, and reshapes several internal interfaces.
**Impact on developers.** Node operators and validator teams should plan to upgrade promptly — the new header format from TIP-1031 will be enforced at a future block height. SDK and indexer maintainers need to update header deserialization logic to include the consensus context field. Anyone building or signing AA transactions must ensure validity bounds are passed as `None` (omitted) rather than `Some(0)` — the latter will now be rejected. And if your project depends on alloy, reth-codecs, reth-primitives-traits, alloy-evm, or revm-inspectors, expect breaking API changes that require code adaptation when you pull in the latest Tempo crates.
> Try this now
try this
# --- TIP-1031: Updated block header with consensus context ---
# If you parse Tempo block headers, you now need to handle the new field.
# Previously:
# header = client.get_block_header(block_number)
# parent_hash = header.parent_hash
# state_root = header.state_root
#
# Now, the header includes consensus_context:
# header = client.get_block_header(block_number)
# consensus_ctx = header.consensus_context # NEW — contains validator/consensus metadata
# # Ensure your deserializer expects this field or it will fail on new blocks.
# --- AA Transaction validity bounds refactor ---
# Before: zero and omitted were ambiguous
# tx_builder.set_valid_after(0) # Was this "no bound" or "valid after genesis"?
#
# After: use Option<NonZeroU64> semantics
# # Omit the bound entirely (no constraint):
# tx_builder.set_valid_after(None)
#
# # Set a real bound (must be > 0):
# tx_builder.set_valid_after(Some(NonZeroU64::new(1_700_000_000).unwrap()))
#
# # This will now be REJECTED at construction time:
# tx_builder.set_valid_after(Some(NonZeroU64::new(0))) # returns None → panic/error
# # Zero-valued bounds are no longer valid for AA transactions.
# --- Dependency upgrade: alloy 2.0 trait split ---
# If you implement custom transaction builders against alloy, note the trait split:
#
# Before (alloy <2.0):
# impl TransactionBuilder for MyBuilder { ... }
#
# After (alloy 2.0):
# impl TransactionBuilder for MyBuilder { ... } // core builder methods
# impl NetworkTransactionBuilder for MyBuilder { ... } // network-specific signing/encoding
#
# Also update BlockHeader usage — new accessor methods may replace old field access.
# Check alloy 2.0.0 changelog and reth rev bfb7ab7 for full migration details.