Skip to content
BaseHub by Will Binns Updated

Denim Upgrade Overview

Denim is the Base hardfork that follows Cobalt. It is a single idea expressed three ways: Base seals blocks five times per second instead of once every two seconds, the chain gains a millisecond clock that contracts can read, and RPC responses learn to report time at that resolution.

NetworkStatusTarget
Base SepoliaPlanningOctober 2026
Base MainnetPlanningNovember 2026
vibenetLive for experimental testingAvailable to preview today
  • 200ms native blocks — block production goes from one canonical block every two seconds to five per second, each a complete block with its own number, hash, state root, receipts, and forkchoice lifecycle. This retires Flashblocks. Full detail in Denim 200ms Native Blocks.
  • BaseTime — a predeploy that carries the sub-second part of each block’s timestamp, supplied by a metadata deposit. Contracts can read the current block’s millisecond component while EVM block.timestamp stays whole-second.
  • Millisecond RPC timestamps — blocks, headers, transactions, logs, and receipts gain optional timestampMs and blockTimestampMs fields derived from authenticated BaseTime metadata. The existing seconds-based timestamp field does not change.
  • B20 policy and receiver changes — the node source also gates two B20 changes on Denim, and upstream added them to the fork page on 2026-09-29, flagging the receiver and executor changes as breaking. The policy registry gains inverted policy IDs (bit 63 as a NOT flag, plus invertedPolicyId). Tokens also refuse to credit their own address. Both are in Arriving with Denim. A third change, B20 logic version 3, enforces TRANSFER_EXECUTOR_POLICY on every transfer path, including a holder’s own transfer; see B20 Issuer Operations.

The obvious way to seal blocks every 200ms would be to make the Ethereum header timestamp finer-grained. Denim does not do that. block.header.timestamp stays Unix time in whole seconds, and a BaseTime metadata deposit at tx[1] supplies the sub-second piece, restricted to 0, 200, 400, 600, or 800. Reading both together gives the block’s millisecond timestamp.

Keeping the header intact is what lets existing tooling stay standing. Contracts observe no change, because EVM block.timestamp still reports the whole-second header value. The cost is that anything wanting millisecond precision has to read the BaseTime deposit or the new optional RPC fields rather than the header alone.

Flashblocks publish incremental previews of pending state inside a two-second block. Once the 200ms interval is a real block, that preview layer has nothing left to do, so Base stops producing Flashblocks as part of the Denim rollout.

Denim briefly lost 200ms blocks to Cobalt in early September 2026, then got them back a week later. The node source stayed put across both moves: is_denim_active_at_timestamp has gated every block-timing path throughout, and the BaseTime helper sits under the same gate. Documentation written during that window may attribute 200ms blocks to Cobalt. The mechanics described here are unaffected by which name is attached.