This release contains the changes from polkadot-stable2512 to polkadot-stable2603.
ℹ️ Please note:
The tag corresponding to the current stable release polkadot-stable2603 and matching the old pattern will be
available under polkadot-v1.22.0.
The node version for this release is: 1.22.0
Changelog
Full changelog can be found here.
Changelog for Node Dev
ℹ️ These changes are relevant to: Those who build around the client side code. Alternative client builders, SMOLDOT, those who consume RPCs. These are people who are oblivious to the runtime changes. They only care about the meta-protocol, not the protocol itself.
[#6029]: Implementation of RFC-123
Store a runtime upgrade in :pending_code before moving it to :code in the next block. It's gated by system_version of the runtime and is activated for runtimes with system_version >= 3.
[#11316]: cargo: Update litep2p to v0.13.3
Update litep2p to latest 0.13.3 version
[#11095]: prefix_logs_with: Ensure the macro works correctly for futures
When setting up a tracing span in an async future, it may gets invalidated by any await point. The problem is that after continuing a future, it may runs on a different thread where the span isn't active anymore. The solution for this is to instrument the future properly.
[#10787]: statement-store: validation without runtime
This removes slow runtime validation from statement-submission hot path.
Validation now happens on the node side via direct signature verification and storage reads for account quotas.
[#10882]: statement-store: make encode/hash faster
Optimizes statement encoding and hashing by pre-allocating memory for the encoded buffer.
This reduces allocation overhead and improves performance, particularly when receiving
statements from multiple peers. Benchmarks show ~16% speedup when receiving statements
from 16 peers.
[#10201]: telemtry: Downgrade spam log to debug
This PR downgrade the telemetry warning log to debug.
- The log is causing a lot of noise in our test nets: https://grafana.teleport.parity.io/goto/fjTQ_vzDg?orgId=1
[#10718]: Statement-store: Propagate all statements to newly connected peers
When a new node connects, we now propagate all statements in our store to them. This happens in bursts of ~1MiB messages over time to not completley use up all resources. If multiple peers are connecting, round robin between them.
[#10917]: Implement persistent reputation database for collator protocol (#7751)
Implements persistent storage for the experimental collator protocol's reputation database.
Changes:
- Adds
PersistentDbwrapper that persists the in-memory reputation DB to disk - Periodic persistence every 10 minutes
- Adds
--collator-reputation-persist-intervalCLI to specify the persistence interval in seconds. - Immediate persistence on slashes and parachain deregistration
- Loads existing state on startup with lookback for missed blocks
Implementation:
PersistentDb wraps the existing Db and adds persistence on top:
- All reputation logic (scoring, decay, LRU) stays in `Db`
- Persistence layer handles disk I/O and serialization
- Per-para data stored in parachains_db
Tests:
basic_persistence.rs: Validates persistence across restarts and startup lookbackpruning.rs: Validates automatic cleanup on parachain deregistration
[#11008]: Collator protocol revamp - update calculate_delay
A followup from #8541 with changes requested by @eskimor:
- Adjust the protocol parameters and add comments about the picked values
- Simpler fetch mechanism - advertisements from unknown collators (those with 0 reputation) are delayed. Everything else is fetched immediately.
[#10542]: statement-store: Add latency bench
Adds a latency benchmark for the statement store to measure propagation performance across distributed nodes.
Changelog for Runtime Dev
ℹ️ These changes are relevant to: All of those who rely on the runtime. A parachain team that is using a pallet. A DApp that is using a pallet. These are people who care about the protocol (WASM, not the meta-protocol (client).)
[#10022]: Aura: Support automatic slot migration
This brings support to pallet-aura for automatically migrated the Slot on a change of SlotDuration. This is done by on_runtime_upgrade of pallet-aura.
[#10324]: Cleanup HRMP channels that were force removed from RC state
Cleanup old LastHrmpMqcHeads entries when the corresponding channel was remove from RC state
[#10794]: [FRAME] Omni bencher run each benchmark at least 10 secs
- Ensure all benchmarks run for at least 10 seconds. Configurable with
--min-duration <s> - Turn off runtime logging in bench bot to reduce spam log output
[#10366]: [pallet-revive] update evm create benchmark
Add a benchmark for the EVM CREATE instruction.
We are currently reusing the seal_instantiate benchmark from PVM instantiation, which is incorrect because instantiating an EVM contract takes different arguments and follows a different code path than creating a PVM contract.
This benchmark performs the following steps:
- Generates init bytecode of size i, optionally including a balance with dust.
- Executes the init code that triggers a single benchmark opcode returning a runtime code of the maximum allowed size (qrevm::primitives::eip170::MAX_CODE_SIZE`).
[#10387]: pallet-revive: add DebugSetting for bypassing eip-3607 for contracts and precompiles
Adds a new DebugSetting option which, if enabled, allows transactions coming from contract accounts or precompiles.
This is needed so that test nodes like anvil can send transactions from contract or precompile accounts, a widely-used feature in tests.
[#10713]: Fix off-by-one error in child bounty limit validation
Fixes an off-by-one error in pallet-child-bounties where the add_child_bounty function allowed creating MaxActiveChildBountyCount + 1 child bounties instead of being capped at MaxActiveChildBountyCount.
The validation check used <= instead of <, allowing the count to exceed the limit by one. This fix changes the comparison to < and removes an unnecessary type cast.
This is a bug fix that ensures runtime configuration limits are properly enforced.
Fixes #10652
[#11389]: Fix: AssetTrapped event with Fungible(0) due to SwapFirstAssetTrader::buy_weight for exact trades
When PayFees contained the exact quoted fee, SwapFirstAssetTrader::buy_weight produces zero swap change. This 0-amount credit was unconditionally wrapped into an AssetsInHolding entry, which propagated through fees → refund_surplus → holding → drop_assets, emitting an AssetsTrapped event with Fungible(0) that fails to decode.
This PR simply guards that by checking if value is 0 before putting it into the holding, and omitting the step if the value is 0.
Closes #11388
[#9184]: FixedPoint: Support parsing x.y format
This makes it easier to declare a fixed point value. The old format is also still supported.
[#10922]: [pallet-revive] small improvements
Small safety and completeness improvements for pallet-revive:
- Add selfdestruct call tracing: Emit terminate trace after successful SELFDESTRUCT
- Add debug assertions for unsafe bytecode operations: in relative_jump, absolute_jump, and read_slice
- Remove transmute in i256 sign detection: Replace unsafe { core::mem::transmute } with explicit conditional logic for determining Sign::Zero vs Sign::Plus
[#10397]: Update the commit hash of the revive-differential-tests
Description
This is a PR that updates the commit hash of the revive-differential-tests framework and the compilation caches to a version that includes fixes to certain tests that used hard-coded gas values. The compilation caches required an update since this was a change to the contract's code.
Changelog for Node Operator
ℹ️ These changes are relevant to: Those who don't write any code and only run code.
[#10978]: Omni-node supports polkadot-asset-hub
The polkadot-omni-node binary now supports polkadot-asset-hub. Other system chains where already supported, but PAH uses Ed25519, which makes it a special case.
[#8541]: collator-protocol-revamp: CollationManager and subsystem impl
This PR adds a new experimental validator-side collator protocol subsystem implementation, which can be enabled via the --experimental-collator-protocol CLI flag.
The new implementation introduces a reputation-based collator selection mechanism. Collators
are assigned scores based on the outcome of their submitted collations: valid included candidates increase the score, while invalid collations or failed fetches decrease it.
When multiple collation advertisements are received, validators prioritize fetching from higher-reputation collators first (with timestamp as a tiebreaker for equal scores).
[#10617]: statement-store: use many workers for network statements processing
Adds --statement-network-workers CLI parameter to enable concurrent statement validation from the network.
Previously, statements were validated sequentially by a single worker. This change allows multiple workers o process statements in parallel, improving throughput when statement store is enabled
[#10373]: Block import improvements
This PR fixes block import during Warp sync, which was failing due to "Unknown parent" errors - a typical case during Warp sync.
Changes
- Relaxed verification for Warp synced blocks:
The fix relaxes verification requirements for Warp synced blocks by not performing full verification, with the assumption that these blocks are part of the finalized chain and have already been verified using the provided warp sync proof. - New
BlockOriginvariants:
For improved clarity, two additionalBlockOriginitems have been introduced:WarpSyncGapSync
- Gap sync improvements:
Warp synced blocks are now skipped during the gap sync block import phase, which required improvements to gap handling when committing the block import operation in the database. - Enhanced testing:
The Warp sync zombienet test has been modified to more thoroughly assert both warp and gap sync phases.
This PR builds on changes by @sistemd in #9678
[#10752]: Gap Sync: Skip Body Requests for Non-Archive Nodes
Summary
This PR optimizes gap sync bandwidth usage by skipping body requests for non-archive nodes. Bodies are unnecessary during gap sync when the node doesn't maintain full block history, while archive nodes continue to request bodies to preserve complete history.
It reduces bandwidth consumption and database size significantly for typical validator/full nodes.
Additionally added some gap sync statistics for observability:
- Introduced
GapSyncStatsto track bandwidth usage: header bytes, body bytes, justification bytes - Logged on gap sync completion to provide visibility into bandwidth savings
[#10662]: Bulletin as parachain missing features
- Node developers/operators could enable the transaction storage inherent data provider setup by using --enable-tx-storage-idp flag. This is especially useful in the context of bulletin chain.
- Node developers will set up the network
idle_connection_timeoutto 1h when using--ipfs-serverflag, again, useful in the context of bulletin chain.
[#11407]: Statement Store: Introduce new CLI args
Introduce new CLI args to control statement store parameters.
Rework the statement store configuration, consolidating all parameters into a single structure.
[#10893]: Do not prune blocks with GrandPa justifications
Warp sync requires GRANDPA justifications at authority set change boundaries to construct proofs. When block pruning is enabled, all block bodies are removed regardless of whether they contain important justifications. The pruned nodes can then not be used to fetch warp proofs.
We now have the capability to filter which blocks can be safely pruned. For parachain nodes, everything can be pruned, solochain nodes using grandpa keep blocks with justifications. This ensures warp sync ability within the network.
[#11224]: Prometheus: Bind external address to IPv6
Binds the prometheus external interface to ::, so that the service is also reachable via IPv6.
[#1739]: Require proof for session key registration
Node operators will now need to provide a proof when registering their SessionKeys on chain.
A new rpc author_rotateKeysWithOwner is provided to generate the SessionKeys plus the proof.
Both values then need to be feed into set_keys as part of the transaction.
author_rotateKeysWithOwner is a replacement for author_rotateKeys.
Changelog for Runtime User
ℹ️ These changes are relevant to: Anyone using the runtime. This can be a token holder or a dev writing a front end for a chain.
[#10856]: [pallet-broker] add extrinsic to force transfer a region
Add an extrinsic to pallet-broker which allows a privileged origin (AdminOrigin or Root) to forcefully transfer a region, ignoring its current owner.
[#10767]: Fix auto-renew core tracking on immediate renew
Summary
Fix auto-renew tracking when do_enable_auto_renew triggers an immediate renewal. The auto-renew record now follows the new core index returned by do_renew, preventing a stale core from being
renewed in the next sale rotation.
Discovered by the Darwinia Network team while attempting a renew.
Problem
When enabling auto-renew during the renewal window (PotentialRenewals at sale.region_begin), do_enable_auto_renew immediately calls do_renew. That call can allocate a different core index, but the auto-renew record was stored with the old core. On the next rotation, renew_cores attempts to renew that stale core and emits AutoRenewalFailed, even though the workload has already moved to the new core.
Fix
Capture the returned core index from do_renew inside do_enable_auto_renew, and store that core in AutoRenewals (and the enable event).
Tests
- Added
enable_auto_renew_immediate_updates_core_and_renews cargo test -p pallet-broker
Closes: #10006
[#10828]: [pallet-broker] add extrinsic to forcefully remove the potential renewal
Add an extrinsic allowing to forcefully remove the existing potential renewal from chain without the need to directly manipulate the storage.
[#10697]: [frame-support] remove error reporting in remote_transfer_xcm for paid execution
The reason is that it is broken and will result in spamming errors until we fix it properly: #10078.
Rust compiler versions
This release was built and tested against the following versions of rustc.
Other versions may work.
- Rust Stable:
1.93.0
Runtimes
The information about the runtimes included in this release can be found below.
The runtimes have been built using srtool v0.18.3 and rustc 1.88.0 (6b00bc388 2025-06-23).
Westend
🏋️ Runtime size: 1.820 MB (1,908,642 bytes)
🗜 Compressed: Yes, 80.78%
✨ Reserved meta: OK - [6D, 65, 74, 61]
🎁 Metadata version: V14
🔥 Core version: westend-1022002 (parity-westend-0.tx27.au2)
🗳️ system.setCode hash: 0xc8187b388aa0858cf60fefb56b607fb657900ad150b421e8936aa99af12e449c
🗳️ authorizeUpgrade hash: 0xfe0520fdaf070b4942d6ab013536220cda33a86cd324e5f91295904d9383a981
🗳️ Blake2-256 hash: 0x5e9ade55f0c3325087afdc20cf1b09e02c175c6f48ba080025a59aa03a7570a2
📦 IPFS: https://www.ipfs.io/ipfs/QmeEyzDJyobNbiJdb2UQjNFKBypf143uNEBNGAB56cRRdR
Westend Assethub
🏋️ Runtime Size: 2.31 MB (2418532 bytes)
🔥 Core Version: westmint-1022002 (westmint-0.tx16.au1)
🗜 Compressed: Yes: 82.09%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0x0bc8565fd3887a85372961dec39fd46876e5a443b11b5b0d8036130bf9dae498
🗳️ authorizeUpgrade hash: 0x8a076098acecbbb5f2d0479f2c6925e733d39e7e12f37e52d042c6d621537a7b
🗳️ Blake2-256 hash: 0x80faa9c8d81c6b74c191464d64e914a5e9e6264603f009e3cc072dd569aabbc0
📦 IPFS: QmRRBahzS5PDPizhWbNhXZhZ7d34zx6cQ4AvtX5mkFC3hv
Westend Bridgehub
🏋️ Runtime Size: 1.31 MB (1377888 bytes)
🔥 Core Version: bridge-hub-westend-1022002 (bridge-hub-westend-0.tx6.au1)
🗜 Compressed: Yes: 79.69%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0x23dd3767d078a1cc868abce77ca8b9e8e2470b57c6382f47a739db1c868621e8
🗳️ authorizeUpgrade hash: 0x9c7990ff31f682e03d51ca94018c151d169446d091de9c25e6453234fb085f56
🗳️ Blake2-256 hash: 0xe2ce48dcb68b6019f5be6f2bec7a7645804574ce69617c41619d330e942a1f73
📦 IPFS: QmW7joW7jSApiCyPQiqTSgEPUPWjMnNcmAnjuk7bT9gS5w
Westend Collectives
🏋️ Runtime Size: 1.19 MB (1244786 bytes)
🔥 Core Version: collectives-westend-1022002 (collectives-westend-0.tx6.au1)
🗜 Compressed: Yes: 80.8%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0xb3d0764ae9c99d0af55e1e0719361701bad7d1f9b65e029778d1f6e43ea87949
🗳️ authorizeUpgrade hash: 0xff9ade7a85e0d70988d6286036bdd121de12d109ff3abf64b4d0e437e48ae39e
🗳️ Blake2-256 hash: 0x1653b2fe1365ff7a91ecb1d73333f6a1396aa41e4926639c61a20b6835a1f2bc
📦 IPFS: Qmam74NBQKgmo7vMkE8akgh8fJWCKe1youN4KXHhKMPCmb
Westend Coretime
🏋️ Runtime Size: 1.06 MB (1110541 bytes)
🔥 Core Version: coretime-westend-1022002 (coretime-westend-0.tx2.au1)
🗜 Compressed: Yes: 79.79%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0x0ca5e204989e75ac997ee9338efc71eaf9de359658dc5e8ea20637b56ea8f3e7
🗳️ authorizeUpgrade hash: 0x6823d5afe2731d55fb82d58ef7f96333f03ce56e9cb72b163feb548c616c89f7
🗳️ Blake2-256 hash: 0x062f92affd3e1a4e23e9d835b128cef42d1e072eec916e1b092bc83e99fa76d9
📦 IPFS: QmR7URjgnmJXMAYP6AkKQcRtyWLh1CJYDXjQMRfMZNHdUy
Westend Glutton
🏋️ Runtime Size: 525.88 KB (538502 bytes)
🔥 Core Version: glutton-westend-1022002 (glutton-westend-0.tx1.au1)
🗜 Compressed: Yes: 78.12%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0xa36a1108d9d53b6622dc282249b69ef4b0f8723b381383cfb4b45e2dbf387f1f
🗳️ authorizeUpgrade hash: 0xe9db839524ac487e91412fd52e0549415760bb7e8efd5137a8ada4aa6131cc63
🗳️ Blake2-256 hash: 0xacac9d78629152fe0cccfab3092bf00a8bdd3d7f9214a1ceecce69aed14af43c
📦 IPFS: QmZpP3m1qNnYDb2rx1nQAmUMtAPmVYL7px3GzwXYdKoxio
Westend People
🏋️ Runtime Size: 1.06 MB (1110670 bytes)
🔥 Core Version: people-westend-1022002 (people-westend-0.tx2.au1)
🗜 Compressed: Yes: 79.73%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0xf3da38a9810fcfd0ff0b0a3d99c867b1d0e6d6d3d0a7a770a2ce6f871c93892d
🗳️ authorizeUpgrade hash: 0xaee0293cacc4b952a385d2015ef4684c251598dd191703e6f4e6c7f42f374fec
🗳️ Blake2-256 hash: 0x78c354d4253eb7a3464da409e8dec68944b539f21d135af7717c8f21fa1a95e6
📦 IPFS: QmR3b4cMZTWfQapzwqYd3mXAsiJPJNch1N3TtKQqQWg1aD
Docker images
The docker images for the polkadot node binary and the polkadot-parachain binary can be found at Docker hub (will be available a few minutes after the release has been published):
You may also pull it with:
docker pull parity/polkadot:stable2603
or
docker pull parity/polkadot-parachain:stable2603