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

pre-release3 hours ago

This release contains the changes from polkadot-stable2606 to polkadot-stable2609.

⚠️ 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.

πŸ“¦ The complete changelog with full descriptions is attached to this release as CHANGELOG.md, and in machine-readable form as changelog.json.

πŸ’₯ Breaking Changes

87 changes are breaking according to Rust SemVer (each bumps the major version of at least one crate). Details in the πŸ’₯-marked entries below.

  • Bridges: #11147 Track nested memory used by xcm::DoubleEncoded: approach #2 (staging-xcm, staging-xcm-executor)
  • Bridges: #12159 Snowbridge: blocks an origin-spoofing attack vector in the V2 outbound queue converter (snowbridge-outbound-queue-primitives)
  • Bridges: #12585 Remove Polkadot Bulletin bridge code (bridge-hub-rococo-runtime, bp-bridge-hub-rococo)
  • Bridges: #12935 Update trie-db to 0.32.0 (sp-trie)
  • XCM: #12369 pallet-asset-conversion: support per-pair swap fee (fallback to global LPFee) (pallet-asset-conversion)
  • XCM: #12378 pallet-assets: allow force_create to set an arbitrary asset id when auto-increment is enabled (pallet-assets)
  • XCM: #12472 Remove deprecated ConvertedConcreteAssetId type alias (staging-xcm-builder)
  • XCM: #12482 Remove deprecated FilterAssetLocation trait (staging-xcm-executor)
  • XCM: #12502 Remove deprecated ForeignChainAliasAccount type alias (staging-xcm-builder)
  • XCM: #12503 Remove deprecated CurrencyAdapter from staging-xcm-builder (staging-xcm-builder)
  • XCM: #12504 Remove deprecated UnpaidLocalExporter from staging-xcm-builder (staging-xcm-builder)
  • XCM: #12505 Remove deprecated JustTry and Identity re-exports from xcm-executor (staging-xcm-executor)
  • XCM: #12832 pallet-xcm: weight asset claiming and precompile XCM input by their real size (pallet-xcm)
  • Smart Contracts (Revive): #12037 [pallet-revive]: move eth-rpc-only types out of pallet-revive (pallet-revive-eth-rpc, pallet-revive)
  • Smart Contracts (Revive): #12096 Bump subxt to 0.50 (pallet-revive-eth-rpc, frame-benchmarking-cli)
  • Smart Contracts (Revive): #12104 pallet-revive: per-transaction cold/hot storage access pricing (pallet-revive)
  • Smart Contracts (Revive): #12220 pallet-revive eth-rpc: make SubmittedTransaction::gas() return Option (pallet-revive-eth-rpc)
  • Smart Contracts (Revive): #12244 [pallet-revive]: Version the trace_block runtime API function (pallet-revive, pallet-revive-eth-rpc)
  • Smart Contracts (Revive): #12374 Fix resource exhaustion when replaying finalized-block transactions (sc-rpc-api, sc-rpc)
  • Smart Contracts (Revive): #12474 pallet-revive: support finalized/safe/pending block tags in eth_getLogs (pallet-revive-eth-rpc)
  • Smart Contracts (Revive): #12522 [pallet-revive] Test Versioning Invariants and Conventions (pallet-revive, pallet-revive-types, pallet-revive-eth-rpc, revive-dev-runtime)
  • Smart Contracts (Revive): #12536 [pallet-revive] Version the Remaining Runtime API Functions (pallet-revive-eth-rpc, pallet-revive, pallet-revive-types, revive-dev-runtime)
  • Smart Contracts (Revive): #12599 pallet-revive: bench the overlay overhead of hot storage accesses (asset-hub-westend-runtime, pallet-revive)
  • Smart Contracts (Revive): #12636 pallet-revive: implement eth_getBlockReceipts (pallet-revive-eth-rpc)
  • Smart Contracts (Revive): #12796 [pallet-revive] Report untraced transactions instead of omitting them (pallet-revive-types)
  • Smart Contracts (Revive): #12802 pallet-revive: make the first hot write after a cold read pay the deferred cost (pallet-revive)
  • Staking & Elections: #11336 Add deferred dispatch support (pallet-whitelist)
  • Staking & Elections: #11940 Post AHM Cleanup: Remove Staking (and friends) from Westend Runtime. (westend-runtime, pallet-staking-async-ah-client)
  • Staking & Elections: #11979 Scale validator self-stake incentive by era-points performance (pallet-staking-async)
  • Staking & Elections: #12323 Decouple unbonding pool bound from bonding duration (pallet-nomination-pools)
  • Staking & Elections: #12381 Introduce chill_inactive extrinsic to the pallet-staking-async (pallet-staking-async, asset-hub-westend-runtime)
  • Staking & Elections: #12542 Beefy: Make the equivocation time slot more generic (pallet-beefy, pallet-offences, sp-staking)
  • Staking & Elections: #12630 staking-async: include the unlock era in the Unbonded event (pallet-staking-async)
  • Staking & Elections: #12654 Remove deprecated pallet_staking::ExposureOf. (pallet-staking)
  • Staking & Elections: #12664 Remove deprecated TREASURER_INDEX constants (westend-runtime-constants, pallet-staking-async-rc-runtime-constants)
  • Coretime: #10188 Add sale_index field to Coretime SaleInfoRecord (pallet-broker)
  • Coretime: #11810 Introduce fp-coretime primitives crate (pallet-broker)
  • Governance: #11045 [pallet-bounties]: add reclaim_bounty_funds to reclaim stranded funds from closed bounty accounts (pallet-bounties, rococo-runtime)
  • Assets: #12245 pallet-psm: multi-instance, permissionless Peg Stability Modules (pallet-psm, frame-support, asset-hub-westend-runtime)
  • Assets: #12366 pallet-assets: enforce full deposit transfer in transfer_ownership (pallet-assets)
  • Parachains (protocol): #11909 [dmp] Use page queue instead of single vec (polkadot-runtime-parachains, polkadot-runtime-common, rococo-runtime, westend-runtime)
  • Parachains (protocol): #12156 Remove deprecated migration::remove_storage_prefix (frame-support)
  • Parachains (protocol): #12172 Collation protocol v4 with bounded segment advertisements (polkadot-node-network-protocol, polkadot-collator-protocol, polkadot-node-primitives, polkadot-node-subsystem-types and 4 more)
  • Parachains (protocol): #12251 Remove deprecated RelaychainBlockNumberProvider type alias (cumulus-pallet-parachain-system)
  • Parachains (protocol): #12391 Fix AllowedRelayParentInfo off by one error (polkadot-runtime-parachains)
  • Node: #11954 Cumulus: introduce authority discovery for parachains (polkadot-omni-node-lib, sc-network-sync)
  • Node: #12296 Cumulus v3: find_parent() adjustments (cumulus-client-consensus-common)
  • Node: #12315 feat(webrtc): add experimental WebRTC transport to litep2p backend (sc-cli, sc-network, sc-network-types)
  • Node: #12395 Cumulus v3 add more test cases + cosmetics (cumulus-client-consensus-common)
  • Node: #12433 txpool: maintain the transaction pool on every imported block (all forks) (sc-transaction-pool-api, sc-transaction-pool, sc-cli)
  • Node: #12450 approval-voting: remove unused v1 version (polkadot-node-primitives, polkadot-node-core-approval-voting)
  • Node: #12501 Remove deprecated BlockAnnounceValidator type alias (cumulus-client-network)
  • Node: #12598 Add roles to syncing peer events (sc-network-sync)
  • Node: #12652 Remove deprecated new_native_or_wasm_executor (sc-service)
  • Node: #12662 sc-hop: add Prometheus metrics (sc-hop)
  • Node: #12669 Remove deprecated NativeElseWasmExecutor, NativeVersion, and GetNativeVersion. (sc-executor, sp-version)
  • Node: #12686 Extract and refactor the Bitswap service (sc-network, sc-service, sc-storage-chain-sync, cumulus-client-service and 1 more)
  • Node: #12870 network: Enable WebRTC by default on full nodes (sc-cli, sc-network, sc-network-types, sc-network-bitswap)
  • Node: #12873 statement gossip: remove the per-peer known-statement cache (sc-network-statement)
  • Node: #12874 statement-store: remove dead propagate_statement method (sc-network-statement)
  • Node: #12878 statement gossip: bound outbound sends with a per-peer outbox (sc-network-statement)
  • Node: #12887 Increase default light client slots (sc-cli)
  • Node: #12890 statement gossip: drive initial sync with a cursor over the admission journal (sp-statement-store, sc-statement-store, sc-network-statement)
  • Node: #12917 Gap sync: download block bodies for storage chains (sc-network-sync, sc-service, cumulus-client-service)
  • Node: #12920 Remove basic collator (cumulus-client-consensus-aura, polkadot-service, cumulus-client-service, cumulus-client-network and 1 more)
  • Tooling & Benchmarking: #12681 Remove deprecated cumulus-pallet-dmp-queue (polkadot-sdk)
  • Tooling & Benchmarking: #12730 pallet-scarcity: coinage-style NFT ownership with feeless rest-time-prioritized transfers (pallet-scarcity)
  • Tooling & Benchmarking: #12746 Remove pallet-scored-pool (polkadot-sdk)
  • FRAME & Runtime: #6978 Adds BlockNumberProvider to pallet-core-fellowship (pallet-core-fellowship, sp-runtime)
  • FRAME & Runtime: #11235 Migrate pallet-im-online to use TransactionExtension API (pallet-im-online)
  • FRAME & Runtime: #12148 Remove deprecated GetStorageVersion::current_storage_version (frame-support)
  • FRAME & Runtime: #12150 Remove deprecated StorageIterator and StorageKeyIterator (frame-support)
  • FRAME & Runtime: #12249 Remove deprecated match_type macro from frame-support (frame-support)
  • FRAME & Runtime: #12250 Remove deprecated AllowAll, DenyAll, and Filter from frame-support (frame-support)
  • FRAME & Runtime: #12254 claims: Reject vesting claims below the existential deposit (polkadot-runtime-common)
  • FRAME & Runtime: #12263 Add remove_registrar extrinsic to pallet-identity (pallet-identity)
  • FRAME & Runtime: #12268 remote-ext: fix silent state corruption from lagging RPC providers (frame-remote-externalities)
  • FRAME & Runtime: #12529 Remove deprecated GenesisBuild trait. (frame-support-procedural, frame-support)
  • FRAME & Runtime: #12584 Remove deprecated schedule::v1 module (frame-support)
  • FRAME & Runtime: #12655 Remove deprecated pallet_society::RawEvent alias. (pallet-society)
  • FRAME & Runtime: #12665 Remove deprecated schedule::v2 traits (pallet-scheduler, frame-support)
  • FRAME & Runtime: #12670 Remove deprecated Utility::derivative_account_id method. (pallet-utility)
  • FRAME & Runtime: #12671 Remove deprecated FixedPoint::try_sqrt. (sp-arithmetic)
  • FRAME & Runtime: #12800 Registrar: reserve and register paras from a system parachain (registrar-primitives, pallet-registrar-para, pallet-registrar-relay)
  • FRAME & Runtime: #12888 Bump arkworks to 0.6, arkworks-extensions to 0.6.0, ark-scale to 0.0.14 and ark-vrf to 0.5.3 (sp-crypto-ec-utils)
  • Testnets & Test Utilities: #12647 Remove non permanent migrations on westend (asset-hub-westend-runtime, bridge-hub-westend-runtime, collectives-westend-runtime, coretime-westend-runtime and 1 more)
  • Testnets & Test Utilities: #12682 Remove deprecated RuntimeHelper::execute_as_governance (parachains-runtimes-test-utils)

Changelog

Bridges

πŸ› οΈ Runtime Dev

πŸ’₯ #11147: Track nested memory used by xcm::DoubleEncoded: approach #2

