github paritytech/polkadot-sdk polkadot-stable2603
Polkadot stable2603

latest release: polkadot-v1.22.0
4 hours ago

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.

[#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 PersistentDb wrapper that persists the in-memory reputation DB to disk
  • Periodic persistence every 10 minutes
  • Adds --collator-reputation-persist-interval CLI 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 lookback
  • pruning.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 feesrefund_surplusholdingdrop_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 BlockOrigin variants:
    For improved clarity, two additional BlockOrigin items have been introduced:
    • WarpSync
    • GapSync
  • 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 GapSyncStats to 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_timeout to 1h when using --ipfs-server flag, 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

Don't miss a new polkadot-sdk release

NewReleases is sending notifications on new releases.