Base Denim is Base’s fourth upgrade and, according to the Base Engineering blog of November 5, 2026, is live on mainnet. Denim brings native 200ms blocks — five canonical blocks per second — and replaces Flashblocks. It also adds BaseTime with millisecond resolution and B20 improvements: extra transfer checks plus NOT/invert policies.
Before Denim, Base produced one canonical block every two seconds; Flashblocks streamed pending-state previews in between. Now every 200ms block is a full canonical block. Inclusion in such a block is still not finality: safety follows the batch posted to Ethereum, and finality follows Ethereum finalizing that batch. Ordinary users need no action per Base; apps that depended on Flashblocks or the pending tag must migrate.
Base Denim: Native 200ms Blocks Instead of Flashblocks
Flashblocks are retired. There is no pending state to reconcile and no separate Flashblocks stream. Standard JSON-RPC returns sub-second state out of the box: eth_subscribe("newHeads"), eth_getLogs, eth_call, receipts — without a Flashblocks client. Migration per Base: newFlashblocks → newHeads; pendingLogs → logs; Flashblock transaction subscriptions → newHeads then fetch each block’s transactions; methods that used the pending tag should target the latest canonical block.
Blocks cannot skip slots: each block’s full timestamp is exactly 200ms after its parent’s, and the protocol validates that progression. Preconfirmation reorgs from dropped Flashblock previews go away conceptually — a 200ms block is the canonical block, not a preview.
block.number, BaseTime, and B20
block.number advances ten times faster in wall-clock time; block.timestamp still advances in whole seconds. Contracts and offchain systems that treat block counts as durations (timelocks, vesting, rate limits, governance clock(), fixed-cardinality TWAP windows) must review those durations: prefer timestamps where possible, or multiply governance-tunable counts by ten. Five consecutive blocks share the same second-level timestamp — without BaseTime, interest or reward logic would see zero elapsed time between four of every five blocks.
BaseTime writes the sub-second part (0, 200, 400, 600, or 800) to the predeploy at 0x4200…0030 (deposit at index 1 after L1 info). Contracts can call timestampMs(); RPC responses add optional timestampMs / blockTimestampMs fields. B20: after Denim, TRANSFER_EXECUTOR_POLICY is checked on msg.sender for every transfer path (not only third-party transferFrom); transfers, mints, or seizures to the token’s own address revert with InvalidReceiver; policy composition gains NOT via invertedPolicyId.
Who Must Act — and Who Need Not
End users without custom integrations: no action. Wallet and app developers on Flashblocks/pending: follow Base’s migrate guide. Contract developers: audit block-count durations. Issuers with a restrictive executor policy: add holders (or a covering policy) to the executor allowlist if holder-initiated transfers should keep working. RPC providers and indexers: expect roughly 10× block volume and the new timestamp fields; Flashblocks streams stop.
Trading and DeFi teams now observe canonical state every 200ms with millisecond timestamps — and no pending-state reconcile. Bridges and proof flows that read historical block hashes via BLOCKHASH keep the same number of values but cover only one tenth of elapsed wall-clock time.
Framing in the Broader Crypto Context
Base Denim is an L2 infrastructure protocol upgrade, not a token launch and not a price call. Base’s disclaimer stresses neutral infrastructure, issuer control over B20, and that inclusion is not finality. On code404zero we have covered related market and product notes: the crypto update of November 3, the market update of November 1, and JPM Coin on Ethereum.
Limits of the Public Spec
The blog states mainnet live status and the three change packages; operational SLAs, sequencer cost, and app-specific migration deadlines are not pinned as binding calendars there. Teams that used Flashblocks in production should check the official Migrate from Flashblocks docs and their own observability (subscription errors, pending-tag behavior). Pre-Denim blocks omit the new timestamp fields — clients that ignore them stay compatible.
Builder-Facing Technical Notes
BaseTime metadata lands as a deposit before user transactions, so any contract call in the block can read milliseconds. RPC clients that do not yet parse timestampMs stay compatible via the seconds field. B20’s NOT policy inverts a base policy’s result via a reserved bit — member lists are shared, not copied, so allow and block lists need not be maintained twice.
Issuer note: tokens that never set an executor policy keep the always-allow default. Tokens that did set one inherit the stricter behavior automatically. Self-sends, sends to other B20 tokens, approvals, and burns are unaffected by the own-address InvalidReceiver guard; pre-Denim balances stuck on the token address may still be recoverable via seize if the issuer enabled that feature.
Bottom line: Base Denim (November 5, 2026) delivers native 200ms blocks instead of Flashblocks, BaseTime milliseconds, and harder B20 transfer/policy controls. Users without Flashblocks dependencies: do nothing. Builders: migrate and review block-count logic. Finality remains L1/Ethereum-bound.
Migrating From Flashblocks in Practice
Teams that used `newFlashblocks`, `pendingLogs`, or the `pending` tag in production should follow the official Migrate from Flashblocks docs: move subscriptions to `newHeads`/`logs`, reload transactions from the canonical block, and point pending-tag methods at the latest canonical block. There is no 1:1 replacement for preconfirmation state — the substitutes return canonical 200ms data. Indexers and explorers must plan for roughly ten times the block volume and optional `timestampMs`/`blockTimestampMs` fields; pre-Denim blocks omit the new fields.
Contract audits: review timelocks, vesting, rate limits, governance `clock()`, and fixed-cardinality TWAP windows that treat block counts as durations by a factor of ten. Prefer `block.timestamp` or `BaseTime.timestampMs()` where possible; multiply governance-tunable counts by ten. Five blocks share the same second-level timestamp — without BaseTime, interest or reward logic would see zero elapsed time between four of every five blocks.
B20 Issuers and Compliance Lists
Issuers with a restrictive `TRANSFER_EXECUTOR_POLICY` must add holders (or a covering policy) to the executor allowlist if holder-initiated `transfer` calls should keep working — before Denim the policy applied only to third-party `transferFrom`. `invertedPolicyId` enables NOT composition over shared member lists without double maintenance. Sends to the token’s own address revert with `InvalidReceiver`; self-sends, other B20 tokens, approvals, and burns are untouched. Pre-Denim balances on the token address may still be recoverable via seize if the issuer enabled that feature.
Framing: Base Denim is infrastructure, not a token event. Inclusion in a 200ms block is still not finality — safety follows the batch on Ethereum, finality follows Ethereum finalizing that batch. Users without Flashblocks dependencies: no action. Builders, RPC providers, and issuers: migrate, review block-count logic and policies. The Base Engineering blog of November 5, 2026 and the Denim docs remain the primary sources.