Resolves #8675 Follow-up for #10747 (approach # 1)

Different approach for tracking the nested memory used by xcm::DoubleEncoded

The idea is to decode the entire xcm::DoubleEncoded<Call> when possible. This can be done when the Call is the RuntimeCall of our local Runtime. When the Call is () it means that it's a remote RuntimeCall, and it will be decoded on the destination chain. …

Breaking: staging-xcm, staging-xcm-executor
Other crates: snowbridge-outbound-queue-primitives (patch), cumulus-pallet-xcmp-queue (patch), pallet-xcm-precompiles (patch), staging-xcm-builder (patch), xcm-simulator (minor), snowbridge-inbound-queue-primitives (patch) and 3 more

πŸ’₯ #12159: Snowbridge: blocks an origin-spoofing attack vector in the V2 outbound queue converter

Adds a validation check in the V2 XCM converter to reject AliasOrigin instructions that attempt to forge the Asset Hub sovereign account origin. This acts as a "defense in depth" against upstream XCM regressions, protecting the bridge's primary agent account (derived from the Asset Hub Root location) which holds ERC20 assets. …

Breaking: snowbridge-outbound-queue-primitives
Other crates: snowbridge-runtime-common (minor), bridge-hub-westend-runtime (minor), bridge-hub-westend-integration-tests (none)

πŸ’₯ #12585: Remove Polkadot Bulletin bridge code

Removes all the Polkadot Bulletin bridge related code:

  • Removes the bp-polkadot-bulletin chain primitives crate.
  • Removes the Rococo <> Rococo Bulletin bridge from the BridgeHubRococo runtime
    (the BridgePolkadotBulletinGrandpa, BridgePolkadotBulletinMessages and XcmOverPolkadotBulletin pallet instances, together with the related runtime APIs, genesis config, weights, benchmarks and tests).
  • Removes the WITH_BRIDGE_ROCOCO_TO_BULLETIN_MESSAGES_PALLET_INDEX constant
    from bp-bridge-hub-rococo.

Breaking: bridge-hub-rococo-runtime, bp-bridge-hub-rococo

#11910: XCM hardening - fix some regressions

This PR fixes some regressions, improves code and adds more defense-in-depth in a couple places. …

Crates: staging-xcm-executor (minor), cumulus-primitives-utility (patch), snowbridge-runtime-common (patch), bridge-hub-westend-runtime (patch), snowbridge-beacon-primitives (patch)

#12211: Snowbridge: drop outbound-queue-v2 message leaves from state

The outbound-queue-v2 pallet stored the per-message merkle leaves in the MessageLeaves storage value and only cleared them at the start of the next block, so the leaves persisted across blocks and were needlessly included in the PoV. They are only needed to build the commitment root and to generate proofs off-chain. …

Crates: snowbridge-pallet-outbound-queue-v2 (patch), asset-hub-westend-runtime (patch), bridge-hub-westend-runtime (patch)

#12514: Remove unused dependencies found by cargo-udeps

Removes unused dependencies flagged by cargo +nightly udeps: bitvec from pallet-broker, rlp from snowbridge-beacon-primitives, and static_assertions from sp-runtime-interface. Each was confirmed unused in the crate source. Partial fix for #6906.

Crates: pallet-broker (patch), snowbridge-beacon-primitives (patch), sp-runtime-interface (patch)

#12879: snowbridge: pin removed SSZ merkle-proofs spec link

Doc comment only: pin the SSZ merkle-proofs spec link in snowbridge-beacon-primitives to a commit, since ethereum/consensus-specs removed the ssz/ directory and the master-branch link 404s, failing the link-checker CI job on every PR.

Crates: snowbridge-beacon-primitives (none)

#12926: fix(bridges): avoid arithmetic overflow in calc_relayers_rewards

calc_relayers_rewards counted messages as end - begin + 1, which overflows when the range covers the whole nonce space. Use the existing saturating_len() helper, and saturating_add for the running total.

Crates: bp-messages (patch)

πŸ”§ Node Dev

πŸ’₯ #12935: Update trie-db to 0.32.0

Bumps trie-db to 0.32.0 and trie-bench to 0.42.2.

Compact proof encoding now deduplicates value nodes that are shared between the top trie and child tries, resulting in smaller compact proofs.

Breaking change: sp_trie::decode_compact, CompactProof::to_storage_proof and CompactProof::to_memory_db now take the expected root as &H::Out instead of Option<&H::Out>. The decoded root is always checked against the expected root.

Breaking: sp-trie
Other crates: sp-state-machine (patch), sc-service (patch), cumulus-pallet-parachain-system (patch), substrate-state-trie-migration-rpc (none), bp-runtime (none)

XCM

πŸ› οΈ Runtime Dev

πŸ’₯ #12369: pallet-asset-conversion: support per-pair swap fee (fallback to global LPFee)

Also for Runtime User

pallet-asset-conversion now supports an optional per-pool swap fee that overrides the global Config::LPFee. No storage migration is required: a new PoolFees storage map holds per-pool overrides, and when a pool has no entry the global LPFee continues to apply. Existing pools are unaffected. …

Breaking: pallet-asset-conversion
Other crates: pallet-asset-conversion-precompiles (patch), pallet-asset-conversion-ops (none), pallet-asset-conversion-tx-payment (none), staging-xcm-builder (none), asset-hub-rococo-runtime (minor), asset-hub-westend-runtime (minor) and 3 more

πŸ’₯ #12378: pallet-assets: allow force_create to set an arbitrary asset id when auto-increment is enabled

force_create no longer requires the asset id to equal NextAssetId: a ForceOrigin may create an asset with any id not currently in use, and the id is then marked as allocated so it can never later collide. Asset id allocation is now configured explicitly via the new Config::AssetIdAllocator (AutoIncAssetId for auto-incrementing ids, () for none), replacing the implicit NextAssetId-is-Some plus AutoIncAssetId callback mechanism. …

Breaking: pallet-assets
Other crates: asset-hub-rococo-runtime (minor), asset-hub-westend-runtime (minor), penpal-runtime (patch), pallet-contracts-mock-network (minor), pallet-asset-conversion (none), pallet-asset-conversion-tx-payment (none) and 7 more

πŸ’₯ #12472: Remove deprecated ConvertedConcreteAssetId type alias

Removes deprecated staging_xcm_builder::ConvertedConcreteAssetId, a type alias for ConvertedConcreteId. Use ConvertedConcreteId directly.

Breaking: staging-xcm-builder

πŸ’₯ #12482: Remove deprecated FilterAssetLocation trait

Removes deprecated xcm_executor::traits::FilterAssetLocation. Use frame_support::traits::ContainsPair<Asset, Location> directly.

Breaking: staging-xcm-executor

πŸ’₯ #12502: Remove deprecated ForeignChainAliasAccount type alias

Summary

Removes the deprecated ForeignChainAliasAccount type alias from staging-xcm-builder. Use HashedDescription<AccountId, LegacyDescribeForeignChainAccount> directly.

Breaking: staging-xcm-builder

πŸ’₯ #12503: Remove deprecated CurrencyAdapter from staging-xcm-builder

Summary

Removes the deprecated CurrencyAdapter from staging-xcm-builder. Use FungibleAdapter instead.

Breaking: staging-xcm-builder

πŸ’₯ #12504: Remove deprecated UnpaidLocalExporter from staging-xcm-builder

Summary

Removes the deprecated UnpaidLocalExporter from staging-xcm-builder. Use LocalExporter instead.

Breaking: staging-xcm-builder

πŸ’₯ #12505: Remove deprecated JustTry and Identity re-exports from xcm-executor

Summary

Removes deprecated JustTry and Identity re-exports from xcm_executor::traits. Callers now use sp_runtime::traits::{TryConvertInto, Identity} directly. Part of #11561

Breaking: staging-xcm-executor
Other crates: asset-hub-rococo-runtime (patch), asset-hub-westend-runtime (patch), assets-common (patch), pallet-xcm-precompiles (patch), pallet-xcm (patch), staging-xcm-builder (patch) and 3 more

πŸ’₯ #12832: pallet-xcm: weight asset claiming and precompile XCM input by their real size

Fixes weights and benchmark worst cases for the claim_assets extrinsic, the ClaimAsset and AliasOrigin instructions, and the pallet-revive XCM precompile. Each was benchmarked with an input far cheaper than one a caller can actually supply, so all four under-charged.

What this needs from you: …

Breaking: pallet-xcm
Other crates: staging-xcm (minor), pallet-xcm-precompiles (patch), pallet-xcm-benchmarks (none), parachains-common (minor), asset-hub-rococo-runtime (patch), asset-hub-westend-runtime (patch) and 9 more

#12807: [pallet-xcm] fix dry-run storage side-effects leaking into xcm-emulator

Wraps dry_run_call and dry_run_xcm in a storage transaction that is always rolled back, so XCMP queue writes and event resets from the simulated execution never escape into the caller's state. Fixes the xcm-emulator bug where dry-run outbound messages were delivered by the subsequent process_messages() call, silently mutating destination-chain state. Removes the reset_ext() and no-op execute_with(|| {}) workarounds that were papering over this in emulated-integration-tests-common.

Crates: pallet-xcm (patch), emulated-integration-tests-common (minor)

#12831: Keep storage-reading aliasers out of AllowExplicitUnpaidExecutionFrom

AllowExplicitUnpaidExecutionFrom<T, Aliasers> emulates origin-altering instructions before UnpaidExecution, calling Aliasers::contains for every AliasOrigin it sees. Barriers run before any payment is taken, so Aliasers must be pure computation: passing a filter that reads storage (such as pallet_xcm::AuthorizedAliasers) lets any incoming message trigger several unmetered storage reads. …

Crates: staging-xcm-builder (patch), asset-hub-westend-runtime (minor), asset-hub-rococo-runtime (minor), bridge-hub-westend-runtime (minor), bridge-hub-rococo-runtime (minor), coretime-westend-runtime (minor) and 3 more

Smart Contracts (Revive)

πŸ› οΈ Runtime Dev

πŸ’₯ #12037: [pallet-revive]: move eth-rpc-only types out of pallet-revive

Description

This PR is part of the versioning effort #11923 and closes #12045. This PR moves a number of types which used to be defined in pallet-revive over to the eth-rpc. A small set of byte wrapper types are now used from the pallet-revive-types crate. …

Breaking: pallet-revive-eth-rpc, pallet-revive

πŸ’₯ #12104: pallet-revive: per-transaction cold/hot storage access pricing

Summary

EIP-2929-style cold/hot(warm) pricing for persistent storage access in pallet-revive. The first non-reverted access to a (contract, slot) pair within a transaction is billed "cold" (higher weight); any later access to the same slot is "hot" (cheaper).

Description
Covered operations

Cold/hot pricing applies to persistent storage:

  • the EVM SLOAD / SSTORE opcodes,
  • the PVM storage host functions,
  • the storage precompile (containsStorage warms the slot like an SLOAD).

…

Breaking: pallet-revive
Other crates: asset-hub-westend-runtime (patch), pallet-revive-fixtures (patch)

πŸ’₯ #12244: [pallet-revive]: Version the trace_block runtime API function

Description

This PR is a follow up from the various discussions we have had as a team around versioning of the runtime API and the approach that we should take.

This PR versions a single runtime API function in pallet-revive: the trace_block function. In the process, I also implemented #11532 to demonstrate how the various pieces connect together when we want to version a specific runtime API function as the last commit in the PR. …

Breaking: pallet-revive, pallet-revive-eth-rpc
Other crates: pallet-revive-types (minor), polkadot-sdk (minor)

πŸ’₯ #12374: Fix resource exhaustion when replaying finalized-block transactions

Also for Node Dev

Description

Re-applying a finalized block's transactions can reject with ExhaustsResources some that originally succeeded, so runtime APIs that replay a block (pallet-revive's trace_block / trace_tx) drop the rejected tail transactions' traces. …

