Range: chain/test12 … test13 · 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/test13is not tagged yet. test13 is the release that will be cut frommaster, so this changelog pins the currentmasterHEAD (16b40ab59) as the test13 candidate and diffschain/test12..16b40ab59. Whenchain/test13is 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/test12tag, generated by diffingchain/test12..16b40ab59.
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.
Each item ships an actionable migration recipe.
/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 withurequire.AbortsWithMessage(...)/urequire.NotAborts(...). - Code that must catch: use the new
revive()builtin (state mutations before the abort still persist —revive()only resumes control flow).
- Tests: replace
-
realm.Origin()was removed (unused). Useruntime.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 explicitcur realmparameter +rlm.IsCurrent()gate, or use the newIsUserCall()/IsUserRun()/IsCode()/IsEphemeral()methods onruntime.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") } ... }
The sticky read-time taint layer is deleted. Direct cross-realm writes are still blocked by the PkgID ownership gate (PopAsPointer2 → IsReadonly), 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-placeuint256-style arithmetic on a freshly-allocated/p/-declared value handed in from another realm no longer panics.{Array,Struct}Value.Copyis now type-driven: a/p/-declared type keeps the copying realm's PkgID; a/r/-declared type keeps its/r/owner.
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.
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
runtimeGC/MemStats (they had no legitimate on-chain use; keeping them would freeze allocator byte-counting internals into consensus). Filetests usingalloc_*.gnokeep working. Backward-incompatible with gnoland1.
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
bitsetpackage — #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
murmur3hashing 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.landURLs 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)
- 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
chantype 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)
- 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)
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
AssertOriginCallorigin 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.DownloadandMemPackage.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)
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.
- gnoweb: update SVG logo to be visible on Safari — #5255 (
c1a785ad7) - gnovm: correct some realm assertion messages — #5284 (
77199c58b) - staging: Updating references to staging.gno.land — #5278 (
04231a461) - skip PR title lint when source branch is master — #5310 (
e5a84cf84) - boards2: remove the test address leaving only the multisig one — #5280 (
4a84645f9) - misc/genproto: add comment to generated go files — #5264 (
756aa496a) - gnovm: remove deadcode — #4807 (
1d5dc521b) - misc: add WASM build script — #5359 (
d48424286) - github-bot: Add davd-gzl to review team members — #5363 (
80115c11a) - update static page content — #5367 (
27ee20897) - gnovm: rename isIntNum to isWhole — #5322 (
05c1bfb27) - update boot node in config.toml — #5381 (
4dc22a442) - improve chain docker builds (tag format, dispatch, rename) — #5408 (
201b898f2) - boards2: change unauthorized message to add more context — #5397 (
f4fa16c6c) - govdao: Allow GovDAO to register names without restrictions from controllers — #5293 (
334c773e2) - ci: make all codecov checks informational — #5403 (
e6b600bec) - boards2: add original thread ID to
hubrealm thread reposts — #5398 (fcb732bda) - ci: refactor workflows — #5423 (
e97423007) - ci: add actionlint + zizmor linting, fix all findings — #5452 (
593d4e2e3) - gnovm: set gnovm toolchain according to go.mod — #5212 (
fc78cc724) - benchops: gap-free timing model and measurement fixes — #5289 (
0326734b6) - tm2: remove resolved TODO comments in
state/store.go— #5290 (d4945b81b) - clean usages of fail.Fail() function — #5267 (
6b80561fe) - std: Make non-panic versions of AddressFromBytes and NewCoin — #5329 (
a1c388e3a) - boards2: escape thread titles — #5434 (
73b07b821) - update .mailmap — #5514 (
47229dc77) - github-bot: Add aronpark1007 to review team members — #5505 (
8e27ed35c) - gno: fix
gno testto update golden filetests in place — #5517 (928bc14bf) - contribs/tx-archive: register chain stdlib amino types — #5535 (
5ffdbd680) - gnovm: remove unreachable panic in doOpEnterCrossing — #5490 (
d6ffd22d5) - docs-linter: skip staging.gno.land URLs — #5539 (
fa24bdde6) - tm2: remove libtm — analysis shows integration not viable — #5534 (
679a80405) - vm: replace custom JSON types with standard Amino encoding (alternative to #4972) — #5274 (
66cdd5002) - bptree: add mutable B+ tree with same ITree API as avl — #5475 (
ca96b7061) - boards2: use
bptreeinstead ofavlpackage — #5568 (81a0aa675) - tm2/rpc: move rpc/core globals into per-node Environment — #5574 (
81cbf049b) - gnovm: remove duplicate Makefile targets — #5616 (
672b71f35) - Remove unused keyscli MakeTxCfg — #5632 (
ce6383ebe) - test: Remove unneeded -broadcast flag in txtars — #5630 (
bfcac2ae0) - gnovm: wire Copy/UnrefCopy benchmarks into calibrate pipeline — #5548 (
c538a307d) - govdao: shared scripts with deployment wrapper — #5426 (
c8a4ef68c) - ci: Removing outdated CI job for benchmarks — #5650 (
c17c97460) - boards2: fix realm (package) documentation — #5636 (
6f43985f5) - gnokey: Add simulate optional parameter -gas-fee-margin — #5112 (
8ac234874) - extract non-test-13 example packages to examples/quarantined/ — #5726 (
5c52b5dba) - gnovm: simplify DeepFill for constant value types — #4891 (
9b0de239e) - add binary releases for chain/* tags — #5420 (
11b05a426) - ci: remove Codecov from CI workflows — #5795 (
515ffcd32)
- 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
stdpackage 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)
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