diff --git a/content/mips/_overview.md b/content/mips/_overview.md index fbc7e07..063039f 100644 --- a/content/mips/_overview.md +++ b/content/mips/_overview.md @@ -16,9 +16,12 @@ notes, and a path to activation. - **MIP-8 — Page-ified Storage.** Aligns EVM storage layout with the underlying hardware page boundary, reducing I/O amplification on commits. Final and active on Monad mainnet since the MONAD_TEN upgrade on September 2, 2026. -- **MIP-12 — Decrease Vote Pace.** Shortens the consensus vote pace from 400ms - to 300ms, with the per-block limits and the block reward scaled down - proportionally. A draft consensus-layer change, not yet live on mainnet. +- **MIP-12 — Decrease Block Time.** Final; its 400ms to 300ms target vote pace + activated on Monad mainnet at round 89,758,000 (July 23, 2026). Per-block + transaction, gas, and byte limits fell 25%; the block reward fell from 25 to + 18 MON (28%). At the nominal cadence, capacity limits per second stay the + same while rewards change from 62.5 to 60 MON per second. Target cadence does + not guarantee observed latency or finality; see `mip-12.md` for dated sources. > TODO(author): paste the canonical one-paragraph summary for each MIP here. > Anything below this line in this file is treated as authoritative context by diff --git a/content/mips/mip-12.md b/content/mips/mip-12.md index 95d8cfe..b9144d0 100644 --- a/content/mips/mip-12.md +++ b/content/mips/mip-12.md @@ -1,40 +1,37 @@ -# MIP-12: Decrease Vote Pace +# MIP-12: Decrease Block Time -**Status:** Draft (not live on mainnet) -**Summary:** Shortens the consensus vote pace from 400ms to 300ms, a 25% -reduction, with the related per-block parameters scaled down proportionally so -blocks arrive sooner while each one carries a little less. +**Proposal status:** Final -## Motivation +**Network status:** Activated on Monad mainnet at round 89,758,000 (July 23, 2026, approximately 14:30 UTC). -A block every 300ms instead of every 400ms means about 33% more blocks each -second. Because each block now holds 25% fewer transactions, less gas, and -fewer bytes, the network's per-second capacity stays roughly the same: it is a -faster pipe, not a bigger one. Faster votes also mean faster confirmations and -finality. +**Verified:** October 4, 2026, against the [canonical MIP-12 specification](https://github.com/monad-crypto/MIPs/blob/2a7e18894f1e55fb043080cb8cef15c7f5647768/MIPs/MIP-12.md) and the [official release notes](https://docs.monad.xyz/developer-essentials/changelog/releases#v0-15-1). -## Specification +## Summary -Vote pace leads the change, dropping from 400ms to 300ms. Four more per-block -parameters scale down with it: +MIP-12 is a Final consensus-layer change that reduced the target vote pace from 400ms to 300ms. The mainnet activation was recorded at round 89,758,000. The 300ms figure describes the protocol's target cadence; it does not guarantee a particular observed block latency or time to finality. -- **Vote pace:** how often validators vote on a block. Lower means faster - confirmations and finality. Drops from 400ms to 300ms. -- **Transactions per block:** the most transactions that can be packed into a - single block. Scales down proportionally. -- **Compute per block (gas):** the total computation a block is allowed to do, - where gas is the EVM's unit for compute. Scales down proportionally. -- **Data per block (bytes):** the largest a single block can get, measured in - bytes. Scales down proportionally. -- **Block reward:** the MON paid to the validator that proposes a block. Shrinks - for the same reason, since blocks are smaller and more frequent. +## Parameter changes -## Backwards compatibility +| Parameter | Before | After | Change | +| --- | ---: | ---: | --- | +| Target vote pace | 400ms | 300ms | 25% shorter | +| Transactions per block | 5,000 | 3,750 | 25% lower | +| Proposal gas limit | 200,000,000 | 150,000,000 | 25% lower | +| Proposal byte limit | 2,000,000 bytes | 1,500,000 bytes | 25% lower | +| Block reward | 25 MON | 18 MON | 28% lower | -This is a consensus-layer change only. The execution layer is unaffected and -existing contracts behave exactly as before. Activating it requires a hard fork -on the consensus client. +At the nominal target cadence, the transaction, gas, and byte limits per second stay the same: 12,500 transactions, 500 million gas, and 5 million bytes per second. The reward rate changes from 62.5 to 60 MON per second at those nominal rates; it is not unchanged. -## Discussion link +## Scope and interpretation -https://mipland.org/mip-12 +The MIP changes consensus parameters and does not change execution-layer behavior. A shorter target vote pace is not a measurement of observed block latency or finality, which can vary with network conditions. + +## Sources + +- [Canonical MIP-12 specification (pinned revision)](https://github.com/monad-crypto/MIPs/blob/2a7e18894f1e55fb043080cb8cef15c7f5647768/MIPs/MIP-12.md) — proposal status and parameter values. +- [Monad v0.15.1 release notes](https://docs.monad.xyz/developer-essentials/changelog/releases#v0-15-1) — mainnet activation round and date. +- [Monad v0.15.0 release notes](https://docs.monad.xyz/developer-essentials/changelog/releases#v0-15-0) — testnet activation at round 43,821,000 (approximately July 9, 2026, 14:30 UTC). + +## Discussion + +https://forum.monad.xyz/t/mip-12-decrease-vote-pace/488 diff --git a/src/app/mip-12/opengraph-image.tsx b/src/app/mip-12/opengraph-image.tsx index 5f41f48..d1e2cac 100644 --- a/src/app/mip-12/opengraph-image.tsx +++ b/src/app/mip-12/opengraph-image.tsx @@ -1,7 +1,7 @@ import { ImageResponse } from "next/og"; export const runtime = "edge"; -export const alt = "MIP-12: Decrease Vote Pace"; +export const alt = "MIP-12: Decrease Block Time"; export const size = { width: 1200, height: 630 }; export const contentType = "image/png"; @@ -42,7 +42,7 @@ export default function Image() { marginBottom: "40px", }} > - Decrease Vote Pace + Decrease Block Time {/* 400 → 300 */} diff --git a/src/app/mip-12/page.tsx b/src/app/mip-12/page.tsx index a427300..f30ff35 100644 --- a/src/app/mip-12/page.tsx +++ b/src/app/mip-12/page.tsx @@ -6,14 +6,14 @@ import DiscussionCtaSection from "@/components/DiscussionCtaSection"; import FooterSection from "@/components/FooterSection"; export const metadata: Metadata = { - title: "MIP-12: Decrease Vote Pace", + title: "MIP-12: Decrease Block Time", description: - "A plain-language look at MIP-12: shortening block vote pace from 400ms to 300ms, and what each parameter change actually means.", + "MIP-12 is Final and its 400ms to 300ms target vote pace activated on Monad mainnet. Explore the exact parameter changes and their effects on capacity and rewards.", alternates: { canonical: "/mip-12" }, openGraph: { - title: "MIP-12: Decrease Vote Pace", + title: "MIP-12: Decrease Block Time", description: - "A plain-language look at MIP-12: shortening block vote pace from 400ms to 300ms, and what each parameter change actually means.", + "MIP-12 is Final and its 400ms to 300ms target vote pace activated on Monad mainnet. Explore the exact parameter changes and their effects on capacity and rewards.", url: "/mip-12", }, }; diff --git a/src/app/page.tsx b/src/app/page.tsx index 475e2c6..91d2ce0 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -48,7 +48,7 @@ const structuredData = { ["MIP-3: Linear Memory", "/mip-3"], ["MIP-4: Reserve Balance Introspection", "/mip-4"], ["MIP-7: Extension Opcodes", "/mip-7"], - ["MIP-12: Decrease Vote Pace", "/mip-12"], + ["MIP-12: Decrease Block Time", "/mip-12"], ].map(([name, path], index) => ({ "@type": "ListItem", position: index + 1, diff --git a/src/components/FooterSection.tsx b/src/components/FooterSection.tsx index fc8d646..eba1562 100644 --- a/src/components/FooterSection.tsx +++ b/src/components/FooterSection.tsx @@ -3,7 +3,12 @@ import { usePathname } from "next/navigation"; import { useLanguage } from "@/i18n/LanguageContext"; -const FOOTER_DATA: Record = { +const FOOTER_DATA: Record = { "/mip-8": { specUrl: "https://github.com/monad-crypto/MIPs/blob/main/MIPs/MIP-8.md", specLabel: "MIP-8 on GitHub", @@ -25,9 +30,12 @@ const FOOTER_DATA: Record {data.specLabel} → + {data.activationUrl && ( + + {t("footer.mip12ActivationSource")} → + + )}

