Skip to content

Commit 54a87b8

Browse files
0x00101010ampagent
andauthored
docs(changelog): link 200ms blocks specification (#83)
Co-authored-by: Amp <amp@ampcode.com>
1 parent bf1e2ce commit 54a87b8

4 files changed

Lines changed: 24 additions & 12 deletions

File tree

app/upgrades/changelog/[slug]/ChangeDetailClient.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,23 @@ export function ChangeDetailClient({ change }: ChangeDetailClientProps) {
113113
<Text as="div" variant="body" dangerouslySetInnerHTML={migrationNotesHtml} />
114114
</div>
115115
) : null}
116+
{change.specUrl ? (
117+
<div>
118+
<Text variant="label.medium" tone="muted" className="mb-2">
119+
Specification
120+
</Text>
121+
<Button
122+
href={change.specUrl}
123+
target="_blank"
124+
rel="noopener noreferrer"
125+
variant="outline"
126+
size="sm"
127+
>
128+
Read specification
129+
<ExternalLinkIcon />
130+
</Button>
131+
</div>
132+
) : null}
116133
{change.relatedRepos && change.relatedRepos.length > 0 ? (
117134
<div>
118135
<Text variant="label.medium" tone="muted" className="mb-2">

app/upgrades/changelog/[slug]/page.tsx

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,8 @@ export default async function ChangePage(props: ChangePageProps) {
5858
{change.title}
5959
</Text>
6060
</div>
61-
<div className="flex shrink-0 flex-wrap gap-2 md:justify-end">
62-
{change.specUrl ? (
63-
<Button href={change.specUrl} target="_blank" rel="noopener noreferrer" variant="outline" size="sm">
64-
Documentation
65-
<ExternalLinkIcon />
66-
</Button>
67-
) : null}
68-
{change.kind === 'eip' ? (
61+
{change.kind === 'eip' ? (
62+
<div className="flex shrink-0 flex-wrap gap-2 md:justify-end">
6963
<Button
7064
href={change.upstreamUrl}
7165
target="_blank"
@@ -76,8 +70,8 @@ export default async function ChangePage(props: ChangePageProps) {
7670
Upstream EIP
7771
<ExternalLinkIcon />
7872
</Button>
79-
) : null}
80-
</div>
73+
</div>
74+
) : null}
8175
</header>
8276
<ChangeDetailClient change={change} />
8377
</div>

app/upgrades/data/changes.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,13 +351,13 @@ export const changes: Change[] = [
351351
'<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>',
352352
migrationNotes:
353353
'<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>',
354-
lastUpdated: '2026-08-10',
354+
lastUpdated: '2026-08-24',
355355
relatedRepos: [
356356
'https://github.com/base/base',
357357
'https://github.com/base/contracts/blob/4848ec70d8f1062fec59470d6e731e13ece8a728/src/L2/BaseTime.sol',
358358
],
359359
githubIssues: [],
360-
specUrl: '',
360+
specUrl: 'https://docs.base.org/base-chain/specs/upgrades/denim/200ms-native-blocks',
361361
},
362362
];
363363

app/upgrades/library/upgrades.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ describe('upgrades route helpers', () => {
5454
title: '200ms Blocks',
5555
category: 'execution',
5656
upgrade: 'denim',
57+
specUrl: 'https://docs.base.org/base-chain/specs/upgrades/denim/200ms-native-blocks',
5758
});
5859

5960
const execution = categoryGroupsForUpgrade('denim').find(

0 commit comments

Comments
 (0)