Skip to content

Instantly share code, notes, and snippets.

@moul
Last active June 10, 2026 08:21
Show Gist options
  • Select an option

  • Save moul/47edc74eb026d52c113510e0daf99ad0 to your computer and use it in GitHub Desktop.

Select an option

Save moul/47edc74eb026d52c113510e0daf99ad0 to your computer and use it in GitHub Desktop.
gno changelog: chain/test12 → test13 (master HEAD) — full PR-linked changelog

gno — changelog chain/test12test13

Range: chain/test12test13 · 228 commits · 2026-03-13 → 2026-06-10 test13 candidate: 16b40ab59 (master HEAD at time of writing — the tag chain/test13 is not cut yet) Diffstat: 3,340 files changed, +221,808 / −34,393

⚠️ chain/test13 is not tagged yet. test13 is the release that will be cut from master, so this changelog pins the current master HEAD (16b40ab59) as the test13 candidate and diffs chain/test12..16b40ab59. When chain/test13 is tagged, re-run against the tag — the delta is identical unless more commits land on master first. (git fetch --tags && git log chain/test12..16b40ab59.)

Covers every PR merged since the chain/test12 tag, generated by diffing chain/test12..16b40ab59.


📋 Executive summary

test13 is a consensus-breaking release dominated by the interrealm-semantics overhaul (Phase 3): /p/ packages and stdlib become persistent frozen Realms, cross-realm panics from /p/ now abort (uncatchable by recover(), use the new revive() primitive), and the legacy N_Readonly provenance taint is removed in favor of a single PkgID ownership gate at the pointer-deref boundary. ~700 example files were migrated to the capability-style cur realm / IsCurrent() API.

The gas & storage model was re-parameterized and calibrated from real benchmarks (per-native gas calibration, per-realm storage deposit, proportional storage-deposit refunds), and persisted state shrank via type-dedup at TypeValue position. Operationally, chain hardfork v3, GovDAO-based chain halt, coordinated halt_height upgrades, valset limits, and session accounts (delegated signing keys with spend limits) all landed. gnoweb gained an omnibar search, gnokey defaults to -broadcast=true, and a large batch of security hardening (path-traversal, markdown-injection, consensus-safety, DoS/unmetered-tx, faucet anti-abuse) shipped.

Operators/validators: review the hardfork v3, halt_height, valset-limit, and genesis/replay changes before upgrading. Realm authors: the interrealm breaking changes require code migration — see below.


🚨 Breaking changes

Each item ships an actionable migration recipe.

1. Interrealm Phase 3 — persistent /p/ Realms, abort-on-panic, capability ACLs — #5669 (1bed667a3)

/p/ packages and stdlib are now persistent frozen Realms. Three concrete migrations:

  • recover() no longer catches cross-realm panics from /p/. They are now aborts.

    • Tests: replace uassert/recover-based expectations with urequire.AbortsWithMessage(...) / urequire.NotAborts(...).
    • Code that must catch: use the new revive() builtin (state mutations before the abort still persist — revive() only resumes control flow).
  • realm.Origin() was removed (unused). Use runtime.OriginCaller() for the origin address.

  • runtime.PreviousRealm().PkgPath() inside a non-crossing function never identified the immediate caller — that pattern was a latent auth bug and has been corrected across examples. Authenticate via an explicit cur realm parameter + rlm.IsCurrent() gate, or use the new IsUserCall() / IsUserRun() / IsCode() / IsEphemeral() methods on runtime.Realm.

    // before (WRONG inside a non-crossing helper):
    if std.PreviousRealm().PkgPath() != "gno.land/r/foo" { panic("unauthorized") }
    
    // after: take the caller capability explicitly and gate on IsCurrent()
    func doThing(_ int, rlm realm, ...) {
        if !rlm.IsCurrent() { panic("unauthorized") }
        ...
    }

2. Remove N_Readonly provenance taint; fix cross-realm /p/-type arithmetic — #5747 (310dc2a04)

The sticky read-time taint layer is deleted. Direct cross-realm writes are still blocked by the PkgID ownership gate (PopAsPointer2IsReadonly), but provenance-only protections (value-copy laundering, borrow+alias laundering, type-pun conversions) are intentionally dropped and become the realm author's responsibility.

  • Migration: code that relied on the taint panic (cannot directly modify readonly tainted object) to block laundering must now enforce its own invariants. Conversely, the common false-positive is gone: a /r/ realm doing in-place uint256-style arithmetic on a freshly-allocated /p/-declared value handed in from another realm no longer panics. {Array,Struct}Value.Copy is now type-driven: a /p/-declared type keeps the copying realm's PkgID; a /r/-declared type keeps its /r/ owner.