diff --git a/src/components/SpecDisclaimer.tsx b/src/components/SpecDisclaimer.tsx index dd25781..a049e26 100644 --- a/src/components/SpecDisclaimer.tsx +++ b/src/components/SpecDisclaimer.tsx @@ -21,7 +21,7 @@ const SPEC_URLS: Record = { mip: "MIP-8", }, "/mip-12": { - url: "https://github.com/monad-crypto/MIPs/blob/main/MIPs/MIP-12.md", + url: "https://github.com/monad-crypto/MIPs/blob/2a7e18894f1e55fb043080cb8cef15c7f5647768/MIPs/MIP-12.md", mip: "MIP-12", }, }; diff --git a/src/components/mip12/WhyProportionalSection.tsx b/src/components/mip12/WhyProportionalSection.tsx index c79402f..bc9b34d 100644 --- a/src/components/mip12/WhyProportionalSection.tsx +++ b/src/components/mip12/WhyProportionalSection.tsx @@ -61,20 +61,20 @@ export default function WhyProportionalSection() { >

- same 1.2s window · more blocks, each 25% smaller + {t("mip12.why.chartNote")}

diff --git a/src/i18n/en.ts b/src/i18n/en.ts index 2b8f9bc..50a9521 100644 --- a/src/i18n/en.ts +++ b/src/i18n/en.ts @@ -44,10 +44,10 @@ const en = { "One reserved slot expands to ~220 selectors. Monad adds opcode-level features without risking collision with future Ethereum upgrades.", }, mip12: { - title: "Decrease Vote Pace", - subtitle: "Faster consensus, scaled proportionally", + title: "Decrease Block Time", + subtitle: "Final · active on Monad mainnet", description: - "A draft proposal to vote on blocks 25% faster, dropping the pace from 400ms to 300ms, with per-block limits scaled down to match. See what each parameter change actually means.", + "MIP-12 is Final and its 400ms to 300ms target vote pace is active on mainnet. See the exact per-block changes and what they mean for capacity and rewards.", }, }, mip8: { @@ -727,21 +727,21 @@ const en = { }, mip12: { hero: { - title: "Faster consensus.", + title: "Shorter target cadence.", before: "400", after: "300", unit: "ms", caption: "vote pace", delta: "−25%", - desc: "MIP-12 proposes a 25% shorter vote pace, dropping from 400ms to 300ms. Related per-block parameters scale down to match, so blocks arrive sooner while each one carries a little less.", + desc: "MIP-12 is Final. Its target vote pace changed from 400ms to 300ms and activated on Monad mainnet at round 89,758,000 on July 23, 2026 (about 14:30 UTC). Target cadence does not guarantee observed block latency or finality.", }, params: { title: "What actually changes", subtitle: - "Vote pace leads the change (above). Four more parameters scale down with it. Here's what each one means in plain terms.", + "The target vote pace and four per-block parameters changed. The cards show the exact before-and-after values.", votePaceName: "Vote pace", votePaceMeaning: - "How often validators vote on a block. Lower means faster confirmations and finality.", + "The target interval for consensus votes. It is not a measurement or guarantee of observed block latency or finality.", txName: "Transactions per block", txMeaning: "The most transactions that can be packed into a single block.", @@ -756,10 +756,14 @@ const en = { }, why: { title: "Why turn down every dial?", - body: "A block every 300ms instead of every 400ms means about 33% more blocks each second. Since each block now holds 25% fewer transactions, less gas, and fewer bytes, the network's per-second capacity stays roughly the same. You're not getting a bigger pipe, just a faster one. The block reward shrinks for the same reason: smaller, more frequent blocks.", + body: "At the nominal target cadence, the 25% lower per-block transaction, gas, and byte limits keep those capacity limits per second unchanged: 12,500 transactions, 500 million gas, and 5 million bytes. The reward falls from 25 to 18 MON per block (28%); at the target cadence, that changes issuance from 62.5 to 60 MON per second, rather than keeping it identical.", + beforeLabel: "400 ms · 3 blocks", + afterLabel: "300 ms · 4 blocks", + chartNote: + "same 1.2s target window · per-block transaction, gas, and byte limits fall 25%", scopeTitle: "What it touches", scopeBody: - "This is a consensus-layer change only. The execution layer is unaffected and existing contracts behave exactly as before. Activating it requires a hard fork on the consensus client.", + "This consensus-layer change does not alter execution-layer behavior. The 300ms target cadence does not guarantee any specific observed latency or finality.", }, }, clearSigning: { @@ -884,7 +888,8 @@ const en = { mip7Note: "MIP-7 aligns with EIP-8163, which reserves 0xAE on Ethereum L1 for non-L1 extension use. All ~220 selectors are currently unassigned; future MIPs will claim specific slots.", mip12Note: - "MIP-12 is a draft proposal to reduce the consensus vote pace from 400ms to 300ms, with proportional cuts to per-block limits and reward. It is a consensus-layer change and is not live on mainnet.", + "MIP-12 is Final. Its target vote pace changed from 400ms to 300ms and activated on Monad mainnet at round 89,758,000 (July 23, 2026, about 14:30 UTC). Verified against the pinned specification and official release notes on October 4, 2026. Target cadence does not guarantee observed latency or finality.", + mip12ActivationSource: "Official activation evidence (release notes)", }, specDisclaimer: { prefix: "The information on this page should not be quoted. Please refer to ", diff --git a/src/i18n/mip12.test.ts b/src/i18n/mip12.test.ts new file mode 100644 index 0000000..053e3a5 --- /dev/null +++ b/src/i18n/mip12.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it } from "vitest"; +import en from "./en"; +import zh from "./zh"; + +describe("MIP-12 localized status", () => { + it("states Final status and mainnet activation in English and Chinese", () => { + expect(en.home.mip12.description).toContain("Final"); + expect(en.mip12.hero.desc).toContain("round 89,758,000"); + expect(en.mip12.why.chartNote).toContain("limits fall 25%"); + expect(en.footer.mip12Note).toContain("activated on Monad mainnet"); + expect(en.footer.mip12Note).toContain("October 4, 2026"); + expect(en.footer.mip12ActivationSource).toContain("activation evidence"); + + expect(zh.home.mip12.description).toContain("已定稿"); + expect(zh.mip12.hero.desc).toContain("89,758,000"); + expect(zh.mip12.why.chartNote).toContain("上限降低 25%"); + expect(zh.footer.mip12Note).toContain("主网"); + expect(zh.footer.mip12Note).toContain("2026 年 10 月 4 日"); + expect(zh.footer.mip12ActivationSource).toContain("官方激活证据"); + }); + + it("removes the stale draft and not-live claims", () => { + const copy = [ + en.home.mip12.description, + en.mip12.hero.desc, + en.footer.mip12Note, + zh.home.mip12.description, + zh.mip12.hero.desc, + zh.footer.mip12Note, + ].join(" "); + + expect(copy).not.toMatch(/draft|not live on mainnet|草案|未在主网上线/i); + }); +}); diff --git a/src/i18n/zh.ts b/src/i18n/zh.ts index 7b27f51..75b15fd 100644 --- a/src/i18n/zh.ts +++ b/src/i18n/zh.ts @@ -44,10 +44,10 @@ const zh = { "一个操作码位,约 220 种扩展可能。Monad 可以添加新功能,而不会跟以太坊未来的升级冲突。", }, mip12: { - title: "缩短投票节奏", - subtitle: "更快达成共识,各项限制按比例调整", + title: "缩短出块时间", + subtitle: "已定稿 · 已在 Monad 主网激活", description: - "该提案草案将区块投票节奏从 400 毫秒缩短到 300 毫秒,并按比例降低每区块限制。了解每项参数变更的实际含义。", + "MIP-12 已定稿,其 400 毫秒至 300 毫秒的目标投票节奏已在主网生效。查看每区块参数的准确变化,以及它们对容量和奖励的影响。", }, }, mip8: { @@ -717,19 +717,19 @@ const zh = { }, mip12: { hero: { - title: "更快的共识。", + title: "更短的目标节奏。", before: "400", after: "300", unit: "ms", caption: "投票节奏", delta: "−25%", - desc: "MIP-12 提议将投票节奏缩短 25%——从 400ms 降到 300ms。相关的每区块参数按比例同步下调,因此区块更快产出,每个区块装得略少——而非更多。", + desc: "MIP-12 已定稿。其目标投票节奏从 400ms 调整为 300ms,并于 2026 年 7 月 23 日约 14:30 UTC 在 Monad 主网第 89,758,000 轮激活。目标节奏不代表或保证实际区块延迟或最终性时间。", }, params: { title: "到底改了什么", - subtitle: "投票节奏是这次改动的主角(见上方)。另有四个参数随之按比例下调——下面用大白话解释每一个的含义。", + subtitle: "目标投票节奏和四项每区块参数都发生了变化。卡片列出准确的调整前后数值。", votePaceName: "投票节奏", - votePaceMeaning: "验证者多久对一个区块投一次票。越低,确认与最终性越快。", + votePaceMeaning: "共识投票的目标间隔;它不是实际区块延迟或最终性时间的测量值,也不构成保证。", txName: "每区块交易数", txMeaning: "单个区块最多能打包的交易数量。", gasName: "每区块计算量", @@ -741,9 +741,13 @@ const zh = { }, why: { title: "为什么每个旋钮都往下拧?", - body: "区块从每 400ms 一个变成每 300ms 一个,意味着每秒多出约 33% 的区块。由于每个区块少装 25% 的交易、Gas 和字节,网络每秒的总容量基本不变。管子没变粗——只是变快了。区块奖励缩水也是同理:区块更小、更频繁。", + body: "按目标节奏计算,每区块交易数、Gas 和字节上限下降 25%,因此每秒这些容量上限保持不变:12,500 笔交易、5 亿 Gas、500 万字节。每区块奖励从 25 降至 18 MON(下降 28%);按目标节奏计算,每秒奖励从 62.5 降至 60 MON,并非保持不变。", + beforeLabel: "400 ms · 3 个区块", + afterLabel: "300 ms · 4 个区块", + chartNote: + "相同的 1.2 秒目标窗口 · 每区块交易、Gas 和字节上限降低 25%", scopeTitle: "影响范围", - scopeBody: "这只是共识层的改动。执行层不受影响,现有合约的行为与之前完全一致。启用它需要在共识客户端上进行一次硬分叉。", + scopeBody: "这项共识层改动不改变执行层行为。300ms 是目标节奏,不保证任何特定的实际区块延迟或最终性时间。", }, }, clearSigning: { @@ -867,7 +871,8 @@ const zh = { mip7Note: "MIP-7 与 EIP-8163 保持一致。EIP-8163 在以太坊 L1 上将 0xAE 保留给非 L1 扩展使用。所有约 220 个选择器目前未分配,由后续 MIP 认领。", mip12Note: - "MIP-12 是一份草案提案,拟将共识投票节奏从 400ms 降至 300ms,并按比例下调每区块上限与奖励。它属于共识层改动,目前未在主网上线。", + "MIP-12 已定稿。其目标投票节奏从 400ms 调整为 300ms,并于 2026 年 7 月 23 日约 14:30 UTC 在 Monad 主网第 89,758,000 轮激活。已于 2026 年 10 月 4 日根据固定版本规范和官方发布说明核验。目标节奏不保证实际区块延迟或最终性时间。", + mip12ActivationSource: "官方激活证据(发布说明)", }, specDisclaimer: { prefix: "本页信息不应作为引用来源。请以 ", diff --git a/src/lib/ai/knowledge.test.ts b/src/lib/ai/knowledge.test.ts new file mode 100644 index 0000000..8ee7ce2 --- /dev/null +++ b/src/lib/ai/knowledge.test.ts @@ -0,0 +1,23 @@ +import { describe, expect, it } from "vitest"; + +import { getKnowledgeBundle } from "@/lib/ai/knowledge"; + +describe("MIP-12 knowledge bundle", () => { + it("loads current MIP-12 status and sourced activation facts", async () => { + const bundle = await getKnowledgeBundle(); + + expect(bundle).toContain(""); + expect(bundle).toContain(""); + expect(bundle).toContain("**Proposal status:** Final"); + expect(bundle).toContain("mainnet at round 89,758,000"); + expect(bundle).toContain("5,000 | 3,750"); + expect(bundle).toContain("200,000,000 | 150,000,000"); + expect(bundle).toContain("2,000,000 bytes | 1,500,000 bytes"); + expect(bundle).toContain("25 MON | 18 MON | 28% lower"); + expect(bundle).toContain("62.5 to 60 MON per second"); + expect(bundle).toContain("does not guarantee a particular observed block latency or time to finality"); + expect(bundle).toContain("Verified:** October 4, 2026"); + expect(bundle).not.toContain("Draft (not live on mainnet)"); + expect(bundle).not.toContain("A draft consensus-layer change, not yet live on mainnet"); + }); +}); diff --git a/src/lib/mip-markdown.test.ts b/src/lib/mip-markdown.test.ts index a021162..275bd9c 100644 --- a/src/lib/mip-markdown.test.ts +++ b/src/lib/mip-markdown.test.ts @@ -3,6 +3,7 @@ import { describe, expect, it } from "vitest"; import { GET as indexMarkdownRoute } from "@/app/index.md/route"; import { GET as llmsTxtRoute } from "@/app/llms.txt/route"; import { GET as mip3MarkdownRoute } from "@/app/mip-3.md/route"; +import { GET as mip12MarkdownRoute } from "@/app/mip-12.md/route"; import { buildHomeMarkdown, buildLlmsTxt, @@ -41,6 +42,25 @@ describe(".md route handlers", () => { ); expect(await res.text()).toBe(await readMipSource("mip-3")); }); + + it("mip-12.md serves the corrected status, parameter facts, and source links", async () => { + const res = await mip12MarkdownRoute(); + const body = await res.text(); + + expect(res.headers.get("content-type")).toBe( + "text/markdown; charset=utf-8", + ); + expect(body).toContain("**Proposal status:** Final"); + expect(body).toContain("round 89,758,000"); + expect(body).toContain("5,000 | 3,750"); + expect(body).toContain("200,000,000 | 150,000,000"); + expect(body).toContain("2,000,000 bytes | 1,500,000 bytes"); + expect(body).toContain("25 MON | 18 MON | 28% lower"); + expect(body).toContain("62.5 to 60 MON per second"); + expect(body).toContain("2a7e18894f1e55fb043080cb8cef15c7f5647768"); + expect(body).toContain("releases#v0-15-1"); + expect(body).not.toContain("Draft (not live on mainnet)"); + }); }); describe("llms.txt", () => {