Breaking: sc-rpc-api, sc-rpc
Other crates: sc-tracing (minor), cumulus-client-service (minor), pallet-revive-eth-rpc (patch), pallet-revive (patch), asset-hub-westend-runtime (patch), pallet-revive-fixtures (patch) and 1 more

πŸ’₯ #12522: [pallet-revive] Test Versioning Invariants and Conventions

Description

This PR just adds a single test which checks that the invariants and conventions that we have for versioning are upheld in code.

The test is test_versioned_runtime_api_invariants in the dev-node's runtime crate. The reason for it being in that crate rather than other crates is because it's the only place where we have access to the metadata and to the runtime which we depend on heavily for this test. …

Breaking: pallet-revive, pallet-revive-types, pallet-revive-eth-rpc, revive-dev-runtime

πŸ’₯ #12536: [pallet-revive] Version the Remaining Runtime API Functions

Description

This PR versions the final remaining runtime API functions in pallet-revive, fully deprecating the old unversioned runtime API in favor of the new versioned runtime API functions. …

Breaking: pallet-revive-eth-rpc, pallet-revive, pallet-revive-types, revive-dev-runtime

πŸ’₯ #12599: pallet-revive: bench the overlay overhead of hot storage accesses

Replace the hardcoded HOT_STORAGE_OVERLAY_OVERHEAD (2Β΅s) with a benchmarked value.

  • Add overlay_probe_full, which fills the overlay inside the measured block and reads n stored keys, and overlay_probe_empty, the same reads without the fill
  • Price each hot storage access with the per-read difference between the two.

Breaking: asset-hub-westend-runtime, pallet-revive

πŸ’₯ #12636: pallet-revive: implement eth_getBlockReceipts

The pallet-revive Ethereum JSON-RPC server did not implement eth_getBlockReceipts, a standard execution-apis method that returns every transaction receipt in a block in a single call and is widely used by indexers and block explorers. It is now supported: given a block number, tag, or hash it returns the list of receipts (extracted from the block in a single pass), or null if the block does not exist, matching go-ethereum.

Breaking: pallet-revive-eth-rpc

πŸ’₯ #12796: [pallet-revive] Report untraced transactions instead of omitting them

Also for Node Dev

Description

Follow-up to polkadot-sdk#12374. A block replay can drop a transaction's trace (the tail hits ExhaustsResources). trace_block / trace_tx currently omit it and eth-rpc infers this from a block-level degraded flag. This reshapes the V2 output of both to report each transaction's status from the runtime directly: traced, couldn't-trace, or nothing to trace. …

Breaking: pallet-revive-types
Other crates: pallet-revive-eth-rpc (minor), pallet-revive (minor)

πŸ’₯ #12802: pallet-revive: make the first hot write after a cold read pay the deferred cost

Summary

A slot warmed by a read and then written was charged only the transaction-time work, while the extra cost a write has over a read was skipped: re-encoding and re-hashing the slot's trie path when the block's storage root is computed. …

Breaking: pallet-revive
Other crates: asset-hub-westend-runtime (patch)

#11887: [pallet-revive] eth-rpc: map EthRpcError to EIP-1474 error codes

closes #11886

Map EthRpcError::ConversionError to -32602 (invalid params) and the remaining execution-time variants (RlpError, InvalidSignature, AccountNotFound, InvalidTransaction, TransactionTypeNotSupported) to -32000, matching Geth and Nethermind, instead of collapsing every non-ClientError to a blanket -32600 Invalid Request.

Crates: pallet-revive-eth-rpc (patch)

#11890: [pallet-revive]: short-circuit eth_estimate_gas for simple ETH transfers

closes #11888 …

Crates: pallet-revive (minor)

#11957: [pallet-revive]: Typegraph Generation

Description

This PR is part of #11923 and closes #11926.

This PR adds a single script to the types crate of pallet-revive to allow us to generate SVG type-graphs of all of the types defined in the crate.

We need this to be able to easily answer the following question: "I just made a change to model X in the types crate. What other models do I need to change as a result of this change?" …

Crates: pallet-revive-types (patch)

#12267: [pallet-revive] fix double deposit charge to parent contractinfo

pallet-revive: fix storage deposit double-count under same-contract reentry

When a contract writes storage, reenters itself (directly or via an intermediary), and writes storage again, the pre-call write is applied to the contract's persisted ContractInfo twice β€” inflating storage_items / storage_bytes / storage_*_deposit. …

Crates: pallet-revive (patch)

#12281: [pallet-revive] Implement originIsRoot precompile method

We have the callerIsRoot API but this doesn't work with nested calls. originIsRoot fills this gap.

Crates: pallet-revive-fixtures (minor), pallet-revive (minor), pallet-revive-uapi (minor)

#12386: [pallet-revive] Omit empty traces uniformly across tracer types

Description

The tracer types produced non-uniform results for empty traces. Tracer::collect_trace returns Option<Trace>, but None meant different things: CallTracer returned None when nothing was traced, while ExecutionTracer and PrestateTracer always returned Some with a zero/default trace.

This makes them uniform: a collected trace equal to the tracer's empty_trace() is reported as None for every tracer type.

Crates: pallet-revive (patch)

#12387: fix sload undercharge on cross-VM storage

Summary

EVM sload previously charged a fixed RuntimeCosts::GetStorage(32) regardless of the actual byte size of the storage value read. This is correct under the EVM-only assumption that every slot holds a 32-byte word, but it breaks under cross-VM execution where a PVM contract sharing the storage namespace (via delegatecall) can have written values up to limits::STORAGE_BYTES. …

Crates: pallet-revive (patch)

#12434: [pallet-revive] storage precompile error-handling refactor and accounting refinements

This PR bundles three self-contained changes in pallet-revive:

  1. Storage precompile: refactor argument-error handling behind a small StorageArgError enum, replacing the repeated inline map_errs.
  2. Weight charges: adjust two operations so their charge tracks the measured cost more closely.
  3. Existential deposit: charge the ED storage deposit only when the account-creating transfer actually succeeds, instead of also counting it for transfers that roll back.

Crates: pallet-revive (patch), pallet-revive-fixtures (patch), asset-hub-westend-runtime (patch)

#12447: [pallet-revive] Version Trivial Runtime API Functions

Description

This PR versions all of the runtime API functions in pallet-revive which have a trivial interface and therefore doesn't require us to add a lot of new wire types or move too many things around. Any runtime API function which required a complex wire type to be defined for it is intentionally not versioned in this PR. …

Crates: pallet-revive-types (minor), pallet-revive (minor), pallet-revive-eth-rpc (minor)

#12523: Update PolkaVM to 0.35

Updates all PolkaVM dependencies (polkavm, polkavm-common, polkavm-derive, polkavm-linker) from 0.33.0 to 0.35.0. The pallet-revive fixtures and pallet-revive-uapi now source their polkavm-* versions from the workspace instead of pinning older releases. …

Crates: pallet-revive (patch), pallet-revive-fixtures (patch), pallet-revive-uapi (patch)

#12548: [eth-rpc] Consume the versioned pallet-revive runtime API

Description

This PR allows the eth-rpc to consume the versioned pallet-revive runtime API and allows it to determine what set of capabilities the version of pallet-revive at the provided block hash provides in order to allow it to determine what exact methods it needs to call on the runtime API.

At the core of this is the ReviveRuntimeApiCapabilities struct which holds the entire set of capabilities that a specific version of pallet-revive supports. …

Crates: pallet-revive-eth-rpc (minor)

#12645: [pallet-revive] Reject re-entrant instantiate at an in-construction address

Fixes #12639 …

Crates: pallet-revive (patch)

#12650: [pallet-revive] EXTCODECOPY zero-fills for an out-of-range code offset

Fixes #12643 …

Crates: pallet-revive (patch)

#12726: Probe cargo for -Z json-target-spec support instead of guessing from the version

Both PolkaVM build paths compile against a .json target spec produced by polkavm-linker and have to decide whether to pass cargo -Z json-target-spec: newer cargo requires the flag, older cargo rejects it as unknown. …

Crates: pallet-revive-fixtures (patch), substrate-wasm-builder (patch)

#12742: [pallet-revive] eth-rpc: fix latest block initialization and reduce per-block RPC calls.

Both the finalized and best blocks were initialized using at_current_block(), which in subxt 0.50 returns the finalized block; the best block therefore started behind the chain tip and served stale blocks until the subscription caught up. Also reduce the number of RPC calls by reusing the already resolved block in fetch_receipt_data, and by only requesting receipt data when a block contains EVM extrinsics. …

Crates: pallet-revive-eth-rpc (patch)

#12798: Add guide for updating versioned runtime API functions

Description

This is a small PR which adds more information to the versioning guide on how versioned runtime API functions can be upgraded. No code edits, just an edit to the GUIDE.md markdown file.

Crates: pallet-revive-types (patch)

#12824: [pallet-revive] eth-rpc: decide reorgs by block canonicality, not by finalized height

Summary

Adjust update_latest to distinguish a reconnect replay from a reorg by checking whether the cached best block is still canonical: a block that is neither higher than the cached one nor the cached one itself is accepted only when the cached block is no longer canonical. The best block is also kept at or above the finalized block. …

Crates: pallet-revive-eth-rpc (patch)

#12855: [pallet-revive] fix wrong values in truncated and failed execution traces

This PR fixes wrong values in truncated traces. The execution tracer reported wrong values in four ways. The first three need ExecutionTracerConfig::limit; the fourth affects every failing transaction.

  1. gasCost / weightCost. Past the limit the tracer stopped opening a pending entry per step, but the interpreter still reported every step's exit, so those exits finalized an enclosing CALL against the counters seen at truncation. At call depth 2 or more the captured steps could sum to more than the transaction consumed.

…

Crates: pallet-revive (patch)

#12860: Add Doc Comments for Pallet Revive's Versioned Types

Description
Why

I think this PR's objective is better understood by the why rather than the how. After versioning was introduced we didn't have a good way to communicate to users, clients, and consumers of the runtime API "we updated this function to v2 to add this specific capability". We agreed that this would be something that we would document but it's not very clear to me where such documentation would go. …

Crates: pallet-revive-types (patch)

#12866: [pallet-revive] expose ReentrancyProtection

Export ReentrancyProtection from pallet_revive and pallet_revive::precompiles: it is a parameter type of the public Ext::call, so it must be nameable by out-of-crate precompile implementors.

Crates: pallet-revive (minor)

πŸ”§ Node Dev

πŸ’₯ #12096: Bump subxt to 0.50

Bumps the workspace subxt, subxt-metadata, and subxt-signer dependencies from 0.44 to 0.50.

subxt 0.50 introduces a block-anchored client API and splits subxt::Error into per-operation sub-errors. Affected crates were updated to the new API; no JSON-RPC or CLI surface changed.

Breaking: pallet-revive-eth-rpc, frame-benchmarking-cli
Other crates: polkadot-omni-node-lib (minor), sc-statement-store (minor), pallet-revive (minor)

πŸ’₯ #12220: pallet-revive eth-rpc: make SubmittedTransaction::gas() return Option

closes #11889

Change SubmittedTransaction::gas() to return Option to match the underlying optional GenericTransaction::gas field, and only run the wait_for_receipt gas-limit assertion when a gas limit is set. This avoids a possible unwrap() panic on payloads without a gas field, which could only occur in the test and example helpers.

Breaking: pallet-revive-eth-rpc

πŸ’₯ #12474: pallet-revive: support finalized/safe/pending block tags in eth_getLogs

The eth_getLogs filter accepted only explicit block numbers and the earliest/latest tags, rejecting finalized, safe and pending with an "Unsupported tag" error β€” even though the rest of the eth-rpc server (eth_getBalance, eth_call, ...) already accepted them. It now resolves all of these tags, consistently with the other endpoints: safe and finalized map to the latest finalized block, and pending maps to latest.