3. Dedupe type persistence at TypeValue position — #5544 (8cfb2c1d3)

Each DeclaredType now has exactly one canonical persisted definition at /t/<TypeID>; TypeValue positions serialize as a compact RefType{ID} instead of an inlined copy.

  • Migration: persisted-state-breaking — block byte layouts change (smaller). Requires a fresh chain / genesis; not state-compatible with test12. No realm source changes needed. See gnovm/adr/prxxxx_typevalue_ref_persistence.md.

4. Move runtime (GC/MemStats) to testing stdlibs — #5321 (afd7e4808)

GC() / MemStats() are now only available under gnovm/tests/stdlibs/runtime/ and cannot be imported by on-chain realm/package code.

  • Migration: remove any on-chain import of runtime GC/MemStats (they had no legitimate on-chain use; keeping them would freeze allocator byte-counting internals into consensus). Filetests using alloc_*.gno keep working. Backward-incompatible with gnoland1.

✨ Features

  • gnoland1 (betanet) genesis — #5250 (3a60bd305)
  • boards2: safe functions for realm or off-chain integration — #5037 (4d4478b54)
  • gnovm: support variadic arguments on maketx call — #5040 (908d1f7f4)
  • faucet: Expose IP rate limiting parameters and improve IP parsing — #5352 (d9be73579)
  • gnoweb: add beta banner — #5323 (3c9f07b4c)
  • add new govdao-scripts — #5375 (0886378db)
  • gnoland: cherry-pick version command from chain/gnoland1 — #5412 (391938e8f)
  • contribs: cherry-pick gnobr from chain/gnoland1 — #5419 (232a4c217)
  • boards2: change permissions to use less storage — #5346 (d5ce782e3)
  • govdao: allow proposal rejection on execution error — #5261 (197281f48)
  • boards2: add function to update required amount for open board interactions — #5349 (e9a28cb1c)
  • node: add halt_height config field for coordinated chain upgrades — #5334 (b9471b776)
  • gnovm: implement iterative exception recovery to prevent stack overflow — #5439 (3be0408f0)
  • examples: add bitset package — #5430 (af90c41dc)
  • gnoweb: Add Source and Action button for realm explorer — #5032 (e6637e7d0)
  • remove p/nt/ownable dependency in r/sys/names — #5244 (375fe89c6)
  • improve rendering of r/sys/cla realm — #5331 (571c798e3)
  • gnokey: improve CLA error display — #5325 (5b03fa0d5)
  • stdlibs: implement realm.SentCoins()#5039 (96b2b4163)
  • gnokey: -broadcast=true by default — #4965 (8022c646b)
  • amino: add genproto2 — direct protobuf3 wire encoding without protoc — #5282 (e8aac7575)
  • examples: add murmur3 hashing package — #5424 (190cbdbc3)
  • auth: account sessions — delegated signing keys with spend limits and path restrictions — #5307 (fdce3c124)
  • node: add GovDAO-based chain halt via r/sys/params — #5368 (7775e4479)
  • valset updates via VM params keeper (v3) — #5485 (e16676eec)
  • r/sys/namereg/v1: Open Nym Tier + canonical unification in r/sys/users — #5600 (5baf1be5f)
  • gnoland: chain hardfork mechanism v3 — #5511 (db1e3ec26)
  • gnokey: Add session account support — #5614 (29f640f07)
  • add validator scenario test harness and CI workflow — #5454 (10158bc74)
  • misc: rewrite install.sh as precompiled binary downloader — #5492 (68cb7b898)
  • govdao-scripts: normalize v2 scripts + add v3/namereg/valoper-register — #5658 (eb9f51920)
  • gnoweb: accept gno.land URLs in search bar — #5612 (6966ea213)
  • validators: limit valset changes — #4834 (145ed8f50)
  • gnogenesis/fork: parallel multi-endpoint RPC block fetching — #5693 (b061b558d)
  • gnogenesis: verify catches uncovered hardfork genesis validators — #5702 (fb55a6b0a)
  • gnogenesis/fork: orthogonal txs / genesis source flags + offline gnoland-data txs reader — #5696 (256a29cea)
  • gnovm: type-driven PkgID stamping for *StructValue at allocation & realm .seal — #5706 (4166be993)
  • tm2: tmkms-compat (1/3) — amino varint, canonical retag, vendored protos, golden vectors — #5716 (d8a351e75)
  • gnovm/stdlibs: IBC crypto stdlibs (bn254, cometbls, keccak256, merkle, modexp) — #5725 (b47faa8e7)
  • markdown: chain/markdown stdlib + p/nt/markdown/sanitize/v0 + safe p/moul/md helpers — #5714 (72aff5a95)
  • grc721: emit realm-qualified collection ID in NFT events — #5745 (263a143cc)
  • gnoweb,boards2: gno-foreign markdown sandbox + rich, paginated comments — #5759 (d889afdc5)
  • examples/urequire: add missing uassert wrappers — #5673 (889405c34)
  • enable inter-realm mode in 'gno run' — #4288 (456e24a1c)
  • gnoweb: add SimpleAnalytics metadata and custom events — #5554 (d61687107)
  • gnoweb: add omnibar search for realms, packages and users — #5761 (bf5b31eda)

