This release contains the changes from polkadot-stable2512 to polkadot-stable2512-1.
This is a patch release for the latest stable version: stable2512. If your nodes are already running on this stable release,
you should upgrade to this patch version to get the latest fixes.
The tag corresponding to the current patch release polkadot-stable2512-1 and matching the old pattern will be
available under polkadot-v1.21.1.
The following crates were updated to the corresponding versions:
Click to expand
Changelog
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.
[#10312]: fatxpool: metrics for unfiltered timings of inblock events
This PR adds a new experimental metric substrate_sub_txpool_timing_event_in_block2 for the reliability dashboard. Unlike the existing in_block metric which records timing only for the first InBlock event per transaction, the new in_block2 metric records every InBlock event without filtering. This allows tracking transactions that appear in multiple blocks during chain reorganizations, providing better visibility into fork-related transaction behavior. The implementation adds the new histogram to EventsHistograms and updates handle_status() to record unfiltered InBlock events before applying deduplication logic.
This approach should allow for experimenting with new inblock confidence metric, without affecting the data currently shown on the Reliability Dashboard.
[#10859]: Upgrade litep2p to v0.13.0
This PR upgrades litep2p to the latest version, bringing multiple fixes with this release.
Specifically, this release enhances WebSocket stability by resolving AsyncWrite errors and ensuring that partial writes during the negotiation phase no longer trigger connection failures.
It also fixes large file download using Bitswap protocol by grouping blocks into batches of <= 2 MiB.
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).)
[#10708]: [stable2512] pallet_revive changes
Backport all the changes we applied in #10552,
This is so the next runtime upgrade will not be a downgrade in terms of pallet_revive as we backported a substantial amount of code to unstable2507.
[#10476]: Allow for "Nick's Method" style deployments
Allow eth legacy transactions to not contain a chain id.
[#10657]: Add support for asset V3 to V5 conversion to match_asset of localPay
Add support for asset V3 to V5 conversion to match_asset of localPay.
[#10861]: [pallet-revive] weight charge in sr25519_verify and ecdsa_to_eth_address precompiles
I couldn't see where the weight is charged in those builtin pre-compiles and a quick test indicated that there's no charges implemented. Assuming those are compute-heavy functions, the missing weight charges seem like a DoS vector.
[#10365]: frame-executive: Remove unused deprecated tag
Recent compiler versions complain about useless deprecation warning on OnRuntimeUpgrade parameter in frame-executive.
[#10711]: Fix benchmarking for pallet-assets::set_reserves()
Parametrize pallet-assets::set_reserves() weight based on number of reserves provided instead of always assuming worst-case.
[#10802]: benchmarking: fix timing leak from bulk setup operations
Fixes timing leaks in benchmarks with large setup operations (e.g., clearing 27k staking entries). After bulk deletions are committed, the first new allocation can trigger memory allocator overhead that leaks into benchmark timing.
The fix adds a memory allocator warmup step in commit_db() that performs a dummy write/clear cycle to absorb this overhead before timing starts.
[#10646]: Update asset-conversion validation to use strict withdrawal checks
Description
Updates the transaction validation logic in asset-conversion-tx-payment.
The validation step currently accepts permissive withdrawal consequences (ReducedToZero, WouldDie) in Native assets and Exchanged asset . However, the underlying withdraw calls utilize Preservation::Preserve, Native assets and Exchanged asset
This change updates the match pattern to strictly accept WithdrawConsequence::Success, ensuring the validation logic correctly mirrors the strict preservation guarantees of the actual withdrawal
Changes
- Restricted
can_withdrawchecks to only acceptSuccess.
[#10792]: pallet-broker: Fix force_reserve
When issuing a force_reserve we are putting the reservation into the current and next region WorkPlan. The issue is that at the next sale rotation we override all unused cores. As the sale rotation isn't aware of the forcefully registered core, also the force reserved core is overwritten and the parachain loses their coretime for one region (it comes back in the next region). To fix this we now keep track of forcefully registered reserves. We input them alongside the other reservations into the workplan, but for the current region using any free cores from the previous sale.
[#10740]: Make BlockRatioFee no longer require pallet_revive
In polkadot-fellows/runtimes#1050 I am unifying the used WeightToFee formula to use BlockRatioFee everywhere. This type is exported by pallet_revive and is independent of any functionality here. However, so far it required the runtime to use pallet_revive in order to discover the Balance type. This PR removes this constraint so it can be used by all runtimes. Even the ones which do not use pallet_revive.
[#10576]: Introduce pallet-dap for AssetHub
This PR introduces the foundation for the Dynamic Allocation Pool (DAP) system:
-
pallet-dap: A new pallet that implements
OnUnbalanced, collecting funds (e.g., slashes) into a buffer account instead of burning them. -
AssetHub Westend integration: The runtime now uses pallet-dap to redirect staking slashes to the DAP buffer (via
type Slash = Dap).
Treasury burns are now disabled so no need to integrate with DAP: treasury Burn parameter is set to zero in Westend RC, AssetHub and collective runtimes. This means no treasury funds are burned at the end of spend periods, preserving total issuance.
User and pallet initiated burns do NOT go through DAP currently but they burn directly instead, reducing total issuance immediately. It will be addressed in a follow-up change.
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.
[#10502]: Allow nominators to be unslashable with configurable fast unbonding
Nominators can now be set as unslashable via runtime configuration. When unslashable, nominators use a configurable fast unbonding duration instead of the full bonding period.
Validators always use the full bonding duration regardless of this setting.
New config parameter NominatorFastUnbondDuration controls the unbonding time for non-slashable nominators (recommended: 2 eras).
[#10365]: frame-executive: Remove unused deprecated tag
Recent compiler versions complain about useless deprecation warning on OnRuntimeUpgrade parameter in frame-executive.
[#10064]: Add pallet_multi_asset_bounties to Westend Asset Hub testnet runtime.
Multi-asset bounties are now available in the Westend Asset Hub runtime.
This update also includes refactoring of pallet_multi_asset_bounties and kitchensink-runtime.
Rust compiler versions
This release was built and tested against the following versions of rustc.
Other versions may work.
- Rust Stable:
1.88.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 Assethub
🏋️ Runtime Size: 2.34 MB (2453190 bytes)
🔥 Core Version: westmint-1021002 (westmint-0.tx16.au1)
🗜 Compressed: Yes: 82.16%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0xdf9514a128cbe03b96fd1f5fa944f7280d4ff2d387ee5236d4ac663e749ae64c
🗳️ authorizeUpgrade hash: 0x332cf76879028985dcca79e4bfcd6fbc93e8d3fbcaff4335f5170a26741ca3a9
🗳️ Blake2-256 hash: 0xa1bfce249c230c83f89a8db4f5900387687dca9a33f2c6bdae9d85458e95c129
📦 IPFS: QmUUyk97cvH1JFYsRVvP1gFFta4jMddHL7Ageb36KXyWKf
Westend Bridgehub
🏋️ Runtime Size: 1.35 MB (1414365 bytes)
🔥 Core Version: bridge-hub-westend-1021001 (bridge-hub-westend-0.tx6.au1)
🗜 Compressed: Yes: 80.07%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0xee3861b9d693376b3dbee990634b99bf5ea35f5d55ae95907bb45189bb249fd7
🗳️ authorizeUpgrade hash: 0xc979b27d15d2fd8c04befe4271d2af6b03b06e85872addc95e0a58d6eb139f8d
🗳️ Blake2-256 hash: 0x2acce46d565dbd70175bbbe9f48355c554fd7785112d82c6089d3737f31dce45
📦 IPFS: QmYXPhVKgVnaL215SFeHr9XLAosqFm4pdpUdAu9z7pgymw
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:stable2512-1
or
docker pull parity/polkadot-parachain:stable2512-1