Breaking: pallet-revive-eth-rpc

#12361: CI: Get it green again (link-checker + check-macos-crates)

Since brew 6.0 llvm post-install step fails. But I think we can just disable it for our purposes.

Crates: sc-rpc-spec-v2 (none), pallet-revive-eth-rpc (none)

#12470: pallet-revive: fix eth_feeHistory reward percentile resolution

eth_feeHistory caches reward percentiles at half-percentile resolution (201 buckets spanning 0.0..=100.0), but the cache lookup rounded each requested percentile to the nearest whole percentile before indexing. As a result the half-percentile buckets were never returned and a request such as the 50.5th percentile yielded the reward for the 51st percentile. The requested percentile is now mapped to the matching bucket.

Crates: pallet-revive-eth-rpc (patch)

#12547: pallet-revive: validate eth_feeHistory reward percentiles

eth_feeHistory did not validate its inputs the way go-ethereum does: out-of-range reward percentiles were silently clamped to 0..=100, unsorted lists were accepted, and a request for zero blocks still returned data, so malformed requests returned approximated results instead of matching go-ethereum. …

Crates: pallet-revive-eth-rpc (patch)

πŸ–₯️ Node Operator

#12882: eth-rpc: pin legacy subxt backend, survive unresolvable blocks

Pin eth-rpc to subxt's legacy backend. subxt 0.50 switched the default to the chainHead-based CombinedBackend, whose pinning limits stall receipt indexing under load. Also, a failed streamed-block resolution no longer kills the server; such blocks are skipped and finalized ones are backfilled by the gap filler.

Crates: pallet-revive-eth-rpc (patch)

Staking & Elections

πŸ› οΈ Runtime Dev

πŸ’₯ #11336: Add deferred dispatch support

Extends pallet-whitelist with automatic deferred dispatch to aid governance sequencing. When dispatch_whitelisted_call or dispatch_whitelisted_call_with_preimage is invoked by a whitelisted origin but the call hash is not yet whitelisted, the dispatch is no longer rejected. Instead, it is deferred with an expiration block and can be executed later by any signed origin once the call is whitelisted. The relaying signed origin is not charged. …

Breaking: pallet-whitelist
Other crates: asset-hub-westend-runtime (minor), rococo-runtime (minor), kitchensink-runtime (minor), pallet-staking-async-parachain-runtime (minor), pallet-staking-async-rc-runtime (minor), governance-westend-integration-tests (none)

πŸ’₯ #11940: Post AHM Cleanup: Remove Staking (and friends) from Westend Runtime.

  • Remove the following pallets from westend runtime: pallet_election_provider_multi_phase, pallet_bags_list, pallet_nomination_pools, pallet_fast_unstake, pallet_delegated_staking (including weights and other related code such as bag generation logic)
  • Ensure the try runtime checks pass for Westend (without any excluded pallets)
  • Disable ProxyType::Staking: post-AHM,

…

Breaking: westend-runtime, pallet-staking-async-ah-client
Other crates: pallet-staking (patch), pallet-root-offences (patch), frame-support (minor), asset-hub-westend-runtime (patch), generate-bags (minor), polkadot-voter-bags (patch) and 1 more

πŸ’₯ #11979: Scale validator self-stake incentive by era-points performance

Validator self-stake incentive payout is now distributed proportionally across elected validators using the weighted-points share share_i = (w_i Β· ep_i) / Ξ£_j(w_j Β· ep_j), where w_j is each validator's per-era incentive weight and ep_j is their era points. …

Breaking: pallet-staking-async
Other crates: asset-hub-westend-runtime (patch)

πŸ’₯ #12323: Decouple unbonding pool bound from bonding duration

The with_era map is now bounded by the fixed MaxUnbondingPools, and the merge cutoff uses an effective window of MaxUnbondingPools - bonding_duration. This prevents a lowered bonding duration from shrinking the bound and making stored state undecodable. This is a breaking change - the Config::PostUnbondingPoolsWindow associated type is renamed to MaxUnbondingPools; runtimes must set it to their previous bonding_duration + PostUnbondingPoolsWindow to preserve the storage bound.

Breaking: pallet-nomination-pools
Other crates: asset-hub-westend-runtime (minor), westend-runtime (minor), pallet-delegated-staking (minor), pallet-nomination-pools-benchmarking (minor)

πŸ’₯ #12381: Introduce chill_inactive extrinsic to the pallet-staking-async

chill_inactive extrinsic can be used to chill the validators that were inactive too much and can be called by anyone if the validator meets the criterias for chilling.

Validator can be chilled if it has zero era points for at least ChillInactiveThreshold (configurable) eras among the last HistoryDepth eras. The check of the inactivity can be adjusted using newly introduced config item IsValidatorInactive. …

Breaking: pallet-staking-async, asset-hub-westend-runtime

πŸ’₯ #12542: Beefy: Make the equivocation time slot more generic

This PR:

  • Adjusts the offence time slot into a more generic slot
  • Adds the equivocation type to the offence slot for Beefy

Breaking: pallet-beefy, pallet-offences, sp-staking
Other crates: polkadot-runtime-parachains (minor), pallet-babe (minor), pallet-grandpa (minor), pallet-im-online (minor), pallet-root-offences (minor), pallet-staking (patch)

πŸ’₯ #12630: staking-async: include the unlock era in the Unbonded event

Also for Runtime User

Event::Unbonded gains an era: EraIndex field. Metadata-driven tooling picks it up; hardcoded decoders and Unbonded test assertions need the field. No new logic, no storage migration.

Breaking: pallet-staking-async

πŸ’₯ #12654: Remove deprecated pallet_staking::ExposureOf.

Remove deprecated pallet_staking::ExposureOf (use DefaultExposureOf / UnitIdentificationOf).

Breaking: pallet-staking

πŸ’₯ #12664: Remove deprecated TREASURER_INDEX constants

Removes the deprecated xcm::body::TREASURER_INDEX constants from the Westend and RC runtime constants modules.

Integration

Downstream users should use xcm::latest::BodyId::Treasury instead of the old numeric TREASURER_INDEX constant.

Breaking: westend-runtime-constants, pallet-staking-async-rc-runtime-constants

#12397: nomination-pools: snapshot rewards before set_commission_max lowers current commission

set_commission_max force-lowers commission.current (via try_update_max) when the new max is below the active rate, but did not first call update_records. Rewards accrued at the higher rate since the last snapshot were therefore re-rated at the new lower rate on the next update_records, crediting the differential (old_current - new_max) * accrued to members instead of the commission payee.

The fix snapshots the reward pool at the current commission before the cut, mirroring the ordering already used in set_commission.

Crates: pallet-nomination-pools (patch)

#12441: staking-async: pending_rewards returns false for zero-point validators

Also for Runtime User

The StakingApi::pending_rewards(era, validator) runtime API previously returned true whenever the validator had exposure in the era with unclaimed pages, without checking whether the validator earned any reward points. A validator that was elected but earned zero reward points (e.g. offline / authored no blocks) is exposed but its payout is 0, so this reported a pending reward where none was payable.

pending_rewards now returns false for validators with zero reward points in the era.

Crates: pallet-staking-async (patch)

#12525: Fix chill_inactive benchmark in pallet-staking-async

