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_idwith the node, so that when failing to useGetParachainInfo::parachain_idwe also get a log with the error (before defaulting topara_idextracted 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-parachainare still supporting thepara_id
field passed via chain specifications, whileparachain-template-nodesupports only runtime API based provided parachain id. - This PR also changes
minimal-template-runtimeto not run anymore with Omni Node. chain-spec-builderstill supports generating chain specifications withpara_idfield.- Starting with
stable2509polkadot-parachain/parachain-template-nodewill generate chain specs that are not compatible
with prior node versions becausepara_idfield 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
- Main changes that verify prior SetId on failures are placed in check_message_signature_with_buffer
- Sync engine no longer disconnects outdated justifications in process_service_command
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
getandfind_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
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
BufferedOffencestruct with optional reporter and slash fraction fields - Restructures buffered offences storage from
Vec<(SessionIndex, Vec<Offence>)>to nestedBTreeMap<SessionIndex, BTreeMap<AccountId, BufferedOffence>> - Adds
MaxOffenceBatchSizeconfiguration 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_offencesfunction - Adds WeightInfo trait with benchmarked weights for batch processing in
on_initializehook
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 ofpallet_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-parachainare still supporting thepara_id
field passed via chain specifications, whileparachain-template-nodesupports only runtime API based provided parachain id. - This PR also changes
minimal-template-runtimeto not run anymore with Omni Node. chain-spec-builderstill supports generating chain specifications withpara_idfield.- Starting with
stable2509polkadot-parachain/parachain-template-nodewill generate chain specs that are not compatible
with prior node versions becausepara_idfield 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_pagemethod 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_scoremethod now returns a default (0) score if no leader is available. - Removed VerificationDataUnavailable now that
get_pageandget_scoredon'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:
- Removing the 4x safety margin for allocations which is no longer needed due to the new allocator.
- Limiting the size of the compilation cache to a fixed size.
- Resetting the compilation cache and flat map every time we call into a new contract.
- 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:
- A contract is guaranteed to have at least 512KiB of memory available.
- A contract that is smaller in code can use more memory.
- 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
BlockNumberProvidervalue).
This situation may occur when theBlockNumberProvideris not local - for example, on a parachain using the Relay Chain block number provider.
Implementation notes: - The
IncompleteSincevalue 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
UnappliedSlashesInPreviousEraerror). 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_slashcall. - 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
OffenceTooOldevent
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
DecodeWithMemTrackingon 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
- Add prestate tracer
- Add coinbase runtime API to get the miner's address
tested against geth with paritytech/evm-test-suite#93
[#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-parachainare still supporting thepara_id
field passed via chain specifications, whileparachain-template-nodesupports only runtime API based provided parachain id. - This PR also changes
minimal-template-runtimeto not run anymore with Omni Node. chain-spec-builderstill supports generating chain specifications withpara_idfield.- Starting with
stable2509polkadot-parachain/parachain-template-nodewill generate chain specs that are not compatible
with prior node versions becausepara_idfield 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
- Main changes that verify prior SetId on failures are placed in check_message_signature_with_buffer
- Sync engine no longer disconnects outdated justifications in process_service_command
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 ofpallet_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
CancelledSlashesstorage map to track cancelled slashes by era - Updated
cancel_deferred_slashto acceptVec<(AccountId, Perbill)>allowing governance to specify the slash
fraction to cancel for each validator - Modified slash application logic to check
CancelledSlashesbefore applying any slash - Automatic cleanup of
CancelledSlashesafter 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