github paritytech/polkadot-sdk polkadot-stable2509-rc1
Polkadot polkadot-stable2509-rc1

pre-release5 hours ago

This release contains the changes from polkadot-stable2506 to polkadot-stable2509-rc1.

⚠️ Warning: Pre-release Version

The currently published version is a pre-release and is not yet a final stable version. This release is provided for testing purposes only, and there is no guarantee that everything will work as expected. Errors and unusual behaviours of some features are to be expected.

Please use this version at your own risk and report any issues you encounter. We recommend waiting for the official release if you need a stable version.

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.

[#9262]: Adds support for additional relay state keys in parachain validation data inherent

Adds the possibility for parachain clients to collect additional relay state keys into the validation data inherent.

[#9432]: CumulusDigestItem: Add function to fetch the relay block identifier

This simplifies code paths that are fetching these information from a parachain header.

[#9488]: prdoc: add missing crates bumps

Adds a few crate bumps associated to PRs which missed to bump them due to a corner case missed by the release tooling.

[#9175]: Deduplicate client-side inherents checking logic

Stumbled upon this while working on other issue (#7902). I thought I might need to change the CheckInherentsResult and this deduplication would have made everything easier. Probably changing CheckInherentsResult won't be needed in the end, but even so it would be nice to reduce the duplication.

[#8882]: Fix flaxy 0003-block-building-warp-sync test

Fixes: #8868

The error skipped in log is acceptable, the announced block does not have the parent imported yet.

[#8646]: emit sparse debug info in unoptimized builds

See here for more details.

I found that on my host, this reduces cargo build (after cargo clean) from 19m 35s to 17m 50s, or about 10%.

[#9201]: polkadot-parachain: fixes and changes related to GetParachainInfo

  • Provides some updated to the asset-hub-westend-local chain specification, by adding appropriate genesis patch for parachainInfo.
  • refactors the logic related to fetching para_id with the node, so that when failing to use GetParachainInfo::parachain_id we also get a log with the error (before defaulting to para_id extracted from chain spec).
  • removes comments/deprecation notices throughout the code that introduce para-id flag removal (from chain-spec-builder and support for parsing it from chain specifications)

[#8939]: Always send full parent header, not only hash, part of collation response

Implementation of #7733

Description
Instead of conditionally sending the full parent header in the collation response we now always send it (never the hash of it).

[#8651]: polkadot-omni-node: add GetParachainInfo runtime api

This PR deprecates the para_id field of parachain chain specifications.

  • Both polkadot-omni-node & polkadot-parachain are still supporting the para_id
    field passed via chain specifications, while parachain-template-node supports only runtime API based provided parachain id.
  • This PR also changes minimal-template-runtime to not run anymore with Omni Node.
  • chain-spec-builder still supports generating chain specifications with para_id field.
  • Starting with stable2509 polkadot-parachain/parachain-template-node will generate chain specs that are not compatible
    with prior node versions because para_id field will not be added anymore to the resulting chain specs.

Starting with stable2509 the para_id field of chain specification is not required anymore, and runtime developers will be able
to specify it to nodes by implementing the runtime API cumulus_primitives_core::GetParachainInfo.

Starting with stable2512 the para_id field of chain specification will not be supported anymore by node versions and
chain-spec-builder will drop its support, so it is mandatory for runtimes to implement the GetParachainInfo trait to still be compatible with the nodes.

[#8894]: remove enable_approval_voting_parallel cli flag

This has been running on polkadot since #7504, so it is time to remove the flag that allowed us to run either with approval-voting-parallel or with approval-distribution and approval-voting subsystems.

[#8596]: fatxpool: limits handling optimizations and fixes

This PR adds some optimization and fixes in handling limits in fork-aware transaction pool.

[#8974]: Fix flaxy 0003-block-building-warp-sync test - one more approach

See the explanation in this comment:
#8868 (comment)

[#9044]: Fix regression benchmarks

Updates benchmark thresholds

[#9255]: Fix CandidateDescriptor debug logs

Implement core::fmt::Debug by hand and differentiate the output based on CandidateDescriptorVersion.

[#8908]: [pvf-worker] Refactor execute request handling

PVF execution worker communication was organized into a single ExecuteRequest struct. This should improve performance: one encode/decode operation instead of four. Also, no more chance of ordering mistakes.

[#9055]: Add para_ids Runtime API

Add a new runtime API for querying the registered paraids at a relay parent (both on-demand parachains and parachains).

This can be used for pruning the reputation database for the new collator protocol, so that we don't keep storing reputations indefinitely for parachains that have been offboarded.

[#8839]: net/discovery: File persistence for AddrCache

Persisting the AddrCache periodically (every 10 minutes) and on worker shutdown. Read AddrCache from file upon launch of worker.

AddrCache is saved as authority_discovery_addr_cache.json in the folder configured by net_config_path of NetworkConfiguration.

This reduces the time it takes for a node to reconnect to peers after restart.

[#8973]: Add polkadot_parachain_peer_connectivity metric

Adds polkadot_parachain_peer_connectivity histogram metric to better understand connectivity patterns.

[#9495]: fatxpool: buckets for event-timings metrics adjusted

This PR adjusts the buckets for transactions' event-timings metrics as requested in #9158 for reliability dashboard.

fixes: #9158

[#8172]: Ignore trie nodes while recording a proof

This pull requests implements support for ignoring trie nodes while recording a proof. It directly includes the feature into basic-authorship to later make use of it in Cumulus for multi-block PoVs.

The idea behind this is when you have multiple blocks per PoV that trie nodes accessed or produced by a block before (in the same PoV), are not required to be added to the storage proof again. So, all the blocks in one PoV basically share the same storage proof.
This also impacts things like storage weight reclaim, because ignored trie node do not contribute a to the storage proof size (similar to when this would happen in the same block).

In your node you only need to do the following change:

-let proposer = Proposer::new(proposer_factory);
+

The cumulus_client_consensus_proposer::Proposer type was removed.

[#8833]: Check artifact integrity before execution

In case of a corrupted artifact, we can find it out before execution and re-prepare the artifact.

[#8152]: fatxpool: some more integration tests

Some new test cases and improvements of zombienet integration tests for fatxpool.

[#9309]: Make RecentDisputes/ActiveDisputes use BTreeMap

Make dispute-coordinator forward BTreeMap/BTreeSet to provisioner directly instead of converting it to Vec as before.

[#9059]: Fetch parent block api_version

This is required to ensure that we use the api_version of the runtime that will be used on the relay chain to validate the block. Otherwise the node may thinks the runtime was already upgraded and sends data to the relay chain that can not be decoded by the runtime and thus, the validation fails.

[#9015]: consensus/grandpa: Fix high number of peer disconnects with invalid justification

A grandpa race-casse has been identified in the versi-net stack around authority set changes, which leads to the following:

  • T0 / Node A: Completes round (15)
  • T1 / Node A: Applies new authority set change and increments the SetID (from 0 to 1)
  • T2 / Node B: Sends Precommit for round (15) with SetID (0) -- previous set ID
  • T3 / Node B: Applies new authority set change and increments the SetID (1)

In this scenario, Node B is not aware at the moment of sending justifications that the Set ID has changed.
The downstream effect is that Node A will not be able to verify the signature of justifications, since a different SetID is taken into account. This will cascade through the sync engine, where the Node B is wrongfully banned and disconnected.

This PR aims to fix the edge-case by making the grandpa resilient to verifying prior setIDs for signatures.
When the signature of the grandpa justification fails to decode, the prior SetID is also verified. If the prior SetID produces a valid signature, then the outdated justification error is propagated through the code (ie SignatureResult::OutdatedSet).

The sync engine will handle the outdated justifications as invalid, but without banning the peer. This leads to increased stability of the network during authority changes, which caused frequent disconnects to versi-net in the past.

Review Notes

Testing Done

  • Deployed the PR to versi-net with 40 validators
  • Prior we have noticed 10/40 validators disconnecting every 15-20 minutes, leading to instability
  • Over past 24h the issue has been mitigated: https://grafana.teleport.parity.io/goto/FPNWlmsHR?orgId=1
  • Note: bootnodes 0 and 1 are currently running outdated versions that do not incorporate this SetID verification improvement

Part of: #8872

[#9063]: sp-tracing: Remove test-utils feature

The crate is already exposing testing related features by default, so there is no real need to hide the rest behind some feature. Also because of feature unification, the feature is enabled always in the workspace.

[#8832]: increase session index cache

A 10 session index cache is not enough when you run under intense pressure and finality is lagg since you will end requesting the session index for blocks older than that. So let's make this cache larger to achieve its purpose even under intense load when it actually matters more to be faster.

The session_index_cache keeps a Hash and a u32, so that's about 36 bytes per entry, with this increase it can grow up to 65k which is not that big in my book.

[#9321]: network/litep2p: Switch to system DNS resolver

Switch to system DNS resolver instead of 8.8.8.8 that litep2p uses by default. This enables full administrator control of what upstream DNS servers to use, including resolution of local names using custom DNS servers.

Fixes #9298.

[#9312]: yap-runtime: fixes for GetParachainInfo

This fixes the YAP parachain runtimes in case you encounter a panic in the collator similar to paritytech/zombienet#2050:

Failed to retrieve the parachain id

(which we do have zombienet-sdk tests for here)

[#8837]: Cache locally controlled validator indices in dispute-coordinator

dispute-coordinator uses keystore.key_pair() to obtain the set of locally controlled validator IDs. This operation happens on each import and is expensive because it involves key generation from a seed phrase. This patch lazily determines the set of locally controlled validator IDs and caches the result for each session.

[#8834]: extend overseer to send priority messages

Extend overseer to send priority messages, the new functionality is used for sending messages on the grandpa call path when we call dispute-coordinator and approval-voting in finality_target_with_longest_chain to make sure we don't block unnecessarily.

[#8875]: fatxpool: ChainApi is now async

Internal ChainApi is now async_trait, validate_transaction and block_body are now async methods. This is just cleanup - migrating from returning Future to async method'.

[#8948]: make sure dispute_coordinator/approval-voting parallel can receive priority messages

#8834, changed relay_chain_selection to send priority messages, but did not configured
the subsystems to tell they can receive priority messages, with can_receive_priority_messages flag.

If can_receive_priority_messages is not specified orchestra falls back when sending a priority message to the normal queue,
so this resulted in the messages not being processed ahead of the others in the queue.

Fix this configuration mistake and add a test to make sure priority messages are consumed ahead of normal ones by the subsystems.

[#8831]: dispute-coordinator: increase lru_observed_blocks_capacity

Under increase load with finality lagging behind there is a risk for blocks to arrive late or out of sequence in that case we will end up scrapping from the received block un till last finalized block and then process all the dispute in-between.

This couple with other inefficiencies like #8823 will increase unnecessarily the load on dispute-coordinator.

Decided to make this super large to err on the cautious side, the Hash size is only 32 bytes, so this will make the LRU grow up to 65k, which I don't think is a significant increase.

[#8896]: Improvements for ControlledValidatorIndices

Improvements for ControlledValidatorIndices:

  • remove unneeded dependency
  • more readable implementations for get and find_controlled_validator_indices

[#8923]: fatxpool: fix: remove invalid txs from the dropped stream controller

While testing mortal transaction I encountered exactly the same problem as in #8490.
This PR should fix the problem.

fixes: #8490

[#9287]: network: Upgrade litep2p to v0.10.0

litep2p v0.10.0

This release adds the ability to use system DNS resolver and change Kademlia DNS memory store capacity. It also fixes the Bitswap protocol implementation and correctly handles the dropped notification substreams by unregistering them from the protocol list.

Added

  • kad: Expose memory store configuration (#407)
  • transport: Allow changing DNS resolver config (#384)

Fixed

  • notification: Unregister dropped protocols (#391)
  • bitswap: Fix protocol implementation (#402)
  • transport-manager: stricter supported multiaddress check (#403)

[#8714]: Upgrade wasmtime

This upgrades wasmtime to the latest version and also fixes backtraces for debug builds.

[#8836]: fatxpool: report_invalid is now aync

TransactionPool::report_invalid is now async, function was typically used in async context, seems right to be fully async.

[#8828]: [subsystem-bench] Add Dispute Coordinator subsystem benchmark

Adds a subsystem benchmark for the Dispute subsystems

[#9315]: network/kad: Increase memory store capacity for providers

Increase Kademlia memory store capacity for DHT content providers (used by parachain DHT-based bootnodes) and reduce provider republish interval & TTL. This is needed to support testnets with 1-minute fast runtime and up to 13 parachains.

Parameters set:

  • 10000 provider keys per node
  • 10h provider record TTL
  • 3.5h provider republish interval

Closes paritytech/litep2p#405.

[#9050]: dispute-coordinator: handle race with offchain disabling

Fixes a potential race with off-chain disabling when we learned about disablement after importing a dispute from that validator.

[#9128]: Rewrite validator disabling test with zombienet-sdk

Migrate validator disabling test to the new version of zombienet

[#9159]: fatxpool: debug levels adjusted

This PR removes redundant debug message and lowers the info about timeout in ready_at.

[#9251]: Allow setting idle connection timeout value in custom node implementations

Allow setting idle connection timeout value. This can be helpful in custom networks to allow maintaining long-lived connections.

[#9479]: cargo: Use rust-yamux version 0.13.6

This PR updates the litep2p' rust-yamux crate to version 0.13.6.

This version solves the following issue:

0: sp_panic_handler::set::{{closure}}
1: std::panicking::rust_panic_with_hook
2: std::panicking::begin_panic_handler::{{closure}}
3: std::sys::backtrace::__rust_end_short_backtrace
4: rust_begin_unwind
5: core::panicking::panic_fmt
6: core::slice::index::slice_start_index_len_fail::do_panic::runtime
7: core::slice::index::slice_start_index_len_fail
8: <yamux::frame::io::Io as futures_sink::Sink<yamux::frame::Frame<()>>>::poll_ready
9: yamux::connection::Connection::poll_next_inbound
10: litep2p::transport::websocket::connection::WebSocketConnection::start::{{closure}}
11: <litep2p::transport::websocket::WebSocketTransport as litep2p::transport::Transport>::accept::{{closure}}
12: <tracing_futures::Instrumented as core::future::future::Future>::poll
13: tokio::runtime::task::raw::poll
14: tokio::runtime::scheduler::multi_thread::worker::Context::run_task
15: tokio::runtime::scheduler::multi_thread::worker::run
16: tokio::runtime::task::raw::poll
17: std::sys::backtrace::__rust_begin_short_backtrace
18: core::ops::function::FnOnce::call_once{{vtable.shim}}
19: std::sys::pal::unix::thread::Thread::new::thread_start
20: start_thread
at /build/glibc-FcRMwW/glibc-2.31/nptl/pthread_create.c:477:8
21: clone
at /build/glibc-FcRMwW/glibc-2.31/misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Part of: #9169

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).)

[#7321]: Update system parachains XCM benchmarking for sibling parachain delivery

Updates cumulus::parachain runtime XCM benchmarking to support asset delivery to system parachains instead of relay chain.

[#9002]: Remove SelectCore and GetCoreSelectorApi

Downstream users need to remove the SelectCore type from the parachain_system::Config:

- type SelectCore = ...;
+

Also the GetCoreSelectorApi got removed. If you had implemented it before in your runtime, you can remove it.

[#9049]: Optimize buffered offence storage and prevent unbounded growth in staking-async ah-client pallet

  • Prevents duplicate offences for the same offender in the same session by keeping only the highest slash fraction
  • Introduces BufferedOffence struct with optional reporter and slash fraction fields
  • Restructures buffered offences storage from Vec<(SessionIndex, Vec<Offence>)> to nested BTreeMap<SessionIndex, BTreeMap<AccountId, BufferedOffence>>
  • Adds MaxOffenceBatchSize configuration parameter for batching control
  • Processes offences in batches with configurable size limits, sending only first session's offences per block
  • Implements proper benchmarking infrastructure for process_buffered_offences function
  • Adds WeightInfo trait with benchmarked weights for batch processing in on_initialize hook

This addresses potential memory issues and improves efficiency of offence handling during buffered operating mode while maintaining backward compatibility.

[#8809]: Add possibility of executing or mocking additional inherents in xcm-emulator

This extends the decl_test_parachains macro to accept a AdditionalInherentCode type. This type needs to implement the AdditionalInherentCode trait and will be called after on_initialize and before on_finalize.
It can be used to mock additional inherents.

[#9454]: [pallet-revive] Migrate blake2_128 from host function to pre-compile

Moves the unstable host function hash_blake2_128 to the System pre-compile.

[#9463]: Minor Snowbridge test fixes

Improves the Snowbridge snowbridge-runtime-test-common test method responsible to testing all Ethereum light client extrinsics, to run in 2 blocks instead of 1, so that the test does not fail because the block limit has been reached.

[#7997]: [AHM] The Asset Hub Migration on Westend

Post AHM changes for Westend Relay and Asset Hub.

[#4300]: XCM NFT types that use Granular NFT traits

This PR provides new XCM types and tools for building NFT Asset Transactors.
The new types use general and granular NFT traits from #5620.
The new types use a more general approach, making integration into any chain with various NFT implementations easier.
Also, the new types provide greater flexibility for supporting derivative NFTs, allowing several possible approaches depending on the given chain's team's goals or restrictions (see the pallet-derivatives crate docs and mock docs).

[#8840]: Add poll_index to conviction-voting Voted and VoteRemoved events

This PR includes poll_index field to the Voted and VoteRemoved events to aid the identification of which referendum a voter voted

[#9285]: [revive] revm backend

Initial EVM support for pallet-revive via the REVM crate to create a dual-VM system that can execute both PolkaVM and EVM

  • Added AllowEVMBytecode: Get to the config to enable/disable EVM call and instantiation
  • The basic flow of uploading an EVM contract and running it should work
  • instructions are copied and adapted from REVM they should be ignored in this PR and reviewed in follow-up PR

[#7953]: Add deposit for setting session keys

Setting session keys might put some funds on hold in the future, depending on how runtimes use this feature.

Requires pallet_session::Config to specify:

  • type Currency, assigned to an instance of pallet_balances.
  • type KeyDeposit, the amount of deposit. Set to () to assert no deposit amount is needed.

[#8802]: [AHM] Staking async e2e zn and papi tests

Adds end-to-end tests for staking async using zombienet and papi.

[#9186]: pallet-staking-async: Use saturating addition for era reward points

This PR replaces regular addition with saturating addition when accumulating era reward points in pallet-staking-async to prevent potential overflow.

[#9411]: staking-async/papi-tests: fix justfile to run in CI

Running the just step within a bash shell, ensures that the error is properly handled and propagated without terminating the just script.

[#9416]: pallet_revive: Enforce storage deposit limit on plain transfer

The existential deposit to create a new account is part of the storage deposit. Hence if the storage deposit limit is too low to create a new account we fail the transaction. However, this limit was not enforced for plain transfers. The reason is that we only enforce the limit at the end of each frame. But for plain transfers (transferring to a non contract) there is no frame.

This PR fixes the situation by enforcing the limit when transferring the existential deposit in order to create a new account.

[#9415]: Cleanup staking try states + fix min bonds

ensures staking try-state code passes, and fixes issues of having a mistakenly high min-bond for validators

[#9112]: Fix seal_call benchmark

Fix seal_call benchmark, ensure that the call actually succeed

[#8537]: Allow RelaychainDataProvider set_block_number to be used in tests

set_block_number in the RelaychainDataProvider trait can now be used in tests. Previously this was only included with the runtime-benchmarks feature.

[#8883]: [pallet-revive] Make Runtime call dispatchable as eth transaction

Make RuntimeCall dispatchable as eth transaction.

By sending a transaction to 0x6d6f646c70792f70616464720000000000000000, using the encoded runtime call as input, the call will be executed by this given origin.

see paritytech/foundry-polkadot#130

e.g sending a remark_with_event

cast wallet import dev-account --private-key 5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133
cast send --account dev-account 0x6d6f646c70792f70616464720000000000000000 0x0007143132333435

[#9136]: Fix Configuration:set_max_upward_queue_size

Removes the invalid validation that prevented setting max_upward_queue_size to values larger than MAX_UPWARD_MESSAGE_SIZE_BOUND.
The queue is clearly allowed to be bigger than an individual message.

[#9308]: Replace log with tracing on pallet-bridge-messages

This PR replaces log with tracing instrumentation on pallet-bridge-messages by providing structured logging.

[#8651]: polkadot-omni-node: add GetParachainInfo runtime api

This PR deprecates the para_id field of parachain chain specifications.

  • Both polkadot-omni-node & polkadot-parachain are still supporting the para_id
    field passed via chain specifications, while parachain-template-node supports only runtime API based provided parachain id.
  • This PR also changes minimal-template-runtime to not run anymore with Omni Node.
  • chain-spec-builder still supports generating chain specifications with para_id field.
  • Starting with stable2509 polkadot-parachain/parachain-template-node will generate chain specs that are not compatible
    with prior node versions because para_id field will not be added anymore to the resulting chain specs.

Starting with stable2509 the para_id field of chain specification is not required anymore, and runtime developers will be able
to specify it to nodes by implementing the runtime API cumulus_primitives_core::GetParachainInfo.

Starting with stable2512 the para_id field of chain specification will not be supported anymore by node versions and
chain-spec-builder will drop its support, so it is mandatory for runtimes to implement the GetParachainInfo trait to still be compatible with the nodes.

[#9455]: [pallet-revive] Migrate to_account_id from host function to pre-compile

Moves the unstable host function to_account_id to the System pre-compile.

[#9176]: Allow locking to bump consumer without limits

Locking is a system-level operation, and can only increment the consumer limit at most once. Therefore, it should use inc_consumer_without_limits. This behavior is optional, and is only used in the call path of LockableCurrency. Reserves, Holds and Freezes (and other operations like transfer etc.) have the ability to return DispatchResult and don't need this bypass. This is demonstrated in the unit tests added.

[#9357]: Fix dust balance handling in ETH transfers

Fixed a bug in the eth-decimals implementation where ETH transfers were failing due to incorrect receiver dust balance handling. The condition for minting a new currency unit when transferring dust was checking to_info.dust.saturating_add(dust) >= plank which to_info.dust has been added twice, could lead to unexpected minting behavior.
This fix ensures that ETH transfers work correctly, enabling proper operation of DeFi protocols like Uniswap on PolkaVM.

[#9288]: Replace log with tracing on bridge-runtime-common

This PR replaces log with tracing instrumentation on bridge-runtime-common by providing structured logging.

[#9381]: Replace log with tracing on pallet-bridge-relayers

This PR replaces log with tracing instrumentation on pallet-bridge-relayers by providing structured logging.

[#9514]: Paras: Clean up AuthorizedCodeHash when offboarding

This PR updates the Paras pallet to clear entries in AuthorizedCodeHash as part of the offboarding process.

[#8922]: paras pallet: don't assign core if para_kind is ParaThread

Only force assign core to genesis para if declared as parachain.
For parathread, proceed only with registering the para.

[#8746]: [pallet-revive] dev-node

This adds a dev-node that is essentially the minimal template with the addition of pallet-revive

can be launched with

RUST_LOG="error,sc_rpc_server=info,runtime::revive=debug"
cargo run -p revive-dev-node -- --no-prometheus --log="$RUST_LOG" --dev

[#9539]: [XCMP] take_first_concatenated_xcm() improvements

This PR:

  • improves take_first_concatenated_xcm() avoiding the XCM re-encoding
  • makes the benchmarks for take_first_concatenated_xcm() more granular, accounting for the number of bytes of the message

[#9641]: Account for PoV size when enqueing XCMP message

Related to #9630 , but adjusting the benchmark

Using #[benchmark(pov_mode = Measured)] for the enqueue_empty_xcmp_message_at benchmark.

[#8732]: Add comprehensive tracing to XCM-related modules

This PR replaces log with tracing instrumentation on XCM-related modules to significantly improve debugging capabilities for XCM execution flows. The implementation provides structured logging throughout XCM components with consistent log targets, making it easier to diagnose execution failures, fee calculation errors, and routing issues with zero runtime impact.

[#8693]: Add XCM Precompile to pallet-xcm

This PR adds the XCM precompile (with xcmSend, xcmExecute and weighMessage functionalities) to pallet-xcm.

This follows the discussion we had on a closed PR, which attempted to add the precompile to pallet-revive, but that approach would have introduced unwanted cyclic dependencies. That's why we decided to migrate the precompile to pallet-xcm, avoiding adding unnecessary dependencies to pallet-revive.

Follow up PR will add integration tests under cumulus/parachains/integration-tests/emulated/tests.

[#9378]: Replace log with tracing on pallet-bridge-beefy

This PR replaces log with tracing instrumentation on pallet-bridge-beefy by providing structured logging.

[#9056]: add benchmark for prune-era

Add benchmarking and weight calculation for prune_era in staking-async.

[#8666]: EPMB: Handle empty solution pages gracefully in verifier

  • Treat missing solution pages as empty rather than errors.
  • Updated get_page method now returns a default Solution instead of an Option when no candidate solutions are available. This simplifies the API and improves code clarity by removing the need to handle None cases.
  • Similarly, updated get_score method now returns a default (0) score if no leader is available.
  • Removed VerificationDataUnavailable now that get_page and get_score don't return an Option anymore
  • Signed validation phase must now be a multiple of the number of pages
  • Moved verifier stop logic to internal pallet method, removing the trait-level stop function in favor of handling cleanup during verification failure.
  • Updated tests to reflect new behavior and remove defensive unwraps.

[#9001]: revive: Precompiles should return dummy code when queried

Fixes paritytech/contract-issues#111

This fixes both the RPC and the opcodes EXTCODESIZE and EXTCODEHASH.

Also removed the disabled host function is_contract. Contracts do use EXTCODESIZE to determine if something is a contract exclusively.

Need to add some differential tests to our test suite to make sure that the RPC matches geth behaviour:

On kitchensink:

# primitive precompiles should not return error but 0x
$ cast code 0x0000000000000000000000000000000000000001
0x

# this is the erc pre-compile
$ cast code 0x0000000000000000000000000000000000010000
0x60006000fd

[#8935]: Fix prestate create traces

Fix an issue on the prestate tracer, for CREATE trace.
The tracer was not reporting the created code properly in the post state trace.

Also added tests in evm-test-suite paritytech/evm-test-suite#97

[#9335]: frame_system: Whitelist storage items and do not double kill!

This pull requests adds some storage values to the whitelisted storage item list, because they are written in every block. Also it stops double killing InherentsApplied. It is killed in on_finalize, so there is no need to do it again in on_initialize.

[#9141]: Asset Hub Westend: nfts pallet uses Relay Chain as block provider

The nfts pallet collections uses the Relay Chain as block provider for the time range of mint.start_block and mint.end_block

[#9267]: pallet-revive: Raise contract size limit to one megabyte and raise call depth to 25

This PR changes the contract code limit from roughly 100KiB to exactly 1MiB. It also raises the call stack depth from 5 to 25.

Those limits were in place because of memory constraints within the runtime. We work around them in those ways:

  1. Removing the 4x safety margin for allocations which is no longer needed due to the new allocator.
  2. Limiting the size of the compilation cache to a fixed size.
  3. Resetting the compilation cache and flat map every time we call into a new contract.
  4. Limiting the size of calldata and return data to 128KiB (only capped by tx size and RAM before). While this is a breaking change nobody will be affected since Geth effectively limits the call data to 128KiB.

1MiB contracts

This is large enough so that all known contracts won't fail for size issues anymore.

The new limit is also much simpler to understand since it does not depend on the number of instructions. Just those two constraints:

PVM_BLOB.len() < 1 MiB
PVM_BLOB.len() + (rw/ro/stack) < 1MiB + 512KiB

This means:

  1. A contract is guaranteed to have at least 512KiB of memory available.
  2. A contract that is smaller in code can use more memory.
  3. Limit is exactly 1MiB unless a user manually increase the memory usage of a contract to be larger than 512KiB.

Call stack depth 5 -> 25

The limit of 5 was problematic because there are use cases which require deeper stacks. With the raise to 25 there should be no benign use cases anymore that won't work.

Please note that even with the low limit of 25 contracts are not vulnerable to stack depth exhaustion attacks: We do trap the caller's context when the depth limit is reached. This is different from Eth where this error can be handled and failure to do so leaves the contract vulnerable.

[#9024]: Add Secretary Program to Collectives Westend

Adds Secretary Program(i.e. pallet-ranked-collective & pallet-salary only).
Salary payments in USDT via Asset Hub and XCM integration for cross-chain payments.

[#8932]: pallet-balances: Do not create account in benchmarking

This particular benchmark is about benchmarking the account creation, so we should not create it before :)

Closes: #8927

[#8829]: Eth transaction do not double bump the nonce

Add an extra eth_instantiate_with_code dispatchable that is used by the EVM compatibility layer and ensures that the origin's nonce is only incremented once

Fixes paritytech/contract-issues#64

[#9401]: Replace log with tracing on bp-runtime

This PR replaces log with tracing instrumentation on bp-runtime by providing structured logging.

[#9325]: Fix pallet-im-online benchmarking for runtimes with MaxKeys < 1000

Fixes benchmarking for pallet-im-online when runtime configuration has MaxKeys < 1000.
Previously, the benchmark code used a hardcoded constant MAX_KEYS = 1000 which would cause benchmark failures for runtimes configured with fewer maximum keys. This change updates the benchmark to dynamically use the MaxKeys value from the pallet's Config trait.

[#9004]: chore: Bump bounded-collections dep

Description

Bump bounded-collections dep from 0.2.3 to 0.3.2 based on the latest release

[#9318]: Replace log with tracing on pallet-bridge-parachains

This PR replaces log with tracing instrumentation on pallet-bridge-parachains by providing structured logging.

[#9105]: feat(binary-merkle-tree): add merkle_root_raw and merkle_proof_raw methods

Resolves #9103

Added merkle_root_raw and merkle_proof_raw methods, which allow developers to avoid double hashing when working with sequences like Vec<H256>, where H256 is already hash of some message.

[#9441]: [pallet-revive] Implement basic System pre-compile, move seal_hash_blake2_256 into it.

Implements a basic System pre-compile and moves the unstable host function hash_blake2_256 in there.

[#9511]: EPMB/Signed: Make invulnerables non-eject-able

Follow-up to #8877 and audits: Make it such that invulnerable accounts cannot be ejected from the election signed queue altogether.

[#8848]: Snowbridge: Improve local and testnet setup

Enable the Prague-Electra fork by default.
Improve Penpal Runtime to include pallet-utility.

[#9470]: Bridges - relax trait bound from Codec to Encode

Relaxing the type SignedTransaction constraint from Codec to Encode.

[#9166]: pallet-bags-list: Emit ScoreUpdated event only if it has changed

follow-up to #8684, ensuring all blocks don't have x events when auto-rebag feature is enabled.

[#9057]: Align parameters for EventEmitter::emit_sent_event

Corrected markdown and indentation for the emit_sent_event function parameters in the EventEmitter trait documentation for better readability.

[#9326]: [HRMP] Check messages order before enqueing them

Related to #8860

This PR adds a check in order to ensure that the collator has respected the proper order when sending the HRMP messages to the runtime.

[#8684]: Add optional auto-rebag within on-idle

Introduced an optional on_idle hook for automatic account rebagging, improving the incremental correction of account positions within the bags-list during block execution's idle phase. This feature leverages new storage and configurable constants, alongside enhanced logging and internal helpers. Setting MaxAutoRebagPerBlock to 0 (e.g., type MaxAutoRebagPerBlock = ();) disables this functionality, preserving pre-upgrade pallet behavior. make sure that after setting value of MaxAutoRebagPerBlock you regenerate weight for your runtime.

[#9482]: [pallet-revive] expose exec::Key

This is a fix for the fact that exec::Key is exposed from within pallet_revive::tracing::Tracing interface, but not from the crate itself making custom tracers effectively unimplementable outside said crate.

In my case it's useful for implementing custom tracers for integration with foundry

[#9564]: Fix disabled validator filtering in the parachains runtime

Correctly map group indices to vote indices when filtering backing statements.

[#8980]: Fix revive-fixtures build script

Fix compilation issue with pallet-revive-fixtures build.rs script.

[#8794]: renamed wasm module in pallet-revive to vm

fixes #8341

[#9316]: Enable TopicIdTracker to support multiple flows

This PR enables TopicIdTracker to support multiple flows.

[#8723]: Scheduler on_initialize supports skipped blocks

Scheduler correctly handles situations where on_initialize is invoked with block numbers that:

  • increase but are not strictly consecutive (e.g., jump from 5 → 10), or
  • are repeated (e.g., multiple blocks are built at the same Relay Chain parent block, all reporting the same BlockNumberProvider value).
    This situation may occur when the BlockNumberProvider is not local - for example, on a parachain using the Relay Chain block number provider.
    Implementation notes:
  • The IncompleteSince value is always set to the next block (now + 1).
  • A scheduled task is considered permanently overweight only if it fails during the first agenda processing.

[#9384]: [AHM] Make stuff public and derive

Preparation for Asset hub migration by making fields public and doing some tweaks.
Also hide one silently truncating constructor from `ParaId``.

[#9079]: Prevent withdrawals while processing offences

Adds withdrawal restrictions to prevent users from withdrawing unbonded funds while there are unprocessed offences that could result in slashing. This is a defensive measure that ensures slashing guarantees are maintained even in extreme edge cases.

Key changes:

  • Withdrawals are blocked if there are unapplied slashes from the previous era (returns UnappliedSlashesInPreviousEra error). This occurs when all unapplied slashes for an era could not be applied within one era worth of blocks. While one era is reserved for applying slashes page by page, if the era rolls over before completion, these slashes can only be applied via the permissionless
    apply_slash call.
  • Withdrawals are restricted to the minimum of the active era and the last fully processed offence era
  • Unbonding chunks are now keyed by active era instead of current era
  • Offences arriving after their intended application era are rejected and emit OffenceTooOld event

Both the UnappliedSlashesInPreviousEra error and withdrawal restrictions due to delayed offence processing are extremely rare scenarios that should not occur under normal operation. These are defensive measures to handle edge cases where slash
processing is delayed beyond expected timelines.

[#9235]: Remove unused deps

Remove unused deps using cargo udeps

[#9501]: [revive] revm move existing files

  • Move exisiting files in pallet-revive to accomodate the upcoming EVM backend
  • Add solc/resolc compilation feature for fixtures

[#9409]: Replace log with tracing on xcm-emulator

This PR replaces log with tracing instrumentation on xcm-emulator by providing structured logging.

[#9544]: Disable reserve_transfer_assets for DOT|KSM|WND|PAS

The reserve_transfer_assets extrinsic on pallet-xcm is also affected by the same issue as transfer_assets.
These extrinsics have been updated to return an error when dealing with DOT|KSM|WND|PAS, effectively disabling them.
We can't afford these extrinsics to be enabled after the Asset Hub Migration (AHM) and risk trapping assets due to chain misconfigurations.
All chains need to update and coordinate with their dapps to move to the alternatives, like transfer_assets_using_type_and_then
or execute.

[#7250]: Add Missing Events for Balances Pallet

This PR improves accounting by implementing missing events for hold, release, credit drops and debt drop operation:

Emit events for hold-related operations (Held, Released, BurnedHeld, TransferOnHold, TransferAndHold, BurnedDebt, MintedCredit).

Adjust total issuance automatically when PositiveImbalance or NegativeImbalance are dropped via the HandleImbalanceDrop trait.

[#8897]: [pallet-revive-rpc] fix sqlite in-memory connection pool issue

Fix in-memory sqlite connection pool issue see launchbadge/sqlx#2510

[#8436]: Fix calling nominate on a validator that doesn’t exist silently succeeds

This PR fixes a bug where calling nominate on a validator that doesn’t exist silently succeeds.
It also updates all the tests that had an incorrect setup - they were simulating elections with unregistered validators.

[#9101]: [revive] eth-decimals

On Ethereum, 1 ETH is represented as 10^18 wei (wei being the smallest unit).
On Polkadot 1 DOT is defined as 10^10 plancks. It means that any value smaller than 10^8 wei can not be expressed with the native balance. Any contract that attempts to use such a value currently reverts with a DecimalPrecisionLoss error.

In theory, RPC can define a decimal representation different from Ethereum mainnet (10^18). In practice tools (frontend libraries, wallets, and compilers) ignore it and expect 18 decimals.

The current behaviour breaks eth compatibility and needs to be updated. See issue #109 for more details.

Fix paritytech/contract-issues#109
weights compare

[#9177]: align eth-rpc response with geth

  • Update serde encoding for eth-rpc to match serialization behavior of Geth

[#9380]: [Staking/AHM] Properly report weight of rc -> ah xcm back to the calls

Properly report weight of rc -> ah xcm back to the calls, which will consequently make the XCM/MQ code path aware of the weights, which was previously not the case.

Additionally, adds an event for when an era is pruned.

[#8903]: ParachainSystem: Do not emit the SelectCore digest

This will be moved into an inherent digest.

[#8938]: Make NoOpPoll generic over Moment

This PR enhances the flexibility of the NoOpPoll implementation by introducing a generic Moment parameter. This change enables support for diverse clock configurations across different runtimes, allowing NoOpPoll to work seamlessly with various block number implementations (e.g., u32, u64, or custom block number types).

[#9604]: Society pallet: Make fields of storage-persisted types public

Fields of types persisted in storage have been made public.

[#9504]: Fix pallet_session benchmarks

Fixes the benchmarking code of pallet_session such that it works with any KeyDeposit.

[#9294]: Replace log with tracing on pallet-bridge-grandpa

This PR replaces log with tracing instrumentation on pallet-bridge-grandpa by providing structured logging.

[#9067]: [AHM] Derive DecodeWithMemTracking and pub fields

  • Derive DecodeWithMemTracking on structs
  • Make some fields public

[#8851]: Add address revive runtime API

This gives an easy way for substrate user to convert an Account ID into the mapped H160 address

[#8781]: [pallet-revive] fix call-trace create calls

Fix call-traces for CREATE calls.

fixes paritytech/contract-issues#96

[#9602]: Fix check_hrmp_message_metadata()

We need to update maybe_prev_msg_metadata inside check_hrmp_message_metadata()

[#8787]: Westend governance authorize_upgrade integration tests

Integration tests covering authorize_upgrade with whitelisting via Collectives for Westend network

[#8952]: Migrate pallet-bounties benchmark to v2

Migrate pallet-bounties benchmark to v2

[#8694]: Fix pallet_migrations benchmark when FailedMigrationHandler emits events

When FailedMigrationHandler emits events, the UpgradeFailed event is not the last one, so assert_last_event fails. Fixed by checking that the UpgradeFailed event is emitted, even if it is not the last one.

[#9126]: XCM precompile - don't support older XCM versions (3 and 4)

The latest XCM version is 5.
A lot of parachains are still running V3 or V4 which is why we haven't removed them, but the XCM precompile is new and should only have to deal with versions 5 and onwards.
No need to keep dragging 3 and 4 in contracts.
This is the default behavior, there's no need to configure anything in pallet-xcm.

[#9497]: Society pallet supports non-consecutive block provider

Society pallet correctly handles situations where on_initialize is invoked with block numbers that:

  • increase but are not strictly consecutive (e.g., jump from 5 → 10), or
  • are repeated (e.g., multiple blocks are built at the same Relay Chain parent block, all reporting the same BlockNumberProvider value).
    This situation may occur when the BlockNumberProvider is not local - for example, on a parachain using the Relay Chain block number provider.

[#9191]: Fixed westend asset hub ID

Added cumulus_primitives_core::GetParachainInfo impl to the AHW runtime to get the parachain ID.

[#8789]: [pallet-revive] Add contract instantiated event

instantiate and instantiate_with_code emit a Instantiated event.

[#9659]: staking-async: prevent manual application of cancelled slashes

Fix security vulnerability where the permissionless apply_slash extrinsic could be used to manually apply slashes that governance had cancelled via cancel_deferred_slash.

[#9225]: Add supported_version to pallet-xcm genesis config

Adds a supported_version field to the pallet-xcm genesis config, which allows specifying versioned locations at genesis.

[#8752]: transfer_assets benchmarking and weights for coretime chains

Introduces implementation of set_up_complex_asset_transfer() to correctly benchmark weights for transfer_assets extrinsics on Rococo Coretime and Westend Coretime. Introducing also test scenarios to cover common xcm teleport use cases

[#8937]: [Staking] [AHM] Fixes insufficient slashing of nominators and some other small issues.

Removed

  • Config constant MaxDisabledValidators: This constant was removed since validator disabling logic has been moved to pallet-session, making it redundant in staking-async.
  • Storage DoubleMap NominatorSlashInEra: This was used to track per-era maximum slashes for nominators. It’s no longer required — we now only track the highest slash per validator per era.
  • Call withdraw_overstake: This was a temporary extrinsic meant to fix overstake issues, but with fungible migration of staking funds, this is no longer possible and the extrinsic is obsolete.

Changed

  • Nominator slashing logic: The logic now aggregates slashes from distinct offending validators nominated by a nominator within the same era. For repeated offences by the same validator, only the highest slash fraction is applied. Previously, the pallet applied only the highest slash across all validators, regardless of how many were slashed.

[#8742]: [pallet-revive] prestate tracer

[#9516]: Fix for promote_fast benchmark

Fixed benchmark generation/compilation for promote_fast MaxRank change from u32 to u16.

[#8881]: [pallet-revive] only record diff if value changed

Only record storage change in diff mode if the value differ from the initial one.
Previous implementation would report a diff for example when the old value was written again.

Updated tests in paritytech/evm-test-suite#96

[#9084]: Fix MaxEncodedLen implementation for Error enum

Updates the MaxEncodedLen implementation for the XCM Error enum to correctly calculate the maximum encoded size.

[#9107]: Add block number and extrinsic index to PureCreated event

Enhances PureCreated event with current block number and extrinsic index.
Uses system BadContext error for extrinsic index retrieval.

Changelog for Node Operator

ℹ️ These changes are relevant to: Those who don't write any code and only run code.

[#8651]: polkadot-omni-node: add GetParachainInfo runtime api

This PR deprecates the para_id field of parachain chain specifications.

  • Both polkadot-omni-node & polkadot-parachain are still supporting the para_id
    field passed via chain specifications, while parachain-template-node supports only runtime API based provided parachain id.
  • This PR also changes minimal-template-runtime to not run anymore with Omni Node.
  • chain-spec-builder still supports generating chain specifications with para_id field.
  • Starting with stable2509 polkadot-parachain/parachain-template-node will generate chain specs that are not compatible
    with prior node versions because para_id field will not be added anymore to the resulting chain specs.

Starting with stable2509 the para_id field of chain specification is not required anymore, and runtime developers will be able
to specify it to nodes by implementing the runtime API cumulus_primitives_core::GetParachainInfo.

Starting with stable2512 the para_id field of chain specification will not be supported anymore by node versions and
chain-spec-builder will drop its support, so it is mandatory for runtimes to implement the GetParachainInfo trait to still be compatible with the nodes.

[#9147]: babe: keep stateless verification in Verifier, move everything else to the import queue

Only do stateless verification without runtime calls in the BabeVerifier, do all other verification in the import queue.

[#9280]: fix: skip verifying imported blocks

Closes #9277. Still WIP testing

[#9272]: track authorities from aura digests

Closes #9064.

Tracks AURA authorities in a ForkTree. The fork tree is updated whenever there is an authorities change log in the digest. If the fork tree doesn't contain the authorities, they are fetched for the runtime (should only happen at startup, or if something weird is going on with forks maybe).

[#9015]: consensus/grandpa: Fix high number of peer disconnects with invalid justification

A grandpa race-casse has been identified in the versi-net stack around authority set changes, which leads to the following:

  • T0 / Node A: Completes round (15)
  • T1 / Node A: Applies new authority set change and increments the SetID (from 0 to 1)
  • T2 / Node B: Sends Precommit for round (15) with SetID (0) -- previous set ID
  • T3 / Node B: Applies new authority set change and increments the SetID (1)

In this scenario, Node B is not aware at the moment of sending justifications that the Set ID has changed.
The downstream effect is that Node A will not be able to verify the signature of justifications, since a different SetID is taken into account. This will cascade through the sync engine, where the Node B is wrongfully banned and disconnected.

This PR aims to fix the edge-case by making the grandpa resilient to verifying prior setIDs for signatures.
When the signature of the grandpa justification fails to decode, the prior SetID is also verified. If the prior SetID produces a valid signature, then the outdated justification error is propagated through the code (ie SignatureResult::OutdatedSet).

The sync engine will handle the outdated justifications as invalid, but without banning the peer. This leads to increased stability of the network during authority changes, which caused frequent disconnects to versi-net in the past.

Review Notes

Testing Done

  • Deployed the PR to versi-net with 40 validators
  • Prior we have noticed 10/40 validators disconnecting every 15-20 minutes, leading to instability
  • Over past 24h the issue has been mitigated: https://grafana.teleport.parity.io/goto/FPNWlmsHR?orgId=1
  • Note: bootnodes 0 and 1 are currently running outdated versions that do not incorporate this SetID verification improvement

Part of: #8872

[#8076]: Enable statement store with new CLI arg in polkadot-omni-node and polkadot-parachain

In polkadot-omni-node-lib, a new cli arg --enable-statement-store is introduced, if set to true then the statement store is enabled in the node.

The statement store is an off-chain data-store for signed statements accessible via RPC and offchain worker.
It uses the runtime api to get the allowance associated to an account.

This takes effect in polkadot-omni-node and polkadot-parachain and any node depending on polkadot-omni-node-lib.

In cumulus-client-service the BuildNetworkParams now takes the metrics configuration explicitly, you can use the same configuration as before using the network backend used when calling build_network:

let metrics = NetworkBackend::register_notification_metrics(
    parachain_config.prometheus_config.as_ref().map(|config| &config.registry),
);

[#9047]: Add extra information to the harmless error logs during validate_transaction

Adds additional information to the harmless error logs "Bad input data provided" during validate_transaction.

[#7985]: Collect system infomation on FreeBSD OS

Adds support for collecting system information on FreeBSD. This allows Decentralized Nodes operators to be compliant with the Telemetry rule without maintaining patches.

[#9446]: Cumulus: Remove --relay-chain-light-client

This PR removes the experimental flag --relay-chain-light-client from cumulus and as a consequence,
smoldot and smoldot-light as workspace dependencies.

Closes #9013

[#9424]: feat(warp sync): store headers and justifications during warp sync

Store justifications and headers for authority set changes blocks during warp sync to be able to respond to warp sync requests from peers even without gap sync. In a follow-up PR, gap sync will be disabled if block pruning is enabled. This PR ensures that warp sync still works across the network, even on pruned nodes.

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.

[#9023]: [XCM Precompile] Rename functions and improve docs in the Solidity interface

This PR changes the function names on the XCM Precompile from xcmExecute and xcmSend to execute and send, respectively. This is a breaking change because it modifies the ABI-encoded function selectors, which are calculated using bytes4(keccak256(FUNCTION_SIGNATURE)).

bytes4(keccak256("xcmSend(bytes,bytes)")) -> 0xc0addb55
is going to be now
bytes4(keccak256("send(bytes,bytes)")) -> 0x7f0a3bf9

bytes4(keccak256("xcmExecute(bytes,(uint64,uint64)))")) => 0x377df829
is going to be now
bytes4(keccak256("execute(bytes,(uint64,uint64)))")) => 0xd3b7e04d

It also adds new documentation to the precompile, directing developers to the official Polkadot XCM documentation. Additionally, it explicitly sets return values for both functions to clarify that the return value matches what is returned by pallet_xcm::send() and pallet_xcm::execute().

[#7997]: [AHM] The Asset Hub Migration on Westend

Post AHM changes for Westend Relay and Asset Hub.

[#7953]: Add deposit for setting session keys

Setting session keys might put some funds on hold in the future, depending on how runtimes use this feature.

Requires pallet_session::Config to specify:

  • type Currency, assigned to an instance of pallet_balances.
  • type KeyDeposit, the amount of deposit. Set to () to assert no deposit amount is needed.

[#9136]: Fix Configuration:set_max_upward_queue_size

The set_max_upward_queue_size function now correctly allows setting the maximum upward queue size to values larger than the maximum individual message size.

[#8987]: EPMB/unsigned: fixed multi-page winner computation

Change the calculation of MaxWinnersPerPage in FullSupportsOfMiner to Pages * MaxWinnersPerPage (instead of the overall maximum number of winners across pages) to prevent the computed solution from having a low overall total of winners, which could result in a WrongWinnerCount error.

[#9187]: Staking Async: Improve slash cancellation to handle multiple slash fractions and pages

This PR fixes an issue where governance could not effectively cancel deferred slashes when subsequent offence
reports increased the slash fraction. The solution introduces a new CancelledSlashes storage item that tracks
cancelled slashes by era and validator with their maximum slash fractions to cancel.

Key changes:

  • Added CancelledSlashes storage map to track cancelled slashes by era
  • Updated cancel_deferred_slash to accept Vec<(AccountId, Perbill)> allowing governance to specify the slash
    fraction to cancel for each validator
  • Modified slash application logic to check CancelledSlashes before applying any slash
  • Automatic cleanup of CancelledSlashes after all slashes for an era are processed

This ensures governance can cancel slashes even when the slash fraction changes due to additional offence reports, addressing a critical limitation in the previous implementation.

[#9632]: staking-async: implement lazy era pruning extrinsic

Move era pruning from automatic unbounded deletions to a permissionless lazy pruning system.
The new system processes era pruning across multiple blocks using a state machine pattern, ensuring storage operations remain bounded and preventing PoV size exhaustion.

[#8693]: Add XCM Precompile to pallet-xcm

This PR allows smart contract developers to call multiple XCM APIs from smart contracts/Ethereum tooling.

[#4081]: [pallet-broker] Force-unpool provisionally pooled regions before redispatching them

This PR force removes regions from the pool before allowing them to be redispatched (through partition/interlace/assign) for regions pooled with Provisional finality. To claim any revenue from before this point, claim_revenue should be called before
partitioning/interleaving/reassigning as it cannot be claimed afterwards.

[#9606]: Expose account/contract revive types to use externally

Exposes revive types to use in foundry-polkadot project.

[#9544]: Disable reserve_transfer_assets for DOT|KSM|WND|PAS

The reserve_transfer_assets extrinsic on pallet-xcm is also affected by the same issue as transfer_assets.
These extrinsics have been updated to return an error when dealing with DOT|KSM|WND|PAS, effectively disabling them.
We can't afford these extrinsics to be enabled after the Asset Hub Migration (AHM) and risk trapping assets due to chain misconfigurations.
All apps should switch to transfer_assets_using_type_and_then or execute.

[#8925]: Multisig::as_multi_threshold_1: Send MultisigExecuted event

So the behavior is the same as as_multi when it comes to sending an event.

Closes: #8924

[#9126]: XCM precompile - don't support older XCM versions (3 and 4)

The XCM precompile will only support XCM from version 5 (current) onwards.
Versions 3 and 4 won't be supported.

[#9125]: [Xcm Precompile] Remove return value

This PR removes any return value from xcm send and execute. Additionally it improves upon the documentation of the interface by reorganising where comments are placed.

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

🏋️ Runtime Size:          2.38 MB (2490534 bytes)
🔥 Core Version:          westend-1020000 (parity-westend-0.tx27.au2)
🗜 Compressed:            Yes: 75.03%
🎁 Metadata version:      V14
🗳️ system.setCode hash:   0xf862ea1045b64d5c3d03e706796e828c0453de4999c94f8f1e40632f9e088ce4
🗳️ authorizeUpgrade hash: 0xe3c943714b6cf0122854fede7c7e5a4985c360f5a1cdd7c8162eea663dec0ed8
🗳️ Blake2-256 hash:       0x5a55dfc559c7e8f6a475e413cb5ca85b7dd8d167df5dc402c0705a042b473343
📦 IPFS:                  Qmd1uyEFz2w8RXiMr1RbsmaiAUiuuxwYbQBhBbfTJ8kbaz

Westend Assethub

🏋️ Runtime Size:          2.95 MB (3096279 bytes)
🔥 Core Version:          westmint-1020000 (westmint-0.tx16.au1)
🗜 Compressed:            Yes: 77.1%
🎁 Metadata version:      V14
🗳️ system.setCode hash:   0xf6d027209539cbdc4e7abbfdcd0bf5192f58f84531502641f85565df9316d51f
🗳️ authorizeUpgrade hash: 0x49308041efdc995aec0eaf19e049962cd29d85f2312cddfa7ecf2d504009b035
🗳️ Blake2-256 hash:       0x316c9a0415aeefd1bce69b48dfaf3e335729bfe157b7b1c464dbe4955ceca865
📦 IPFS:                  QmT6okVC36HHk2otDWU62K8L7UFkrTdgQyZa6PXj5ic6rs

Westend Bridgehub

🏋️ Runtime Size:          1.76 MB (1844857 bytes)
🔥 Core Version:          bridge-hub-westend-1020000 (bridge-hub-westend-0.tx6.au1)
🗜 Compressed:            Yes: 74.8%
🎁 Metadata version:      V14
🗳️ system.setCode hash:   0xb690be268d7ae626ecf5ad02ce33e716add2bdb503c8ebad4f875bf514e17097
🗳️ authorizeUpgrade hash: 0x21a8194766d1950cb116763a1f0e8eb37109836831af26bcdb357c086b0d001d
🗳️ Blake2-256 hash:       0x0438da5c004caf848db47fc34e74fea3c727bd347286e3125ad7527525843a72
📦 IPFS:                  QmSJRP4WCUpmktRWRoMukZqNhNQ72hULC9eKZ1taMrn1SC

Westend Collectives

🏋️ Runtime Size:          1.60 MB (1672481 bytes)
🔥 Core Version:          collectives-westend-1020000 (collectives-westend-0.tx6.au1)
🗜 Compressed:            Yes: 76.16%
🎁 Metadata version:      V14
🗳️ system.setCode hash:   0x431ac56e04cd6e95c66be3af84e936b359e19da122143a596e5caff1cb12bd4d
🗳️ authorizeUpgrade hash: 0x270950bd87dcd531a0451dbcb9322cdc5e651eba3948267152d15df509e9bf04
🗳️ Blake2-256 hash:       0x862cc465126a8d1acd2c63c8f99a560d9594d91267f0eb728bf9d6efd28dfda8
📦 IPFS:                  QmXFuQ9tWoHQutf3VRah7aBbkMw2173rBLkmjrmGxwj1t3

Westend Coretime

🏋️ Runtime Size:          1.42 MB (1488597 bytes)
🔥 Core Version:          coretime-westend-1020000 (coretime-westend-0.tx2.au1)
🗜 Compressed:            Yes: 75.23%
🎁 Metadata version:      V14
🗳️ system.setCode hash:   0xd03e1b074b359af150d663a5ea8f65c1fb98095084d9fc458b3866e24dc74650
🗳️ authorizeUpgrade hash: 0x69e45ff3f02476116ac0d608537a590f508d6540574944870bcd638b04e5d412
🗳️ Blake2-256 hash:       0x0dc6ef63fd46675c706a6e41426337182628c119c93d7cf37c140a35d05e1ee7
📦 IPFS:                  Qme2dAiYQXbnApo7Zt3ni99veS44Mz7AsY5YypHwmNWtBW

Westend Glutton

🏋️ Runtime Size:          660.04 kB (675884 bytes)
🔥 Core Version:          glutton-westend-1020000 (glutton-westend-0.tx1.au1)
🗜 Compressed:            Yes: 73.25%
🎁 Metadata version:      V14
🗳️ system.setCode hash:   0xb9bb4b2ba18eec6f887f545c57e267c05eb692438e904b8c0eacf3f338d4535e
🗳️ authorizeUpgrade hash: 0xca8cb58c2c1bd10a753e4c16a2b21fcd98ebe95a702bb335cbccefcecfe0a9a8
🗳️ Blake2-256 hash:       0xeaac4abecf3243b4bd69060bc8b321e543d333847f0ae2f8a7501b31ece1717b
📦 IPFS:                  QmNd63BEpFRTYyuscwTRQSM4x1tqPArdu6y4qgjtxcNdxG

Westend People

🏋️ Runtime Size:          1.41 MB (1473255 bytes)
🔥 Core Version:          people-westend-1020000 (people-westend-0.tx2.au1)
🗜 Compressed:            Yes: 75.27%
🎁 Metadata version:      V14
🗳️ system.setCode hash:   0xacb62e69865c055fff9186a7f7e617054f0b7cd19dca5af3fb664b37ce8439f8
🗳️ authorizeUpgrade hash: 0x53aba0fa0e44b9d44fdcf475ec7fc04dab030ac13520e769fb8183c82453e76c
🗳️ Blake2-256 hash:       0x7d5da5899951e5a845e94ee9ee626a732ec237c56f2194ff711fdae76799093a
📦 IPFS:                  QmYEYheB1MHTT5xaFku7DvVt11TvmGsTpCbqxLTPgcStoY

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:stable2509-rc1

or

docker pull parity/polkadot-parachain:stable2509-rc1

Don't miss a new polkadot-sdk release

NewReleases is sending notifications on new releases.