chill_inactive extrinsic was improperly benched (worst-case scenario wasn't considered), which is fixed now.

Crates: pallet-staking-async (patch), asset-hub-westend-runtime (patch)

#12992: pallet-delegated-staking: ignore zero-amount delegations

A zero-amount delegation is now a no-op instead of storing an empty Delegation record. Before, it left the account marked as a delegator and holding a provider reference, which blocked it from registering as an agent.

delegate_to_agent and migrate_delegation return early on a zero amount, and Delegation::update stores nothing for a zero-amount entry: an existing delegation at zero is removed and a new one is not created. This holds for both new and existing delegators, so nomination-pools' bond_extra at 100% commission keeps working. …

Crates: pallet-delegated-staking (patch)

πŸ‘€ Runtime User

#12922: staking-async parachain: deny ForeignAssets and PoolAssets transfers to the NonTransfer proxy

In the staking-async parachain runtime, the ProxyType::NonTransfer call filter is a deny-list and so fails open: any pallet added to the runtime is reachable by a NonTransfer proxy unless it is listed explicitly. The deny-list named only Assets (the TrustBackedAssets instance) and omitted the other pallet-assets instances, contradicting the documented policy that this proxy type can only execute calls that do not transfer funds or assets. …

Crates: pallet-staking-async-parachain-runtime (patch)

Coretime

πŸ› οΈ Runtime Dev

πŸ’₯ #10188: Add sale_index field to Coretime SaleInfoRecord

Adds a sequential sale_index field to SaleInfoRecord and the SaleInitialized event in pallet-broker. It is 0 for the bootstrap sale from do_start_sales and increments by 1 on each rotate_sale, giving every bulk Coretime sale a unique index. A SaleIndex (u32) type alias is added in types.rs. …

Breaking: pallet-broker
Other crates: coretime-westend-runtime (minor)

πŸ’₯ #11810: Introduce fp-coretime primitives crate

Introduces fp-coretime, a frame-primitives crate for Polkadot Coretime types and traits. Moves shared coretime types and the Market trait from pallet-broker into fp-coretime.

This allows market implementations (e.g. an RFC-17 pallet) to depend on fp-coretime instead of pallet-broker, avoiding a pallet dependency just for trait definitions and shared types. …

Breaking: pallet-broker
Other crates: fp-coretime (patch), polkadot-sdk (minor)

Governance

πŸ› οΈ Runtime Dev

πŸ’₯ #11045: [pallet-bounties]: add reclaim_bounty_funds to reclaim stranded funds from closed bounty accounts

fixes #10996 …

Breaking: pallet-bounties, rococo-runtime

#12365: frame-support: stabilize MaybeConsideration by removing experimental gate

Remove the experimental feature gate from the MaybeConsideration trait and its implementations ((), FreezeConsideration, HoldConsideration), making it available unconditionally alongside Consideration.

Consumers no longer need to enable frame-support/experimental to use MaybeConsideration; the feature has been dropped from the pallet-collective dependency and the pallet-balances dev-dependency accordingly. No public API removals or storage changes.

Crates: frame-support (minor), pallet-collective (patch), pallet-balances (none)

Assets

πŸ› οΈ Runtime Dev

πŸ’₯ #12245: pallet-psm: multi-instance, permissionless Peg Stability Modules

Reworks pallet-psm from a single, governance-seeded Peg Stability Module into a multi-instance design where many PSMs coexist, each created permissionlessly and managed by its own admins. …

Breaking: pallet-psm, frame-support, asset-hub-westend-runtime

πŸ’₯ #12366: pallet-assets: enforce full deposit transfer in transfer_ownership

transfer_ownership previously discarded the remainder returned by repatriate_reserved. Under Polite fortitude, a lock or freeze on the current owner that overlaps their free balance can leave part of the reserved deposit behind, leaving the asset's recorded deposit out of sync with what is actually reserved. The call now captures the returned remainder and rejects the dispatch with a new IncompleteDepositTransfer error when it is non-zero; the storage layer rolls back the partial move. …

Breaking: pallet-assets

#12408: fix(asset-conversion): use full balances for pool prices

pallet-asset-conversion now reads full pool account balances when calculating pool prices and liquidity amounts. Previously, these calculations used reducible balances, which could understate pool reserves when protected funds or unrelated non-sufficient assets were held in the pool account.

Crates: pallet-asset-conversion (patch)

#12811: pallet-psm: report the real instance footprint to the creation Consideration

create_psm previously established the creation Consideration with a placeholder footprint of one item and zero bytes, under-reporting what the call actually writes. A new Pallet::psm_creation_footprint helper now reports the Psm and PsmAdmin entries (two items, max-encoded-len sized) and is used by the extrinsic and the benchmarks.

Crates: pallet-psm (minor)

Parachains (protocol)

πŸ› οΈ Runtime Dev

πŸ’₯ #11909: [dmp] Use page queue instead of single vec

The DMP queue pallet currently uses one Para -> Vec<Message> map to map parachains to their messages. Using one big vector per parachain is not ideal, hence i change it to a (Para, Index) -> Message list.

Storage

A lazy multi-block-migration is in place migration::MigrateV0ToV1 and must be applied to all chains that deploy the DMP pallet. All new storage items should be used through the static functions of InboundDownwardQueue to preserve invariants. …

Breaking: polkadot-runtime-parachains, polkadot-runtime-common, rococo-runtime, westend-runtime
Other crates: polkadot-core-primitives (minor)

πŸ’₯ #12156: Remove deprecated migration::remove_storage_prefix

Description

Removes deprecated migration::remove_storage_prefix as part of #11561.

Migrates all in-repo callers to clear_storage_prefix(..., None, None) (equivalent behavior). No external usage remains.

Breaking: frame-support
Other crates: cumulus-pallet-parachain-system (patch), yet-another-parachain-runtime (patch), polkadot-runtime-common (patch), pallet-scheduler (patch)

πŸ’₯ #12251: Remove deprecated RelaychainBlockNumberProvider type alias

Removes deprecated cumulus_pallet_parachain_system::RelaychainBlockNumberProvider, a type alias for RelaychainDataProvider. Use RelaychainDataProvider directly.

Breaking: cumulus-pallet-parachain-system

πŸ’₯ #12391: Fix AllowedRelayParentInfo off by one error

Related to #11624 …

Breaking: polkadot-runtime-parachains

#12097: cumulus: add SignedSchedulingInfo PVF verification

Verifies the SignedSchedulingInfo payload inside the PVF whenever it is present β€” required on V3 resubmissions (relay_parent != internal_scheduling_parent) and verified on initial submissions when a collator attaches one. The verifier confirms that the signature was produced by the parachain author eligible at the slot derived from the relay header at internal_scheduling_parent, proving the submitting collator owns the para slot at that anchor. …

Crates: cumulus-pallet-aura-ext (minor), cumulus-pallet-parachain-system (patch), cumulus-primitives-core (minor), pallet-aura (minor)

#12430: Accept ApprovalVoteMultipleCandidates dispute statements when max_approval_coalesce_count is 1

The disputes pallet no longer rejects ApprovalCheckingMultipleCandidates statements when max_approval_coalesce_count == 1. All validators now support the coalesced vote format, so single-candidate votes in this form are accepted instead of being dropped. The per-session coalesce cap (candidates.len() <= max_approval_coalesce_count) is still enforced.

Crates: polkadot-runtime-parachains (patch)

#12695: Read the collator's scheduling parameters at the parent it builds on

The slot-based collator reads scheduling_v3_enabled, relay_parent_offset, max_claim_queue_offset and the Aura authorities at the parent it builds on rather than at the para best head, and resolves them against :pending_code, so they come from the runtime that executes the block. This keeps candidate shape correct across a para runtime upgrade that flips V3 scheduling off again. …

Crates: cumulus-client-consensus-common (patch), cumulus-pallet-parachain-system (patch), cumulus-client-consensus-aura (patch), cumulus-primitives-core (patch)

#12759: Westend Coretime: remove truncation of the assignments vector

Fixes the way coretime assignments are being reported to the Relay Chain. Previously any assignment beyond the initial 28 would be silently truncated. Now all the assignments (up to
80) are divided into chunks of at most 28 and sent to the Relay Chain.

Some types and methods in polkadot-runtime-parachains are made public in order to facilitate inspection of the Scheduler pallet's state from outside the crate.

Crates: coretime-westend-runtime (patch), polkadot-runtime-parachains (minor)

#12844: paras: skip undersized parachain heads in sorted_para_heads

Paras::sorted_para_heads() now skips parachain heads shorter than MIN_PARA_HEAD_LEN (64 bytes). Encoded parachain headers are well above this bound, so no real parachain is affected.

Crates: polkadot-runtime-parachains (minor)

πŸ”§ Node Dev

πŸ’₯ #12172: Collation protocol v4 with bounded segment advertisements

Also for Node Operator

This PR adds collation protocol v4 (/collation/4). A v4 collator advertises up to MAX_SEGMENT_LEN (32) candidates per scheduling parent and core in one AdvertiseSegment. There is no Declare and no CollationSeconded in v4. Collations are fetched over the new /req_collation/3 protocol. v2/v3 validators get an AdvertiseCollation for the segment tip. …

Breaking: polkadot-node-network-protocol, polkadot-collator-protocol, polkadot-node-primitives, polkadot-node-subsystem-types, cumulus-client-network, polkadot-primitives and 2 more
Other crates: polkadot-node-collation-generation (minor), polkadot-network-bridge (patch), polkadot-runtime-parachains (patch), cumulus-client-consensus-aura (patch), cumulus-relay-chain-minimal-node (patch), polkadot-node-core-pvf-execute-worker (patch)

Node

πŸ”§ Node Dev

πŸ’₯ #11954: Cumulus: introduce authority discovery for parachains

Adds authority discovery support for parachains to connect parachain collators as reserved peers on the block-announce protocol. This enables 1 hop block propagation between collators. …

Breaking: polkadot-omni-node-lib, sc-network-sync
Other crates: cumulus-client-collator-discovery (patch), cumulus-relay-chain-minimal-node (minor), polkadot-sdk (minor)

πŸ’₯ #12296: Cumulus v3: find_parent() adjustments

Implements the main changes discussed in #11624

Adjusts the find_parent() logic in order to also support V3 candidates

Breaking: cumulus-client-consensus-common
Other crates: cumulus-client-consensus-aura (patch), cumulus-client-network (patch), cumulus-client-pov-recovery (patch), cumulus-relay-chain-inprocess-interface (minor), cumulus-relay-chain-interface (minor), cumulus-relay-chain-rpc-interface (minor)

πŸ’₯ #12315: feat(webrtc): add experimental WebRTC transport to litep2p backend

Description

Add webrtc-direct support to the litep2p backend

  • webrtc-direct support gated behind a new --experimental-webrtc CLI flag.
  • WebRTC listen_addr entries are skipped with a warning unless enabled.
  • Persist the DTLS certificate to <net_config_path>/webrtc_certificate so the node keeps a stable identity across restarts. Fall back to an ephemeral cert otherwise.
  • update network type to support WebRTCDirect
Integration

No behavioral change unless --experimental-webrtc is explicitly enabled. …

Breaking: sc-cli, sc-network, sc-network-types

πŸ’₯ #12433: txpool: maintain the transaction pool on every imported block (all forks)

Also for Node Operator

The fork-aware transaction pool is now maintained on every imported block, not only on blocks imported as the new best, so it builds a view for all forks. The new --pool-best-blocks-only flag restores the previous best-blocks-only behavior. The flag only affects the fork-aware pool; the single-state pool is always maintained on best blocks only.

Breaking: sc-transaction-pool-api, sc-transaction-pool, sc-cli
Other crates: sc-client-api (minor), sc-service (patch)

πŸ’₯ #12450: approval-voting: remove unused v1 version

Removes the long-dead approval-voting v1 code, now that all networks have used v2 assignments for ~2.5 years: the v1 assignment-cert types and the v1<->v2 conversions, the non-compact AssignmentCertKindV2::RelayVRFModulo variant (codec index 2 is now reserved), and the v1 approval-DB schema together with its migration.

Breaking: polkadot-node-primitives, polkadot-node-core-approval-voting
Other crates: polkadot-approval-distribution (patch), polkadot-service (patch)

πŸ’₯ #12501: Remove deprecated BlockAnnounceValidator type alias

Removes deprecated cumulus_client_network::BlockAnnounceValidator, a type alias for RequireSecondedInBlockAnnounce. Use RequireSecondedInBlockAnnounce directly.

Breaking: cumulus-client-network

πŸ’₯ #12598: Add roles to syncing peer events

SyncEvent::PeerConnected now carries the Roles the peer advertised in its sync handshake, allowing subscribers of the syncing event stream to learn a peer's role (full/light/authority) without re-deriving it from the notification handshake or the peer store. This is a breaking change for consumers of SyncEvent: the variant changed from PeerConnected(PeerId) to PeerConnected { peer_id, roles }.

Breaking: sc-network-sync
Other crates: sc-network-gossip (patch), sc-network-statement (patch), sc-network-transactions (patch)

πŸ’₯ #12652: Remove deprecated new_native_or_wasm_executor

Summary
  • Remove sc_service::new_native_or_wasm_executor, deprecated with note "Will be removed at end of 2024".
  • Callers should use sc_service::new_wasm_executor instead.

Part of #11561

Breaking: sc-service

πŸ’₯ #12669: Remove deprecated NativeElseWasmExecutor, NativeVersion, and GetNativeVersion.

Remove the deprecated NativeElseWasmExecutor and NativeExecutionDispatch from sc-executor, as well as NativeVersion and GetNativeVersion from sp-version.

Integration

Downstream users should:

  • replace NativeElseWasmExecutor with WasmExecutor
  • stop implementing / reexporting NativeExecutionDispatch
  • remove references to NativeVersion, GetNativeVersion, and native_version()

Breaking: sc-executor, sp-version
Other crates: polkadot-service (patch), sc-service (patch)

πŸ’₯ #12686: Extract and refactor the Bitswap service

Moves the Bitswap client and server from sc-network into the new sc-network-bitswap crate. The new actor exposes a streaming BitswapHandle and centralizes CID deduplication, peer selection, retries, response handling, and backpressure. Storage-chain sync and node service wiring now use this handle.

The backend-specific Bitswap shims and local protobuf plumbing are removed. Bitswap is now supported through Litep2p only; starting a node with --ipfs-server and a different network backend returns an error.

Breaking: sc-network, sc-service, sc-storage-chain-sync, cumulus-client-service, polkadot-omni-node-lib
Other crates: sc-network-bitswap (patch), polkadot-service (patch), polkadot-sdk (minor)

πŸ’₯ #12870: network: Enable WebRTC by default on full nodes

Also for Node Operator

Accept WebRTC connections on the same UDP --port as used for TCP/WS connections. Enabled by default on full nodes, can be force-enabled on validators & collators with --force-enable-webrtc, or disabled by passing an explicit --listen-addr without WebRTC addresses. Only supported with litep2p network backend. …

Breaking: sc-cli, sc-network, sc-network-types, sc-network-bitswap
Other crates: sc-service (patch), polkadot-omni-node-lib (patch)

πŸ’₯ #12873: statement gossip: remove the per-peer known-statement cache

Also for Node Operator

MAX_KNOWN_STATEMENTS is removed from sc_network_statement::config, and Peer::new_for_testing loses its known-statements parameter.

Breaking: sc-network-statement

πŸ’₯ #12874: statement-store: remove dead propagate_statement method

Removes the unused public method StatementHandler::propagate_statement from sc-network-statement. It never had a caller since its introduction: it was copied from the transactions protocol, whose controller plumbing was never brought over. Statements continue to be propagated by the periodic propagation loop.

Breaking: sc-network-statement

πŸ’₯ #12878: statement gossip: bound outbound sends with a per-peer outbox

Also for Node Operator

MAX_INITIAL_SYNC_IN_FLIGHT_BYTES in sc_network_statement::config is renamed to MAX_SEND_IN_FLIGHT_BYTES and now covers propagation and initial-sync chunks together. MAX_PROPAGATION_OUTBOX_LEN is added.

Breaking: sc-network-statement

πŸ’₯ #12890: statement gossip: drive initial sync with a cursor over the admission journal

Also for Node Operator

sp_statement_store::StatementStore gains admission_watermark and admitted_statements (a filtered walk of the admission journal returning the new AdmittedBatch). take_recent_statements now returns (u64, Hash, Statement) triples carrying admission sequence numbers, oldest first. statement_hashes is removed.

Breaking: sp-statement-store, sc-statement-store, sc-network-statement

πŸ’₯ #12917: Gap sync: download block bodies for storage chains

Gap sync now supports a GapSyncBodyPolicy: besides the previous all-or-nothing behavior, BodiesWithinWindow(window) requires bodies only for blocks within window below the finalized block. The omni-node uses this on storage chains to backfill the bodies of the transaction storage retention period after warp sync, and requires --blocks-pruning >= retention there. …

Breaking: sc-network-sync, sc-service, cumulus-client-service
Other crates: polkadot-omni-node-lib (minor), polkadot-service (patch)

πŸ’₯ #12920: Remove basic collator

Related to #12172

Closes: #8145

This PR:

  • removes the basic collator
  • removes collation_req_v1_receiver
  • removes CollatorSybilResistance
  • removes RequireSecondedInBlockAnnounce
  • removes WaitToAnnounce

These are not used anymore

Breaking: cumulus-client-consensus-aura, polkadot-service, cumulus-client-service, cumulus-client-network, cumulus-client-collator
Other crates: cumulus-relay-chain-minimal-node (patch), polkadot-omni-node-lib (patch)

#11253: net/litep2p: Install the default crypto provider

This PR installs the default crypto provider before TLS connections are made.

In case another provider was already installed (unexpected but parachains dev might have enabled it), a warning is printed.

Without the fix, litep2p websocket (tokio tungstenite that uses rustls) would panic under the hood: …

Crates: sc-network (minor)

#11731: fatp: unban viewless transactions after mempool revalidation

In rare cases a transaction valid at the finalized block can get stuck in the fork-aware pool. If it receives InvalidTransaction on one fork, the view's rotator bans it and the ban propagates to all new views (rotator is cloned). The tx stays in the mempool but is silently rejected from every view for the ban duration (default 30 min). …

Crates: sc-transaction-pool (patch)

#11733: fatxpool: invalid inblock event fixed

Fixes a false InBlock (and cascading Finalized) event in the fork-aware transaction pool when a replaced transaction (same sender+nonce, higher priority) had its original version included in a block by another node. The faulty "pruned-by-tag + invalid-on-resubmit => in block" inference in resubmit_pruned is removed, so InBlock now fires only for hashes actually present in the imported block body.

Crates: sc-transaction-pool (minor)

#11989: statement-store: new api implementation

Summary

Adds the statement_unstable_* JSON-RPC API implementation for statement-store and wires it into the parachain node RPC stack.

Changes
  • Add statement_unstable_submit, statement_unstable_subscribe, statement_unstable_add_filter, and statement_unstable_remove_filter
  • Add multi-filter subscription support with replay and live statement delivery
  • Add zombienet smoke test for the unstable RPC wiring

Crates: polkadot-omni-node-lib (patch), sc-rpc-spec-v2 (minor), sc-statement-store (minor), sp-statement-store (minor)

#12007: Deterministic simulation-based testing for subsystems

Introduces polkadot-subsystem-test-sim, a subsystem-agnostic, deterministic simulator for testing Polkadot node subsystems, and adopts it for the collator-protocol (both validator sides) and prospective-parachains. …

Crates: polkadot-node-clock (minor), polkadot-collator-protocol (none), polkadot-node-core-prospective-parachains (none), polkadot-node-core-av-store (none), polkadot-node-core-chain-selection (none), polkadot-node-core-dispute-coordinator (none)

#12091: Add resubmission store for parablock resubmission

Introduces cumulus-client-resubmission-store, a new crate that persists per imported parablock the data needed to resubmit it without relying on the relay parent still being available in the blockchain state: the storage proof, the relay parent header and the relay-parent session. Entries are pruned on finality.

Crates: cumulus-client-resubmission-store (minor), cumulus-client-consensus-aura (minor), cumulus-client-consensus-common (minor), polkadot-sdk (minor)

#12242: Introduce StorageChainBlockImport

Also for Node Operator

Storage chains rely on Renew extrinsics to keep indexed transaction payloads alive past their original retention window. A node that tip-syncs past a Renew without ever having executed the original store ends up with an empty TRANSACTION column locally, and apply_index_ops fails. This PR adds StorageChainBlockImport, a block-import wrapper that intercepts this case during tip-sync, fetches the missing bytes over bitswap, and hands them to the backend through the PrefetchedIndexedTransactions carrier introduced in #12086. …

Crates: sc-storage-chain-sync (minor), polkadot-omni-node-lib (minor), sc-network (minor), sp-transaction-storage-proof (minor), polkadot-sdk (minor)

#12255: Collator protocol β€” honor the scheduling lookahead, not a claim-queue/ancestry length

Both validator sides of the collator protocol derived the claim-queue window length from a value that is only a lower bound on the runtime scheduling lookahead, and so truncated the tail of the claim queue β€” silently dropping advertisement positions that are in fact fetchable. Each side used a different bound, and each falls short in a different situation: …

Crates: polkadot-collator-protocol (patch)

#12256: Statement-store: Publishing documentation

Documentation-only update for the statement store. Adds an overview and usage guide to sc-statement-store and expands doc comments across the statement store crates. No functional changes.

Crates: sc-rpc-api (none), sp-statement-store (none), sc-statement-store (none), sc-network-statement (none)

#12304: Statement store: move the query index to disk

Second stage of the statement-store index refactor. The query index (by_topic, by_dec_key) and the evicted-hash journal are moved out of memory into dedicated btree-indexed parity-db columns.

Crates: sc-statement-store (patch)

#12362: fatxpool: preserve order of same-priority transactions on re-orgs

On a re-org, transactions from retracted blocks are now resubmitted in execution order (common ancestor β†’ old best) instead of reverse order. This is a best-effort improvement: per-account nonce ordering is always kept, but cross-account ordering is only preserved when priorities are equal (otherwise priority decides).

Crates: sc-transaction-pool (minor)

#12506: grandpa: fix panic when a change block is finalized concurrently during justification import

Also for Node Operator

Fixes a node panic (returns Ok when no authority set change should be enacted; qed;) that could occur while importing a justification for a block enacting an authority set change. …

Crates: sc-consensus-grandpa (minor)

#12582: collator-protocol-revamp: additional metrics

Improves the observability of the collator protocol revamp by adding/improving some metrics.

Crates: polkadot-collator-protocol (minor)

#12657: statement-store: avoid blocking the event loop during propagation

Also for Node Operator

Statement propagation no longer awaits each notification inline: sends are queued as futures driven by the protocol's main event loop, so an unresponsive peer stalls only its own send. Also fixes a network error being reported as a successful send on the initial sync path, which marked statements as known to a peer that never received them.

Crates: sc-network-statement (patch)

#12693: sc-network: derive the WebRTC DTLS certificate from the node key

Derive the WebRTC DTLS certificate deterministically from the node's Ed25519 secret key instead of persisting it to a separate file on disk.

Crates: sc-network (minor)

#12697: statement-store: replay subscriptions from persisted admission cursor

The statement store now persists a monotonic admission sequence for active statements in parity-db (a new ADMISSION_SEQ column, created automatically on startup) and restores it on restart. Subscription filters attached at runtime are replayed from a cursor up to a registration watermark instead of materializing a full snapshot of statement hashes, with replay batches bounded by raw statement bytes. Replay-before-live ordering and re-admission semantics are preserved.

Crates: sc-statement-store (minor)

#12706: Statement RPC: reject invalid inputs and report account size limits

The unstable statement RPC now returns -32602 for SCALE-encoded statements with trailing bytes and empty matchAll filters. Use "any" to match every statement. Submissions that exceed an account's remaining data allowance now return dataTooLarge instead of accountFull.

Crates: sc-rpc-spec-v2 (patch), sc-statement-store (patch)

#12754: sc-consensus-babe: skip epoch pruning when finalized header has no BABE pre-digest

prune_finalized assumed every finalized header carries a BABE pre-digest and panicked otherwise. That breaks constructing BabeBlockImport when finalized blocks were authored by another engine (e.g. during an Aura→BABE migration).

Pruning is now skipped when the pre-digest is missing.

Crates: sc-consensus-babe (patch)

#12774: statement-store: move the submit index to disk with bounded caches

Stage 2b of the statement-store index refactor (#10910). The submit index (per-account quota accounting) now lives on disk next to the statements, with bounded in-memory caches on top. Store memory usage no longer grows with the number of stored statements or accounts, and startup no longer reads statement bodies, so it stays fast for large stores. Existing databases are migrated automatically on first start.

Crates: sc-statement-store (minor)

#12814: statement-store: avoid blocking event loop during initial sync

Also for Node Operator

Initial-sync sends are now driven as futures by the protocol event loop instead of being awaited inline, so an unresponsive peer stalls only its own sync. Statements are marked known only after a successful send, only one chunk per sync is in flight, and stale results from replaced syncs are ignored.

Crates: sc-network-statement (minor)

#12847: Fix panic on sc-rpc-server start_server error paths

Also for Node Operator

start_server took ownership of the dedicated RPC tokio::runtime::Runtime and dropped it as an ordinary local on its two error paths (a non-optional endpoint failing to bind, and no listen address). Since start_server is awaited from within a runtime context, that drop panicked with "Cannot drop a runtime in a context where blocking is not allowed", masking the underlying error. …

Crates: sc-rpc-server (patch)

#12880: Make the experimental collator proto the default for Kusama

The binary checks if a Kusama chainspec is loaded and enables the experimental collator protocol by default unless experimental-collator-protocol parameter is passed explicitly. In that case its value is respected no matter what the chainspec is.

Crates: polkadot-cli (patch)

#12883: statement-store: reject submissions from accounts with a depleted allowance

Store::submit accepted any allowance present in chain state, including one depleted on the count or size axis. A depleted allowance stores nothing by definition, but the per-account constraint check only evaluates max_count while walking the account's existing statements, so an account with a max_count of zero and no statements yet had nothing to walk and its first statement was admitted. The statement was evicted again by the next allowance enforcement pass, so the effect was a single statement stored for an account entitled to none. …

Crates: sc-statement-store (patch)

#12991: statement-store: bound inbound statement batch size

An inbound statement notification declaring more statements than a notification can hold is now rejected from its length prefix, drawing the same bad-message reputation penalty as any other decode failure.

Crates: sc-network-statement (minor)

#13003: statement store: skip expired statements before sending

Also for Node Operator

sp_statement_store::Statement gains is_expired, used by the gossip send paths and by the store's submit-time expiry check.

Crates: sp-statement-store (minor), sc-network-statement (patch), sc-statement-store (patch)

#13007: Make statement network rate-limit tests deterministic

The per-peer rate limiter in the statement network protocol now holds its token bucket behind a small TokenBucket trait, so tests can construct it with a fake clock instead of the default wall clock. The sustained rate-limit test drives that fake clock forward in fixed steps rather than sleeping for five seconds, which removes a source of CI flakiness and makes the test both exact and much faster. Production behaviour is unchanged: the handler still uses the default clock and the same quota.

Crates: sc-network-statement (patch)

πŸ–₯️ Node Operator

πŸ’₯ #12662: sc-hop: add Prometheus metrics

Adds Prometheus metrics to sc-hop: …

Breaking: sc-hop
Other crates: polkadot-omni-node-lib (patch)

πŸ’₯ #12887: Increase default light client slots

The default of --in-peers-light is raised from 100 to 500, since measurements showed nodes handle far more light peers than the old default allowed (#12846).

Breaking: sc-cli

#12247: changes to use zombie-bite

In order to use zombie-bite (to fork and spawn a live network with the current state) with the same client binaries (for testing releases), we need to allow to set this value DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION to 1.

Thx!

Crates: polkadot-node-core-dispute-coordinator (patch), polkadot-node-primitives (patch)

#12812: beefy: lower peer reputation for bad responses

Bad BEEFY justifications are refused and also the sending peer penalized.

Crates: sc-consensus-beefy (patch)

#12946: fix(state-sync): reject empty unverified state responses

Reject empty state responses when proof verification is disabled, preventing malformed peer data from causing a state sync panic.

Crates: sc-network-sync (patch)

#12994: statement gossip: allocate the validation queue lazily

The statement validation queue no longer pre-allocates its full capacity, its memory tracks actual occupancy. The queue limit still holds.

Crates: sc-network-statement (patch)

πŸ› οΈ Runtime Dev

πŸ’₯ #12395: Cumulus v3 add more test cases + cosmetics

Cosmetics + implementing the test cases listed in #11624 (comment)

Breaking: cumulus-client-consensus-common
Other crates: cumulus-client-consensus-aura (patch)

#12334: [RWF] sc-client-db: fix finalization can leave best_number below finalized_number

Closes #12305.

Summary

finalize_block_with_transaction always returns MetaUpdate { is_best: false, .. }, and update_meta only updates best_number/best_hash when is_best is true. If the best block is behind the block being finalized (e.g. after a re-org moves best to an earlier block), finalizing a later block leaves best_number < finalized_number β€” violating the metadata invariant. …

Crates: sc-client-db (patch)

Tooling & Benchmarking

πŸ› οΈ Runtime Dev

πŸ’₯ #12681: Remove deprecated cumulus-pallet-dmp-queue

Summary
  • Removes the cumulus-pallet-dmp-queue crate (deprecated after November 2024).

Breaking: polkadot-sdk

πŸ’₯ #12730: pallet-scarcity: coinage-style NFT ownership with feeless rest-time-prioritized transfers

Adds pallet-scarcity, a FRAME pallet for collectible instances under a coinage-style ownership model: one instance per fresh purse public key, with a stable InstanceId reverse index as the external handle. Item identity is immutable once written and may be minted many times. Metadata is a three-level mutable key/value store: collection entries provide defaults, item entries override the same key for every mint of that definition, and instance entries override both for one minted NFT. …

Breaking: pallet-scarcity
Other crates: polkadot-sdk (minor)

πŸ’₯ #12746: Remove pallet-scored-pool

pallet-scored-pool has been removed. It was not used by any runtime in the Polkadot SDK and had received no functional changes in years.

Runtimes depending on it should migrate to one of the maintained membership pallets, such as pallet-membership, pallet-ranked-collective or pallet-core-fellowship, depending on the desired semantics.

Users of the polkadot-sdk umbrella crate should remove the pallet-scored-pool feature from their dependency declaration.

Breaking: polkadot-sdk

FRAME & Runtime

πŸ› οΈ Runtime Dev

πŸ’₯ #6978: Adds BlockNumberProvider to pallet-core-fellowship

Also for Runtime User

This PR adds a parameter 'BlockNumberProvider' to the pallet-core-fellowship config such that a block provider can be set for use in the pallet. This would usually be the local system pallet or the appropriate relay chain. Previously it defaulted to the local system pallet.

Breaking: pallet-core-fellowship, sp-runtime
Other crates: collectives-westend-runtime (minor), kitchensink-runtime (patch)

πŸ’₯ #11235: Migrate pallet-im-online to use TransactionExtension API

Migrates pallet-im-online from the deprecated ValidateUnsigned trait to the modern TransactionExtension API using the #[pallet::authorize] attribute.

Runtime integrators: the pallet's Config trait now requires CreateAuthorizedTransaction<Call<Self>> instead of CreateBare<Call<Self>>. The runtime must include frame_system::AuthorizeCall in its transaction extension pipeline.

Breaking: pallet-im-online
Other crates: pallet-offences-benchmarking (patch), kitchensink-runtime (patch)

πŸ’₯ #12148: Remove deprecated GetStorageVersion::current_storage_version

Description

Removes deprecated GetStorageVersion::current_storage_version as part of #11561.

The method was renamed to in_code_storage_version in March 2024. It has no remaining usage in this repository.

Does not close #11561.

Breaking: frame-support

πŸ’₯ #12150: Remove deprecated StorageIterator and StorageKeyIterator

Removes migration::StorageIterator and migration::StorageKeyIterator, deprecated in July
2023. Use storage_iter / storage_iter_with_suffix and storage_key_iter /
storage_key_iter_with_suffix instead. No remaining in-repo usage.

Breaking: frame-support

πŸ’₯ #12249: Remove deprecated match_type macro from frame-support

Removes deprecated frame_support::match_type!, a thin alias for match_types!. Use match_types! directly.

Breaking: frame-support

πŸ’₯ #12250: Remove deprecated AllowAll, DenyAll, and Filter from frame-support

Removes deprecated frame_support::AllowAll, DenyAll, and Filter, legacy aliases for Everything, Nothing, and Contains. Use those types directly.

Breaking: frame-support

πŸ’₯ #12254: claims: Reject vesting claims below the existential deposit

Description

A vesting claim attaches a balance lock to the destination account, which requires the account to stay alive (balance >= existential deposit). This is currently not enforced: If a claim's destination would end up below ED, process_claim's deposit_creating left it below ED, and the subsequent add_vesting_schedule -> update_locks -> try_mutate_account saw free < ED. This dusted the account and tripped pallet_balances' "caused unexpected dusting/balance update" defensive failure. …

Breaking: polkadot-runtime-common

πŸ’₯ #12263: Add remove_registrar extrinsic to pallet-identity

Also for Runtime User

Adds a remove_registrar(index) extrinsic to pallet-identity, gated by the same RegistrarOrigin as add_registrar. Until now there was no on-chain way to disable a compromised or malicious registrar; the only remedy was a runtime upgrade with a bespoke storage migration. …

Breaking: pallet-identity
Other crates: rococo-runtime (patch), westend-runtime (patch), people-westend-runtime (patch)

πŸ’₯ #12529: Remove deprecated GenesisBuild trait.

Summary
  • Removed the deprecated GenesisBuild trait from frame_support::traits
  • Dropped the re-export and macro support for GenesisBuild<T> / GenesisBuild<T, I>
  • Pallet #[pallet::genesis_build] now only accepts BuildGenesisConfig
  • Updated docs and UI test expectations accordingly
Migration

If you still use the old genesis build syntax: …

Breaking: frame-support-procedural, frame-support

πŸ’₯ #12584: Remove deprecated schedule::v1 module

Summary
  • Remove the deprecated schedule::v1 module from frame_support::traits::schedule.
  • schedule::v2 remains unchanged and is still used by pallet-scheduler.

Breaking: frame-support

πŸ’₯ #12655: Remove deprecated pallet_society::RawEvent alias.

Use Event instead; no remaining in-repo callers.

Breaking: pallet-society

πŸ’₯ #12665: Remove deprecated schedule::v2 traits

Removes the deprecated frame_support::traits::schedule::v2 traits and the corresponding compatibility impls in pallet-scheduler.

Integration

Downstream users should migrate from frame_support::traits::schedule::v2::{Anon, Named} to frame_support::traits::schedule::v3::{Anon, Named}.

Breaking: pallet-scheduler, frame-support

πŸ’₯ #12670: Remove deprecated Utility::derivative_account_id method.

Remove the deprecated pallet_utility::Pallet::derivative_account_id method.

Integration

Replace:

pallet_utility::Pallet::<T>::derivative_account_id(who, index)

with:

pallet_utility::derivative_account_id(who, index)

Breaking: pallet-utility

πŸ’₯ #12671: Remove deprecated FixedPoint::try_sqrt.

Remove the deprecated try_sqrt method from the fixed-point arithmetic types in sp-arithmetic.

Integration

Replace value.try_sqrt() with value.checked_sqrt().

Breaking: sp-arithmetic

πŸ’₯ #12800: Registrar: reserve and register paras from a system parachain

Fills in the two registrar pallets and their shared wire types, so a system parachain can hand out para ids, hold the deposits, and drive registration on the relay chain over XCM. Deposits only ever live on the parachain; the relay chain takes nothing.

Pushing a multi-megabyte validation code through an XCM Transact would be wasteful, so registration is split in two and only the code hash and length cross the bridge: …

Breaking: registrar-primitives, pallet-registrar-para, pallet-registrar-relay
Other crates: polkadot-runtime-common (minor)

πŸ’₯ #12888: Bump arkworks to 0.6, arkworks-extensions to 0.6.0, ark-scale to 0.0.14 and ark-vrf to 0.5.3

Bumps the arkworks crates (ark-ec, ark-ff, ark-std and the curve crates) from 0.5 to 0.6, the arkworks-extensions crates from 0.5.2 to 0.6.0, ark-scale from 0.0.13 to 0.0.14 and ark-vrf from 0.5.0 to 0.5.3. No source changes were required. The sp-crypto-ec-utils bump is major since the crate re-exports arkworks types in its public API.

Breaking: sp-crypto-ec-utils
Other crates: sp-core (none), sp-keystore (none)

#12227: [FRAME] Auto-bound RuntimeTask: From<Task<Self>> in pallet Config when using tasks

Pallets using #[pallet::tasks_experimental] now automatically get frame_system::Config<RuntimeTask: From<Task<Self>>> added as a supertrait on their Config trait by the macro β€” mirroring the existing automatic RuntimeEvent: From<Event<Self>> bound added for pallets with events. …

Crates: frame-support-procedural (minor), frame-support (minor)

#12449: Derive Debug, Clone, PartialEq, Eq for EraPayoutParams

polkadot_runtime_common::impls::EraPayoutParams now derives Debug, Clone, PartialEq and Eq, so runtimes can log and compare the era-payout parameters they construct.

Crates: polkadot-runtime-common (minor)

#12590: pallet-society: return funds of discarded payouts to the pot

Funds backing pending payouts are moved into the payouts sub-account when scheduled, and must be returned whenever a payout is discarded. Four paths failed to do so, leaving balance stranded in the sub-account with no Payouts entry left to claim it: …

Crates: pallet-society (minor)

#12616: [RWF] pallet-membership: Fix Downstream change_key Unchanged Prime

Closes #12464

Problem

change_key in pallet-membership swaps a member's account key and calls T::MembershipChanged::change_members_sorted(...) to notify the configured ChangeMembers implementation of the swap. change_members_sorted "resets any previous value of prime" on the downstream consumer's side.

If the prime is any other, unaffected member, this branch is skipped entirely. Downstream ChangeMembers consumer never gets a set_prime call to restore what change_members_sorted just reset. …

Crates: pallet-membership (patch)

#12858: [RWF] pallet-beefy: return the correct future voting proof error

Also for Runtime User

Description

Fixes #12784.

Invalid signatures in FutureBlockVotingProof were rejected as InvalidForkVotingProof. This changes that failure path to return InvalidFutureBlockVotingProof and adds a regression test that tampers with the signed payload. The invalid proof remains rejected. …

Crates: pallet-beefy (patch)

#13006: Reject duplicate derivative IDs

Reject derivative registration when the derivative ID is already mapped to another original, preserving the one-to-one relationship between registry indexes.

Crates: pallet-derivatives (patch)

πŸ‘€ Runtime User

#5850: Try State Hook for Membership Pallet.

Invariants for storage items in the membership pallet. Enforces the following Invariants: 1.Prime member must be part of Members. 2.Numbers of Members cannot be more than MaxMember allowed.

Crates: pallet-membership (minor)

πŸ”§ Node Dev

πŸ’₯ #12268: remote-ext: fix silent state corruption from lagging RPC providers

Fixes #12264. Remote-externalities could silently produce an incomplete or corrupted state snapshot when talking to lagging or flaky RPC providers. This is fixed by:

  • treating per-item RPC errors inside a batch as a batch failure (and retrying) instead
    of substituting empty values, which previously dropped storage entries;
  • verifying the computed storage root against the block header's state root before
    caching a snapshot of a complete scrape; the new OnlineConfig::disable_root_check flag bypasses the check when deliberately …

Breaking: frame-remote-externalities

#12288: binary-merkle-tree: preallocate proof vector to avoid reallocations

ProofCollection now preallocates the proof Vec to ceil(log2(number_of_leaves)), the most nodes a single-leaf proof can hold, so merkle_proof and merkle_proof_raw no longer reallocate while collecting it.

Crates: binary-merkle-tree (patch)

Testnets & Test Utilities

πŸ› οΈ Runtime Dev

πŸ’₯ #12647: Remove non permanent migrations on westend

Remove one-shot migrations that already executed on the live Westend system chains (all on spec 1024001), plus their now-unused support code. …

Breaking: asset-hub-westend-runtime, bridge-hub-westend-runtime, collectives-westend-runtime, coretime-westend-runtime, people-westend-runtime

πŸ’₯ #12682: Remove deprecated RuntimeHelper::execute_as_governance

Summary
  • Removes RuntimeHelper::execute_as_governance (deprecated after August 2025).
  • Callers should use execute_as_governance_call instead; no remaining in-repo usages.

Breaking: parachains-runtimes-test-utils

#12275: In glutton_westend_config patch the genesis config with the passed para_id

While running tests on Versi I noticed that while generating chainspec for e.g. glutton-westend-local-1301 I noticed that the para id in the spec id is ignored and always set to 1300.

Not sure if there is a good reason for this behaviour but it's misleading.

Crates: glutton-westend-runtime (patch), polkadot-parachain-bin (patch)

πŸ‘€ Runtime User

#12769: asset-hub-westend: fix NonTransfer proxy falsely claiming Governance containment

On Asset Hub Westend, the NonTransfer proxy type declared itself a superset of the Governance proxy type while its call filter denied the Treasury, ConvictionVoting, Referenda and Whitelist calls that Governance admits.

Because pallet_proxy authorizes add_proxy/remove_proxy through is_superset, a NonTransfer proxy could add a Governance proxy for its delegator and thereby reach calls that its own filter denies. NonTransfer no longer declares Governance as a subset, so this is rejected. …

Crates: asset-hub-westend-runtime (patch)

#12771: asset-hub-westend: deny value-moving calls to the NonTransfer proxy

On Asset Hub Westend, the ProxyType::NonTransfer call filter is a deny-list and so fails open: any pallet added to the runtime is reachable by a NonTransfer proxy unless it is listed explicitly. Several call families that move the delegator's funds or assets were not listed, contradicting the documented policy that this proxy type can only execute calls that do not transfer funds or assets.

The following are now denied to a NonTransfer proxy: …

Crates: asset-hub-westend-runtime (patch)

πŸ”§ Node Dev

#11211: fix(bridge-hub): expose try-runtime feature in bridge-hub-test-utils

Fixes #10962. Fixed feature propagation issues in bridge-hub-test-utils by adding the try-runtime feature.

Crates: bridge-hub-rococo-runtime (patch), bridge-hub-westend-runtime (patch), bridge-hub-test-utils (patch)

Misc

πŸ”§ Node Dev

#12521: Fix out-of-bounds chunk index error in erasure coding

Description

reconstruct in polkadot-erasure-coding allocated received_shards with length n_validators and then indexed it directly with the caller-provided chunk_idx. Any chunk index >= n_validators panicked with an index-out-of-bounds instead of returning the already-defined Error::ChunkIndexOutOfBounds variant.

This PR adds the missing bounds check so invalid indices are reported as an error rather than panicking.

Closes #12465 …

Crates: polkadot-erasure-coding (patch)

#12528: bridges: remove dead FloatJsonValueMetric

Removes the unused FloatJsonValueMetric from relay-utils. It fetched a token price over HTTP (CoinGecko) via isahc to compute cross-chain message fees, but that mechanism was removed in parity-bridges-common#1642 and the type has been dead code since. Dropping it removes the isahc -> curl -> openssl-sys dependency chain from the bridges relay tree.

πŸ› οΈ Runtime Dev

#12729: [client] fix flaky test connectivity

test_connectivity flakes on teardown: TestNet::drop tears down tokio before the storage backend's background threads release their files, so temp.close() races a DirectoryNotEmpty. Retry fs::remove_dir_all a few times instead of failing on it.

Rust compiler versions

The crates and node binaries in this release were built and tested with the following rustc toolchain; other versions may work.

  • Rust Stable: 1.93.0

The WASM runtimes are built separately with the rustc version pinned by srtool (see the Runtimes section below).

Runtimes

The information about the runtimes included in this release can be found below.
The runtimes have been built using srtool v0.18.4 and rustc 1.93.0 (254b59607 2026-01-19).

Westend

πŸ‹οΈ Runtime Size:          1.48 MB (1550755 bytes)
πŸ”₯ Core Version:          westend-1025000 (parity-westend-0.tx27.au2)
πŸ—œ Compressed:            Yes: 80.88%
🎁 Metadata version:      V14
πŸ—³οΈ system.setCode hash:   0x816620663f3684de38591143c415b406df16998f24e3baac4d73f5114915cdfe
πŸ—³οΈ authorizeUpgrade hash: 0x4aa373de14118120347493e7dd92a479b68eabaeff2dc6356d8e708d2ce6e8fc
πŸ—³οΈ Blake2-256 hash:       0xe4fc5d79c623e5040f94d47abec40fbaacb33fdcfdedf35f9fc2e223b61ea249
πŸ“¦ IPFS:                  QmbMXKaxAKFzzjqFFDPWGZWWGJF2kNXCSaVXmrSpXAFmdV

Westend Assethub

πŸ‹οΈ Runtime Size:          2.52 MB (2645663 bytes)
πŸ”₯ Core Version:          westmint-1025000 (westmint-0.tx16.au1)
πŸ—œ Compressed:            Yes: 82.58%
🎁 Metadata version:      V14
πŸ—³οΈ system.setCode hash:   0x3d0b7d729eb4a890501846ca0b563ab341d76ed3a8157dfacf7f4ac5608a3b5b
πŸ—³οΈ authorizeUpgrade hash: 0x91f720088f4bbff1b7665fe4013dc4b9a6c7b291b8bb2c4749a776457bd85d1c
πŸ—³οΈ Blake2-256 hash:       0x6d7bd9c8858c304dc57f78025c2053e0961ef4343670c0b4bebf788f33fe5a26
πŸ“¦ IPFS:                  QmYnEv1pEtLwwSUTwmAkoQpgz2e4c5QgiYh6rCvLKNyJdn

Westend Bridgehub

πŸ‹οΈ Runtime Size:          1.36 MB (1425766 bytes)
πŸ”₯ Core Version:          bridge-hub-westend-1025000 (bridge-hub-westend-0.tx6.au1)
πŸ—œ Compressed:            Yes: 80.24%
🎁 Metadata version:      V14
πŸ—³οΈ system.setCode hash:   0xdc1049726f788bc25916828fb083a2fa2bf9d01d4c20284bf46407073e3cfb67
πŸ—³οΈ authorizeUpgrade hash: 0x2ea0400872ccaa9b79171913c535842a7a21f0107217e1e4f40a635e47d17b91
πŸ—³οΈ Blake2-256 hash:       0xa42f26bd5d4f1e291d7d46c84080ed73eeced9d8eb230fa4e43edc76518a23a3
πŸ“¦ IPFS:                  QmaXveBL9XVP1FMaT8afVvAxJVGagxVfn6gRDTGfdxDtB3

Westend Collectives

πŸ‹οΈ Runtime Size:          1.24 MB (1296242 bytes)
πŸ”₯ Core Version:          collectives-westend-1025000 (collectives-westend-0.tx6.au1)
πŸ—œ Compressed:            Yes: 81.41%
🎁 Metadata version:      V14
πŸ—³οΈ system.setCode hash:   0x5d9e903fbe2470c97062a6eaf5ddc80a93a8ad2626c52aa8bd075052d0729423
πŸ—³οΈ authorizeUpgrade hash: 0x72a9be945f1349d9be4c08188ff2b5b01c52621be849365f746fe0d6c35530e2
πŸ—³οΈ Blake2-256 hash:       0x9c8c5d2d36c2cfddeb25e84fa032884899e99f72348a6c70c24b4c9c321ab878
πŸ“¦ IPFS:                  QmP8dwiqyhaZZ39kekkjo66kJPKpeGQVKgHsqB9JQhhCQN

Westend Coretime

πŸ‹οΈ Runtime Size:          1.11 MB (1164192 bytes)
πŸ”₯ Core Version:          coretime-westend-1025000 (coretime-westend-0.tx2.au1)
πŸ—œ Compressed:            Yes: 80.53%
🎁 Metadata version:      V14
πŸ—³οΈ system.setCode hash:   0x86ab036ae5561f66cb4141b35eb7393f142e60268234ab76a28f84d831ad0f40
πŸ—³οΈ authorizeUpgrade hash: 0xa300f4637a961dc1c13efe235f62df669393286ddb2042bd76fdca45a3e7ce85
πŸ—³οΈ Blake2-256 hash:       0x5c9decadf8ff37d43a17c3f32d9926d9be8f668090e71e00d87fcbff85e0b592
πŸ“¦ IPFS:                  QmeybBHbZJvYZuee7QfmJrWx8QoyF7cE5g3w3HtEgkxbiX

Westend Glutton

πŸ‹οΈ Runtime Size:          548.57 kB (561736 bytes)
πŸ”₯ Core Version:          glutton-westend-1025000 (glutton-westend-0.tx1.au1)
πŸ—œ Compressed:            Yes: 78.18%
🎁 Metadata version:      V14
πŸ—³οΈ system.setCode hash:   0x17ea3b5c726b930afb06ac505d8569e7816fca5b0436f69ac385568e1fcf7290
πŸ—³οΈ authorizeUpgrade hash: 0x8ab1a0eb9d5b4ff1ccccb884e0c32fba44da9f60d1608f7e8cebadf0054592a0
πŸ—³οΈ Blake2-256 hash:       0x992354a6d43262857f242ed3df93d89cb1ae250858061599d00de115667a44be
πŸ“¦ IPFS:                  QmbZPvujsbwL9Rg5z5FaJV5gR3cZQ7sZpcUToCUApCoM67

Westend People

πŸ‹οΈ Runtime Size:          1.11 MB (1163574 bytes)
πŸ”₯ Core Version:          people-westend-1025000 (people-westend-0.tx2.au1)
πŸ—œ Compressed:            Yes: 80.54%
🎁 Metadata version:      V14
πŸ—³οΈ system.setCode hash:   0x33f9fbfe18af2d54cdcfc7605e94f3cf04724d090f105b6cc54e1e9c86480a43
πŸ—³οΈ authorizeUpgrade hash: 0xe2445ee400e2800c5a9fc700a4de2111f3e816509f19ed657a3e9ed23b9b94e2
πŸ—³οΈ Blake2-256 hash:       0xf717e8abd0869da881b2786fbec98c613fde98e7a4032863da6ebf300ad34cbe
πŸ“¦ IPFS:                  QmPvT3mrRfSSEgMzfBK5mXvNkh5cJC2uaF2oCwy2WuxExQ

Docker images

The docker images for the binaries of this release can be found on Docker Hub (available a few minutes after the release has been published), all tagged with stable2609:

You may also pull them with:

docker pull parity/polkadot:stable2609
docker pull parity/polkadot-parachain:stable2609
docker pull parity/polkadot-omni-node:stable2609
docker pull parity/chain-spec-builder:stable2609

Don't miss a new polkadot-sdk release

NewReleases is sending notifications on new releases.