🐛 Bug fixes

  • gnoweb: hide broken Source/Actions buttons on static markdown pages — #5305 (7f6f79853)
  • gnovm: simplify float value conversion — #5311 (cfe24dffe)
  • gnovm: compile time mapkey assertion — #5309 (eef3b2293)
  • govdao: implement abstain vote — #5271 (ce2ba67f6)
  • gnovm: call DidUpdate on DataByte index assignment — #5318 (a3a356e71)
  • gnovm: correct allocation while restoring — #4805 (e6da9024a)
  • gnovm: const uint64 overflow check — #5269 (6a6fc4c71)
  • gnovm/doc: use import path instead of package name in package line — #5262 (72c432b69)
  • tm2: correct log level misclassifications across node components — #5315 (a82373a4d)
  • gnovm: don't print GAS line in non-verbose test output — #5225 (ebb7a13f8)
  • blockchain: recalculate maxPeerHeight when peer lowers its height — #5228 (8d17f08e3)
  • home: broken homepage link — #5339 (fe7e38b7e)
  • codegen: handle git worktrees correctly when detecting git roots — #5302 (339579739)
  • add static content pages for dead gno.land links — #5351 (ccbcd67c9)
  • gnovm: register vm amino types in gno CLI — #5357 (6d40b3207)
  • stdlibs/chain: make Coins.AmountOf panic for duplicate denoms — #5099 (81d9f806c)
  • vm/keeper: cherry-pick typeCheckCache stdlib fix from chain/gnoland1 — #5401 (c59fc2eb0)
  • gnovm: enforce int type for untyped variadic arguments in make — #5249 (2d7f19362)
  • gnovm: implement Go-compliant variable initialization order — #5247 (50ee56e64)
  • amino: return error instead of panic for malformed type_url — #5399 (8b8e1f8e7)
  • chain build workflow dispatch — #5413 (7211a773e)
  • gnovm: reject chan type at preprocess/runtime — #5238 (4bcd9828e)
  • examples: format r/sys/users/admin.gno — #5427 (a385538f3)
  • ci: make FOSSA workflow_dispatch only — #5449 (bb427de28)
  • gnovm: inconsistency in the single-linked list implementation (cont.) — #4960 (4598c267d)
  • gnovm: deep-copy array elements in ArrayValue.Copy — #5445 (c64feef1d)
  • gnoland: prevent duplicate validator removals in EndBlocker — #5356 (b97785036)
  • ci: use local checkout for Docker bake source — #5483 (c9c4e880b)
  • gnobr: read LastResultsHash from block header instead of ABCI responses — #5443 (17bcc64cd)
  • gnodev: rewrite lazy loading proxy as HTTP reverse proxy — #5276 (9ff6f5c44)
  • add generic markdown customized banner — #5378 (df30676ac)
  • tm2/client: return error message when ID is missing — #5081 (c035dd833)
  • gnovm: correct len/cap/hint type check — #5391 (4c858f5bf)
  • wrap correct error when creating in-memory node — #5232 (4cd18fc56)
  • gnovm: post loopvar fixes (2) — #5266 (930377606)
  • gnovm: recoverable panic, runtime error prefix — #5501 (326832e56)
  • gnovm: add validation on alloc constructors and caller side — #5498 (26dc377ab)
  • gnovm: use static type in doOpRef for correct interface pointer types — #5474 (659bbb495)
  • gnovm: assert index non-negative for const in preprocess. — #5141 (c6d9832f0)
  • docs/linter: retry transient URL failures, add HTTP timeout — #5538 (96080c026)
  • false cycle detection for valid multi-value var declarations — #5336 (2f6166a72)
  • gnoweb: render function doc markdown as HTML in Help view — #5562 (066f15a79)
  • amino: nil_elements + AminoMarshaler repr-zeroness + BinFixed64 + cross-codec parity harness (alt of #5569) — #5590 (facbfe3a8)
  • gnovm: add preprocessor checks for unexported fields in struct literals — #5240 (2dfe3a291)
  • gnovm: fix debug mode panics during uverse initialization — #5440 (7b6282fc8)
  • gnovm: correctly retrieve owner of an object — #5285 (7a6f5ebed)
  • misc: Update stress-test-many-posts — #5617 (cd97e45f3)
  • gnokey sign -output-document help — #5635 (6423b725c)
  • val-scenarios: remove stopped container before restart to avoid port conflict — #5659 (bc94a8c57)
  • ci: bump Go version to 1.25.9 — #5441 (2055dc5df)
  • tm2,gnoland: stream /genesis RPC and on-disk genesis cache — #5684 (5d0a4d703)
  • ci: persist credentials in dependabot-tidy so push succeeds — #5685 (626ff0392)
  • valopers: reject UpdateSigningKey rotation onto an active validator slot — #5700 (b5ff3dc55)
  • gnoland: panic on genesis valoper coverage assertion failure — #5701 (cbbe18e60)
  • gnofaucet: apply reward debit after claim succeeds, atomically — #5697 (7bea46999)
  • gnogenesis: decode auth/accounts as gnoland.GnoAccount — #5647 (cd3adeb21)
  • gnovm: allow []byte -> string cast on realm owned fields — #4831 (fe76c046b)
  • gnovm: show failing path on setup error in gno test — #5521 (88495cb95)
  • gnolang: O(N²) in Go2Gno Span for chain-shaped AST types — #5648 (b1b04798c)
  • gnovm: make LeftmostX return true root of chains — #4824 (67f2e312f)
  • interact-with-gnokey multisig needs -broadcast=false — #5729 (c260e5cb5)
  • gnoweb: copy origin — #5615 (3961a0d09)
  • tm2: make test p2p clusters dial each pair in one direction only — #5781 (366fcd38f)
  • nil ptr when discarded key and value not present on range — #5751 (16b40ab59)

⚡ Perf / gas / storage

  • gnovm: proper gas consumption for mem allocation — #5091 (5d5f9213f)
  • gnovm: track block item allocations in PrepareNewValues — #5436 (e4533a45c)
  • gnovm: paramterize and calibrate gas model (from Xeon 8168 benchmarks) — #5291 (1ad092227)
  • tm2,gnovm,gno.land: gas storage — #5415 (4e1745ab4)
  • gnovm: fix regression introduced by #5291, which was fixed by #5284 — #5587 (dc7244951)
  • gnovm: fix regression by #5291, restore alloc counting from #4805 — #5607 (80ed79db0)
  • gnovm: add per-element gas metering for array/struct/string equality comparisons — #5154 (b2bf65397)
  • vm: per-native gas calibration + per-realm storage deposit — #5629 (45480c6b1)
  • consume gas on ComputeMapKey — #5127 (720af8bcd)
  • ci: run gno.land txtar integration tests on in-memory nodes — #5748 (bc5795fb2)
  • gnovm: use proportional refund for storage deposit to prevent fund lock on storage price change — #5198 (ba9da8eb3)
  • ci: speed up the gno.land test job (in-memory parallel txtars + per-package fixes) — #5750 (99d2f3fb2)

🔐 Security

Hardening across the VM, consensus/p2p, markdown rendering, and faucet. Many close panic/DoS or cross-realm-corruption classes.

  • gnofaucet: improve hCaptcha api compliance & observability — #5286 (c1befb39d)
  • p2p: validate received node info to prevent nil NetAddress crash — #5251 (553b1c701)
  • faucet: avoid IP spoofing — #5353 (fe3d82d23)
  • faucet: don't allow request bursts on ip limits — #5362 (687eba2d3)
  • examples: prevent markdown injection in Render outputs — #5418 (7cb2e9b12)
  • tm2/bft: add nil checks for block and block meta retrievals — #5137 (786f06ba2)
  • consensus: error when block header parts are too big — #5246 (f7a23f1ea)
  • tm2/rpc: prevent index out of bounds panic — #5136 (e72b47960)
  • tm2: reject block parts with mismatched proofs in AddPart — #5479 (b56b78f1e)
  • gnovm: skip closure frames in AssertOriginCall origin check — #5407 (d27fdaff5)
  • tm2/rpc: handle malformed elements in batch requests — #5447 (bb3528ab6)
  • gnoweb: apply IsDangerousURL to angle-bracket autolinks — #5515 (acdaf12c1)
  • gnovm: prevent cross-realm state corruption via NameExpr assign+recover pattern — #5330 (f87249327)
  • tm2: fix three CodeQL high-severity alerts — #5573 (c5880ab36)
  • tm2/rpc: don't panic when txDispatcher subscription closes on shutdown — #5561 (3e2b17c9e)
  • tm2: add duplicate peer protection — #5319 (5111dbc22)
  • gnolang: preprocess hardening — per-tx allocator + caps — #5642 (c98a2cdca)
  • vm: bound panic-Log rendering to prevent unmetered long running txs — #5643 (4bb497abe)
  • gnovm: add nil checks for unsafe .V type assertions — #5196 (6dad8e39d)
  • gnovm: generate proper Gno panic for nil function calls — #5711 (a7e4c34b0)
  • tm2/consensus: avoid re-signing known self votes — #5348 (9a885e15a)
  • markdown: BlockRich (more permissive Block), and BlockquoteRich (more permissive Blockquote) — #5744 (e9347f106)
  • gnovm: close the nil-realm cross-realm write hole for /p/ and stdlib — #5758 (2c7f1abe3)
  • consensus: handle conflicting votes instead of panicking — #5216 (4b3479e1c)
  • prevent path traversal in pkgdownload.Download and MemPackage.WriteTo#5219 (a20d9d7fc)
  • gnovm: recoverable panic on nil interface method call — #5715 (df91bada8)
  • p/nt/markdown/sanitize: reject any query in mailto URLs — #5743 (8778b541f)

🏗️ Internals / refactors / chores

Includes the store-structure work (bptree B+ tree with the same ITree API as avl, boards2 migrated off avl), CI/workflow hardening (actionlint + zizmor), and stdlib/amino plumbing.


📚 Docs

  • update links to staging.gno.land#5279 (4059baf2e)
  • add agent-friendly documentation (AGENTS.md, ADRs, contributing guide) — #5265 (891989adc)
  • reformat CLA.md to 80 columns and fix markdown — #5312 (602294554)
  • add RELEASING.md with versioning and branching strategy — #5275 (cd7a79ddd)
  • gnoland1: improve docs for joining gnoland1 — #5453 (bf217205c)
  • testing govDAO halt height — #5476 (b442d75c4)
  • improve network table formatting and label Betanet as current — #5470 (52a136b35)
  • Fix 2 errors on IsEphemeral and realm sequence — #5513 (99843a484)
  • fix broken code and typos in minisocial tutorial — #5508 (e26dacb8f)
  • fix outdated CLI syntax and examples in gnokey reference — #5509 (23ce1c6cc)
  • fix inaccurate gnomod.toml field documentation — #5510 (17ffc066f)
  • fix stale references, broken links, and minor inconsistencies — #5512 (cc3134f8c)
  • update outdated std and API references to match current codebase — #5506 (4404e581f)
  • fix missing cross and add gnomod.toml to gnokey addpkg section — #5516 (2b4bf1565)
  • manifesto: replace outdated gno-by-example link with docs.gno.land — #5536 (b463133ee)
  • fix remaining stale std package references — #5541 (dc30ea6f6)
  • constitution: $GNOT vesting schedule and inflation — #5566 (0804bb54e)
  • remove supernova walkthrough — #5652 (76fec799e)
  • add dedicated installation page — #5552 (a28468f28)
  • add getting started (alternative to #5519) — #5592 (64c945f1b)
  • add editor setup guide — #5553 (7922f54af)
  • streamline getting started section — #5746 (9cd16101e)
  • interrealm-v2: correct /p/ copy-stamping description for #5747 — #5773 (ecc5c9fe2)
  • list per-function stdlib gaps in compatibility doc — #5677 (d01db8f38)
  • getting-started: fix accuracy and tighten prose — #5755 (4c9de5225)
  • gnovm: document pointer equality divergence for zero-sized types — #5771 (cc490acaf)

🧪 Tests

  • gno.land: restore exact-value checks in gas/storage txtars — #5560 (711a5a511)

🤝 Contributors

Merged work in this range, by commit count (git shortlog -sne chain/test12..master):

Morgan Bazalgette · moul · David (davd-gzl) · Jae Kwon · ltzmaxwell · Jerónimo Albi · Jeff Thompson · Guilhem Fanton (gfanton) · 6h057 (omarsy) · Alexis Colin · Antoine Eddi · Miguel Victoria Villaquiran · Antonio Navarro Perez · Lee ByeongJun · MikaelVallenet · Rémi Barbero (d4ryl00) · Sergio Maria Matone · Thomas Bruyelle · Amoz Pay · Aron Park · Audren Bouëssel du Bourg · Clockwork · Dongwon · Marc Vertes · Nemanja Aleksic (kouteki) · operagxoksana · piux2

Full diff: https://github.com/gnolang/gno/compare/chain/test12...master

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment