Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions app/upgrades/changelog/[slug]/ChangeDetailClient.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,23 @@ export function ChangeDetailClient({ change }: ChangeDetailClientProps) {
<Text as="div" variant="body" dangerouslySetInnerHTML={migrationNotesHtml} />
</div>
) : null}
{change.specUrl ? (
<div>
<Text variant="label.medium" tone="muted" className="mb-2">
Specification
</Text>
<Button
href={change.specUrl}
target="_blank"
rel="noopener noreferrer"
variant="outline"
size="sm"
>
Read specification
<ExternalLinkIcon />
</Button>
</div>
) : null}
{change.relatedRepos && change.relatedRepos.length > 0 ? (
<div>
<Text variant="label.medium" tone="muted" className="mb-2">
Expand Down
14 changes: 4 additions & 10 deletions app/upgrades/changelog/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,8 @@ export default async function ChangePage(props: ChangePageProps) {
{change.title}
</Text>
</div>
<div className="flex shrink-0 flex-wrap gap-2 md:justify-end">
{change.specUrl ? (
<Button href={change.specUrl} target="_blank" rel="noopener noreferrer" variant="outline" size="sm">
Documentation
<ExternalLinkIcon />
</Button>
) : null}
{change.kind === 'eip' ? (
{change.kind === 'eip' ? (
<div className="flex shrink-0 flex-wrap gap-2 md:justify-end">
<Button
href={change.upstreamUrl}
target="_blank"
Expand All @@ -76,8 +70,8 @@ export default async function ChangePage(props: ChangePageProps) {
Upstream EIP
<ExternalLinkIcon />
</Button>
) : null}
</div>
</div>
) : null}
</header>
<ChangeDetailClient change={change} />
</div>
Expand Down
4 changes: 2 additions & 2 deletions app/upgrades/data/changes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -351,13 +351,13 @@ export const changes: Change[] = [
'<p>Base will produce native L2 blocks at a 200ms cadence. Each block has its own number, hash, state root, receipts, and unsafe-to-finalized lifecycle.</p><p class="mt-4">Unlike Flashblocks, which expose sub-second updates while building one block, this change runs the full rollup block lifecycle every 200ms.</p><div class="mt-4 rounded-lg border border-bds-orange-20 border-l-4 border-l-bds-orange-50 bg-bds-orange-5 px-4 py-3"><p class="text-[11px] font-semibold uppercase tracking-wide text-bds-orange-70">Deprecation Notice</p><p class="mt-1"><strong>Flashblocks will be deprecated as part of this release.</strong> Because native 200ms blocks deliver the same sub-second confirmation experience directly on the canonical chain, the Flashblocks WebSocket stream is no longer needed and will be removed. Migrate off the Flashblocks WebSocket stream before Denim activation.</p></div><p class="mt-4">Ethereum block headers and <code>block.timestamp</code> remain in whole seconds. The BaseTime predeploy records the sub-second component before user transactions, while optional <code>timestampMs</code> and <code>blockTimestampMs</code> RPC fields expose the complete millisecond timestamp to applications and infrastructure.</p>',
migrationNotes:
'<p><strong>Application developers</strong></p><p class="mt-2 pb-4">Existing contracts and applications remain compatible. Use the BaseTime <code>timestampMs()</code> getter when contracts need same-block millisecond precision; continue using <code>block.timestamp</code> when second-level precision is sufficient.</p><p><strong>RPC and indexing providers</strong></p><p class="mt-2 pb-4">Support the optional <code>timestampMs</code> block and header field and <code>blockTimestampMs</code> on mined transactions and logs. Do not infer millisecond timestamps from the whole-second header value.</p><p><strong>Node operators</strong></p><p class="mt-2">Upgrade to a Denim-compatible release before activation. Plan capacity for the higher native block rate across execution, storage, RPC events, and peer-to-peer propagation.</p>',
lastUpdated: '2026-08-10',
lastUpdated: '2026-08-24',
relatedRepos: [
'https://github.com/base/base',
'https://github.com/base/contracts/blob/4848ec70d8f1062fec59470d6e731e13ece8a728/src/L2/BaseTime.sol',
],
githubIssues: [],
specUrl: '',
specUrl: 'https://docs.base.org/base-chain/specs/upgrades/denim/200ms-native-blocks',
},
];

Expand Down
1 change: 1 addition & 0 deletions app/upgrades/library/upgrades.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ describe('upgrades route helpers', () => {
title: '200ms Blocks',
category: 'execution',
upgrade: 'denim',
specUrl: 'https://docs.base.org/base-chain/specs/upgrades/denim/200ms-native-blocks',
});

const execution = categoryGroupsForUpgrade('denim').find(
Expand Down
Loading