Releases: RaoFoundation/subtensor
Release list
Runtime 432
What's Changed
- Consolidate pending PRs into staging by @unarbos in #2927
- reuse canonical alpha iterator helper by @UnArbosSix in #2929
- Publish tested localnet images and restore clippy by @UnArbosFive in #2928
- Make privilege first-class across intents, CLI, and docs; add root emission intent by @unarbos in #2910
New Contributors
- @UnArbosSix made their first contribution in #2929
Full Changelog: v431...v432
Runtime 431 (proposed)
Proposed runtime upgrade to spec 431 (awaiting signatures)
CI has submitted its half of the 2-of-2 deployment multisig for this
upgrade on finney. It executes once the sudo multisig (triumvirate)
produces the second approval. This tag is the exact code being
deployed.
Sign it
Each triumvirate member runs:
btcli upgrade sign --url https://github.com/RaoFoundation/subtensor/releases/tag/v431 -w <your-wallet>
btcli verifies the call data against the chain (structure, sudo key,
on-chain call hash) before submitting, and picks the right approval
(first / interior / final) from chain state automatically.
Verify it independently (recommended)
Build the runtime from this tag with srtool and compare byte-for-byte
(see .github/scripts/deploy/README.md for the full recipe):
git fetch origin && git checkout v431
# srtool build, then:
btcli upgrade check --url https://github.com/RaoFoundation/subtensor/releases/tag/v431 --wasm <path/to/your-build.wasm>
Without --wasm, btcli upgrade check --url https://github.com/RaoFoundation/subtensor/releases/tag/v431 still verifies
the published artifacts against each other and the chain, but trusts
the released wasm; a local srtool build closes that gap.
Proposal details
| spec_version | 431 |
| commit | 32f3b652cfa74df5f8f595a5be051bf5bb86925f |
| call hash | 0x0e3db1de709f56aa15e93da55427b7852a292dfd84a349d460c8be5adec3a43e |
| deployment timepoint | 8621971:21 |
| CI key | 5EqaWfYWgPWfXRFaM2hXbATkVGKdEJBznoyEUnVi8aGfN1bA |
| deployment multisig | 5CzMP6tiNjKx3YiTbuPebLHZCtuomzTPzEGvG711iemY6u2f |
| wasm sha256 | 0xdff349a56cfa42650b046c1d1d2efdc75a8e465ec0600135f6245d2d9e7a34ff |
Runtime 430 (proposed)
Proposed runtime upgrade to spec 430 (awaiting signatures)
CI has submitted its half of the 2-of-2 deployment multisig for this
upgrade on finney. It executes once the sudo multisig (triumvirate)
produces the second approval. This tag is the exact code being
deployed.
Sign it
Each triumvirate member runs:
btcli upgrade sign --url https://github.com/RaoFoundation/subtensor/releases/tag/v430 -w <your-wallet>
btcli verifies the call data against the chain (structure, sudo key,
on-chain call hash) before submitting, and picks the right approval
(first / interior / final) from chain state automatically.
Verify it independently (recommended)
Build the runtime from this tag with srtool and compare byte-for-byte
(see .github/scripts/deploy/README.md for the full recipe):
git fetch origin && git checkout v430
# srtool build, then:
btcli upgrade check --url https://github.com/RaoFoundation/subtensor/releases/tag/v430 --wasm <path/to/your-build.wasm>
Without --wasm, btcli upgrade check --url https://github.com/RaoFoundation/subtensor/releases/tag/v430 still verifies
the published artifacts against each other and the chain, but trusts
the released wasm; a local srtool build closes that gap.
Proposal details
| spec_version | 430 |
| commit | 9c8e26e7fccc76327ab5204f7978aa2e4d86efd6 |
| call hash | 0xd3cdbbaac34d4a79a36374a6e325b486e21cf311353165e05b5fb48b4e613911 |
| deployment timepoint | 8614043:27 |
| CI key | 5EqaWfYWgPWfXRFaM2hXbATkVGKdEJBznoyEUnVi8aGfN1bA |
| deployment multisig | 5CzMP6tiNjKx3YiTbuPebLHZCtuomzTPzEGvG711iemY6u2f |
| wasm sha256 | 0x4c6a1ba447118e4353d8356383e401bcd8762a1161a3e73ada7a8fe82497aff4 |
v3.4.9-424
v3.4.8-423
What's Changed
- Governance refactoring (V1 -> V2) by @shamil-gadelshin in #2620
- Added dev test for the setCode tx by @evgeny-s in #2628
- Governance update 1 by @shamil-gadelshin in #2627
- Referenda benchmarks by @l0r1s in #2626
- Add getNetworkRegistrationBlock view to SubnetPrecompile by @fine135 in #2674
- Remove the per-block staking operation rate limiter by @evgeny-s in #2712
- Pallet advanced limit orders by @girazoki in #2554
- Adapt rate limits after disabling in-block staking rate limit by @evgeny-s in #2720
- [Re-merge] Fix for arithmetic side effect by @evgeny-s in #2722
- Re-enable balancer by @gztensor in #2505
- fix failed eco test by @open-junius in #2725
- Governance by @l0r1s in #2198
- Remove CreateSignedTransaction deadcode by @l0r1s in #2479
- Optimize locks to avoid full iteration of lock map by @gztensor in #2701
- Fix issues in conviction by @gztensor in #2744
- fixes pallet limit orders by @girazoki in #2732
- Add
StakeInfoRuntimeApi.get_stake_availability_for_coldkeysruntime API by @basfroman in #2742 - Fix & Add Benchmarks by @JohnReedV in #2749
- Improve Efficiency of Timelocked Commitments by @JohnReedV in #2751
- fix pallet_subtensor_swap weight info by @JohnReedV in #2752
- Added eco-tests for indexer + CI job to notify the indexer team by @evgeny-s in #2624
- fix timeout in ts e2e dev test by @open-junius in #2756
- Remove pallet-registry from runtime by @l0r1s in #2747
- record db cost for precompile view functions by @open-junius in #2757
- fix eco test with two deprecated variables by @open-junius in #2762
- Adds
min_childkey_taketo hyperparams v3 by @thewhaleking in #2761 - [Feature] Configurable Tempo & Owner-Triggered Epochs by @evgeny-s in #2638
- Fixed dev tests by @evgeny-s in #2776
- Added a possibility to configure max epochs per block. by @evgeny-s in #2770
- pallet-signed-voting extracted from governance umbrella PR by @l0r1s in #2713
- Switch subnet emissions to price-based shares by @gztensor in #2779
- Convert transaction extensions to dispatch extensions by @l0r1s in #2773
- feat(chain-extensions): add read-only WASM queries for subnet registration, coldkey lock, and stake availability by @silva-fj in #2768
- Fix contract tests balance checks + benchmarks by @l0r1s in #2783
- Back propagate new subnet emission off by @gztensor in #2788
- migrate contract e2e by @open-junius in #2716
- Girazoki fix pallet limit orders bugs by @girazoki in #2791
- Back propagate new subnet emission off - clean merge by @gztensor in #2790
- Postpone gov preparation by @l0r1s in #2796
- mainnet deploy June 24th, 2026 by @sam0x17 in #2769
New Contributors
Full Changelog: v3.4.7-422...v3.4.8-423
v3.4.7-422
What's Changed
Full Changelog: v3.4.6-421...v3.4.7-422
v3.4.6-421
What's Changed
Full Changelog: v3.4.5-419...v3.4.6-421
v3.4.5-419
Security hotfix — resolves a set of findings from a recent security audit, primarily hardening the proxy permission system along with several hotkey-swap and staking edge cases. Mainnet upgraded to spec_version 419. All findings were reproduced with regression tests before being fixed.
🔒 Security advisories
| Advisory | Severity | Summary |
|---|---|---|
| GHSA-m759-m8mv-q3m5 | 🟠 High | Restricted proxies (NonTransfer/NonFungible/NonCritical) can take over an entire coldkey via the announce/swap coldkey-swap lifecycle |
| GHSA-qh57-vpv2-3fvp | 🟠 High | NonFungible proxy denylist omits live swap_hotkey_v2 (call 72), letting a scoped delegate reassign a victim's hotkey identity |
| GHSA-xm63-2wwx-pm6w | 🟡 Moderate | Owner proxy except sudo_set_sn_owner_hotkey carve-out is bypassable via the duplicate alias sudo_set_subnet_owner_hotkey |
| GHSA-h98r-p37h-h4mv | 🟡 Moderate | set_weights/commit_weights family is Pays::No with the per-neuron rate limit enforced only in the dispatch body, enabling fee-free block-fill flooding |
| GHSA-6c95-q3r3-rgwq | 🟢 Low | Root cleanliness gate omits RootClaimed, letting a hotkey-swap merge inflate the claimed high-water mark and under-pay future root dividends |
| GHSA-vpjj-mhgr-cphg | 🟢 Low | Per-subnet hotkey-swap cooldown (HotkeySwapOnSubnetInterval) is bypassable via the all-subnets swap path |
| GHSA-rhmm-mqf8-v6gv | 🟢 Low | StakingColdkeysByIndex / NumStakingColdkeys grow monotonically and are never pruned |
| GHSA-wc2g-rc74-vgw3 | 🟢 Low | Per-subnet ChildkeyTake is not migrated during hotkey swap, silently resetting it |
What's changed
- Proxy filter hardening — cover the coldkey-swap lifecycle,
swap_hotkey_v2, and thesudo_set_subnet_owner_hotkeyalias in the restricted-proxy filters (#5, #6, #7) - Weight-setting throttle — enforce the per-neuron
set_weights/commit_weightsrate limit pre-dispatch (#10) - Hotkey-swap correctness —
RootClaimedwatermark accounting (#14), per-subnet swap cooldown on the all-subnets path (#15), per-subnetChildkeyTakemigration (#18), plus review follow-ups mergingRootClaimedby sum and extending the cooldown to parent-key subnets (#22) - Storage housekeeping — prune the staking-coldkey index when no longer needed (#16)
- Bump
spec_versionto 419
Full Changelog: v3.4.4-417...v3.4.5-419
v3.4.4-417
Hotfix: adds a check that ensures that during a hotkey swap, the new hotkey already exists globally and is owned by corresponding coldkey
Full Changelog: v3.4.3-416...v3.4.4-417
v3.4.3-416
What's Changed
Full Changelog: v3.4.2-415...v3.4.3-416