Proto commits in paritytech/polkadot-sdk

These 48 commits are when the Protocol Buffers files have changed:

Commit:6ff9a26
Author:cirko33

Squashed commit of the following: commit 7a3a1675fadff0e10aa4beb868e6bfb8c12af5ff Author: Sebastian Kunert <mail@skunert.dev> Date: Wed Oct 21 06:45:20 2026 +0000 Remove accidentally reintroduced contracts runtime (#13522) Runtime was removed in #7638 and accidentally reintroduced in #1739 This also removes the `cargo-check-runtimes` job. This was triggered by looking at changes at `cumulus/parachains/runtimes/*`. But actually this only includes files directly in that folder and not on subfolders. So the job nearly never ran. Also it is only checking the crates, which is also covered by our crate-checker job. So from my perspective we can just kill this one. commit b070ee1a2ba5b6440955a2b12e73dd9518c36f8e Author: Andrei Eres <eresav@me.com> Date: Tue Oct 20 13:28:32 2026 +0000 statement-store: keep up to K routing peers reserved on the v2 DHT path (#13487) With the v2 DHT path on, peer steering keeps the node's routing peers reserved besides the peers covering its topics: the K nearest known peers, K being the replication factor, then the nearest peer of every distance bucket from the node's key that those K leave uncovered. The nearest peers are the replicas the node shares its topics with. The uncovered buckets are the far ones, as in Kademlia, and hold most of the network: one peer in each gives a statement for any topic a next hop closer to it. The set is recomputed every tick from the known peers, so it fills from the first discovered peers and settles as discovery completes. Only about log2(N) buckets are populated, so the far peers add about log2(N / K) connections: 3 at 100 nodes, 10 at 10 000. Today steering desires only the peers covering the node's topics, so a node without topics asks for no peer at all. The routing peers give every node a connected set that routes any statement onward. https://github.com/paritytech/polkadot-sdk/pull/13488 stops the statement set dialing peers of its own, so it needs this floor. Part of https://github.com/paritytech/polkadot-sdk/issues/13307. commit 09f43112698d3a719347a96d2869035f7bf16156 Author: 0xRVE <robertvaneerdewijk@gmail.com> Date: Tue Oct 20 13:28:04 2026 +0000 Dust accounting in fungibles transfers and approvals (#13230) Alice holds 100 of an asset with a minimum balance of 10. She approves Bob for 95. Bob asks to move 91 to Carol. That would leave Alice with 9, which the pallet can't keep, so it takes the last 9 too: 100 moves. But Bob was approved for 95. The fix checks the approval against the 100 that will actually move, not the 91 Bob asked for. Bob's call fails, Alice keeps her balance and her approval. Bob can ask for 90 instead, leaving Alice at exactly 10. The pallet won't silently do that for him, and moving less than requested isn't an option here. Alice holds 100 of an asset with a minimum balance of 10. She sends 95 to Bob (through XCM or treasury payout). Taking 95 would leave Alice with 5, which the pallet can't keep, so it takes all 100. But the transfer credits Bob only the 95 that was asked for. Alice is down 100. Bob is up 95. The missing 5 went nowhere and nothing reduced the supply, so the chain still reports 100 in existence while the balances now add up to 95. That gap never closes. With the fix, the transfer credits Bob whatever was actually taken. Alice is down 100, Bob is up 100, and the books balance again. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 193aa6c20eed45a960830aabedae6d6b8213abe9 Author: Luka Ciric <luka.ciric2106@gmail.com> Date: Tue Oct 20 12:18:36 2026 +0000 Registrar: Deregister (#13091) Closes #12816 Implements deregister flow on the parachain in registrar. New flow covers deregistering through para (CT in Polkadot case) and relay accepting it. 1. The manager (or root, or the para itself) calls `pallet-registrar-para::deregister(para_id)`. A locked para is out of the manager's hands. 2. If the id was only reserved, the relay chain never knew it. The reservation is released, the entry is removed and nothing is sent. 3. If the para is registered, it moves to `Deregistering { ticket, can_retry_after, message_id }` and `Deregister { para_id, message_id }` goes to the relay chain. Both deposits stay held. 4. On the relay chain, `pallet-registrar-relay` calls `ParachainRegistrar::deregister`: - A parathread is dropped through `paras_registrar::do_deregister`. Cleanup is scheduled and `AwaitingFirstHead` is cleared. - A para that is already gone or offboarding answers `Ok`. - Anything else (onboarding, a lease-holding parachain) is refused. There are no origin or lock checks here, because those belong to the parachain that took the deposit. 5. The relay chain answers with `DeregisterResponse`: - `Ok(())`: the parachain releases both deposits and removes the entry. - `Err(NotDeregisterable)`: the para goes back to `Registered` with its deposits. A rejected request still returns `Ok` on the relay chain, so the report isn't rolled back. A lost answer leaves the para in `Deregistering` with both deposits held. There is no separate cancel message. The manager just asks again: 1. From `can_retry_after` (`PendingDeadline` after the last request), the manager calls `deregister` again. Before that it fails with `CannotRetryYet`, so the relay chain isn't asked once per block. 2. The retry reports the missing answer as `Unexpected(ResponseNeverArrived)`, takes a new message id, pushes `can_retry_after` out and resends `Deregister`. 3. `Deregister` is idempotent on the relay chain: - If the first request went through, the para is already offboarding or gone, so it is confirmed again and the deposits are released. - If it was refused, it is refused again and the para goes back to `Registered`. 4. The parachain only accepts the answer to the latest request. An answer to an older one is reported as `StaleResponse` and dropped. - `registrar-primitives`: `FailureReason::NotDeregisterable`. - `pallet-registrar-para`: - `deregister` and `on_deregister_response` are implemented. - New events: `ReservationDropped`, `DeregisterRequested`, `Deregistered`, `DeregistrationFailed`. - New error: `CannotRetryYet`. - New weights: `deregister_reserved`, `deregister_registered`, `deregister_retry`. - `pallet-registrar-relay`: - `Deregister` is handled. - New events: `Deregistered`, `DeregistrationRejected`. - New weight: `receive_deregister`. - `polkadot-runtime-common`: `paras_registrar` implements `ParachainRegistrar::deregister`. --------- Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com> commit 5cee2473f7d1d51d45b429d5844d46ba284360a2 Author: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Date: Tue Oct 20 11:27:56 2026 +0000 statement-store: keep a transient statement until its outboxes fetch it (#13465) Closes #13220. A transient statement now stays in the store until every outbox it was queued in has fetched it, instead of being swept as soon as the propagation pass takes it. - `StatementStore` gains `hold_statements` and `release_statements`. `take_recent_statements` returns each statement with one hold that the caller releases. - The store counts holds per hash, and the retention sweep skips held statements. - The handler's outboxes move into `PropagationOutboxes`, which holds each queued hash until it leaves the outbox. commit aeb228f71799c9973a4e119aa15c016e1f0ce394 Author: BDevParity <bruno.devic@parity.io> Date: Tue Oct 20 10:21:17 2026 +0000 [Release|CI/CD] Add publish delay on publish crates workflow (#11837) Forwards a new `publish_delay` workflow input to `parity-publish apply` as `--publish-delay SECS`. The flag sleeps between parallel publish batches within a dependency level, helping avoid crates.io rate limits on large releases. Default is 0 (no delay, preserves existing behavior). Bumps pinned parity-publish install to 0.10.16 which introduces the flag. Co-authored-by: EgorPopelyaev <egor@parity.io> commit 143941d9cc080289ed866c1e49273818186cc5e0 Author: Nasihudeen Jimoh <nasihudeen04@gmail.com> Date: Tue Oct 20 10:03:36 2026 +0000 Remove unused ChildBountyCount storage item from pallet-child-bounties (#13333) This is part of #11561. `ChildBountyCount` was replaced by the per-parent `ParentTotalChildBounties` counters in the v0 to v1 migration and is no longer read anywhere, so this removes the storage item from the pallet. The storage version stays at 1. The old value only still exists on Asset Hub Polkadot and Kusama, so it is removed there with `RemoveStorage<ChildBountyCount>` in polkadot-fellows/runtimes#1328, instead of an in-pallet migration every runtime would have to wire in. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Branislav Kontur <bkontur@gmail.com> commit 09476c778a37494e60c650372b17126f5a6b85ed Author: Bastian Köcher <git@kchr.de> Date: Mon Oct 19 07:41:38 2026 +0000 Remove `Printable` trait (#13491) This removes the `Printable` trait. There was almost no usage left and what was left was replaced by `log`. commit de321b34ee0b31d1c58aa5e556d3e353beb0c70e Author: Alexander Pastushenka <a.pastushenka@gmail.com> Date: Mon Oct 19 07:12:45 2026 +0000 pallet-proxy: refund unused weight of the proxied call (#13462) `proxy` and `proxy_announced` drop the post-dispatch info of the proxied call: its result only goes into the `ProxyExecuted` event, and both calls return `DispatchResult`. So the proxied call is always charged its full declared weight, even when it reports a lower actual weight, and the unused block space is not reclaimed. The overcharge is largest for calls that declare their worst case, e.g. a `utility::batch` interrupted by an error. This PR makes both calls return `DispatchResultWithPostInfo` with the proxy overhead plus the actual weight of the proxied call, the same approach `pallet-multisig` and `pallet-whitelist` use when they dispatch a call. If the proxied call does not report its actual weight, `None` is returned and the full declared weight is charged, as before. The declared weight does not change. `pays_fee` of `proxy` and `proxy_announced` stays `Pays::Yes`. The encoding of calls does not change, so clients and wallets are not affected. The bump is major because of two API changes: - `Pallet::proxy` and `Pallet::proxy_announced` return `DispatchResultWithPostInfo` instead of `DispatchResult`. Callers that check the result with `assert_ok!` keep working. - `Config::RuntimeCall` now requires `PostInfo = PostDispatchInfo`, as in `pallet-utility` and `pallet-multisig`. `RuntimeCall` generated by `construct_runtime!` already satisfies it, so runtimes need no changes. ```diff type RuntimeCall: Parameter - + Dispatchable<RuntimeOrigin = Self::RuntimeOrigin> + + Dispatchable<RuntimeOrigin = Self::RuntimeOrigin, PostInfo = PostDispatchInfo> ``` - `do_proxy` returns the result of the proxied call; the `ProxyExecuted` event is unchanged. - `get_result_weight` is the same helper as in `pallet-multisig` and `pallet-collective`. - The weight calculation moved into `proxy_weight` / `proxy_announced_weight`, used by both `#[pallet::weight]` and the post-dispatch weight, so it is not duplicated. commit ef9f154c2b370357343306d75db64b37bd980c18 Author: Diego <diego2737@gmail.com> Date: Mon Oct 19 06:44:38 2026 +0000 pallet-revive: Expose the PVM code upload check (#13300) Tooling that produces PVM blobs cannot tell whether `pallet-revive` will accept a blob until it is deployed. The motivating case is `resolc` ([paritytech/revive#599](https://github.com/paritytech/revive/pull/599)): a contract compiled with a large `--heap-size` links fine and is then rejected on upload for exceeding the baseline memory limit. This PR exposes the upload check itself instead of the constants behind it: ```rust pub fn check_pvm_code(blob: &[u8]) -> Result<(), CodeRejection>; pub enum CodeRejection { BlobTooLarge { size: u32, limit: u32 }, BasicBlockTooLarge { size: u32, limit: u32 }, PurgeableMemoryTooLarge { size: u32, limit: u32 }, BaselineMemoryTooLarge { size: u32, limit: u32 }, InvalidInstruction, Malformed, } ``` Both are re-exported from the crate root. `mod limits` stays private, so downstream code sees the limits only as values inside a rejection and the code limits can still be raised between releases. - `limits::code::enforce` is split into `check_pvm_code`, which is not generic over the runtime and looks up the syscall list itself, and `enforce::<T>`, which stays the pallet's entry point and maps each rejection to the `Error<T>` it returned before. Dispatch errors do not change. - `REVIVE_SKIP_VALIDATION` is only honored by `enforce`, so external callers always get the real verdict. - Tests: one unit test per variant pinning the error it maps to, plus `check_pvm_code` assertions on the existing oversized blob, basic block and static memory fixtures, a malformed blob and a valid one. commit 4f70f263f11a4ee2c25731f9fcf8759be5e510a0 Author: Marian Radu <marian@parity.io> Date: Sat Oct 17 06:07:15 2026 +0000 eth-rpc: send only new latest blocks to newHeads subscribers (#13477) The newHeads subscription sent every block from the best block stream, including blocks eth-rpc does not take as the latest one: a repeat of the latest block, a lower block replayed while the latest block is still canonical, or a block that contradicts the finalized block. Subscribers are now notified only when the latest block changes, so a lower or repeated block is sent only when the latest block moves back, after a reorg or a reconnect to a node that is behind. - `BlockInfoProvider::update_latest` returns the new latest block, or `None` if it did not change. - The finalized block stream now also notifies subscribers when it changes the latest block. commit 03215dcacd1313785052a8eb6e69dd5f07ee01de Author: Andrei Eres <eresav@me.com> Date: Sat Oct 17 04:41:50 2026 +0000 statement-store: deliver statements to light peers on the v2 DHT path (#13456) Closes https://github.com/paritytech/polkadot-sdk/issues/13307. With the v2 DHT path on, a light peer got only the initial sync. The propagation plan took the filter matches from the peers in the topology, and light peers never enter it. The plan now takes them from the stored peer filters, so a light peer reaches the plan through its filter alone, while staying out of the DHT index, routing targets and peer steering. The two TODO(#11288) comments are settled without a code change. A light peer stays out of the orchestrator because it stores and routes nothing. The `can_receive` check before queueing stays because a V2 peer skipped for a missing filter gets the skipped statements from the initial sync that follows its filter. No changes needed. commit 264c36dd72329280589b6de2312c8df1e114bfee Author: Nasihudeen Jimoh <nasihudeen04@gmail.com> Date: Fri Oct 16 20:15:45 2026 +0000 Remove the construct_runtime! where clause (#13349) This is part of #11561. The `where` clause on `construct_runtime!` has warned since December 2023, and no production runtime still uses it. The block type is already read from `frame_system::Config::Block`. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Branislav Kontur <bkontur@gmail.com> commit bd8f292bf13f898a52b81cafd84d124bb837a2c6 Author: Ron <yrong1997@gmail.com> Date: Fri Oct 16 14:53:10 2026 +0000 Snowbridge: Ethereum Glamsterdam Upgrade Support (#13122) Context - [EIP-7688](https://eips.ethereum.org/EIPS/eip-7688) turns BeaconState and BeaconBlockBody into progressive containers, so every generalized index moves; the light client selects the Gloas indices by slot. - [EIP-7732](https://eips.ethereum.org/EIPS/eip-7732) removes `execution_payload` from BeaconBlockBody, leaving a builder's bid that commits to the *parent* execution block hash. A proof carries that block's canonical RLP header, authenticated by `keccak256(bytes) == committed hash`, and reads `receipts_root` out of it. - [EIP-8037](https://eips.ethereum.org/EIPS/eip-8037) prices new state and [EIP-8038](https://eips.ethereum.org/EIPS/eip-8038) reprices state access. The outbound dispatch gas limits are raised to match; they now live in `snowbridge_outbound_queue_primitives::dispatch_gas`, shared by v1 and v2. --------- Co-authored-by: Branislav Kontur <bkontur@gmail.com> commit 2cd0e4fe5b5ef1355d89ffff40f69c2713f01b34 Author: Nasihudeen Jimoh <nasihudeen04@gmail.com> Date: Thu Oct 15 21:22:28 2026 +0000 Remove deprecated BlockLength constructors (#13348) This is part of #11561. `BlockLength::max` and `BlockLength::max_with_normal_ratio` were due for removal after July 2026, and nothing in the repository calls them. The deprecation notes pointed at `builder().max()` and `builder().normal_ratio()`, but the builder only had `max_length`. `max_length` already replaces `BlockLength::max`. This change adds `BlockLengthBuilder::normal_ratio` for the second constructor and deletes both old functions. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 80536b7691ec4b8235ffdbf0f1e36745c953f17c Author: Andrei Eres <eresav@me.com> Date: Thu Oct 15 18:19:40 2026 +0000 statement-store: benchmark routing targets and retention affinity of the v2 topology (#13436) Adds a criterion benchmark for the two per-statement decisions of the v2 DHT topology: the forwarding targets of a topic and the local node's retention affinity. Both walk the XOR-ordered peer index, so the benchmark runs them on a topology the size of a live network: 50 to 1000 connected peers out of 2048 known for the targets, 512 to 2048 known peers for the affinity. Each run checks its result against the counts computed at setup. The topology types are re-exported with the same doc-hidden pattern that the existing network benchmark relies on, and the benchmark requires the test-helpers feature like that one. Part of https://github.com/paritytech/polkadot-sdk/issues/13135. The target-selection benchmark was asked for in the review of https://github.com/paritytech/polkadot-sdk/pull/13197. None. Run it with: ``` cargo bench -p sc-network-statement --features test-helpers --bench peers_topology ``` commit 3de1a0ebc8d3c57156f020764a61667080f577d3 Author: Ankan <10196091+Ank4n@users.noreply.github.com> Date: Wed Oct 14 19:45:35 2026 +0000 [AHMv2] Abstracts away HRMP deposits into a Deposit Provider impl. Paves way for remote deposits later (on CT) (#13475) Abstracting out the deposit provider from the HRMP pallet. No-op almost except couple of extra events. See `Functional Change`. The followup PR will implement an async (deposit on CT, management on RC) implementation of the deposit provider. Makes it easier for relay to live a token less life. Basically just 2 files to review - `polkadot/runtime/parachains/src/hrmp/deposits.rs`: Contains all the new traits (`ChannelDepositProvider` and the callback trait) and in-pallet impl/callbacks + weights etc. All of new code is just here. - `polkadot/runtime/parachains/src/hrmp.rs`: Only really deletes of deposit code (except very small changes) which is outsourced to deposits.rs. Should be <del>absolutely</del> almost (two cases that didn't emit event before will emit now) no-op, not challenging the status quo. `OpenChannelRequested`, `OpenChannelAccepted` and `OpenChannelDepositsUpdated` are now emitted as part of a common function invoked when call completes. As a result `force_open_hrmp_channel`, `establish_system_channel` and `establish_channel_with_system` now also emit `OpenChannelRequested` and `OpenChannelAccepted`. - [ ] Security Audit for the PR - [ ] (followup) hrmp-primitives are for wire types, should contain contract between hrmp_para and hrmp_relay, not for contract between hrmp and hrmp_relay. --------- Co-authored-by: cirko33 <luka.ciric2106@gmail.com> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 747a4383120b6ee1d45915b1c1d41e47a184b696 Author: Bastian Köcher <git@kchr.de> Date: Wed Oct 14 18:46:41 2026 +0000 sp-io: Stop passing state version to storage root host functions (#13452) This starts ignoring the `state_version` passed to the storage root functions. This basically implements [this old rfc](https://github.com/w3f/PPPs/pull/6), but instead of deprecating the functions it changes the way the host/node is handling this. This is a preparation for [parachain service](https://github.com/paritytech/parachain-service/issues/52). Parachains on JAM will require new host functions and to not introduce the requirement there to pass `state_version` this pull requests removes the requirement. A later pull request will then introduce the new host functions for JAM. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 0c6a0edc17553c5ec227dd9d669c814947c2bebf Author: Paolo La Camera <paolo@parity.io> Date: Wed Oct 14 10:16:54 2026 +0000 papi-tests: convert chain specs with export-chain-spec (#13479) zombienet converts plain chain specs to raw with the node's `build-spec` subcommand unless `chain_spec_command` is set. #12586 removed `build-spec`, which broke `just setup` / `just run` in papi-tests. This sets `chain_spec_command` to `export-chain-spec` for the relay (`polkadot`) and the parachain (`polkadot-parachain`). zombienet still customizes both plain specs before converting them, as before. Note: `{{chainName}}` is wrapped in `{% raw %}` because zombienet renders the TOML with nunjucks (using env vars) before parsing it. Unescaped, it renders to an empty string and `--chain` gets no value. This fixes also miner nightly test which relies on papi-test setup (see https://github.com/paritytech/polkadot-staking-miner/issues/1344) Tested locally: ``` 🚧 Chain Spec for paraId 1100 was set to a file in raw format, can't customize. 🚧 Command : bash -c polkadot export-chain-spec --chain /tmp/zombie-.../rococo-local-plain.json --raw > /tmp/zombie-.../rococo-local-raw.json [Parachain] 💤 Idle (0 peers), best: #3 (0x464e…b28f), finalized #0 (0x64c0…0313) INFO monitor: Charlie score registered (malicious) INFO monitor: Alice score registered INFO monitor: Bob score registered INFO monitor: Charlie slashed for incomplete/invalid submission! INFO monitor: Alice rewarded! INFO monitor: Bob solution discarded! INFO monitor: 🤑 Successfully completed three-miner test: Alice and Bob submitted solutions (one rewarded, one discarded), Charlie slashed for malicious behavior! test submit_works ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 526.32s ``` commit 69a43afcb6de792708f8f73a021780f67780b981 Author: Egor_P <egor@parity.io> Date: Wed Oct 14 08:33:36 2026 +0000 Backport version bumps and prdocs reordering from stable2609 (#13468) This PR backports regular version bumps and prdocs reordering after release from stable branch back to master --------- Co-authored-by: ParityReleases <release-team@parity.io> commit 6634ddb4dbf31ed8b9d192000b9bfc93dc0e4593 Author: Dmitry Markin <dmitry@markin.tech> Date: Wed Oct 14 07:20:02 2026 +0000 Add interruptible executor & limit light client request processing time (#12725) Add executor that aborts execution when timeout elapses, based on WasmTime epoch interruptions. A separate executor for time-bound requests is needed, because epoch interruption compiles into the WASM blob and slows execution down by 10%. Limit light client execution proof requests by 3-second timeout by defaul. The timeout is deliberately chosen high before we obtain real-world execution time data for legitimate requests. The default timeout can be overridden with `--light-request-execution-timeout-ms`. It is recommended to review the PR as a series of individual commits. They build on each other bottom-up. See https://github.com/paritytech/polkadot-sdk/pull/12500 for original work and discussion. --------- Co-authored-by: Bastian Köcher <git@kchr.de> commit 47612878ffdca773d88bb35209b240d52337d376 Author: Omar <OmarAbdulla7@hotmail.com> Date: Wed Oct 14 06:03:47 2026 +0000 Fix `eth_subscribe("newHeads")` in the ETH RPC (#13419) `eth_subscribe("newHeads")` was rejected on master. `SubscriptionKind` serialised the variant as `newBlockHeaders`, and only our own client sent that. This PR renames it to `newHeads` and adds `difficulty` and `mixHash` to `BlockHeader`, because alloy can't decode a `newHeads` header without them. The `newHeads` test now subscribes through alloy's WebSocket provider, which sends `"newHeads"` on the wire, and checks the header against the receipt and `eth_getBlockByNumber`. Split out of #13002 so it can be backported on its own. commit e8e1c1b5efc3189184214a5e55c617b5f9e8886c Author: Abdulwaarith Zakariyya <abdulwaarithz@gmail.com> Date: Tue Oct 13 20:18:30 2026 +0000 sp-keystore: MemoryKeystore signs only with a secret URI that derives the queried key (#13410) Closes #13142 `MemoryKeystore::insert` stores any suri under any public key and returns `Ok(())`. `pair()` then derived a key from the stored suri without checking it against the queried public, which caused two problems: - After a mismatched insert, `sr25519_sign`, `sign_with` and the VRF methods returned a signature from a different key, one that does not verify under the queried public. - After an unparseable suri, every lookup panicked on `expect("seed slice is valid")`, including the typed `*_public_keys` listings. As planned in the issue, the check happens at lookup time, the way `LocalKeystore` does it. `insert` only gets raw public bytes and doesn't know the scheme, so it can't validate up front. - `pair()` parses the suri with `from_string(..).ok()` and returns `None` unless the derived public matches the queried one. Every sign, VRF and proof-of-possession method goes through it. - `public_keys` skips an unparseable suri, the same way it already skips a mismatched one. `insert`, `keys` and `has_keys` are unchanged: they still report what was stored, like `LocalKeystore`. The sign methods return `Ok(None)` for such an entry, matching how `public_keys` already treats it as absent. `LocalKeystore` returns an error instead (`PublicKeyMismatch` / `InvalidPhrase`). Happy to switch to an `Err` if that's preferred. Tests: - `mismatched_secret_uri_signs_nothing`: sign, `sign_with`, VRF sign, VRF pre-output and listing, then the same suri under its own public still signs and verifies. - `unparseable_secret_uri_does_not_panic`: sr25519, ed25519 and ecdsa sign, prehashed sign, VRF, `sign_with` and listings. Each test fails with its half of the fix reverted. `cargo test -p sp-keystore --lib`: 7 passed, and 12 with `--all-features`. RWF finding, same cluster as #13402. --------- Signed-off-by: Abdulwaarith <abdulwaarithz@gmail.com> commit 68506aeda4ca20c0a40fbd805fb1e84c903e8ebd Author: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Date: Tue Oct 13 16:07:41 2026 +0200 ci: migrate ci-unified to bookworm (#13467) cc https://github.com/paritytech/devops/issues/5593 commit de8b01bbec123e4fadee1cf2ddb30f52620519bb Author: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> Date: Tue Oct 13 11:28:21 2026 +0000 cumulus: compute resubmittable segment in the parent search (#13355) During the `find_parent` call we are able to find both the included head and pending availability head if it exists. They can be used as starting point for a forward walk up to para best block, to determine the resubmittable segment (as headers). *NOTE*: at this point the resubmittable segment can contain multiple blocks of the same bundle. The following PRs in the stack will be able to compact the blocks of a bundle in a single collation though, before submitting a V4 segment. Closes https://github.com/paritytech/polkadot-sdk/issues/12309 --------- Signed-off-by: Iulian Barbu <iulian.barbu@parity.io> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 40801b808531a58136a8bf310abd62c47183c342 Author: Dhiraj Sah <dhiraj@parity.io> Date: Tue Oct 13 10:43:48 2026 +0000 pallet-multi-asset-bounties: refund parent bounty net of paid-out child-bounty value on close (#13258) `close_bounty` on a parent bounty refunded the full stored `value` to the funding source, even though part of that value had already been moved to child-bounties and, for paid-out children, never came back. With a paymaster that performs a real transfer (`LocalPay` on Polkadot and Kusama Asset Hub) the refund over-requested, failed with `RefundError`, and the parent bounty could never be closed through the intended path. The refund path now applies the same `calculate_payout` adjustment as the payout path, so a parent bounty refunds `value - ChildBountiesValuePerParent`, which is exactly what its account holds. Child-bounty refunds are unchanged. The pallet tracks the cumulative funded child value in `ChildBountiesValuePerParent`. On a child *refund* the counter is reverted, because the funds return to the parent account. On a child *payout* it is intentionally kept, because the funds leave for good and the parent payout must be reduced by that amount. The payout path honours this via `calculate_payout`; the refund path did not. Once a child has been paid out, every `close_bounty` attempt on the parent fails identically. The funds are not lost (they stay in the parent bounty account and can still be awarded), but the reclaim-to-treasury path is unavailable for that parent. - `do_process_refund_payment` computes the refund amount through `calculate_payout` instead of using the raw `value`. This covers both `close_bounty` and the `RefundAttempted` retry in `retry_payment`, and is a no-op for child-bounties. - Doc comments on `ChildBountiesValuePerParent` and `calculate_payout` updated to mention the refund. - Test paymaster gains an opt-in strict mode (`set_strict_balances`) that debits the source and fails when it holds too little, modelling `LocalPay`. Off by default; existing tests unchanged. - New regression test `close_parent_bounty_after_child_payout_refunds_remaining_value`. It fails on `master` with `RefundError` and passes with this change. - No storage migration. Bounties already stuck in this state become closable as soon as the runtime is upgraded, since the fix only changes the amount requested at close time. commit 06659c00451e158c13b8a6e0eff38e2d53dc1250 Author: Nasihudeen Jimoh <nasihudeen04@gmail.com> Date: Tue Oct 13 10:41:42 2026 +0000 Remove deprecated build-spec CLI subcommand (#12586) This removes the deprecated `build-spec` CLI subcommand and `BuildSpecCmd` from `sc-cli`, and migrates all callers (nodes, templates, scripts, docs, zombienet) to `export-chain-spec`. Part of #11561 --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Branislav Kontur <bkontur@gmail.com> Co-authored-by: Francisco Aguirre <franciscoaguirreperez@gmail.com> commit a6a749e55ece8bd55ce81031782a3f9582cb1b54 Author: Omar <OmarAbdulla7@hotmail.com> Date: Mon Oct 12 12:51:42 2026 +0000 Bump revive differential tests (#13448) Update the revive-differential-tests action and checkout to `562538e33022be827bc0383aa53786f3a9751596`, and refresh the REVM and PolkaVM expectation files to match the current results. commit 34595be73eb19afe34d26ace0090d26ac5aefec5 Author: Nasihudeen Jimoh <nasihudeen04@gmail.com> Date: Mon Oct 12 10:28:18 2026 +0000 Kanas/module invalidity (#11724) This PR implements descriptive module invalidity support for transactions as proposed in #11337. It extends the `InvalidTransaction` enum with a new `Module(ModuleError)` variant, allowing pallets to return pallet-specific, descriptive error data during the transaction validation phase (e.g., in `TransactionExtension`). Closes #11337 Downstream projects and UI tools (like `subxt` or `polkadot-js`) can now leverage descriptive invalidity reasons. When a transaction is rejected by the pool with a `Module` error, the RPC will return a formatted message including the pallet index and the error bytes. Example RPC error output: `"Invalid Transaction: Module error: index: 5, error: [1, 0, 0, 0]"` Client-side libraries can use this index and byte array to look up the specific error definition in the chain's current metadata, mirroring how `DispatchError::Module` is handled today. The implementation follows the established pattern for descriptive errors in Substrate while ensuring 100% backward compatibility for the transaction pool and node-side logic. - **`sp-runtime`**: Appended `Module(ModuleError)` to the `InvalidTransaction` enum (index 13). This position ensures that existing SCALE-encoded variants remain unchanged. - **String Conversion**: Updated the `From<InvalidTransaction> for &'static str` implementation to prioritize the descriptive message from `ModuleError` if present. - **RPC Layer**: Enriched both the Author RPC (v1) and the Transaction RPC (v2) to explicitly handle the `Module` variant and return formatted debug information. - **Verification**: Added a new unit test `module_invalidity_should_encode_and_decode` in `sp-runtime` to verify the encoding/decoding and string conversion paths. ```diff pub enum InvalidTransaction { ... UnknownOrigin, + /// An error in a module. + Module(ModuleError), } --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 8c541320b8ff1b7f9377962d13d3359a2dd502e5 Author: Nasihudeen Jimoh <nasihudeen04@gmail.com> Date: Mon Oct 12 08:50:37 2026 +0000 fix(sc-network-gossip): deduplicate local message registration (#12694) `register_message_hashed` used `known_messages.insert(message_hash, ())` as the dedup guard before pushing a `MessageEntry`. With `schnellru::LruMap` (0.2.3), `insert` does not distinguish new keys from replacements: for an existing key it replaces the value and still returns `true` whenever the cache is non-empty (`!self.is_empty()`). Registering the same message twice therefore passed the guard and appended a second `MessageEntry` with the same hash, breaking the intended one-entry-per-hash invariant in the gossip message cache. The `on_incoming` path was unaffected because it already checks `known_messages.get(&message_hash).is_some()` before calling `register_message_hashed`. The broken path is user-reachable via `register_message` and `multicast`, which hash the payload and call `register_message_hashed` directly with no prior dedup check. Duplicate entries surface through `messages_for()` as repeated notifications for the same bytes, waste memory in `messages`, and can cause duplicate processing in upper layers that assume the cache is hash-unique. `multicast` also registers before propagating, so duplicates can be rebroadcast from the local cache on later topic broadcasts. A second `register_message` / `multicast` for an already-registered message hash is now ignored by an explicit `known_messages.get()` check before insert, matching the `on_incoming` dedup behavior. Closes #12607 --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 4eec7dfb770e3c7d3d7b254125580edf3de527ec Author: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Date: Sun Oct 11 21:20:08 2026 +0000 statement-store soak: fit the 6 h namespace token, accept a partial mesh (#13450) Raise the soak job timeout to 355 min and its test step to 345 min, so a soak of up to ~5 h 15 min (`soak_secs=18900`) finishes before the 6 h namespace token expires. The lifecycle topology check (`baseline-ready`, `disconnected`, `joined`) now expects each online node to be connected to at least `min(online peers, CONNECTED_PEER_FLOOR)` peers, as the start-up wait already does, instead of to every online peer. Past 51 nodes the start-up wait accepted a partial mesh while the lifecycle check still demanded a full one. commit 05ddbee5c062d49c8a2a072c529a2fc80aad243e Author: Paolo La Camera <paolo@parity.io> Date: Fri Oct 9 14:14:41 2026 +0000 pallet-validator-collators: random draw of validator collators under a cap (#13420) When `MaxCollators` is set, `pallet-validator-collators` draws the validators at random at the first of the two forced rotations after a set arrives. The draw shuffles the whole set with a seed made of the genesis hash, the era and the relay chain epoch randomness, keeps the validators with registered keys and truncates to the cap. The drawn list and its era are stored in the new `Collators` storage item and reported in the new `CollatorsDrawn` event. Without a cap every validator with registered keys is returned. Changing the cap while a set is stored forces two session rotations. The first draws the list anew from the stored set, with the randomness cached at that time, so the drawn validators can change. Removing the cap clears the drawn list. The pallet implements `cumulus_pallet_parachain_system::OnSystemEvent` and caches the relay chain `ONE_EPOCH_AGO_RANDOMNESS` in the new `EpochRandomness` storage item (similar to People Polkadot's `relay-randomness` pallet). Runtimes using the pallet must wire it as `OnSystemEvent` of `cumulus-pallet-parachain-system`, and should return the keys of `Pallet::relay_keys_to_prove` from `cumulus_primitives_core::KeyToIncludeInRelayProof`. A relay chain state proof that lacks the trie nodes of the randomness key, or holds a value that does not decode, makes the block invalid, so a block author cannot omit the key to keep an older value. A proof that shows the key absent, as on a relay chain before its first epoch change, caches a zero value, the default of BABE's randomness storage. Asset Hub Westend and People Westend wire the pallet as `OnSystemEvent` and implement `KeyToIncludeInRelayProof` with its keys. Under a cap the list is **redrawn for every new set, so every era**, and applies with no notice: **drawn validators must already run a synced collator node**. The cap lets governance roll out validator collators gradually: start with a low cap and raise it in steps, monitoring in between, up to no cap. Lowering it again goes back to fewer collators if something breaks. Each cap change is a new draw. Redraw period, a slot kept for several eras and advance notice are deferred until operators have run collators and given feedback. See https://github.com/paritytech/metanode/issues/22. - Panics: `on_relay_state_proof`, the pallet's `OnSystemEvent` handler, _panics_ on a relay chain state proof without the trie nodes of the randomness key or with an undecodable value, which makes the block invalid, as parachain-system does for other required relay proof data (e.g. People on Polkadot via individuality's `relay-randomness` pallet). Honest collators include the key in their fixed key list and through `KeyToIncludeInRelayProof`. - Try-state: drawn collators imply a cached randomness, which flags a runtime without the `OnSystemEvent` wiring. Since an absent key caches zero, the cache exists from the first block on a wired chain, so this holds in every state. - Storage: `Collators` and `EpochRandomness` are new in this PR, so no migration is needed. `Collators` is bounded by `MaxValidators`. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Co-authored-by: Omar <OmarAbdulla7@hotmail.com> Co-authored-by: Egor_P <egor@parity.io> Co-authored-by: Serban Iorga <serban@parity.io> Co-authored-by: Viacheslav <shlavik@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> commit e169b412d9559f6fbe74760df743abd181817683 Author: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Date: Thu Oct 8 14:26:07 2026 +0000 statement-store: enforce allowance against best and finalized blocks (#13437) In this PR, we evict statements only when the account's usage exceeds both the best-block and finalized-block allowances. This prevents accepted statements from being evicted and banned while an allowance increase awaits finality. Closes #13394. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit db46f6f939f68b8b84ddd531e77dbe8771dc4a73 Author: Viacheslav <shlavik@gmail.com> Date: Thu Oct 8 09:25:02 2026 +0000 sp-api: write back `transaction_depth` after `execute_in_transaction` (#13439) Fixes #13438 `ApiExt::execute_in_transaction` in the generated client-side `RuntimeApiImpl` incremented `transaction_depth` but discarded the result of `checked_sub(1)`, so the counter never returned to zero. Every later plain runtime API call on the same instance then skipped its own transaction, and overlay writes of a call returning `ApiError` were kept instead of rolled back. This PR assigns the decremented value back and adds a regression test. No action required by downstream projects. The change is confined to the native client side (the code is generated inside `std_enabled!`); the Wasm runtime is unchanged. Behaviour change to be aware of: on an API instance that has already completed an `execute_in_transaction` scope, a plain runtime API call that returns `Err(ApiError)` now has its overlay changes rolled back, as documented for `ProvideRuntimeApi::runtime_api`. Code that relied on those changes persisting after an error would see a difference; no such code is known in-tree. ```diff *std::cell::RefCell::borrow_mut(&self.transaction_depth) += 1; let res = call(self); -std::cell::RefCell::borrow_mut(&self.transaction_depth) - .checked_sub(1) - .expect("Transactions are opened and closed together; qed"); +{ + let mut depth = std::cell::RefCell::borrow_mut(&self.transaction_depth); + *depth = depth + .checked_sub(1) + .expect("Transactions are opened and closed together; qed"); +} ``` - The counter was introduced in paritytech/substrate#14447, replacing a `commit_on_success` boolean that was reset after the closure. This restores that behaviour for the counter. - The real overlay / recorder / extension transactions were always balanced; only the logical counter was stale. `sc-block-builder` is unaffected in practice because a failing `finalize_block` consumes the builder. - The borrow is scoped so it is released before `commit_or_rollback_transaction`. - Behaviour on unwind is unchanged and out of scope. New test `auto_transaction_is_restored_after_execute_in_transaction` in `sp-api-test` makes a failing plain call after an explicit scope (commit and rollback, with a nested scope) and asserts that no storage changes remain. Run with `cargo test -p sp-api-test --test runtime_calls`: - Without the fix: the new test fails at `assert!(changes.main_storage_changes.is_empty())`. - With the fix: all 11 tests in the file pass. * [x] My PR includes a detailed description as outlined in the "Description" and its two subsections above. * [x] My PR follows the [labeling requirements](https://github.com/paritytech/polkadot-sdk/blob/master/docs/contributor/CONTRIBUTING.md#Process) of this project (at minimum one label for `T` required) * [x] I have made corresponding changes to the documentation (if applicable) * [x] I have added tests that prove my fix is effective or that my feature works (if applicable) --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> commit d17f024230ae3a73d2bded1fd6d2f1b64d646861 Author: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Date: Thu Oct 8 08:25:58 2026 +0000 statement-store: v2 soak step, node joining shifts the replica layout (#13422) In this PR, we extend the v2 DHT soak with a full node joining an active network. Statements are first placed on their K closest nodes. Load starts before the newcomer is spawned and continues until all nodes learn the new peer and the topology converges. Fresh probes submitted through the XOR-farthest node must land on exactly the new top-K. For shifted topics, the newcomer holds the statements and the displaced replica does not; control topics keep their replica set. The newcomer must also receive every pre-join statement of its shifted topics. The displaced replicas' pre-join copies are not checked: persistent statements stay until they expire. The join and a subsequent ordinary wave are mandatory, including with a zero soak duration. Closes #13185. Part of #13162. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 1fb966abb7f3014e58279d09bc46eea408f820a9 Author: Serban Iorga <serban@parity.io> Date: Thu Oct 8 08:07:34 2026 +0000 pallet session: small deduplication (#13432) Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 53361ece685597763642629f2042e21e6096d25b Author: Egor_P <egor@parity.io> Date: Thu Oct 8 07:18:02 2026 +0000 Switch eth-rpc image to the actual version of the base-bin (#13429) This PR sets an newer version of the `base-bin` image as a ground base for the `eth-rpc` container, making also arm weekly builds possible commit 44c8a8a1feeb52446e1f2ac0915bee1aede7a339 Author: Giuseppe Re <giuseppe.re@parity.io> Date: Wed Oct 7 14:15:02 2026 +0000 pallet-revive: fix callerIsRoot and callerIsOrigin across delegate calls (#13413) Closes #13412. When the call path included a delegate call, `callerIsRoot()` and `callerIsOrigin()` looked at the wrong contract to find who called the contract asking. They now find the caller the same way `msg.sender` does, so both methods return what `ISystem.sol` documents: | Call path | Contract calling `callerIsRoot()` | Its real caller | Before | After | |---|---|---|---|---| | Root calls proxy `P`, which delegatecalls its implementation | The implementation, running as `P` | Root | `false` | `true` | | Root calls `A`, which delegatecalls a library that calls `B` | `B` | `A` | `true` | `false` | Call paths without delegate calls are unchanged. Contracts behind a proxy that use `originIsRoot()` only because `callerIsRoot()` returned `false` can now switch to `callerIsRoot()`. Tests cover both call shapes for each method, on Solc and Resolc. They fail without the fix, and the full pallet-revive suite passes with it. commit d60f31e3a61c0fc01a483c17bfbb00dd9e86240e Author: Paolo La Camera <paolo@parity.io> Date: Wed Oct 7 12:57:46 2026 +0000 frame-support: make `#[stored]` work in crates without a direct `derive-where` dependency' (#13421) Today `#[frame_support::stored]` on a generic type fails in any crate that depends on `frame-support` but not directly on `derive-where`: ``` error[E0433]: cannot find `derive_where` in the crate root error: cannot find attribute `derive_where` in this scope ``` The macro emits `#[frame_support::derive_where::derive_where(..)]`, but `derive_where` itself expands to `::derive_where::...` paths unless given a `crate` option. The existing tests did not catch this because `frame-support-test` depends on `derive-where` directly e.g. [`test_stored_struct_implements_required_traits`](https://github.com/paritytech/polkadot-sdk/blob/master/substrate/frame/support/test/tests/stored.rs#L72), [`test_stored_enum_implements_required_traits`](https://github.com/paritytech/polkadot-sdk/blob/master/substrate/frame/support/test/tests/stored.rs#L78), [`test_derive_where_not_needed_storable`](https://github.com/paritytech/polkadot-sdk/blob/master/substrate/frame/support/test/tests/stored.rs#L86), [`test_no_generics_storable`](https://github.com/paritytech/polkadot-sdk/blob/master/substrate/frame/support/test/tests/stored.rs#L94), [`no_skip_type_params`](https://github.com/paritytech/polkadot-sdk/blob/master/substrate/frame/support/test/tests/stored.rs#L100). `#[stored]` already calls `derive_where` through the `frame-support` re-export. The problem is the code `derive_where` generates: it roots its helper paths at `::derive_where` unless told otherwise with a `crate = ...` option. Before: ```rust // emitted by #[stored] struct Foo<T, S: Get<u32>> { items: BoundedVec<T, S> } // then emitted by derive_where ``` After: ```rust // emitted by #[stored] struct Foo<T, S: Get<u32>> { items: BoundedVec<T, S> } // then emitted by derive_where ``` The `crate` attribute must follow the `derive_where` call, since an attribute macro only sees the attributes below it. --------- Co-authored-by: Bastian Köcher <git@kchr.de> commit 82334446236fc5e8a3216fa78bc8a00c2c6f1d10 Author: Serban Iorga <serban@parity.io> Date: Wed Oct 7 11:12:57 2026 +0000 [XCMP/HRMP] fix `last_processed_block` update (#13411) We need to take into consideration the unprocessed messages as well when updating the `last_processed_block` --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 67c1257ee07d73005956d1b98de3eff616a72097 Author: Sebastian Kunert <mail@skunert.dev> Date: Wed Oct 7 09:50:20 2026 +0000 Cleanup: Remove unused INDEXED_BODY attribute (#13399) In our substrate backend, there has been a `SyncMode::LightState` which held a `storage_chain_mode` flag which was supposed to sync storage chains. However, this has been unused for years and is also not in use in the current storage chain syncing solution. This is because the original design had the problem that Blocks on storage chains can hold more than 16MB of data (including renewals) and it is not reasonable or possible to fetch them in one go with the block request. The mechanism has been superseeded by a blockimport which fetches this data based on info from the runtime, see #12242. This cleans up the never-used leftovers from the previous approach. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit df31b788356dce258f263e18186ee0bf8bd14d3d Author: BDevParity <bruno.devic@parity.io> Date: Wed Oct 7 09:31:35 2026 +0000 [CI] Unify the two get_s3_url_base implementations (#13417) Second step of paritytech/release-engineering#314. `lib.sh` and `release_lib.sh` both defined `get_s3_url_base` and they didn't agree: `lib.sh` returned `https://releases.parity.io/<product>`, `release_lib.sh` returned `releases.parity.io/<product>`, and the product lists differed (`substrate-node` and `subkey` only in one, `eth-rpc` added to both at different times). Four workflows source both files, so which definition you ended up with depended on sourcing order. Nothing is broken today because no single step sources both, but it's a trap. Now there's one copy in `lib.sh` returning the bare bucket path with the union of both product lists. `release_lib.sh` sources `lib.sh` instead of redefining it. The three `fetch_*` helpers prepend `https://` themselves; `upload_s3_release` already needed the bare form for `s3://`. Checked the rebuilt URLs against live S3 — binary, deb and rpm for `polkadot-stable2603-2` all resolve, and `s3://releases.parity.io/polkadot/...` is unchanged. Sourcing either file alone, and both in either order, all give the same result. commit 9f3a6b0001b9071444e43a30abd192f11d65d462 Author: Omar <OmarAbdulla7@hotmail.com> Date: Wed Oct 7 01:58:12 2026 +0000 Benchmarking some EVM arithmetic opcodes (#13400) As agreed, we're experimenting with the arithmetic op-codes first to try out charging EVM op-codes from their own benchmarks. This PR benchmarks `DIV`, `SDIV`, `MOD`, `SMOD`, `ADDMOD` and `MULMOD` and charges them from those benchmarks. All other op-codes keep their current charges. `pallet_revive::WeightInfo` gains 21 new methods. Runtimes with their own `WeightInfo` implementation need to generate them by running the `pallet_revive` benchmarks. Each op-code is benchmarked in pairs with a `POP`, and `evm_pop_opcode` is subtracted to get its charge. The divisors come from `knuth_division_operands`, which covers every correction pattern of the division algorithm. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 109dca166987ae4e689fa1c215eb3c509e6bbc7a Author: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Date: Tue Oct 6 18:41:48 2026 +0000 statement-store: v2 soak step, a replica goes offline and returns (#13378) Part of #13162, implements #13178. Adds a replica outage/recovery step to `statement_store_v2_dht_soak`: stop a node, continue publishing, then restart it with the same database and node key. Checks delivery and placement during the outage, replica recovery and subscription replay after restart. Post-restart cleanup of non-affine statements is not asserted due to a known race. The soak workflow now sets `ZOMBIE_SPAWN_CONCURRENCY=20`: with all nodes spawned at once, the cluster apiserver dropped connections and two runs died mid-spawn (35 and 39 of 43 nodes up). --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit eebfe319ab7db7d8c9b8041fa1a219349d7c3be0 Author: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Date: Tue Oct 6 16:16:12 2026 +0000 Bump litep2p to 0.16.0 (#13398) Bumps `litep2p` from 0.15.3 to 0.16.0 ([release notes](https://github.com/paritytech/litep2p/releases/tag/v0.16.0)). 0.16.0 adds the client-server mode for Kademlia (paritytech/litep2p#611) and fixes the panics around local provider records in the Kademlia memory store (paritytech/litep2p#666) commit c0195bbec8cc00310f7f1b575a48a3697a95e197 Author: BDevParity <bruno.devic@parity.io> Date: Tue Oct 6 12:52:13 2026 +0000 [CI] Upstream release build-script fixes from release-automation (#13416) First step of paritytech/release-engineering#314. `release-automation` forks these scripts and has fixed a few things we haven't — pulling them back here so that fork can eventually be deleted. Nothing is removed from `release-automation` yet, that's a follow-up there. - `build-linux-release.sh`: enable `set -e`. It's been commented out since #5963, so a failed `cargo build` still exits 0 and leaves half an artifacts dir behind. - `build-linux-release.sh`: cross build via `TARGET`. No-op when unset, qemu for aarch64, exits 1 on an unknown triple. This is the only reason release-automation keeps its own copy of the build scripts. - `build-deb.sh`: `$PRODUCT_` parses as an undefined variable, so the glob was really `target/debian/*_amd64.deb`. - `release_lib.sh`: `sort -u` the runtime list (same 11 paths today) and note why `docs` is filtered out. Not included: `build-macos-release.sh` also has `set -e` commented out, but turning it on there would break the build — `VERSION=$(git tag -l --contains HEAD | grep -E "^v.*")` exits 1 when HEAD has no legacy `v*` tag. release-automation solved that by taking the version from the binary instead, which is a behaviour change worth deciding separately. commit b76182dd335abcc07b0ff876d4889416a4c08ab7 Author: 0xRVE <robertvaneerdewijk@gmail.com> Date: Tue Oct 6 10:53:01 2026 +0000 [pallet-assets] balance-change callbacks (#12581) - **pallet-assets**: extend the existing `AssetsCallback` (`CallbackHandle`, paritytech/substrate#12307) with infallible balance-change observers — `issued` / `transferred` / `burned` / `deposited` / `withdrawn`. Unlike `created`/`destroyed` they never fail — fired after the state change, exactly where the corresponding `Issued` / `Transferred` / `Burned` / `Deposited` / `Withdrawn` event is emitted, on every path: extrinsics, the `fungibles` traits (incl. XCM asset transactors), the `fungibles::Balanced` imbalance paths, delegated transfers, and deposit-refund burns. - **pallet-revive**: new `Pallet::emit_contract_log_outside_frame(contract, topics, data)` — emit an EVM log attributed to an address from outside any contract call frame (traced, receipt-captured inside an ethereum context, deposited as `ContractEmitted`). Contract execution keeps its own in-frame emission path (`Ext::deposit_event`); the two differ only in the tracer hook. The call tracer gains a matching `Tracing::log_event_outside_frame` hook, so tracing a block containing such a log attaches it to the active frame if there is one and skips it otherwise; the in-frame `log_event` (the `LOG` opcode) keeps its active-frame invariant. - **pallet-assets-precompiles**: `Erc20TransferLogsCallback`, an `AssetsCallback` implementation for runtimes to wire as `CallbackHandle`, translating balance changes into canonical ERC-20 `Transfer` logs at the asset's precompile token address. Mint/deposit = `Transfer(0x0, owner)`, burn/withdraw = `Transfer(owner, 0x0)`. Log bytes built from the same `IERC20` ABI the precompile uses — identical by construction. Works for inline-id assets (address derived from the `u32` id) and foreign assets (`Location` ids, resolved through the foreign asset-index map; assets predating the wiring are backfilled by the index-map migration). - The `ERC20` precompile no longer emits its own `Transfer` log from `transfer()` / `transferFrom()`; the callback is now the single source. Wire `Erc20TransferLogsCallback` as the instance's `CallbackHandle` to keep precompile-mediated transfers logged. Zero-value transfers stay EIP-20 compliant: they are a no-op in pallet-assets and fire no callback, so the precompile invokes the callback itself to emit the required `Transfer` log. - **asset-hub-westend**: wired for all three instances — trust-backed and pool assets (inline-id) and foreign assets (via `ForeignIdConfig`). The mirrored-log cost is part of the pallet-assets weights, which are benchmarked against the runtime with the callback wired. Assets on Asset Hub are real ERC-20 tokens (callable precompile per asset), but only precompile-mediated transfers emitted `Transfer` logs. Transfers via plain extrinsics or XCM — the majority — were invisible to EVM tooling, so any indexer/wallet reconstructing balances from logs is wrong. This puts the logs on-chain at the source instead of synthesizing them off-chain in eth-rpc. Groundwork for paritytech/contract-issues#61. `AssetsCallback<AssetId, AccountId>` gains a third generic parameter `Balance` (pallet-assets `bump: major`). The new methods have default no-op implementations, so any hand-written `impl AssetsCallback<Id, Acct>` only needs the signature update (add the `Balance` param); implementations wired only as `CallbackHandle` need no change beyond a recompile. Note for downstream runtimes: because the precompile no longer self-emits, upgrading pallet-assets-precompiles without wiring `Erc20TransferLogsCallback` silently stops `Transfer` logs for precompile-mediated transfers. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit dae26eec1256dbf3a30c1df276bb96ea848c2d14 Author: Xiliang Chen <xlchen1291@gmail.com> Date: Tue Oct 6 07:29:46 2026 +0000 pallet-multi-asset-bounties: net parent refunds after child payouts (#13409) Closing a parent bounty after a child payout has settled currently refunds the parent’s gross value, including funds already paid out through the child bounty. This patch applies the existing net-payout calculation to parent refunds and adds regression coverage for closing a parent after a settled child payout. No API or storage migration is required. commit b367ff86414eeb8c73975934bc7594ba551a21a4 Author: BDevParity <bruno.devic@parity.io> Date: Tue Oct 6 06:55:53 2026 +0000 [CI] Resolve the RPM signing GPG wrapper path from $GITHUB_WORKSPACE (#13401) Resolves paritytech/release-engineering#307 (part of paritytech/release-engineering#305). `rpmmacros` becomes a template using `${GITHUB_WORKSPACE}`, rendered at runtime when the workflow writes `$HOME/.rpmmacros`. No hardcoded `/home/runner/work/...` path remains. Two guards close the silent-failure window, since the point of the bug is that it does not announce itself: - **Before signing**, assert `rpm --eval '%{__gpg}'` resolves to the executable wrapper. A missing or wrong `$GITHUB_WORKSPACE` now fails the job instead of the signature. - **After `rpm --addsign`**, import the signing key into a throwaway rpmdb and require `rpm --checksig` to report `signatures OK`. An unsigned package reports `digests OK` *without* `signatures`, so this one check catches both a missing and a bad signature. The throwaway rpmdb (`--dbpath`) avoids the system one, which the runner cannot write. The exact workflow logic was run end to end locally (rpm 4.20, a real GPG key standing in for the KMS wrapper), with the workspace at `.../work/release-engineering/release-engineering` — a repo **not** named `polkadot-sdk`: ``` Guard passed: %__gpg -> .../release-engineering/release-engineering/.github/scripts/release/pgpkms-gpg-wrapper.sh Header V4 RSA/SHA256 Signature, key ID 21d434da: OK Header SHA256 digest: OK Payload SHA256 digest: OK E2E RESULT: PASS (built, signed and verified from a repo named 'release-engineering') ``` Negative tests both behave as intended: | case | result | |---|---| | wrapper not executable | guard fails the job | | `rpm --delsign`'d package | `digests OK` (no `signatures`) → gate rejects | One thing that testing caught: gating on `%{SIGPGP:pgpsig}` does **not** work — on modern rpm a header-only signature lands in `RSAHEADER`, so `SIGPGP` is empty even for a correctly signed package. `rpm --checksig` is version-agnostic, so the gate uses that instead. `pgpkms-gpg-wrapper.sh` hardcodes `/home/runner/.local/bin/pgpkms`. That one survives the migration (it is a home path, not repo-named) but would break on any self-hosted or container runner. The workflow already computes `PGPKMS_RPMSIGN_PATH` via `which`, so it is worth a follow-up issue — left out of scope here. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> commit 0cc91a64db63688ad67ddac8fb2a122c213549a1 Author: Xiliang Chen <xlchen1291@gmail.com> Date: Mon Oct 5 21:12:16 2026 +0000 backing: reject out-of-bounds core indices (#13385) Reject candidate statements whose resolved core index equals `n_cores`, since valid indices are `0..n_cores-1`. Add regression coverage for the zero-rotation path where `core_for_group` returns the caller-supplied group index. No API or storage changes are required. commit 828b9d54038520f680d8f2887aac018f1e404d98 Author: Andrei Eres <eresav@me.com> Date: Mon Oct 5 15:20:35 2026 +0000 statement-store: restore the full-store fixture and report percentiles in the benchmarks (#13371) The full-store benchmark restores its fixture after the eviction phase, so a reused fixture matches a fresh build and its size checks run on every start. The add_filter benchmark reports the median and p90 instead of the mean. The enforce_limits benchmark gives the expiry backlog a 20-second margin and waits by the clock until it expires, so a slow disk no longer makes it fail. Part of https://github.com/paritytech/polkadot-sdk/issues/13135. commit 4076925754b91bcd6da9f714a614cce7f292c38b Author: Paolo La Camera <paolo@parity.io> Date: Mon Oct 5 13:36:13 2026 +0000 Validators as system chain collators: AH announces the era's set to itself and PC (#13332) Every validator in the active set that registers session keys on Asset Hub or People becomes a collator there, next to the existing invulnerables and bonded candidates. The collator set switches within a few blocks of the relay chain activating a new era. Related issue: https://github.com/paritytech/metanode-issues/issues/1 Design document [here](https://github.com/paritytech/metanode/blob/main/designs/collator-selection.md) - **`pallet-validator-collators`** (**initially on AH and PC, in the future on every system chain**): stores the validator set received for an era and acts as a second session manager. At every rotation it returns the received validators that registered local keys, up to an optional governance cap (unlimited by default). On a new set it forces two rotations, queue then enact, while periodic rotations continue. `UnionSessionManager`, added to `pallet-session`, combines it with `pallet-collator-selection`. - **`pallet-validator-set-announcer`** (**Asset Hub only**): `announce` stores the era's set through the local `pallet-validator-collators` and, if the receiver accepts it, sends it once to each configured system chain through a runtime-provided sender, reporting each send with `AnnouncementSent` or `AnnouncementFailed { destination, era }`. A set the receiver rejects is reported with `AnnouncementRejected` and not sent. It holds no storage and does not retry, since every HRMP enqueue error persists for the era and the next era sends the full set again. - **`pallet-staking-async`**: new `OnEraStart` hook, called at era start with the new era's validators. The set is kept in `NextEraValidators` when it is handed to the relay chain and taken at era start. An era whose set was handed to the relay chain before the hook was enabled has no copy and is not announced, and receivers keep their invulnerables and candidates for it. A `()` hook keeps no copy and costs nothing. - **Asset Hub Westend**: wires both pallets, the union session manager and the hook. The announcer sends the set to People as an unpaid `Transact`. - **People Westend**: wires the receiver and accepts the set only from the Asset Hub sibling origin. ```mermaid sequenceDiagram participant AHS as Asset Hub staking participant RC as Relay chain participant AHA as Asset Hub announcer participant AHV as Asset Hub validator-collators participant PCV as People validator-collators Note over AHS: Era N starts, election for N+1 AHS->>AHS: Election completes, keep copy in NextEraValidators AHS->>RC: Validator set for N+1 (after session 4 report) RC->>RC: Queue at next session, activate at the one after RC->>AHS: Session report with activation timestamp AHS->>AHS: start_era(N+1), take the copy AHS->>AHA: OnEraStart(N+1, validators) calls announce AHA->>AHV: receive_validator_set: store set, force two rotations AHA->>PCV: set_validators(N+1, validators) via XCM, retried until sent PCV->>PCV: Store set, force two rotations Note over AHV,PCV: Collators = invulnerables + bonded candidates + validators with local keys ``` At every rotation the collator set is the union of what the two session managers return, each applying its own rule. `pallet-collator-selection` returns every invulnerable plus the top bonded candidates up to its desired count, as today. `pallet-validator-collators` returns every received validator with registered keys, or, once governance sets a cap, that many of them (a random draw replaces the current truncation in a follow-up). The combinator only concatenates and deduplicates, keeping the collator-selection entry when an account appears on both sides. The intended end state is that governance lowers the desired candidates and removes the invulnerables, leaving the validator side. Two forced rotations are needed because `pallet-session` queues a set at one rotation and enacts it at the next. Periodic rotations continue, since they are how rotated session keys take effect. Sending is retried every block only while the message cannot leave Asset Hub. Once delivered, a message that People cannot apply, for example because People runs an older runtime, is consumed there and not reported back, so the next attempt is the next era's announcement. The full set is sent every era, so any single failure heals in the worst case at the next era. See [here](https://github.com/paritytech/polkadot-sdk/pull/13332#issuecomment-5915888241) - Aura writes the full authority list into the block header at every change of the set, and the relay chain rejects head data above a limit hard-coded in its backing constraints, 20 KiB. That allows about 630 authorities per chain, invulnerables and candidates included. Polkadot's 600 fit, Kusama's 700 do not. Until active set is reduced, initial runtime configuration and governance **must** keep the union below the limit via `MaxCollators` cap on those chains. The cap is applied **before** `pallet-session builds` the list, so the session validators and Aura's authorities stay the same set. The digest stays as it is, since smoldot clients (and maybe not only them...) follow authority changes through it (see #13360). Truncating Aura's own list is not an option, since the runtime would then announce a different set from the session validators. - A runtime must configure `pallet-collator-selection`'s `KickThreshold` to exceed a full Aura round of the merged collator list ([`Config::MaxValidators`] plus the invulnerables and candidates), times the blocks the chain produces per Aura slot. Otherwise bonded candidates are kicked as stale between their slots. See [here](https://github.com/paritytech/polkadot-sdk/pull/13332#issuecomment-5915888241) for additional tests we need to add in the runtime PR. The two chains can be upgraded in either order. People collates with validators from the first era whose set Asset Hub handed to the relay chain after its upgrade, which is at the latest the second era boundary after both chains are upgraded. Until then each chain keeps its invulnerables and candidates. - **Until the production filter lands**, a validator that registers keys but runs no collator is in the Aura rotation and its slots produce no block. Nothing evicts it in this PR, which is why the production filter is the first follow-up. - HRMP message size. The set is sent in one XCM message, about 19 KB at 600 validators and 32 KB at 1,000. A channel's limits are fixed when it is opened, and the live Asset Hub to People channel allows 102,400 bytes. If that channel were reopened with a smaller limit, the send would fail and Asset Hub would report `AnnouncementFailed` every era. People would keep the last set it stored, so it keeps producing blocks, but with the previous era's validators. Splitting the set across several messages would be the follow-up if that ever becomes realistic. - [x] Benchmarks and generated weights for the 2 new pallets - [X] Re-benchmark `rc_on_session_report` in staking-async with the era-start path. - [x] https://github.com/paritytech/polkadot-sdk/issues/13360 - the short term fix is not a blocker for rollout on Kusama (we can set `MaxCollators` in the new pallet lower than 600 or so and we are good to go) 1. **Production filter.** Drop a validator that authors no block within a block window, re-include it after a configurable ban, keep a minimum number of collators. 2. **Block counting and era points.** Count blocks per author and era, report them to Asset Hub once per session, and add the staking entry point that credits them, with a claim gate so late reports land before payouts. 3. **Random draw under a cap.** Replace the truncation (`TODO` in `new_session`) with a draw among validators with keys, a configurable redraw period and advance notice. 4. An additional safety net could be to bound the merged collator list in the runtime to what a session-change header can carry, instead of relying solely on the cap being set. We could enforce also a `try-runtime` constraint in `pallet-aura-ext` checking that the stored authority list fits the head-data limit. 5. **Relay-chain offence propagation** to collator sets, only if a need is established so maybe/probably never :smile: --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit e94321b1610ff202c52cccf6502c36ce27604d7b Author: Andrei Eres <eresav@me.com> Date: Mon Oct 5 13:28:21 2026 +0000 statement-store: measure delivery latency between nodes in the zombienet benchmark (#13376) The statement store latency benchmark in zombienet now measures delivery between nodes. Each client subscribes to the topics of a neighbour on another node, so every statement reaches its subscriber through gossip. The sender writes its send time into the statement, and a background task on the receiver stamps each statement as it arrives, so the latency per message is reported as p50, p90, p99 and max. All clients subscribe before any of them sends, and a submit that is not accepted fails the run. Before, each client subscribed to its own topics on its own node, so the benchmark measured how fast a node notifies itself and never touched gossip. Local runs with 500 clients on 5 nodes give a p50 between 0.5 s and 0.85 s and a max between 1.0 s and 1.4 s. The spread comes from the one-second propagation tick against a single round of sends. The interval runs from before the submit call to after the receiver wakes, so it is end-to-end delivery latency, with the propagation tick as its largest part. A follow-up runs the same benchmark on the v2 DHT path to compare it with v1, as part of https://github.com/paritytech/polkadot-sdk/issues/13135. commit 1d6f4582400a935a10a71280575a5e9d4be2325c Author: Andrei Eres <eresav@me.com> Date: Mon Oct 5 13:27:44 2026 +0000 statement-store: drop a peer's affinity filter when its substream closes (#13354) A peer's affinity filter now goes away when its statement substream closes, not when block sync reports the peer gone. The filter arrives over the statement substream, and the two lifetimes are independent, so the stored filters drifted from the connected set: - A peer that peer steering dialed outside the sync set never produced a sync disconnect, so its filter stayed after its substream closed, and the map grew for the node's lifetime. - A peer that block sync dropped while its statement substream stayed open lost its filter although it was still connected, so it stopped receiving statements on its advertised topics until it sent the filter again. No changes needed. The change is internal to sc-network-statement and affects only the v2 DHT path. A reconnecting peer sends its filter again once the substream reopens, so dropping it on close loses nothing. commit b64d01cf595d5bae0b6aa6fcee0b099ff81bac09 Author: Xiliang Chen <xlchen1291@gmail.com> Date: Mon Oct 5 09:35:59 2026 +0000 pallet-bridge-parachains: preserve re-imported parachain heads (#13408) Re-importing a previously stored parachain head when the ring buffer wraps can prune the same hash immediately after inserting it, leaving the best-head pointer without corresponding head data. This patch skips self-pruning for that case, reports pruning only when an older hash is actually removed, and adds regression coverage for the wraparound sequence. No API or storage migration is required. --------- Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: Branislav Kontur <bkontur@gmail.com> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 04e1036fbd94148da0a630296c1b7ba413af087f Author: 0xRVE <robertvaneerdewijk@gmail.com> Date: Mon Oct 5 07:31:34 2026 +0000 [pallet-revive] Report precompile code in prestate tracer (#12806) The prestate tracer resolved code only through `PristineCode`, so `debug_traceTransaction` with `prestateTracer` reported no `code` for precompile addresses while `eth_getCode` and `EXTCODESIZE`/`EXTCODEHASH`/`EXTCODECOPY` served the code stub. The tracer now reports the same bytes `eth_getCode` returns for builtin and runtime precompiles (`0x60006000fd` by default). Primitive precompiles (`0x01`..`0x09`) have an empty stub and still report no code. No migration needed. The `EXTCODECOPY` consistency fix this PR originally targeted landed on master via #12229; the remaining `exec.rs` change is a refactor consolidating the precompile/mock/delegation code resolution into a single `virtual_code` helper, plus tests pinning the `EXTCODECOPY` behavior. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 18311d6fa3f6649ba3e0622ad2928ed0789bfbb9 Author: Andrei Eres <eresav@me.com> Date: Fri Oct 2 12:59:50 2026 +0000 statement-store: time only the measured operation in the store benchmarks (#13370) The statement store benchmarks now time only the operation that they are named after. Before this change, several benchmarks reported costs that a node never pays: the drop of a store, a no-op maintain, and the setup of the contention store. A benchmark whose submits were rejected looked the same as a working one. Part of https://github.com/paritytech/polkadot-sdk/issues/13135. commit f5b80bb77f92709695bf8fb00cb64c2db3238cd5 Author: Andrei Eres <eresav@me.com> Date: Fri Oct 2 06:26:46 2026 +0000 statement gossip: remove unused code left by the v2 DHT work (#13353) Removes code that the v2 DHT work introduced and nothing uses anymore. Behaviour does not change on either path, and the v1 path is untouched. Closes https://github.com/paritytech/polkadot-sdk/issues/12137 No changes needed. Everything touched is private to sc-network-statement. - Three orchestrator hooks only wrote a trace log: on_peer_connected, on_validate_inbound_substream and on_initial_sync. - The dead_code allows in affinity, peer steering and explicit affinity went stale - Explicit affinity counted references per source for each topic, but no count ever exceeded one. Configured topics were deduplicated at construction, and subscription topics arrive only through replace_source_topics, which adds just the topics the source lacks. A set of sources per topic keeps the same rule, a topic stays while some source wants it, without the counters. The two tests that exercised counting a source twice are gone with them, and add_topics and remove_topics become private. - The peer_is_dht_target_for_topic helper had one caller and is inlined into dht_target_predicate. The Clone derives on PeersTopology and V2DhtMetrics had no users. commit 2d06e303b93c5a4efb5098f71256a15870231d76 Author: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Thu Oct 1 20:18:07 2026 +0000 grandpa: don't gossip commits that don't advance finality (#13358) Multiple voters can issue a commit for the same round, and several can pass gossip validation before any is processed, since validation only compares against the height noted after processing. Each was then gossiped, so peers got the same finality proof more than once. Now a processed commit is gossiped only if it advanced finalized height (`note_commit_finalized` returns whether it did); otherwise it's logged at debug level. Nothing is lost: the commit for our best height is already in the gossip store and keeps being rebroadcast. The dropped commit is still marked as known via a new `GossipEngine::mark_message_known` (`sc-network-gossip`), which records a message as known without storing or propagating it. Found while working on #13318 (https://github.com/paritytech/smoldot/issues/3375), but independent of it. - `note_commit_finalized_reports_whether_finality_advanced` - `duplicate_commit_is_not_relayed` commit 4cc62947fa17b58cf3dd18f336041253ce117ce5 Author: Tsvetomir Dimitrov <tsvetomir@parity.io> Date: Thu Oct 1 07:07:39 2026 +0000 Update RC peer ids of Polkadot AH invulnerable collators (#13320) As described in https://polkadot.subsquare.io/referenda/1946 commit d2e08992098ac61e13117d61420903e1e076d8d8 Author: Andrei Eres <eresav@me.com> Date: Wed Sep 30 18:11:04 2026 +0000 statement-store: drop benchmarks of store methods that no node calls (#13369) The statement store benchmarks now cover only the store methods that a node actually calls. The benchmarks of statements, broadcasts, posted, statement and remove are gone. The read_scaling, contention and full-store numbers no longer compare with older baselines, because those benchmarks now time subscriptions. This is the first step of the benchmark work for https://github.com/paritytech/polkadot-sdk/issues/13135. commit 15fdbd4ba646c4eb64709f97deab8a04de7fd800 Author: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed Sep 30 16:16:49 2026 +0000 grandpa: gossip commits to light clients in rotating groups (#13318) Fixes https://github.com/paritytech/smoldot/issues/3375 GRANDPA gossip sends each commit to only `LUCKY_PEERS` (4) randomly picked light clients per round. Light clients don't relay gossip, so they only observe finality when picked. With `N` light clients connected to a node, the expected wait is `N / 4` rounds, so finality lag on light clients grows linearly with the number of light clients per node. The `--in-peers-light` default was recently raised to 500 (#12887), which makes this worse. The time-based fallback that allows commits to all peers doesn't help: it only kicks in after a round has lasted `PROPAGATION_ALL` round durations, and on a healthy chain every imported commit starts a new round. Sending every commit to every light client isn't an option either. A commit carries a signature per voter, so outbound bandwidth would grow with both the validator count and the number of light clients. Light clients take turns in groups of up to `LIGHT_PEERS_GROUP_SIZE` (100): - Connected light clients are kept in a `BTreeSet`, sorted by peer id. - On every round, the next group is the range of `LIGHT_PEERS_GROUP_SIZE` light clients following the last one served in the previous round, wrapping around at the end. - The current group is stored as a peer id range, so checking whether a light client is in turn is two comparisons. Light clients connecting or disconnecting don't shift the rotation. - With at most `LIGHT_PEERS_GROUP_SIZE` light clients, all of them get every commit. A commit also finalizes all of its ancestors, so skipping a few commits loses nothing. Every light client observes every finalized block within `ceil(light_clients / LIGHT_PEERS_GROUP_SIZE)` rounds, and the outbound bandwidth spent on light clients is bounded by the group size. Gossip towards full nodes and authorities is unchanged. Measured `master` against this PR on a Polkadot full node, with up to 500 synthetic light peers following `/grandpa/1` like smoldot ([details](https://github.com/paritytech/smoldot/issues/3375#issuecomment-5832488482)): - **Finality lag on light clients:** on `master` it grows with the number of light peers, up to several minutes. With this PR it stays within a few rounds, tens of seconds even at 500 light peers. - **Extra GRANDPA traffic:** it grows up to 100 light peers and then stays flat, at about 1.4 MB/s. - **CPU, memory and block import:** no measurable change. - The commit finalizing the last block of an authority set only reaches the light clients in turn at that moment, as before. Light clients that miss it still learn about the set change from the neighbor packet sent to all peers (paritytech/substrate#13559), and can request the justification of the set change block, which nodes always store. commit e3c36a56d3bb9dde069f66a9238539a0d1a469dd Author: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed Sep 30 09:05:44 2026 +0000 grandpa: skip decoding commits peers would reject (#13347) In `GossipValidator::message_allowed`, check whether the peer would accept a commit at our best commit height before decoding the message. Only our best commit is ever gossiped to peers, and its height is already known from the local view, so the check can be done without decoding. Previously the commit was decoded first and then refused for peers already at or past that height. A refused peer isn't marked as knowing the message, so this could repeat on later gossip attempts. Discovered while working on #13318 (but independent of it) --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit c99fecfaa1cea379f6c9ec7b66585e9ba8e88749 Author: Bastian Köcher <git@kchr.de> Date: Wed Sep 30 08:16:04 2026 +0000 Bump litep2p to 0.15.3 (#13366) This fixes some internal issues of litep2p assuming connections still being alive while this not being the case anymore. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 229b73d531349ee5df46e22869454e620b13d9c7 Author: Andrei Eres <eresav@me.com> Date: Wed Sep 30 07:10:44 2026 +0000 statement gossip: hold initial sync to the peer's statement rate limit (#13298) Initial sync now respects the peer's statement rate limit. Each peer carries a second `PeerRateLimiter` with the same quota its receive side applies to us, charged by every propagation chunk and, during an initial-sync fetch, by each statement it takes, so the fetch stops where the quota runs out. A peer whose quota has no room keeps its turn in the sync queue while its neighbours are served, so a peer draws its backlog at the rate it accepts, however often it asks for it. Before this, bursts ran every 10 ms with one chunk per peer in flight, so a fast peer could receive far more than `statements_per_second` and disconnect us as a flooder, and any peer could pull the whole store again by flipping its filter. Closes https://github.com/paritytech/polkadot-sdk/issues/12562 No changes needed. The send-side quota mirrors the node's own `statement_rate_limit`, so a fleet with one setting throttles exactly to what its peers accept. commit c09e4690a08fa3beca53e1fe8e6b7125a0224315 Author: dharjeezy <dharjeezy@gmail.com> Date: Tue Sep 29 15:29:20 2026 +0000 try state hook for pallet core fellowship (#12419) This PR introduces try state hook into the Core Fellowship Pallet. It also defines the invariants that holds for the pallet. Part of: https://github.com/paritytech/polkadot-sdk/issues/239 --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: muharem <ismailov.m.h@gmail.com> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: Adrian Catangiu <adrian@parity.io> commit 3e5f1af2f62cf4b5997934cc3601be35c9005ee2 Author: dharjeezy <dharjeezy@gmail.com> Date: Tue Sep 29 10:20:26 2026 +0000 try state hook for pallet grandpa (#12422) This PR introduces try state hook for grandpa pallet. It also defines the invariants that holds for the pallet. Part of: https://github.com/paritytech/polkadot-sdk/issues/239 --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> commit 38c00a18e68620ebe3324116757ca5f424b2e0f8 Author: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> Date: Tue Sep 29 09:30:51 2026 +0000 cumulus: submit V2/V3 collations as segments (#13312) Reworks the slot-based collator to submit every collation through the segment path (CollationGenerationMessage::SubmitSegment), and shares the UMP scheduling-signal logic between the PVF and the collator so the two can't drift. - One submission path. A single V2 collation is submitted as a one-element V2 segment (no scheduling proof, scheduling parent = relay parent); a V3 segment carries the shared scheduling proof and its scheduling parent comes from the proof. No more separate V2/V3 code paths in the collation task. - Builder → collator protocol module (message.rs). CollatorMessage (Collation | Segment) is the channel payload — pure data — with CollationParts (the block builder's per-collation output) and CollatorMessageBuilder. Assembling and submitting a message is the collation task's job, via the new CollationSubmitter. - Shared SchedulingSignals. Moved from parachain-system/validate_block into cumulus-primitives-core, so the PVF (validate_block) and the collator apply the same UMP scheduling tail. - message.rs leaves room for the resubmission work (a resubmittable_headers slot on Segment) without implementing it here. - No behavior change to what validators receive for a plain V2 collation — it's the same bytes, now routed through the segment API. --------- Signed-off-by: Iulian Barbu <iulian.barbu@parity.io> commit 5123f42751116805f178f0044f7ddb1190c78079 Author: Alexandre R. Baldé <alexandre.balde@parity.io> Date: Mon Sep 28 22:06:52 2026 +0000 pallet-recovery: add do_try_state invariant checks (#12490) Adds a `do_try_state` implementation to `pallet-recovery`, wired into the `try_state` runtime hook. The revamped recovery pallet shipped without runtime invariant checks; this PR addresses that, mirroring the approach taken for `pallet-psm` in #12154. `do_try_state` checks eight state-consistency invariants over `Attempt`, `FriendGroups`, and `Inheritor` storage: 1. No orphan attempts (every `Attempt[lost, _]` has a matching `FriendGroups[lost]` entry). 2. In-range friend-group index. 3. No bit set past `friends.len()` in an attempt's approval bitfield. 4. (warn) Inheritor overridability: an existing inheritor is either at the strongest priority, overridable by some currently-configured group, or the lost account can clear it via `revoke_inheritor`. Warn-only because the state is reachable through legal single-signer actions. 5. Each storage entry (`AttemptStorage`, `SecurityDeposit`, `FriendGroupsStorage`, `InheritorStorage`) has a non-zero balance on hold for its depositor. 6. Approval count `<= friends_needed`. 7. `init_block <= last_approval_block`. 8. `inheritor != lost`. `do_try_state` is `pub(crate)` and gated on `#[cfg(any(feature = "try-runtime", test))]`; the `try_state` hook is gated on `try-runtime`. A `try_state` test module covers all eight invariants: a passing case per storage shape and a failing case per hard error, plus the warn-only path. The four deposit-hold checks are exercised by releasing a hold while leaving the backing storage entry in place. commit a775c6f7c0d20fb3ca6245d2ae7ef493ef7fd619 Author: Bastian Köcher <git@kchr.de> Date: Mon Sep 28 19:57:37 2026 +0000 sp-io: Move relay-chain host functions to dedicated `relay_chain.rs` (#13315) commit 64de0b9212cfd56d831feed24f3a959b19f73daa Author: Derek Colley <derek@colley.cc> Date: Mon Sep 28 18:53:24 2026 +0000 add INTERWEB polkadot boot node (#13297) Adds four Interweb IT bootnode multiaddrs to the embedded Polkadot relay chainspec (`polkadot/node/service/chain-specs/polkadot.json`): - `/ip4/195.144.22.130/udp/13012/webrtc-direct/certhash/uEiAh5tKwiZJCcuqrK28fbtyfPtCKxe0YhLUmd5hmKVZF4g/p2p/12D3KooWRjHFApinuqSBjoaDjQHvxwubQSpEVy5hrgC9Smvh92WF` (WebRTC) - `/ip4/195.144.22.130/tcp/13012/p2p/12D3KooWRjHFApinuqSBjoaDjQHvxwubQSpEVy5hrgC9Smvh92WF` (TCP) - `/dns/boot.interweb-it.com/tcp/13012/p2p/12D3KooWRjHFApinuqSBjoaDjQHvxwubQSpEVy5hrgC9Smvh92WF` (DNS/TCP) - `/dns/boot.interweb-it.com/tcp/13016/wss/p2p/12D3KooWRjHFApinuqSBjoaDjQHvxwubQSpEVy5hrgC9Smvh92WF` (DNS/WSS) Peer ID: `12D3KooWRjHFApinuqSBjoaDjQHvxwubQSpEVy5hrgC9Smvh92WF`. No existing bootnodes were removed or reordered. No crate or runtime code changes. Reachability checked before opening: - `boot.interweb-it.com` → `195.144.22.130` - TCP `13012` accepts connections - WSS/TLS on `13016` succeeds (cert CN/SAN `boot.interweb-it.com`) - WebRTC UDP `13012` responds to a STUN binding probe No downstream integration steps. Chainspec `bootNodes` only; nodes pick up the new entries on the next release that ships this chainspec. No API, CLI, or crate version impact. Prefer label `R0-no-crate-publish-required`. Single-file change to `polkadot/node/service/chain-specs/polkadot.json`, appending the four multiaddrs above to the existing `bootNodes` array, plus `prdoc/pr_13297.prdoc`. Same pattern as prior operator bootnode PRs (e.g. IBP/stakeworld bootnode updates): JSON-only, no code paths touched. Suggested labels (also requested via `/cmd label`): - `T0-node` - `R0-no-crate-publish-required` * [x] My PR includes a detailed description as outlined in the "Description" and its two subsections above. * [x] My PR follows the labeling requirements of this project (at minimum one label for `T` required) — requested via `/cmd label T0-node R0-no-crate-publish-required` * [x] I have made corresponding changes to the documentation (if applicable) — N/A (chainspec bootNodes only; prdoc included) * [x] I have added tests that prove my fix is effective or that my feature works (if applicable) — N/A (static chainspec data; reachability verified off-CI) --------- Co-authored-by: Derek Colley <dcolley@users.noreply.github.com> commit cedc12682ca64e33c5c021895724344ef0122fd4 Author: Andrei Eres <eresav@me.com> Date: Mon Sep 28 16:15:46 2026 +0000 statement-store: size limits for the DHT-affinity and transient statements (#13278) Closes https://github.com/paritytech/polkadot-sdk/issues/11936. Part of https://github.com/paritytech/polkadot-sdk/issues/11932. On the v2 DHT path one store limit covered every statement, so a flood of transient statements could push out the statements the node is responsible for. The statements kept for DHT affinity and the transient statements now each have their own size limit, on top of the store limits. When one of these limits is reached, the store rejects new statements of that kind with `StoreFull` and still accepts the others. Statements kept only for explicit affinity have no limit of their own: the operator chose those topics, so they may use whatever room the store has left. The sweep already sorts every statement into a retention track: DHT affinity, explicit-only or transient. Each statement now records its track, and its size counts toward that track. When the sweep moves a statement to another track, its size moves with it. The size of each track survives a restart. The database moves to version 3, and older statements count as explicit-only, because nothing records why they were kept. The node warns at startup when a track limit is above half of the store size. It also warns, at most once per maintenance period, when the store size rejects a statement whose own track still has room. The issue also proposed a limit for explicit affinity and letting tracks borrow room from each other. The store rejects the statement instead: one simple rule, and no second eviction order. Two hidden flags on the substrate node and the omni-node, `--statement-store-max-dht-affinity-size` and `--statement-store-max-transient-size`, in bytes, each defaulting to the store size. The database migrates on the first start. - After a restart the sweep forgets which statements are transient, so the ones that survived keep their track's room until they expire. With a limit set, they can keep the track full. The fix is to rebuild that list at startup. - The sweep moves a statement to another track without checking the limit of that track. Either check it, or warn when a move goes over the limit and count a rejection by a full track apart from a rejection by a full store. commit 23e3e20b917d2e3bfb1da7f306d0f0832387a629 Author: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Date: Mon Sep 28 13:36:29 2026 +0000 statement-store: v2 DHT soak zombienet test (#13218) Part of #13172: the full-mesh soak of the v2 DHT path under continuous load. The peer-limited topology and the late-subscription step are follow-ups. Sizing is the point: `nodes > replication_factor > gossip_target + 1` (12 > 8 > 4) is the smallest network where defects like #13189 show at all. The matrix entry runs 40 nodes for 600 s, held there until paritytech/litep2p#665 is fixed; a dispatch can override the node count, the soak window and the build run. Not in the per-PR zombienet matrix: runs by a manual dispatch of `zombienet_statement-store-soak.yml` onto the zombienet k8s cluster, or from a workstation with the command in the module docs. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 1af454d2d3a533bec6d4f18dcea1214b51c9c90f Author: Paolo La Camera <paolo@parity.io> Date: Mon Sep 28 12:55:32 2026 +0000 session: fix benchmarks with non-zero KeyDeposit (#13337) `pallet_session::Pallet::ensure_can_pay_key_deposit` now mints the key deposit on top of the account's existing balance. Previously it counted existing free balance towards the deposit. This made the`pallet-collator-selection` `register_as_candidate` and `take_candidate_slot` benchmarks fail on runtimes with a non-zero session `KeyDeposit`. Fixes #13336 --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 8b20e748b8cf3b07bdbfbf6df3bdaa4070a915e3 Author: Andrei Eres <eresav@me.com> Date: Mon Sep 28 11:44:34 2026 +0000 statement-store: migrate the database one version step at a time (#13317) The statement store migrates an older database one version step at a time. `check_db_version` returns the on-disk version, `migrate_database` walks from it to `CURRENT_VERSION` and runs the step for each version, and every step bumps the version to its own target once its rows are committed. The existing rebuild of the indexes, journals and counters from the statement bodies is the v1 to v2 step; the pass over the stored statements and the loading of the admission sequence numbers are helpers a later step can reuse. Behaviour is unchanged: version 2 is still the current one and the only step is v1 to v2. None. Node operators and downstream users need no changes. Before, a version bump reran the whole rebuild on every older database, including columns the new version left untouched. Running that over a version 2 database would have added a second evicted-journal key for every banned statement whose purge time the expiry had capped, and maintenance would then have counted the ban twice. The step per version keeps each migration limited to what its version changed. https://github.com/paritytech/polkadot-sdk/pull/13278 adds the v2 to v3 step on top of this. commit 19822ade4171132796f64b2435b0ded7457189ad Author: Bartłomiej Kamiński <bartlomiej@parity.io> Date: Mon Sep 28 10:23:31 2026 +0000 Move on-demand coretime orders to the Coretime chain (#13009) First step towards completion of #12715 This moves on-demand order placing logic from the Relay Chain to the Coretime Chain. The functionality gets moved to a new `on-demand` pallet with a `place_order` extrinsic which replaces the order-placing extrinsics in the RC on-demand pallet. Pricing is based on a local estimation of the queue depth, assuming a small constant draining speed per block on the Relay Chain. Any projects purchasing on-demand coretime on the Relay Chain should transition to using the `place_order` extrinsic on the Coretime Chain once this becomes a part of a runtime update. There is a new `on-demand` pallet with an extrinsic `place_order(para_id, max_amount)`. The extrinsic calculates the spot price based on the estimated queue depth, and if it doesn't exceed `max_amount`, charges the caller the spot price. The order is then added to a locally kept batch, which gets sent to the Relay Chain in the `on_finalize` hook via XCM. Upon reception of the XCM, the Relay Chain simply adds the batch of orders to the queue in the RC `on_demand` pallet, as it used to happen before when coretime was being purchased. The rest of the scheduling process is unchanged for now. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com> commit 08f989be9fd8ad67e2ccf24216b6bacb87563daa Author: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Date: Mon Sep 28 09:34:26 2026 +0000 statement-store: add v2 DHT connection and retention metrics (#13288) Impl #12291 Two metrics for the v2 DHT path: - **`substrate_sync_statement_v2dht_desired_unconnected_peers`** – desired peers with no open statement substream, sampled in `on_pending_affinities`. Makes a node that never reaches its desired peer set visible. - **`substrate_sub_statement_store_submitted_statements`** – now a `CounterVec` labelled `reason`, taken from the `RetentionReasonMask` at admission: `dht`, `explicit`, `both`, `transient` (no affinity for the statement's topics), `persistent` (no v2 retention resolver). Tells whether the affinity oracles actually drive retention. commit 105baae645417bf085f1d44d5a55d5e115bd6971 Author: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Mon Sep 28 09:10:52 2026 +0000 pallet-broker: fix double counting of re-pooled regions (#13311) A region pooled with `Provisional` finality can be pooled again, but `do_pool` never removed the earlier pooling. The region was counted twice in the pool size, and reassigning it afterwards only removed one copy. The leftover share diluted revenue for all other pool contributors and could never be claimed. This PR unpools the region before pooling it again, the same way `assign`, `partition` and `interlace` already do. commit 5cc4eda07222ebb03b3fc50cd46556437cb506c4 Author: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Date: Mon Sep 28 08:19:22 2026 +0000 statement-store: recover V2 gossip after major sync (#13272) - Resume deferred statement peer connections after major sync in both gate modes. - Keep V2 affinity controls during sync and re-announce the current filter once the node has stayed out of major sync for `MAJOR_SYNC_SETTLE_PERIOD`, even without dropped statements: a peer never retries a propagation chunk that failed to reach us. - Reconnect one v1 peer after major sync on the v2 path too: a v1 peer cannot replay on request, and on this path the set accepts non-reserved peers, so the substream is closed directly instead of leaving the reserved set. - Refresh affinity snapshots using current subscriptions and topology, reusing the existing filter dirty state without new networking events or wire changes. - zombienet: the v1 and v2 late-joiner tests share one body and both assert the deferred-peer drain log line, which master never emits under the gate; the v2 one joins the CI matrix. Fixes #12561 Follow-up: #13280 – incremental resync after major sync commit bd6b01028c6cfb9c010bbf6cb505d2330f8a0433 Author: Xiliang Chen <xlchen1291@gmail.com> Date: Fri Sep 25 21:12:55 2026 +0000 approval-distribution: expand knowledge past duplicate candidates (#13152) Multi-candidate assignments could stop recording candidates after encountering an existing entry. Evaluate every insertion while preserving existing approval knowledge and duplicate return semantics. No API changes or storage migration are required. commit a92f928a64c30c08c1bcd3c94161eccd537b733d Author: eduardspa <eduard@parity.io> Date: Fri Sep 25 14:56:00 2026 +0000 chain-spec-builder: manage the boot nodes of a chain spec (#13302) `chain-spec-builder` had no way to manage the boot nodes of a chain spec. The `bootNodes` field had to be edited by hand, which is error prone: the addresses must be multiaddresses carrying the peer id of the node, and a raw chain spec is not pleasant to edit manually. The new `bootnodes` command group operates on an existing chain spec, in both plain and raw format: ```sh chain-spec-builder -c out.json bootnodes add chain_spec.json /dns/node-0.example.com/tcp/30333/p2p/12D3KooW... chain-spec-builder -c out.json bootnodes remove chain_spec.json /dns/node-0.example.com/tcp/30333/p2p/12D3KooW... chain-spec-builder -c out.json bootnodes remove chain_spec.json --all chain-spec-builder bootnodes list chain_spec.json ``` `add` appends and skips the addresses that are already stored, `remove` ignores the ones that are not stored, so both can be safely repeated. `create` takes a new `--bootnodes` argument. The addresses are validated: one without a `/p2p/<peer id>` component is rejected before anything is read or written. New functionality only. `sc-chain-spec` now re-exports `MultiaddrWithPeerId`, which was already public through `ChainSpec::boot_nodes()`. The commands edit the chain spec `serde_json::Value`, which is what makes plain and raw work through one path and leaves the rest of the spec untouched — the tests assert this by comparing the output against the input with only `bootNodes` patched. `remove --all` skips deserializing the existing addresses on purpose: it is the way to repair a spec whose `bootNodes` no longer parses. --------- Co-authored-by: nprt <nikola.djoric@parity.io> commit 6d4445b6af52ef42643acf53e432d58cd2f9ff4d Author: Branislav Kontur <bkontur@gmail.com> Date: Fri Sep 25 12:36:45 2026 +0000 Remove obsolete bridges zombienet test image publishing (#13316) Remove the unused `build-push-image-bridges-zombienet-tests` job, its `prepare-bridges-zombienet-artifacts` dependency and `docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile`, since the bridge integration tests now run as zombienet-sdk tests and this image is not pulled by anything — see https://github.com/paritytech/parity-bridges-common/pull/3327#issuecomment-5816227455 commit 5f0e2684174659b28c25f3fd879c42939ccd98a0 Author: gab <79002163+gab8i@users.noreply.github.com> Date: Fri Sep 25 09:46:26 2026 +0000 feat: check configured address identity against the node key (#13024) `--listen-addr` and `--public-addr` can now carry the identity components an operator is likely to paste back from an advertised or published address, either `/p2p/<peer id>` on any address or `/certhash/<hash>` on a `webrtc-direct` address. Both are checked against the node key and then stripped. `NetworkConfiguration::validate_and_complete_webrtc_addresses` now is no longer WebRTC-specific. Two new `sc_network::error::Error` variants: `MismatchedAddressIdentity` and `MalformedAddressIdentity`. - check is part of `sc_network::config`, it applies to both litep2p and libp2p. - `check_and_strip_identity` pops a trailing /p2p, then a /certhash, and rejects the address if anything identity-shaped remains inside it. - addrs tests moved from `webrtc.rs` to a new `substrate/client/network/src/address_tests.rs`. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit c534ae5fee6bfcc4b00450ad4f27c19346097d5d Author: Ankan <10196091+Ank4n@users.noreply.github.com> Date: Thu Sep 24 20:10:44 2026 +0000 [AHMv2] Migrator dependencies (#13282) Adds the types the migrator pallets need to move parachain registrations and HRMP channels from the relay chain to the pallets that will own them on a system chain (Coretime). - `rc2-migrator` (runtimes repo) [depends on](https://github.com/Ank4n/runtimes/blob/ankn-min-relay-int/pallets/rc2-migrator/src/lib.rs#L359) `hrmp`, `paras_registrar` etc. directly, iterates their storage and packs each record into a `Portable*` entry (eg [`PortableHrmpChannel`](https://github.com/Ank4n/runtimes/blob/ankn-min-relay-int/pallets/migrator-types/src/lib.rs#L164)). These are the wire types between the two migrators, rc2 and ct, and carry the RC-recorded deposits. - `ct-migrator` receives the wire type, settles the deposits (the balances arrive earlier, in the accounts stage), converts the record to the smaller `Migrated*` type from this PR and hands it to the new pallet (`registrar_para` / `hrmp_para`), which recreates the record at its own price. So `Portable*` is the wire format and is what gets parked in a `Failed*` map when an entry is refused. `Migrated*` is never stored; it is the translation from wire to the fields the pallet actually needs. The ct-migrator could hand the pallets the portable type directly, but this keeps the pallets away from deposit amounts they do not use, and the wire format stays in the runtimes repo with no SDK dependency. - `registrar-primitives` - `MigratedPara`, `MigratedParaState`: one para as handed to the registrar pallet. - `ReceiveMigratedParas`: implemented by `registrar_para`. The `()` impl refuses every record. - `hrmp-primitives` - `ChannelId`, `MigratedChannel`: one channel as handed to the HRMP pallet. - `ReceiveMigratedChannels`: implemented by `hrmp_para`. The `()` impl refuses every record. Neither type carries a deposit: the receiving pallet takes its own at the destination's prices. A record is recreated even if its manager cannot pay, so no RC para or channel is dropped. --------- Co-authored-by: Luka Ciric <luka.ciric2106@gmail.com> commit cccea0c9393792a97a7814b88ca73a7678c43fc7 Author: Andrei Eres <eresav@me.com> Date: Thu Sep 24 16:06:45 2026 +0000 statement gossip: route the v2 propagation plan through the per-peer outbox (#13197) Closes https://github.com/paritytech/polkadot-sdk/issues/13193. Stacked on https://github.com/paritytech/polkadot-sdk/pull/13216. The v2 DHT path sent orchestrator-chosen statements through its own chunked send function, bypassing the per-peer outbox the v1 path uses. This PR feeds the orchestrator's targets into the same outbox and deletes the direct path, so v2 gets one chunk in flight per peer, the shared byte budget and the bounded queue. The orchestrator's choice of peer is final: on the v2 path the drain applies no affinity filter of its own and drops only statements the peer sent to us, so a target that leaves the routing set while its hash waits in the outbox still receives the statement. Two loss reasons count what the direct path never lost: `missing_from_store` for a statement that left the store or expired before its chunk went out, and `disconnected` for hashes still queued when the peer left. Node-side only. Nodes without the v2 DHT path gain the two `substrate_sync_statement_undelivered_total` reasons and see no other change. commit 11569634ea4734d4b55c822a1990d262b64772da Author: Alexandru Cihodaru <40807189+AlexandruCihodaru@users.noreply.github.com> Date: Thu Sep 24 11:09:41 2026 +0000 Collator protocol V4 validator side logic (#12396) Reworks the experimental validator side of the collator protocol (validator_side_experimental) to also handle V4 collation segments. Fixes: #13266 A collator can now advertises a whole segment, and the validator picks the first unknown fingerprint at fetch time rather than collapsing at receipt. --------- Signed-off-by: Alexandru Cihodaru <alexandru.cihodaru@parity.io> Signed-off-by: Iulian Barbu <iulian.barbu@parity.io> Co-authored-by: Iulian Barbu <iulian.barbu@parity.io> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: eskimor <robert@gonimo.com> Co-authored-by: Serban Iorga <serban300@gmail.com> Co-authored-by: Serban Iorga <serban@parity.io> Co-authored-by: eskimor <1527017+eskimor@users.noreply.github.com> commit 83b147a9b29aa5bdf40ddd105d308740a1647892 Author: Paolo La Camera <paolo@parity.io> Date: Wed Sep 23 14:03:13 2026 +0000 elections-phragmen: saturate the prime-vote multiplier (#13269) The Borda count that picks the prime member weighs each ballot position by `MaxVotesPerVoter - vote_position`. Stored ballots are a plain `Vec` and are only length-checked when `vote` is called, so a reduction of `MaxVotesPerVoter` leaves entries whose positions run past the current bound and underflow the subtraction. Use a saturating subtraction so those positions weigh nothing. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Luka Ciric <luka.ciric2106@gmail.com> commit 32cc17dbfc6fbd4163744fe1828714a0d9905d7e Author: Alistair Singh <alistair.singh7@gmail.com> Date: Wed Sep 23 11:06:59 2026 +0000 Preserve Snowbridge v1 inbound liveness when the Asset Hub sovereign is empty (#12569) Snowbridge v1 inbound messages now burn the teleported Asset Hub execution fee from the relayer's Bridge Hub account instead of requiring funds in the Asset Hub sovereign account on Bridge Hub. The Asset Hub sovereign reimburses the relayer best-effort for the burned fee plus delivery reward when it has enough reducible balance. This preserves the existing funded-sovereign economics while preventing an empty Asset Hub sovereign from stalling the Ethereum-to-Polkadot inbound channel. In the empty-sovereign case, the message is still processed and the nonce advances, but the relayer is not reimbursed. Motivation: In order to deprecate Snowbridge V1, we can simply allow funds to run out in these sovereigns making it unattractive to relayers. If the community wishes to continue to use V1, we can submit a proposal to top up these accounts from treasury so that relayers are rewarded again or they can migrate to V2. In reality we will probably submit at least 1 proposal to top up these accounts one last time to give the community time to migrate over. * [x] My PR includes a detailed description as outlined in the "Description" and its two subsections above. * [x] My PR follows the [labeling requirements]( https://github.com/paritytech/polkadot-sdk/blob/master/docs/contributor/CONTRIBUTING.md#Process ) of this project (at minimum one label for `T` required) * External contributors: Use `/cmd label <label-name>` to add labels * Maintainers can also add labels manually * [x] I have made corresponding changes to the documentation (if applicable) * [x] I have added tests that prove my fix is effective or that my feature works (if applicable) --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit c4465b07a4eed1733e216bfad354586a51a1796f Author: Luka Ciric <luka.ciric2106@gmail.com> Date: Wed Sep 23 07:33:55 2026 +0000 Registrar: Scaffolding (#13084) Scaffolding for registrar. commit acf6e6960d79df7c832121ec96274033c2652e08 Author: Alexandre R. Baldé <alexandre.balde@parity.io> Date: Wed Sep 23 01:57:28 2026 +0000 Expand `pallet-psm`'s `do_try_state` with additional invariant checks + unit tests (#12154) This PR supersedes #11805. That PR combined five things in one diff: `try_state` checks, unit tests, fuzzer harnesses, fuzzing infrastructure, and coverage tools. A diff of that size is difficult to review. This PR is the first of several smaller PRs. `pallet-psm` on master has a `do_try_state` function with five checks. This PR increases that number to seventeen, and it adds a unit test for each one. A later PR adds the fuzzers and the fuzzing infrastructure. That PR depends on this one. The runtime behavior does not change. The checks run only with the `try-runtime` feature, or in tests. This PR is rebased onto the multi-instance PSM redesign (#12245). PR pallet. It used `PsmDebt: AssetId -> Balance`, a global `MaxPsmDebtOfTotal`, and a pallet-level `FeeDestination`. The new layout holds many PSMs. Each PSM has its own storage, keyed by the internal asset id. The checks follow the new layout. Their numbers are 1 to 17, in the same order as the source code. The second table below maps the old numbers to the new numbers. `R0-no-crate-publish-required`: this PR adds only tests and `do_try_state` code. Production block execution does not change. Downstream users need no integration work. There are 17 checks. Master supplies five of them; this PR adds the other twelve. The table groups them by their position in the code. Five checks are advisory. An advisory check writes a warning to the log. It does not return an error. A permitted call can create each of those five states. An error in those cases stops the chain after a correct call: a parameter change by governance for checks 10, 11 and 17, a metadata change by an asset owner for checks 2 and 7. | # | Check | Kind | Scope | |---|---|---|---| | 1 | The instance has its paired `PsmAdmin` row | error | per-instance | | 2 | Live internal decimals equal the `PsmInfo` snapshot | advisory | per-instance | | 3 | The reserve account exists | error | per-instance | | 4 | The fee destination account exists | error | per-instance | | 5 | `min_swap_amount` is not zero | error | per-instance | | 6 | Internal issuance covers the instance debt | error | per-instance | | 7 | Live external decimals equal the registration snapshot | advisory | per-external | | 8 | The reserve covers the tracked debt, in external units | error | per-external | | 9 | The sum of the approved debts does not overflow | error | per-external | | 10 | Per-asset debt is within its ceiling | advisory | per-external | | 11 | Zero weight and zero debt give a zero reserve | advisory | per-external | | 12 | The cached `external_count` equals the approved externals | error | per-instance | | 13 | The approved-external count is within `MaxExternals` | error | per-instance | | 14 | No `PsmDebt` row with a value exists for a pair that is not approved | error | global | | 15 | No row stays after the removal of its PSM | error | global | | 16 | No fee row or weight row exists for a pair that is not approved | error | global | | 17 | The instance debt is within `max_debt` | advisory | global | Master merged #13062 while this PR was under review. Minting now uses the decimals recorded at registration, as redemption always did, and the pallet never reads live metadata on a swap path. Two changes follow: * Checks 2 and 7 are now advisory. Live decimals that differ from the recorded values are a state that any asset owner can create with a metadata call, and the pallet's arithmetic does not depend on them. A hard error here fails try-runtime on a legal state. The warning preserves the signal: a reader of live metadata sees different amounts than the PSM pays. * The test `test_external_asset_owner_can_brick_minting` is removed. It asserted that a metadata change halts minting, and #13062 removed that behavior on purpose. The tests `mint_uses_snapshot_when_asset_decimals_drift` and `remove_external_asset_succeeds_after_debt_drained_with_external_decimal_drift` from #13062 cover the current behavior. | Old | New | Note | |---|---|---| | 1 decimals | 2, 7 | split into internal and per-external | | 2 reserve >= debt | 8 | | | 3 sum equals `total_psm_debt()` | removed | see below | | 4 issuance >= debt | 6 | | | 5 total debt <= ceiling | 17 | | | 6 per-asset debt <= ceiling | 10 | | | 7 no debt for an asset that is not approved | 14 | | | 8 fee rows without an external | 16 | | | 9 PSM account exists | 3 | | | 10 count <= maximum | 13 | | | 11 zero weight with a reserve | 11 | | | 12 fee destination exists | 4 | | This PR does not keep the old numbers. The old checks were one flat sequence. The new checks are at three levels in the code. The old numbers put those checks out of order in the source. This PR removes check 3. Before the redesign, `total_psm_debt()` read a stored total. Check 3 compared that stored total against a new sum of the per-asset debts. The comparison found real errors. After the redesign, `total_psm_debt()` adds the same `PsmDebt` rows as the sum. The two values are always equal. The check cannot fail. Check 9 and check 14 keep the parts of check 3 that still work. Check 9 finds an overflow in the sum. Check 14 finds debt for a pair that is not approved. Checks 1, 5, 12 and 15 are new. They cover storage that PR #12245 added: * Check 1: the `Psm` row and the `PsmAdmin` row exist together. * Check 5: the per-instance `min_swap_amount`. * Check 12: the `external_count` cache. * Check 15: rows that stay after the removal of their instance. Check 5 needs attention. `create_psm` refuses a zero `min_swap_amount`. No check confirmed that value in storage. A migration or a manual genesis file can therefore write a zero. A zero value permits swaps of dust amounts. The checks now cover all seven storage items and all `PsmInfo` fields. One field has no check: `PsmAdminInfo.deposit`. That field holds a `T::Consideration`. The type gives no value to test. A new `try_state` module in `tests.rs` holds one test for each check. Each test changes one storage item only. * `detects_*`: the check returns an error. * `warns_on_*`: the check writes a warning. * `passes_on_valid_state`: all checks pass on correct storage. * One more test for check 14: a row with a zero value is correct. Each advisory test first confirms that the code reaches the warning state. Then it confirms the result is `Ok`. Without the first step, the test passes after the removal of the `log::warn!` block. Check 9 has no test. A test must make a `u128` sum of two debts overflow. The mock runtime cannot reach that state with realistic values. This PR also moves four groups of tests from #11805: * the fee destination balance after a redeem * a redeem from a sender that holds no internal asset * `PsmManagerLevel::can_set_circuit_breaker` * three tests for the per-asset ceiling limits All 161 tests pass. This PR does not move two tests from #11805. The test `genesis_panics_when_asset_configs_exceed_max` is obsolete, because the new PSM has no global `asset_configs` list. The test `fails_insufficient_reserve` on master already covers `redeem_with_drained_reserve_hits_defensive`. This PR adds a `Storage Invariants` section to the module documentation. It also adds a doc comment on `do_try_state`. That comment gives the groups of checks, and it identifies the advisory checks. For decisions that this diff does not show, refer to the commit messages and the discussion on #11805. * [x] My PR includes a detailed description as outlined in the "Description" and its two subsections above. * [x] My PR follows the labeling requirements of this project (at minimum one label for `T` required) * [x] I have made corresponding changes to the documentation (if applicable) * [x] I have added tests that prove my fix is effective or that my feature works (if applicable) commit 16ae0b3dbbfe688d1045d8832f9679c59b3d8393 Author: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> Date: Tue Sep 22 14:54:09 2026 +0000 cumulus: add support for signed scheduling info (#13234) Fixes #12311 Added the support to sign the scheduling proof's payload, relevant for resubmitting a block. The added support is exercised just in tests, and the plan is to use it once the logic moves onto segment submission - the V4 collator-protocol alternative to a collation submission, just that it enables the submission of >=1 collations, and a scheduling proof with a signed payload, to prove the eligibility of the current author to resubmit not just the freshly built blocks of the current para slot. --------- Signed-off-by: Iulian Barbu <iulian.barbu@parity.io> commit 7e68ad23409d5891ccdb37ac253d18bf8fc23c0c Author: Andrei Eres <eresav@me.com> Date: Tue Sep 22 08:10:43 2026 +0000 statement gossip: score a resent banned statement against the sender (#13274) Closes https://github.com/paritytech/polkadot-sdk/issues/12517. On the v2 DHT path a peer that resends a statement the store has removed and banned, such as a forwarded transient one, now loses one point of its per-peer score. The store already refuses the resend since https://github.com/paritytech/polkadot-sdk/pull/13216, which left the sender unpunished. The penalty is small because an honest replica can resend such a statement once during an initial sync. No changes needed. Nodes without the v2 DHT path enabled are unaffected. commit c46fa16033309fc9262f6866fa1a5b5e49acf198 Author: Egor_P <egor@parity.io> Date: Mon Sep 21 13:01:19 2026 +0000 [CI/CD] Adjust time to fix cron job (#13275) This PR fixes a cron job that runs in the paritytech-release org to sync forks commit c7bc926f89162cb8dd8681af112fcd1cb9677227 Author: Andrei Eres <eresav@me.com> Date: Mon Sep 21 11:19:08 2026 +0000 statement-store: read affinity topics from a file (#13240) Adds a hidden `--statement-affinity-topics-file <PATH>` flag to the substrate node and the omni-node. The file holds one 32-byte hex topic per line, blank lines and `#` comments skipped, and adds to the repeatable `--statement-affinity-topic` flag. A line holds the topic itself, not a name to hash, since applications derive topics in their own ways. Closes https://github.com/paritytech/polkadot-sdk/issues/12557. Optional flag, takes effect only on the experimental v2 DHT statement path. `V2DhtConfig` gains the field `affinity_topics_file: Option<AffinityTopicsFile>`. commit 843cadf2f65aa35495ee65dca49e8113d2b81dc9 Author: Paolo La Camera <paolo@parity.io> Date: Mon Sep 21 10:08:29 2026 +0000 staking-async runtimes: fix treasury payout XCM location and waive its delivery fees (#13268) The parachain runtime hardcoded the treasury's interior location to pallet index 37, copied from the relay runtime, while its Treasury pallet sits at index 96. Derive the index from `PalletInfoAccess` in both staking-async runtimes. `PayOverXcm` charges delivery fees from that location before sending the payout XCM. No location converter maps a local pallet location to an account, so the withdrawal failed and every payout errored before leaving the chain. Add the location to `WaivedLocations` in both runtimes, as #10831 did for the relay and collectives runtimes, and pin it with a test. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit dd5653893c7e431627f9c3bcd4d812bdce650364 Author: Andrei Eres <eresav@me.com> Date: Mon Sep 21 09:44:01 2026 +0000 statement-store: local mixed-version soak zombienet test (#13124) Local-only zombienet soak for statement gossip between two `polkadot-parachain` versions with DHT disabled. Two collators run the branch binary, two run the binary named by `OLD_PARACHAIN_COMMAND`. It checks that the gossip path landed in https://github.com/paritytech/polkadot-sdk/pull/12319 stays compatible with the previous release. Statements flow at 50/s in one-minute rounds, round-robin over all collators. Every round must reach every live collator. Every tenth round one collator restarts (30 s downtime) and must catch up on the round it missed. None. Test-only. It is not in the CI test list and returns early when `CI` is set, so it cannot be picked up by accident. Run locally: ``` PATH=<branch target/release>:$PATH \ OLD_PARACHAIN_COMMAND=~/bin/stable2609/polkadot-parachain \ MIXED_VERSION_SOAK_SECS=3600 ZOMBIE_PROVIDER=native \ cargo test -p cumulus-zombienet-sdk-tests --features zombie-ci -- --test-threads 1 --nocapture statement_store_mixed_version ``` - `common.rs`: `launch_network` delegates to the new `launch_network_with_commands`, which takes an optional command per collator. Existing callers are unchanged. - `mixed_version.rs`: 4 collators (`alice`, `bob` new, `charlie`, `dave` old), 2 000 genesis allowances, `run_round` submits and verifies via RPC subscriptions, `assert_caught_up` checks the restarted node. --------- Signed-off-by: Adrian Catangiu <adrian@parity.io> Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Signed-off-by: Tomasz Bartos <tomasz.bartos@iohk.io> Signed-off-by: Iulian Barbu <iulian.barbu@parity.io> Signed-off-by: Alexandru Gheorghe <alexandru.gheorghe@parity.io> Signed-off-by: Andrei Sandu <andrei-mihail@parity.io> Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Co-authored-by: Javier Viola <363911+pepoviola@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: PG Herveou <pgherveou@gmail.com> Co-authored-by: dharjeezy <dharjeezy@gmail.com> Co-authored-by: Adrian Catangiu <adrian@parity.io> Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Co-authored-by: Nasihudeen Jimoh <nasihudeen04@gmail.com> Co-authored-by: muharem <ismailov.m.h@gmail.com> Co-authored-by: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Co-authored-by: eskimor <jfanatiker@gmx.at> Co-authored-by: Davide Galassi <davxy@datawok.net> Co-authored-by: drskalman <35698397+drskalman@users.noreply.github.com> Co-authored-by: Paolo La Camera <paolo@parity.io> Co-authored-by: Egor_P <egor@parity.io> Co-authored-by: Sebastian Kunert <mail@skunert.dev> Co-authored-by: Ludovic Domingues <ludovic.domingues96@gmail.com> Co-authored-by: Branislav Kontur <bkontur@gmail.com> Co-authored-by: Serban Iorga <serban@parity.io> Co-authored-by: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> Co-authored-by: Klapeyron <11329616+Klapeyron@users.noreply.github.com> Co-authored-by: Serban Iorga <serban300@gmail.com> Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io> Co-authored-by: Ross Bulat <ross@jkrb.io> Co-authored-by: Milos Kriz <82968568+miloskriz@users.noreply.github.com> Co-authored-by: eskimor <robert@gonimo.com> Co-authored-by: eskimor <eskimor@noreply.com> Co-authored-by: Marios <marios@parity.io> Co-authored-by: Alin Dima <alin@parity.io> Co-authored-by: Rodrigo Quelhas <22591718+RomarQ@users.noreply.github.com> Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com> Co-authored-by: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com> Co-authored-by: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Co-authored-by: eskimor <1527017+eskimor@users.noreply.github.com> Co-authored-by: Andrei <54316454+sandreim@users.noreply.github.com> Co-authored-by: Javier Viola <javier@parity.io> Co-authored-by: Luka Ciric <luka.ciric2106@gmail.com> Co-authored-by: Ankan <ankan.anurag@gmail.com> Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Co-authored-by: Francisco Aguirre <franciscoaguirreperez@gmail.com> Co-authored-by: Omar <OmarAbdulla7@hotmail.com> Co-authored-by: Kirill <pisarevkir@gmail.com> Co-authored-by: 0xRVE <robertvaneerdewijk@gmail.com> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com> Co-authored-by: gab <79002163+gab8i@users.noreply.github.com> Co-authored-by: s0me0ne-unkn0wn <48632512+s0me0ne-unkn0wn@users.noreply.github.com> Co-authored-by: ron <yrong1997@gmail.com> Co-authored-by: Marian Radu <marian@parity.io> Co-authored-by: Nathaniel Bajo <73991674+Nathy-bajo@users.noreply.github.com> Co-authored-by: mertwole <mertwole@gmail.com> Co-authored-by: Andrei Trandafir <142614787+andreitrand@users.noreply.github.com> Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> Co-authored-by: jessechejieh <dev@jessechejieh.com> commit e9f9b636cbe173a334d9212e2352e28f8182fbd4 Author: Paolo La Camera <paolo@parity.io> Date: Mon Sep 21 08:53:10 2026 +0000 election-provider-support: fix MaxEncodedLen undercount in generated solution types (#13265) The prefix budget assumed a one-byte length prefix per vote field, but a field holding `MaxVoters` elements uses a multi-byte compact. `max_encoded_len()` of `generate_solution_type!` types now includes the full compact length prefix of a field holding `MaxVoters` elements. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit c2e1de81c62ceeb3397bc04548d16f336d4f28b5 Author: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Date: Sun Sep 20 08:44:24 2026 +0000 statement-store: refresh DHT affinity after peer eviction (#13248) Part of #13038. Peer eviction updated the topology but left the store's DHT-affinity snapshot unchanged. Removed peers could keep affecting retention until a later Identify or substream-open event refreshed it. Republish the snapshot when eviction removes a DHT-eligible peer. No-op sweeps and removal of unconfirmed peers skip the copy. Discovery and eviction policies are unchanged. commit 1cc9ce56bc20e686b6a4383228d3c70d16a710e0 Author: Alexander Theißen <alex.theissen@me.com> Date: Sat Sep 19 01:34:04 2026 +0000 Bump PolkaVM from 0.35 to 0.36 (#13261) Updates the four workspace PolkaVM pins (`polkavm`, `polkavm-common`, `polkavm-derive`, `polkavm-linker`) from 0.35.0 to 0.36.0. The `pallet-revive` fixtures build template follows the workspace pin. Also removes the orphaned `try_compile_invalid_fixture` helper from `pallet-revive-fixtures`. Its only caller was the `sbrk_cannot_be_linked` test that #12523 deleted together with the sbrk fixture. Split out of #12142, which needs this version but where the bump does not belong. commit 165c0ff8111463dc767e6addc84e897d5ac38efd Author: Alexander Theißen <alex.theissen@me.com> Date: Sat Sep 19 01:33:45 2026 +0000 pallet-revive: make execution_tracing_works independent of resolc codegen, bump CI resolc to 1.4.0 (#13262) `tests::sol::execution_tracing_works` compared the PVM trace of three Solidity fixtures against JSON snapshots. After normalization those snapshots only pin the sequence of syscalls, and that sequence is decided by resolc, not by the pallet. Every resolc release that adds or drops a host call breaks the test. With resolc 1.4.0 the `CALL` fixture makes one `return_data_size` call less (40 steps instead of 42), so the test fails for anyone not running the exact version CI pins. The test already carried one workaround of this kind, folding `call` into `call_evm` for an earlier compiler change. The three `*_pvm.json` snapshots are removed. For the PVM run the test now checks what the tracer is responsible for: - A frame's steps alternate between `pvm_fuel` and a syscall, starting and ending with `pvm_fuel`. The steps of a sub call sit between the calling syscall and the fuel step after it. - Depth changes by one at a time, and only goes up right after a call syscall. - Every syscall step has a non zero `gas_cost`. - `return_data` is empty until the sub call returns and equals the callee's output afterwards. - `failed` and `return_value`, with the expected values built through the ABI types instead of hex literals. - The call structure, as a short inline list such as `[(1, Call), (2, Return), (1, Return)]`. `call` and `call_evm` count as the same entry, which replaces the rewrite in `normalize_trace`. The existing gas consistency check is unchanged. The EVM snapshots are unchanged as well: every opcode is traced there, so the sequence follows from the bytecode. What is lost is detection of a tracer change that drops or duplicates a single non call syscall step. The alternation and cost checks cover most of that. `RESOLC_VERSION` goes from 1.0.0 to 1.4.0. `tests-linux-stable.yml` had its own hardcoded copy of the version in two install steps. They now read `.github/env`, like the `get-resolc` action already does. Those steps run under `sh`, hence `.` and not `source`. The bump is in this PR because it cannot go in before the test change. Locally with resolc 1.4.0: `cargo test -p pallet-revive --profile testnet -- tests::sol::execution_tracing_works` passes, and fails with `CALL: wrong call structure` when the expected skeleton is changed to a wrong one. The same test fails on master with this resolc version. Not checked locally: the revive differential tests in `tests-evm.yml` compare against a checked in expectations file, and a newer resolc may change which cases pass. That needs the CI run here. commit b09232fe9d2ec8964a8069e1f5799962fe8b1e63 Author: Nasihudeen Jimoh <nasihudeen04@gmail.com> Date: Fri Sep 18 21:30:48 2026 +0000 frame: re-export hashing free functions via sp_io (#12753) In #12158 we removed the deprecated `sp_core` hashing re-exports and pointed `frame::hashing` at `sp_crypto_hashing` instead. That works, but those helpers run as pure wasm, which is slower than going through the host. This PR switches the free functions in `polkadot-sdk-frame::hashing` (`blake2_256`, `twox_128`, and friends) over to `sp_io::hashing`, so runtime code that uses FRAME’s hashing module gets the host-function path. The trait helpers (`BlakeTwo256` / `Keccak256`) were already doing that; this just brings the free functions in line. Also drops the now-unused `sp-crypto-hashing` dependency from `polkadot-sdk-frame`. Fixes #12727 --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> commit 6719be2fe39c7cb6bf423b9c8e5724867b14ed93 Author: html//stephlou <141152972+Stephenlawrence00@users.noreply.github.com> Date: Fri Sep 18 16:50:01 2026 +0000 [frame-benchmarking] Refactor pallet benchmarking backend (#11758) closes https://github.com/paritytech/polkadot-sdk/issues/194 This PR refactors the benchmarking infrastructure in FRAME by deduplicating analysis logic, improving API ergonomics, formalizing `BenchmarkBatch::split()`, enhancing documentation and error handling, and deprecating the v1 macro system in favor of v2. commit cc4eca897f5c373be9ff11250e9796c0a6c1d959 Author: html//stephlou <141152972+Stephenlawrence00@users.noreply.github.com> Date: Fri Sep 18 16:46:37 2026 +0000 fix(parachains): Ensure broker parachain reachability in coretime benchmarks (#11080) fixes #8869 Ensures the broker parachain is reachable before benchmarks run by invoking `SendXcm::ensure_successful_delivery()` to initialize the required XCM routing infrastructure. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Branislav Kontur <bkontur@gmail.com> commit 595c3d87910d1c04d740054ff295f1bfe2f61928 Author: html//stephlou <141152972+Stephenlawrence00@users.noreply.github.com> Date: Fri Sep 18 12:34:55 2026 +0000 [pallet_balances] Remove `FreezeIdentifier` and `MaxFreezes` in favour of `RuntimeFreezeReason` (#12900) Closes #2997 `RuntimeFreezeReason` becomes the freeze identifier and bounds `Freezes` with its variant count, retiring the redundant `FreezeIdentifier` and `MaxFreezes` config items along with the integrity test that policed them. commit fd67bf19cbe55bd8c290d7e09ccca69ada3b68e3 Author: Dhiraj Sah <dhiraj@parity.io> Date: Fri Sep 18 11:47:10 2026 +0000 `pallet-whitelist`: document that unwhitelisting pauses a live deferral not remove it, pin it with a test. (#13257) Docs and test only. No behaviour change, no bench needed. Since #11336, `pallet-whitelist` keeps two independent storage maps: `WhitelistedCall`, owned by `WhitelistOrigin`, and `DeferredDispatch`, owned by `DispatchWhitelistedOrigin`. A relayed root dispatch needs both plus an unexpired deferral. `remove_whitelisted_call` clears only the whitelist entry, so a live deferral survives revocation and re-whitelisting the same hash before expiry re-enables relayed execution without a fresh act from `DispatchWhitelistedOrigin`. That behaviour is intentional but was undocumented, and it has already been reported once as an authorization finding. This PR records the semantics where the next reader will look and pins them with a test so a future refactor cannot flip them silently. - Neither origin can erase the other's record. Letting a whitelist revoke drop the deferral would allow `WhitelistOrigin` to unilaterally void an enacted referendum, which is a larger authority than it holds today. - Revocation still blocks relayers for as long as the hash is off the whitelist, which the existing `relayer_cannot_bypass_unwhitelisting` test asserts. - Re-arming requires `WhitelistOrigin` again, and that origin already has the power to permit root execution of a hash the moment it whitelists it. No origin gains authority it did not have. - This matches pre-#11336 behaviour, where a scheduled enactment also ran if the whitelist was toggled off and on before the enactment block. Deferral only widens that window to `DeferredDispatchExpiration`. - Symmetry with the existing `remove_deferred_dispatch_does_not_unwhitelist` test, which pins the other direction of the same independence. - Pallet-level rustdoc: new "Deferred dispatch" section describing the two maps, their owners, and the pause-not-cancel semantics of unwhitelisting. - `remove_whitelisted_call` rustdoc: two-line note that the deferred entry is left in place. - New test `unwhitelisting_pauses_but_does_not_cancel_deferral`: defer → whitelist → revoke, assert deferral survives and relayers are blocked, re-whitelist, assert a signed relay executes as root fee-free and clears both maps. - [x] prdoc - [x] label `T1-FRAME` --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 7d4be3ec428c1b0aacd718bf6c12ebbfd7cea1b4 Author: Alexander Theißen <alex.theissen@me.com> Date: Fri Sep 18 03:30:41 2026 +0000 docs: share repository guidance across coding harnesses (#13251) Make the repository guidance available to harnesses beyond Claude Code. Currently it lives only in `CLAUDE.md`, which Codex does not read by default. Moving it to `AGENTS.md` lets Codex and other harnesses that support that file discover the same instructions. `CLAUDE.md` becomes a single `@AGENTS.md` import so Claude Code continues using the shared guidance without duplicating it. Require reading every applicable `AGENTS.md` along a file's directory path before editing or creating it, including when work starts at the repository root. This explicitly directs harnesses to load scoped instructions that were not included at startup. The rule only names `AGENTS.md`: Claude Code already loads nested `CLAUDE.md` files automatically when it reads files in those directories, including their imports, so a separate instruction to discover `CLAUDE.md` is unnecessary. More specific instructions apply within their own subtree. Also correct the existing prdoc exemption to `R0-silent` and distinguish it from `R0-no-crate-publish-required`, which only exempts crate publication. Existing commands and technical guidance are preserved. Markdown lint and `git diff --check` passed. Verified the exact import, preservation of every command block, and that only the two root guidance files changed. No Rust build or runtime tests were needed for this documentation-only change. commit ceca401ab3ca1f2faba112893863bff19ba1d1a6 Author: Alexander Theißen <alex.theissen@me.com> Date: Fri Sep 18 03:30:30 2026 +0000 revive: document contributor and compatibility rules (#13250) Document revive contributor rules for immutable contract syscalls, independent RPC/runtime upgrades, additive Cargo features, module structure, Solidity tests, and handwritten prdocs that serve as porting guides. Keep the detailed runtime API versioning procedure in `types/GUIDE.md` and link to it from the contributor guidance. Update it to cover capability selection, historical wire compatibility, matching request/response versions, and independent rollout. Add the companion import file pointing to the same guidance. Markdown lint, relative link checks, the exact import check, and `git diff --check` passed. No Rust build or runtime tests were run because this change only updates documentation. No crate publication is required. commit 4bf6d91ddb771991001e628477900e129e3cb2c3 Author: dharjeezy <dharjeezy@gmail.com> Date: Thu Sep 17 19:58:26 2026 +0000 fatxpool: hold the transaction pool as a trait object instead of a wrapper (#12845) `TransactionPoolWrapper` was a struct wrapping a boxed transaction pool, existing only to give it a sized type, at the cost of ~190 lines forwarding every trait method to the inner box. `TransactionPoolHandle` is now a type alias for the trait object itself rather than for that wrapper, so the forwarding layer is gone and `Builder::build` hands back an `Arc<TransactionPoolHandle<Block>>` instead of a wrapper by value. This also folds in #12942. `FullClientTransactionPool` no longer carries a `Client` type parameter: all three of its associated types are projections that discard the client, so `Hash`, `InPoolTransaction` and `Error` are spelled out in terms of `Block` alone. Naming them that way required exporting `sc_transaction_pool::error` and `sc_transaction_pool::Transaction`. `BuildNetworkParams`, `BuildNetworkAdvancedParams`, `SpawnTasksParams` and `GenRpcModuleParams` keep a generic transaction pool parameter, relaxed to `?Sized` so the trait object can be passed in. The service therefore does not pin the pool's error or in-pool transaction type, and an alternative pool implementation is free to define its own. What those entry points no longer do is constrain the client on the transaction pool's behalf: the `BlockIdTo` and `TaggedTransactionQueue` bounds that only existed to build a pool are gone from `build_network`, `build_network_advanced`, `spawn_tasks`, `gen_rpc_module` and the cumulus `build_network`. The client capabilities each side genuinely needs are each spelled out once: - `sc_transaction_pool::ClientForTransactionPool`, for building a pool. Used by the `Builder` and internally by `FullChainApi`, `BasicPool::new_full` and `ForkAwareTxPool::new_full`. It does not pin the `BlockIdTo` error, so a hand written client is free to choose its own. - `sc_service::ClientForService`, for the service entry points, in the same shape as the existing `ClientForGrandpa` and with each entry point adding only the few capabilities it genuinely uses on top. Components holding the pool behind an `Arc` stay generic over the pool type and accept unsized pools now, which is a relaxation requiring no changes on their side. closes #5489 closes #12942 --------- Co-authored-by: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> commit e7c242653aba8f3dae834c71546aa0d6f731e0d5 Author: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Thu Sep 17 17:25:23 2026 +0000 pallet-psm: reject the `None` origin as a PSM admin (#13256) A PSM admin could be set to the `None` origin. The pool rejects unsigned PSM calls, but a block author bypasses the pool, so such a PSM would be managed by whoever authors the block. This PR rejects the `None` origin both when storing an admin and when checking one. --------- Co-authored-by: Dónal Murray <donal.murray@parity.io> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit dccf478651c2253e490796f86160fedbe55670a9 Author: Marian Radu <marian@parity.io> Date: Thu Sep 17 09:38:45 2026 +0000 pallet-revive: separate slot warmth from storage access pricing (#13013) The access list only tracks persistent storage, but `touch_storage_access` and `peek_storage_access` took a `transient` flag anyway and returned a pricing value rather than slot warmth. The two concerns are now separated: the access list reports slot warmth, and the pricing value is built by the storage operation itself. 1. The access list reports slot warmth only; it no longer knows about transient storage. 2. The pricing value lives next to the pricing code and carries both inputs it needs: the slot's warmth and the operation being performed. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 3f0afb7ee7d5a57e0605fab294ec4e7def98a9bd Author: Rodrigo Quelhas <22591718+RomarQ@users.noreply.github.com> Date: Wed Sep 16 18:35:13 2026 +0000 Migrate `pallet-election-provider-multi-block` from the deprecated `ValidateUnsigned` trait to `#[pallet::authorize]` (#13032) Part of #2415 (follow-up to #10150) Migrate `pallet-election-provider-multi-block` from the deprecated `ValidateUnsigned` trait to `#[pallet::authorize]`, following the pattern established in #10716. - Replace the `ValidateUnsigned` impl with `#[pallet::authorize]` on the `submit_unsigned` call. The validation logic is unchanged, just moved into the authorize callback. It still restricts the call to `TransactionSource::Local` and `TransactionSource::InBlock`, runs `validate_unsigned_checks`, and builds the same transaction validity. - Change the `Config` supertrait from `CreateBare<Call<Self>>` to `CreateAuthorizedTransaction<Call<Self>>`. - Replace `ensure_none` with `ensure_authorized` and `create_bare` with `create_authorized_transaction`. - Add `#[pallet::weight_of_authorize]`. The weight already existed as `validate_unsigned`, so rename it to `authorize_submit_unsigned` and point its benchmark at the authorize callback. - Add `frame_system::AuthorizeCall` to the `pallet-staking-async-parachain-runtime` transaction extension pipeline, and a `CreateAuthorizedTransaction` implementation for it and for `asset-hub-westend-runtime`. The `Config` trait now requires `CreateAuthorizedTransaction<Call<Self>>` instead of `CreateBare<Call<Self>>`. The runtime must also include `frame_system::AuthorizeCall` in its transaction extension pipeline. The `WeightInfo` trait renamed `validate_unsigned` to `authorize_submit_unsigned`. --------- Co-authored-by: Paolo La Camera <paolo@parity.io> commit 177c490356fab38f8de89c7d9c5f2408ba3b06fb Author: Andrei Eres <eresav@me.com> Date: Wed Sep 16 14:37:10 2026 +0000 statement-store: persist transient statements and sweep them once propagated (#13216) Part of https://github.com/paritytech/polkadot-sdk/issues/11932, prerequisite for https://github.com/paritytech/polkadot-sdk/issues/13193. A statement no affinity covers (the node is neither a DHT replica for its topics nor has explicit affinity for them) is transient: the node forwards it once and does not keep it. The PoC kept such statements in an in-memory map inside the store and handed the body out once on the propagation pull, so nothing downstream could fetch it by hash again, and a copy redelivered after the pull was admitted and forwarded anew. Transient statements now go through the normal admission and are swept on maintenance once propagated, like explicit-only statements already are. Node-side only, no API changes, no effect with the v2 DHT gate off. - `explicit_only` and the PoC `transient` map become one `retention_tracks` map of hash to `RetentionTrack`, and `sweep_explicit_affinity` becomes `sweep_retention`: the resolver's verdict becomes the track, a verdict of Transient removes the statement. - Removal bans re-acceptance for a transient statement, so a redelivery cannot start another forwarding round, and keeps allowing it for a lapsed explicit-only one. - Deleted: the transient branch in `submit`, the body hand-out in `take_recent_statements`, the `u64::MAX` sequence sentinel. - Transient statements take the per-account quota like any other statement and are visible to the query API until swept. A transient statement admitted within the sweep window before a restart reloads untracked and stays until expiry, the same in-memory limit explicit-only tracking already has. - The zombienet v2 DHT tests told a replica from a non-replica by whether the node stored a probe right after submit. They now wait for the sweep to remove the non-replica's copy. - Files: substrate/client/statement-store/src/lib.rs, substrate/client/network/statement/src/v2dht/mod.rs (docs), cumulus/zombienet/zombienet-sdk/tests/zombie_ci/statement_store/. commit 0bb78dd2572695b8a797ee6b29f7c1c701cdc5d5 Author: Marios <marios@parity.io> Date: Wed Sep 16 14:01:25 2026 +0000 More v3 candidates zombienet-sdk tests (#12743) Coverage of #12164 Scenario 1: added in existing test: `v3_rolling_upgrade` Scenario 2/3: covered in #12695 Scenario 4: v3_old_validator_dispute_storm.rs Scenario 5: manual test Scenario 6: parameter changes added to doesnt_break_parachains_test **NOTE** v3_old_validator_dispute_storm is expensive to add it in CI. Added here to run it manually while its still relevant --------- Co-authored-by: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> commit 618071368d69f663c167e66d775c654d08088da5 Author: Egor_P <egor@parity.io> Date: Wed Sep 16 11:10:10 2026 +0000 Version bumps and prdocs reordering from release stable2606-2 (#13228) This PR backports regular prdcos reordering and version bumps from release branch stable2606 back to master --------- Co-authored-by: ParityReleases <release-team@parity.io> commit c5b3121ccc4f35a8391e8d515f63e3e9ac82b201 Author: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed Sep 16 07:27:41 2026 +0000 litep2p/req-resp: fix inbound request serve time reporting (#13097) The litep2p backend reported a near-zero serve time in the `substrate_sub_libp2p_requests_in_success_total` histogram for inbound requests. The timestamp paired with a pending inbound request was evaluated only after the response was ready (`Instant::now()` after awaiting the response channel), so the reported duration covered just the response hand-off to the transport instead of the actual time spent serving the request. - Stamp the start time when the request arrives, matching the libp2p backend, so the reported serve time covers the time the request spends queued and being processed by the handler. - Add a regression test (`inbound_request_serve_time_includes_handler_time`) which delays the response in the request handler and asserts the recorded serve time covers that delay. The test fails against the previous behavior. The analogous outbound metric (`requests_out_success_total`) already stamps on send and is unaffected. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 576ec2a144c29d294c0cc190f7c4cb3849221113 Author: Luka Ciric <luka.ciric2106@gmail.com> Date: Tue Sep 15 20:05:54 2026 +0000 Registrar: lock and unlock (#13060) Closes #12817 Moves the manager lock onto the CT chain. Everything here is CT-side; no relay leg. - `registrar-para::add_lock`: shuts the manager out of a registered para. Callable by the manager, the para itself (new `ParachainOrigin` config item), or root. Emits `ParaLocked`. - `registrar-para::remove_lock`: lifts it again, for root or the para itself only — a lock the manager could lift would not be a lock. Emits `ParaUnlocked`. - `ParaInfo.locked`, enforced through a new `ensure_root_para_or_manager` helper: a locked para refuses the manager and still answers to root and to itself, matching `ensure_root_para_or_owner` today. Change made from original RC flow Manager lock was triggered when parachain produced first block and PVF verified it. Now it's triggered to lock when parachain gets assigned first core on CT. Now as before lock is triggered on same `OnNewHead` hook for parachain head production. Difference is that now RC XCMs change to CT when needed. Storage `AwaitingFirstHead` on RC is filled when para registers and awaits for first block to be produced. After XCM this storage will remove para id key and won't trigger lock for every block. Migration of the lock for each para will be just copying state to `pallet-registrar-para` from `paras-registrar` and newly registered parachains won't be needed any new migration after. --------- Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com> commit 50047cb3b75f62307f2a44b0fcebe8ce4b70273f Author: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Date: Tue Sep 15 17:56:50 2026 +0000 statement-store: replica fanout (#13154) On the v2 DHT path a statement never reaches all of its K replicas. `routing_targets` caps the whole forwarding list at `gossip_target`, and since it always picks the topic-closest peers, every holder selects the same nodes and forwarding closes over `gossip_target + 1` of them: with K=8 and gossip-target=3 a statement is stored on 4 nodes instead of 8. The configured `replication_factor` has no effect on durability. The fix: every connected replica of the topic is always a forwarding target; the `gossip_target` cap applies only to routing peers (those closer to the topic than the local node). Only affects nodes running with `STATEMENT_STORE_V2_DHT_ENABLED=1`. Verified on a 100-node zombienet: 4/8 replicas before, 8/8 after, zero extra holders in both cases - full test report in the comment below. Closes #13189. commit 4ad1aa893b6c7697b3292396ca08f591aea77537 Author: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> Date: Tue Sep 15 14:57:42 2026 +0000 cumulus: use slot timer's slot to determine the scheduling parent (#13165) A V3 candidate takes its scheduling parent by walking back from the relay chain best block until a slot older than the one being produced for. That walk read the wall clock a second time to decide which slot that was. The slot timer wakes 2ms before the slot it reports begins, so the second read still returned the previous slot. The walk then stepped one block too far back, anchoring the candidate at an older relay block than the slot intended. The production slot is now passed down from the slot timer and used as the only source of truth for the walk. --------- Signed-off-by: Iulian Barbu <iulian.barbu@parity.io> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: Alexandru Cihodaru <alexandru.cihodaru@parity.io> commit a0fae9d44617843c51674469a1bc04dd4f884111 Author: Nasihudeen Jimoh <nasihudeen04@gmail.com> Date: Tue Sep 15 11:54:42 2026 +0000 core-fellowship: avoid panic on undersized Params salary/period vectors (#13182) `Pallet::get_salary` computed an index from the member's rank and then indexed the `active_salary `or `passive_salary` vector directly. The bump and promote calls did the same thing to `demotion_period `and `min_promotion_period`. All four of these vectors are BoundedVec fields bounded only by MaxRank, so a privileged set_params call is free to store a shorter vector, including the empty default. Once that happens, any of these three call sites panics for a member whose rank sits past the end of the stored vector, which traps the extrinsic instead of failing gracefully. This changes all three sites to look up the index with get and fall back to the type's default when the entry is missing, so a rank past the end of the vector now degrades to zero salary, a zero demotion period or a zero minimum promotion period, the same way the pallet already treats rank 0 and untracked members. No panic path remains. Added three unit tests that configure an undersized vector for each of the three call sites and assert the graceful fallback instead of a panic. Closes #13141 --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: muharem <ismailov.m.h@gmail.com> commit a3aadb19fd9d7a5176371fe34adfea30e3152c1d Author: Andrei Eres <eresav@me.com> Date: Tue Sep 15 11:40:05 2026 +0000 statement gossip: schedule initial sync only after affinity filter arrived (#13058) Closes #12558. With the v2 DHT path enabled, a V2 peer receives no statements until its affinity filter arrives. Both sides already send their filter as the first message on connect. Initial sync now waits for that filter and replays only matching stored statements through the existing sync cursor. Node-side only, no API changes. Behavior changes only with `STATEMENT_STORE_V2_DHT_ENABLED=1`. Without the flag, V2 full peers keep syncing immediately on connect. - `Peer::can_receive()` now also holds back any V2 peer without topic affinity when `v2dht_enabled()`. All three call sites (connect-time sync, outbox propagation, targeted sends) get the gate through it. - Statements skipped while the filter is in flight are not lost: `process_pending_affinities` schedules a full journal replay once the filter arrives. - Initial sync also serves statements outside the peer's filter when the peer is a DHT routing target for one of their topics. Light peers get filter matches only. The per-topic routing check is memoized for the duration of one chunk. - Removed a stale TODO in the pending-affinities tick — `process_pending_affinities` already serves the backlog it described. - New test: `initial_sync_serves_dht_targeted_statements_outside_the_explicit_filter`. The gate-on branch of `can_receive` is unreachable from unit tests: the env var is read once per process. - Files: `substrate/client/network/statement/src/lib.rs`, `substrate/client/network/statement/src/v2dht/mod.rs`. --------- Signed-off-by: Adrian Catangiu <adrian@parity.io> Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Signed-off-by: Tomasz Bartos <tomasz.bartos@iohk.io> Signed-off-by: Iulian Barbu <iulian.barbu@parity.io> Signed-off-by: Alexandru Gheorghe <alexandru.gheorghe@parity.io> Signed-off-by: Andrei Sandu <andrei-mihail@parity.io> Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Co-authored-by: Javier Viola <363911+pepoviola@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: PG Herveou <pgherveou@gmail.com> Co-authored-by: dharjeezy <dharjeezy@gmail.com> Co-authored-by: Adrian Catangiu <adrian@parity.io> Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Co-authored-by: Nasihudeen Jimoh <nasihudeen04@gmail.com> Co-authored-by: muharem <ismailov.m.h@gmail.com> Co-authored-by: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Co-authored-by: eskimor <jfanatiker@gmx.at> Co-authored-by: Davide Galassi <davxy@datawok.net> Co-authored-by: drskalman <35698397+drskalman@users.noreply.github.com> Co-authored-by: Paolo La Camera <paolo@parity.io> Co-authored-by: Egor_P <egor@parity.io> Co-authored-by: Sebastian Kunert <mail@skunert.dev> Co-authored-by: Ludovic Domingues <ludovic.domingues96@gmail.com> Co-authored-by: Branislav Kontur <bkontur@gmail.com> Co-authored-by: Serban Iorga <serban@parity.io> Co-authored-by: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> Co-authored-by: Klapeyron <11329616+Klapeyron@users.noreply.github.com> Co-authored-by: Serban Iorga <serban300@gmail.com> Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io> Co-authored-by: Ross Bulat <ross@jkrb.io> Co-authored-by: Milos Kriz <82968568+miloskriz@users.noreply.github.com> Co-authored-by: eskimor <robert@gonimo.com> Co-authored-by: eskimor <eskimor@noreply.com> Co-authored-by: Marios <marios@parity.io> Co-authored-by: Alin Dima <alin@parity.io> Co-authored-by: Rodrigo Quelhas <22591718+RomarQ@users.noreply.github.com> Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com> Co-authored-by: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com> Co-authored-by: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Co-authored-by: eskimor <1527017+eskimor@users.noreply.github.com> Co-authored-by: Andrei <54316454+sandreim@users.noreply.github.com> Co-authored-by: Javier Viola <javier@parity.io> Co-authored-by: Luka Ciric <luka.ciric2106@gmail.com> Co-authored-by: Ankan <ankan.anurag@gmail.com> Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Co-authored-by: Francisco Aguirre <franciscoaguirreperez@gmail.com> Co-authored-by: Omar <OmarAbdulla7@hotmail.com> Co-authored-by: Kirill <pisarevkir@gmail.com> Co-authored-by: 0xRVE <robertvaneerdewijk@gmail.com> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com> Co-authored-by: gab <79002163+gab8i@users.noreply.github.com> Co-authored-by: s0me0ne-unkn0wn <48632512+s0me0ne-unkn0wn@users.noreply.github.com> Co-authored-by: ron <yrong1997@gmail.com> Co-authored-by: Marian Radu <marian@parity.io> Co-authored-by: Nathaniel Bajo <73991674+Nathy-bajo@users.noreply.github.com> Co-authored-by: mertwole <mertwole@gmail.com> Co-authored-by: Andrei Trandafir <142614787+andreitrand@users.noreply.github.com> Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> Co-authored-by: jessechejieh <dev@jessechejieh.com> commit f18d8ce7f64e9663a755aae8cd9886523f15e9f4 Author: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Date: Tue Sep 15 10:04:29 2026 +0000 ci: rm oldlinux runners (#13221) cc https://github.com/paritytech/devops/issues/5661 commit 05012874d3cf379178218300a8b0ad7be6b18bf5 Author: Andrei Eres <eresav@me.com> Date: Tue Sep 15 09:23:42 2026 +0000 statement network: score peers by behaviour to steer disconnects (#12580) Closes #12552. Adds a dumb per-peer score to the v2 DHT peer steering so disconnections drop the worst-behaved peers first, not the longest-connected. Each connected peer carries a score, reset when its substream closes. It moves only on the peer's own actions: * **+1** — a valid statement (`New` or `Known`). * **-50** — a fault: `Invalid` statement, duplicate, or undecodable message. * **0** — our-side outcomes (`KnownExpired`, `Rejected`, `InternalError`), which aren't the peer's fault. The penalty outweighs the reward on purpose, mirroring the v1 reputation system: one fault sinks a peer below anything it earned by behaving. The weights are a first cut, not a tuned reputation model. `peers_to_disconnect` orders undesired peers by score ascending, connection age breaking ties. Everything stays behind `v2dht_enabled()`, so production behaviour is unchanged. --------- Signed-off-by: Adrian Catangiu <adrian@parity.io> Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Signed-off-by: Tomasz Bartos <tomasz.bartos@iohk.io> Signed-off-by: Iulian Barbu <iulian.barbu@parity.io> Signed-off-by: Alexandru Gheorghe <alexandru.gheorghe@parity.io> Signed-off-by: Andrei Sandu <andrei-mihail@parity.io> Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Co-authored-by: Javier Viola <363911+pepoviola@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: PG Herveou <pgherveou@gmail.com> Co-authored-by: dharjeezy <dharjeezy@gmail.com> Co-authored-by: Adrian Catangiu <adrian@parity.io> Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Co-authored-by: Nasihudeen Jimoh <nasihudeen04@gmail.com> Co-authored-by: muharem <ismailov.m.h@gmail.com> Co-authored-by: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Co-authored-by: eskimor <jfanatiker@gmx.at> Co-authored-by: Davide Galassi <davxy@datawok.net> Co-authored-by: drskalman <35698397+drskalman@users.noreply.github.com> Co-authored-by: Paolo La Camera <paolo@parity.io> Co-authored-by: Egor_P <egor@parity.io> Co-authored-by: Sebastian Kunert <mail@skunert.dev> Co-authored-by: Ludovic Domingues <ludovic.domingues96@gmail.com> Co-authored-by: Branislav Kontur <bkontur@gmail.com> Co-authored-by: Serban Iorga <serban@parity.io> Co-authored-by: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> Co-authored-by: Klapeyron <11329616+Klapeyron@users.noreply.github.com> Co-authored-by: Serban Iorga <serban300@gmail.com> Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io> Co-authored-by: Ross Bulat <ross@jkrb.io> Co-authored-by: Milos Kriz <82968568+miloskriz@users.noreply.github.com> Co-authored-by: eskimor <robert@gonimo.com> Co-authored-by: eskimor <eskimor@noreply.com> Co-authored-by: Marios <marios@parity.io> Co-authored-by: Alin Dima <alin@parity.io> Co-authored-by: Rodrigo Quelhas <22591718+RomarQ@users.noreply.github.com> Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com> Co-authored-by: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com> Co-authored-by: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Co-authored-by: eskimor <1527017+eskimor@users.noreply.github.com> Co-authored-by: Andrei <54316454+sandreim@users.noreply.github.com> Co-authored-by: Javier Viola <javier@parity.io> Co-authored-by: Luka Ciric <luka.ciric2106@gmail.com> Co-authored-by: Ankan <ankan.anurag@gmail.com> Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Co-authored-by: Francisco Aguirre <franciscoaguirreperez@gmail.com> Co-authored-by: Omar <OmarAbdulla7@hotmail.com> Co-authored-by: Kirill <pisarevkir@gmail.com> Co-authored-by: 0xRVE <robertvaneerdewijk@gmail.com> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com> Co-authored-by: gab <79002163+gab8i@users.noreply.github.com> Co-authored-by: s0me0ne-unkn0wn <48632512+s0me0ne-unkn0wn@users.noreply.github.com> Co-authored-by: ron <yrong1997@gmail.com> Co-authored-by: Marian Radu <marian@parity.io> Co-authored-by: Nathaniel Bajo <73991674+Nathy-bajo@users.noreply.github.com> Co-authored-by: mertwole <mertwole@gmail.com> Co-authored-by: Andrei Trandafir <142614787+andreitrand@users.noreply.github.com> Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> Co-authored-by: jessechejieh <dev@jessechejieh.com> commit c0fa7aba504f8d6d55ca48de85bf869a2120ff44 Author: Serban Iorga <serban@parity.io> Date: Tue Sep 15 08:09:31 2026 +0000 [XCMP/HRMP] Retry some types of pages (#12638) Retry: - XcmpMessageFormat::Signals pages - XcmpMessageFormat::ConcatenatedOpaqueVersionedXcm pages --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 9769d37ca6cf296624956f7482dae96b875f4f1e Author: Diego <diego2737@gmail.com> Date: Mon Sep 14 18:26:09 2026 +0000 network: Move the connected peers metric to the sync component (#12979) Closes #5024 `substrate_sub_libp2p_peers_count` was registered by `sc-network`, sourced from an `Arc<AtomicUsize>` that each backend kept updated purely so that metric could be published: - the libp2p backend stored `user_protocol().num_sync_peers()` into it on every worker poll (`service.rs`), - the litep2p backend stored the block-announce peerset's `connected_peers` into it on every loop iteration (`litep2p/mod.rs`). Both are syncing-level numbers, not networking ones — which is what @bkchr pointed out in https://github.com/paritytech/polkadot-sdk/pull/4942#discussion_r1669297505. This moves the gauge to `sc-network-sync`, where `SyncingEngine` already maintains an equivalent `num_connected` counter, and drops `connected_peers` from `sc-network`'s `MetricSources`. The metric keeps its name. The gauge is now registered by `Metrics::register` in `sc-network-sync`'s `engine.rs`, next to `MajorSyncingGauge`, and fed the `num_connected` counter the engine already owns: ```diff impl Metrics { - fn register(r: &Registry, major_syncing: Arc<AtomicBool>) -> Result<Self, PrometheusError> { + fn register( + r: &Registry, + major_syncing: Arc<AtomicBool>, + num_connected: Arc<AtomicUsize>, + ) -> Result<Self, PrometheusError> { MajorSyncingGauge::register(r, major_syncing)?; + NumConnectedGauge::register(r, num_connected)?; ``` and correspondingly removed from `sc-network`: ```diff pub struct MetricSources { pub bandwidth: Arc<dyn BandwidthSink>, - pub connected_peers: Arc<AtomicUsize>, } ``` **Test.** Added `num_connected_gauge_tracks_the_shared_counter` in `engine.rs`, asserting the gauge registers under exactly `substrate_sub_libp2p_peers_count` and reads through to the live counter rather than a snapshot. Name stability is the whole contract of this change, so it seemed worth pinning. <details> <summary>Local verification</summary> - `cargo check -p sc-network -p sc-network-sync` — clean, no warnings - `cargo clippy -p sc-network -p sc-network-sync --all-targets` — no warnings in either crate - `cargo test -p sc-network-sync --lib` — 94 passed, 0 failed - `cargo +nightly fmt --check` — clean </details> The approach matches the earlier attempt in #11012, which was closed without review because its author never signed the CLA. --------- Co-authored-by: Bastian Köcher <git@kchr.de> commit 8ace06674a3e4a3d06c804a21cb24ea3392ca498 Author: Andrei Eres <eresav@me.com> Date: Mon Sep 14 16:56:14 2026 +0000 statement-store: rate-limit topic affinity updates per peer (#13196) Gives `ExplicitTopicAffinity` its own per-peer token bucket and reports `rep::AFFINITY_FLOODING` for updates past it. Until now an affinity update drew one token from the peer's statement bucket, 50k/s with a 250k burst, so a peer could push tens of thousands of 1 MiB filters per second unchecked, and a burst of its own statements could reject a legitimate filter change. Closes https://github.com/paritytech/polkadot-sdk/issues/12556. Node operators: no action. Two new constants in `sc-network-statement`: ```rust pub const AFFINITY_UPDATES_PER_SECOND: NonZeroU32 = 100; pub const AFFINITY_UPDATES_BURST: NonZeroU32 = AFFINITY_UPDATES_PER_SECOND * STATEMENTS_BURST_COEFFICIENT; // 500 ``` A peer past the limit keeps its connection, the extra update is dropped, reported, and counted by the new `substrate_sync_statement_affinity_flooding_detected` metric. - Handling an update costs a decode plus a map insert that replaces the peer's previous filter, and the filter itself is applied only at the next tick, so a queue drained in one poll is not abuse. The bucket is therefore loose: it exists to catch a runaway peer and to give peer scoring a signal, not to police the honest rate. The statement path already admits 50k notifications per second, so a much tighter affinity limit would buy no protection while risking false positives on a light client that changes its subscriptions. - The burst reuses `STATEMENTS_BURST_COEFFICIENT`, leaving the sustained rate as the only number chosen by hand. - `Peer` gains `affinity_rate_limiter`, built via `PeerRateLimiter::for_affinity_updates()` at every construction site. - New reputation constant so peer scoring has a signal to build on. - Test: `affinity_updates_are_rate_limited_per_peer`. - Files: `substrate/client/network/statement/src/{lib.rs,config.rs}`. commit c208ccc5d3dfa7f7c0f63af6014e4e9edd366392 Author: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Mon Sep 14 11:52:39 2026 +0000 asset-hub-westend: Remove PSM reset migration (#13137) Removes the `RemovePallet<Psm>` and `RemovePallet<Parameters>` migrations added in #12245 from the Westend Asset Hub runtime. Both already ran on Westend Asset Hub (spec 1_025_000). Since `RemovePallet` runs on every upgrade, leaving them in would wipe any PSM created from now on. commit 86f2e26675a0d5e1f1764d6eb2bc56ec3c1e445d Author: Serban Iorga <serban@parity.io> Date: Mon Sep 14 06:56:06 2026 +0000 [HRMP] Extend InboundMessageId for horizontal messages (#12876) [HRMP] Extend `InboundMessageId` for horizontal messages Make `InboundMessageId` more specific for horizontal messages, in order to cover possible corner cases. For example when a channel is force closed --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit e34add8b49d5ba0ad1e5acb694c3bd1a706aaa0e Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun Sep 13 20:40:12 2026 +0000 Bump wasmtime from 36.0.7 to 36.0.8 (#12013) Bumps [wasmtime](https://github.com/bytecodealliance/wasmtime) from 36.0.7 to 36.0.8. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/bytecodealliance/wasmtime/releases">wasmtime's releases</a>.</em></p> <blockquote> <h2>v36.0.8</h2> <h2>36.0.8</h2> <p>Released 2026-04-30.</p> <h3>Fixed</h3> <ul> <li>Panic when allocating a table exceeding the size of the host's address space. <a href="https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-p8xm-42r7-89xg">GHSA-p8xm-42r7-89xg</a></li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/bytecodealliance/wasmtime/blob/v36.0.8/RELEASES.md">wasmtime's changelog</a>.</em></p> <blockquote> <h2>36.0.8</h2> <p>Released 2026-04-30.</p> <h3>Fixed</h3> <ul> <li>Panic when allocating a table exceeding the size of the host's address space. <a href="https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-p8xm-42r7-89xg">GHSA-p8xm-42r7-89xg</a></li> </ul> <hr /> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/bytecodealliance/wasmtime/commit/332e8ad2374e78adba1127f725d6603a4a5f96f3"><code>332e8ad</code></a> Release Wasmtime 36.0.8 (<a href="https://redirect.github.com/bytecodealliance/wasmtime/issues/13239">#13239</a>)</li> <li><a href="https://github.com/bytecodealliance/wasmtime/commit/82baadae5f71f27f1d32090349316d27e8a5a9e1"><code>82baada</code></a> Fix panicking overflow when calculating table sizes (<a href="https://redirect.github.com/bytecodealliance/wasmtime/issues/13242">#13242</a>)</li> <li>See full diff in <a href="https://github.com/bytecodealliance/wasmtime/compare/v36.0.7...v36.0.8">compare view</a></li> </ul> </details> <br /> > **Note** > Automatic rebases have been disabled on this pull request as it has been open for over 30 days. Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 2869908b81d4645d1ee40ee5e0da4778df4536fb Author: Alexander Theißen <alex.theissen@me.com> Date: Sun Sep 13 20:38:09 2026 +0000 [pallet-revive] Enforce the storage deposit limit before recording the charge (#13039) `charge_deposit` recorded the charge first and, when the root meter's limit was exceeded, reset the whole meter before returning the error. The end-of-stack termination path discards that error on purpose: a termination that cannot complete is skipped rather than failing the call. As a result the reset dropped the storage charges already accumulated for the rest of the transaction, and the call committed its storage writes while reporting a zero storage deposit and taking no hold. This checks the limit before recording the charge, so a charge that would exceed the limit never mutates the meter. A termination whose deposit charge would exceed the limit is skipped as before, while the transaction's remaining storage charges stay in place and are held. `reset()` had no other caller and is removed. Adds a Solidity regression test that runs on both backends: a contract writes storage and terminates another contract in the same call under a deposit limit sized to the writes, and the writes must still be charged and held. commit b07bc46ed883db53dccf87bca8313608dcde170c Author: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> Date: Fri Sep 11 09:33:06 2026 +0000 cumulus: refactor slot based builder loop (#13163) First PR of a stack extracted from #12537 (resubmissions support). Refactor (no behavior change). `run_block_builder`'s monolithic loop is split into phases so later work can plug in per phase: - `BuilderEnv` groups the clients, caches, and per-task state; the loop body shrinks to prepare_slot → plan_cores → per-core build. - `prepare_slot` resolves everything for one slot iteration up to a successful slot claim, returned as `SlotContext`; `plan_cores` resolves the claim queue into a `CorePlan` (cores and per-core block counts). - Small extractions along the way: `SchedulingParams::at` and `ParentSearchParams::new` constructors, `included_header_at_execution` and `allowed_pov_size` helpers, `update_backing_connections` (which now logs a previously silent authorities() failure), `claim_queue_offset` and redundant header/hash fields dropped from the context structs. One behavior fix (second commit). The two-phase context derivation reuses the parent search result when the build parent's runtime disagrees with the para best's. If the search ran with V3 params and the re-derive settled on V2, the reused included_at_scheduling snapshot was taken at a V3 scheduling parent and could be stale for the V2 execution context. The V2 arm now re-fetches the included head at its relay parent in that case (search_ran_v3 flag); the reverse direction is expected/assumed to not occur, since a V3 → V2 parachain rollback is not supported, and the plan is to not end up needing it, by testing V3 parachains before recommending it officially. --------- Signed-off-by: Iulian Barbu <iulian.barbu@parity.io> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> commit 6f0ba62c939476a0ce28df549038e7b736f88f01 Author: Andrei Eres <eresav@me.com> Date: Fri Sep 11 07:54:18 2026 +0000 sc-network: register `out_events` metrics on the litep2p backend (#13191) The litep2p backend now passes the Prometheus registry into `OutChannels::new`, as the libp2p backend does, instead of `None`. This exposes `substrate_sub_libp2p_out_events_events_total` and `substrate_sub_libp2p_out_events_num_channels` on litep2p nodes. #12319 added the `PeerIdentified` and `PeerRoutingTableUpdate` events to every `event_stream`, and we want to see on the fleet that consumers unaware of them keep draining their channels. This PR should not be integrated by downstream projects. commit 597a9f04be6a06d6658b361812fd7cc4d5480026 Author: Andrei Eres <eresav@me.com> Date: Thu Sep 10 21:37:19 2026 +0000 statement-store: drop explicit-affine statements once affinity lapses (#13050) Statements persisted only for explicit topic affinity are now dropped once no affinity covers them — typically after the last matching RPC subscription ends. Configured-topic and DHT-affine statements stay untouched. Closes #12551. No action required. Internal `sc-statement-store` change: no public API or configuration changes. With the v2 DHT gate off no retention resolver is installed, so behavior is unchanged. - `QueryIndex.explicit_only` tracks hashes admitted with `EXPLICIT_AFFINITY` and without `DHT_AFFINITY` (`RetentionTrack::from(mask)`). Cleared on every removal path, empty after restart — restored statements persist until expiry, as before. - `sweep_explicit_affinity` runs at the start of `maintain()` (29s tick): re-runs the retention resolver over tracked hashes, removes statements whose current mask carries no persistent reason. - Statements still in `recent` — not yet taken by propagation — are exempt from the sweep, so a locally submitted statement is handed to propagation at least once before it can be dropped. - Removal passes `Resubmission::Allowed`, skipping the `EXPIRED` re-acceptance ban: dropped statements are valid, a returning subscription can pull them back from peers. Existing removal paths keep `Resubmission::Banned`. - Sweep is unbounded per tick; worst case is point reads for every stored statement. Possible follow-up: statement/time budget with a resume cursor, as in `check_expired`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Signed-off-by: Adrian Catangiu <adrian@parity.io> Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Signed-off-by: Tomasz Bartos <tomasz.bartos@iohk.io> Signed-off-by: Iulian Barbu <iulian.barbu@parity.io> Signed-off-by: Alexandru Gheorghe <alexandru.gheorghe@parity.io> Signed-off-by: Andrei Sandu <andrei-mihail@parity.io> Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Co-authored-by: Javier Viola <363911+pepoviola@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: PG Herveou <pgherveou@gmail.com> Co-authored-by: dharjeezy <dharjeezy@gmail.com> Co-authored-by: Adrian Catangiu <adrian@parity.io> Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Co-authored-by: Nasihudeen Jimoh <nasihudeen04@gmail.com> Co-authored-by: muharem <ismailov.m.h@gmail.com> Co-authored-by: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Co-authored-by: eskimor <jfanatiker@gmx.at> Co-authored-by: Davide Galassi <davxy@datawok.net> Co-authored-by: drskalman <35698397+drskalman@users.noreply.github.com> Co-authored-by: Paolo La Camera <paolo@parity.io> Co-authored-by: Egor_P <egor@parity.io> Co-authored-by: Sebastian Kunert <mail@skunert.dev> Co-authored-by: Ludovic Domingues <ludovic.domingues96@gmail.com> Co-authored-by: Branislav Kontur <bkontur@gmail.com> Co-authored-by: Serban Iorga <serban@parity.io> Co-authored-by: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> Co-authored-by: Klapeyron <11329616+Klapeyron@users.noreply.github.com> Co-authored-by: Serban Iorga <serban300@gmail.com> Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io> Co-authored-by: Ross Bulat <ross@jkrb.io> Co-authored-by: Milos Kriz <82968568+miloskriz@users.noreply.github.com> Co-authored-by: eskimor <robert@gonimo.com> Co-authored-by: eskimor <eskimor@noreply.com> Co-authored-by: Marios <marios@parity.io> Co-authored-by: Alin Dima <alin@parity.io> Co-authored-by: Rodrigo Quelhas <22591718+RomarQ@users.noreply.github.com> Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com> Co-authored-by: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com> Co-authored-by: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Co-authored-by: eskimor <1527017+eskimor@users.noreply.github.com> Co-authored-by: Andrei <54316454+sandreim@users.noreply.github.com> Co-authored-by: Javier Viola <javier@parity.io> Co-authored-by: Luka Ciric <luka.ciric2106@gmail.com> Co-authored-by: Ankan <ankan.anurag@gmail.com> Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Co-authored-by: Francisco Aguirre <franciscoaguirreperez@gmail.com> Co-authored-by: Omar <OmarAbdulla7@hotmail.com> Co-authored-by: Kirill <pisarevkir@gmail.com> Co-authored-by: 0xRVE <robertvaneerdewijk@gmail.com> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com> Co-authored-by: gab <79002163+gab8i@users.noreply.github.com> Co-authored-by: s0me0ne-unkn0wn <48632512+s0me0ne-unkn0wn@users.noreply.github.com> Co-authored-by: ron <yrong1997@gmail.com> Co-authored-by: Marian Radu <marian@parity.io> Co-authored-by: Nathaniel Bajo <73991674+Nathy-bajo@users.noreply.github.com> Co-authored-by: mertwole <mertwole@gmail.com> Co-authored-by: Andrei Trandafir <142614787+andreitrand@users.noreply.github.com> Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> Co-authored-by: jessechejieh <dev@jessechejieh.com> commit 6c487ab3c6c19c4f3f58b0a13ad9a848474e9d4c Author: Marian Radu <marian@parity.io> Date: Thu Sep 10 19:46:17 2026 +0000 rpc-server: set TCP_NODELAY on JSON-RPC connections (#12797) The JSON-RPC server never sets `TCP_NODELAY`, so [Nagle's algorithm](https://en.wikipedia.org/wiki/Nagle%27s_algorithm) stays enabled on every RPC socket. jsonrpsee sets the option in its own accept loop and defaults it to on, but that loop never runs: substrate accepts connections itself and hands jsonrpsee an already-accepted socket. CI runtime for `revive-differential-tests` rose to ~2 hours after the subxt 0.50 bump moved eth-rpc onto `chainHead`; the main cause is the latency between the messages a `chainHead` call sends. Set `TCP_NODELAY` on every accepted connection, restoring jsonrpsee's default for all nodes. Messages that would otherwise be coalesced are now sent separately, which can increase the number of emitted TCP packets. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 07fd6f90e4662a08293155c521d57d35483e0014 Author: Sebastian Kunert <mail@skunert.dev> Date: Thu Sep 10 18:34:42 2026 +0000 Gap-sync: Fix stall when tip sync causes `AncestorSearch` switch. (#13126) A best-block announcement on an unknown fork can switch a busy peer to ancestry search. Previously, replacing its request dropped the response future but left the old download reserved. That leftover Downloading marker could stall gap sync. Make cancellation explicit: the strategy releases the old work, then the engine drops the old response future before starting the replacement. Restart uses the same cancellation path, and `remove_obsolete` is removed. Encountered this gap sync problem while testing warp sync from time to time. Also fixes a stale GapSync marker that could be stuck in ChainSync if the client and ChainSync bookkeeping diverge. commit 1d4aa61cad9f4fd6340096417e1a722cb364a5c1 Author: Shawn Tabrizi <shawntabrizi@gmail.com> Date: Thu Sep 10 16:42:08 2026 +0000 Remove `pallet-scarcity` (#13161) Removes `pallet-scarcity`, added in #12730. The pallet was never part of a release and has moved to the `individuality-community` repository, where it continues development alongside the personhood pallets it depends on. - Delete `substrate/frame/scarcity/` - Drop the workspace member and dependency entries - Drop the `pallet-scarcity` feature, `std`/`try-runtime`/`runtime-benchmarks` propagation, and re-export from the `polkadot-sdk` umbrella crate - Remove the pallet and the `AsScarcity` transaction extension from the kitchensink runtime, node CLI, and `node-testing` - Remove the `AsScarcity` subxt config from the zombienet block-building test - Delete `prdoc/pr_12730.prdoc`, since the pallet never shipped (same approach as #10458 and #10459) - Bump the kitchensink `spec_version` This is a clean `git revert` of #12730 on top of current master, plus the spec version bump. Checked with `SKIP_WASM_BUILD=1 cargo check --locked` for `kitchensink-runtime`, `staging-node-cli`, `node-testing`, `substrate-zombienet-sdk-tests` (`zombie-ci`), and the umbrella crate (`runtime-full`). --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> commit e993420b81cbef53f469a2ea923117024ac71b55 Author: Xiliang Chen <xlchen1291@gmail.com> Date: Thu Sep 10 14:47:12 2026 +0000 bridge-grandpa: detect forced changes after other consensus logs (#13160) GRANDPA bridge headers containing forced authority changes could be accepted when another GRANDPA consensus log appeared first. Filter for forced changes inside the digest search so these headers are consistently rejected. No API changes or storage migration are required. commit ed5bfcff08358370771e1ffdc1523b42064a2b43 Author: Paolo La Camera <paolo@parity.io> Date: Thu Sep 10 14:29:43 2026 +0000 staking-async parachain and WAH genesis: fund DAP buffer as signed reward pot (#13166) and changed the winner payout from `mint_into` to a `Preservation::Preserve` transfer. Genesis funded that account with exactly ED, enough only to make it exist as a slash sink, so its spendable balance is zero and every payout fails into `UnpaidRewards`. Fund it above ED, sized in rounds of `RewardBase`. Same issue for Westend AH's genesis. Live WAH is unaffected, its buffer is funded and `BudgetAllocation` keeps it topped up. It only bites devnet and test chains spawned from genesis. Fix https://github.com/paritytech/polkadot-staking-miner/issues/1327 commit f2e0a17b994fe8d347e687ea75a526234c983a2b Author: Bastian Köcher <git@kchr.de> Date: Thu Sep 10 13:17:52 2026 +0000 Slot based: Ensure we do not build two blocks on the same relay parent (#13043) The collator protocol would silently drop such a block and let the parachain get stuck for some time. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit c68155d0a5d493e7428d309d759a3f5d3f366502 Author: Sebastian Kunert <mail@skunert.dev> Date: Thu Sep 10 10:06:35 2026 +0000 Gap-sync: Reset duplicate request counter after some time (#13131) Duplicate request counters never expired, so legitimate retries after sync restarts could leave peers permanently refused and repeatedly banned. Reset the counters after 60 seconds and replace fatal duplicate-request penalties with a smaller penalty in both block and state request handlers. A concrete occurence of this issue that we saw recently on a westend RPC node: 1. Westend Coretime RPC nodes had a one-block history gap. 2. Tip sync hit “Potential long-range attack” import errors, triggering sync restarts and repeated gap requests. 3. Those retries exhausted the duplicate-request allowance on the only two reachable peers, the collators. 4. The collators refused further requests and fatally penalized the RPC nodes. 5. After each ban expired, the nodes reconnected, retried, and were banned again. The counters never reset, leaving gap sync stuck. Issues like this seem to come up in the past too (https://github.com/paritytech/polkadot-sdk/issues/8990, https://github.com/paritytech/polkadot-sdk/issues/9165), with no real resolution. I think this here would solve most of the problems. If in doubt, we could also increase the timer to 3 or 4 minutes. commit 8433a78bb6db387dd2af057cc58eeb980c0b2dc5 Author: html//stephlou <141152972+Stephenlawrence00@users.noreply.github.com> Date: Thu Sep 10 08:41:39 2026 +0000 pallet-accumulate-and-forward: measure the transfer period from the last forward (#13153) `on_idle` now records the block of the last forwarding attempt and forwards once `now - last >= TransferPeriod`, instead of requiring an exact multiple of `TransferPeriod`, which a parachain reading the relay chain block number can miss indefinitely. Closes #13149 --------- Co-authored-by: Luka Ciric <luka.ciric2106@gmail.com> commit 9c4d3c4871f8c04b00c80451e5e03201724ab0ab Author: Andrei Eres <eresav@me.com> Date: Wed Sep 9 20:56:00 2026 +0000 statement-store: Source the bloom false-positive rate and seed from CLI (#13049) Closes #12555. Adds two hidden CLI flags to set the parameters of the topic-affinity bloom filter: `--statement-bloom-false-positive-rate` and `--statement-bloom-seed`. Before, the rate was hardcoded to 0.01 and the seed was always random. The default rate is now 0.001; the seed still defaults to a random value per node. New flags on the substrate node and omni-node, relevant only with `--enable-statement-store` on the v2 DHT path. `sc_statement_store::Config` gets two new fields: ```diff sc_statement_store::Config { ... affinity_topics, + bloom_false_pos_rate: sc_statement_store::DEFAULT_BLOOM_FALSE_POS_RATE, + bloom_seed: None, replication_factor, ... } ``` `StatementHandlerPrototype::build` takes the two values as new arguments. `bloom_seed: None` means a random seed per node, as before. - Values flow CLI → `sc_statement_store::Config` → `build()` → `ExplicitAffinity`, same as `affinity_topics`. - `Config::validate` rejects a rate below `DEFAULT_BLOOM_FALSE_POS_RATE` (0.001) or at 1 and above. The default doubles as the floor: lower rates inflate the filter's size and hash count toward the wire limits peers enforce at decode, so a too-low rate would make every peer silently reject the advertised filter. - Resolves the two TODOs in `affinity.rs` and `explicit_affinity.rs`. - Key files: `substrate/client/network/statement/src/{affinity,config,lib}.rs`, `v2dht/explicit_affinity.rs`, `substrate/client/statement-store/src/lib.rs`, both `cli.rs` files. --------- Signed-off-by: Adrian Catangiu <adrian@parity.io> Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Signed-off-by: Tomasz Bartos <tomasz.bartos@iohk.io> Signed-off-by: Iulian Barbu <iulian.barbu@parity.io> Signed-off-by: Alexandru Gheorghe <alexandru.gheorghe@parity.io> Signed-off-by: Andrei Sandu <andrei-mihail@parity.io> Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Co-authored-by: Javier Viola <363911+pepoviola@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: PG Herveou <pgherveou@gmail.com> Co-authored-by: dharjeezy <dharjeezy@gmail.com> Co-authored-by: Adrian Catangiu <adrian@parity.io> Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Co-authored-by: Nasihudeen Jimoh <nasihudeen04@gmail.com> Co-authored-by: muharem <ismailov.m.h@gmail.com> Co-authored-by: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Co-authored-by: eskimor <jfanatiker@gmx.at> Co-authored-by: Davide Galassi <davxy@datawok.net> Co-authored-by: drskalman <35698397+drskalman@users.noreply.github.com> Co-authored-by: Paolo La Camera <paolo@parity.io> Co-authored-by: Egor_P <egor@parity.io> Co-authored-by: Sebastian Kunert <mail@skunert.dev> Co-authored-by: Ludovic Domingues <ludovic.domingues96@gmail.com> Co-authored-by: Branislav Kontur <bkontur@gmail.com> Co-authored-by: Serban Iorga <serban@parity.io> Co-authored-by: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> Co-authored-by: Klapeyron <11329616+Klapeyron@users.noreply.github.com> Co-authored-by: Serban Iorga <serban300@gmail.com> Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io> Co-authored-by: Ross Bulat <ross@jkrb.io> Co-authored-by: Milos Kriz <82968568+miloskriz@users.noreply.github.com> Co-authored-by: eskimor <robert@gonimo.com> Co-authored-by: eskimor <eskimor@noreply.com> Co-authored-by: Marios <marios@parity.io> Co-authored-by: Alin Dima <alin@parity.io> Co-authored-by: Rodrigo Quelhas <22591718+RomarQ@users.noreply.github.com> Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com> Co-authored-by: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com> Co-authored-by: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Co-authored-by: eskimor <1527017+eskimor@users.noreply.github.com> Co-authored-by: Andrei <54316454+sandreim@users.noreply.github.com> Co-authored-by: Javier Viola <javier@parity.io> Co-authored-by: Luka Ciric <luka.ciric2106@gmail.com> Co-authored-by: Ankan <ankan.anurag@gmail.com> Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Co-authored-by: Francisco Aguirre <franciscoaguirreperez@gmail.com> Co-authored-by: Omar <OmarAbdulla7@hotmail.com> Co-authored-by: Kirill <pisarevkir@gmail.com> Co-authored-by: 0xRVE <robertvaneerdewijk@gmail.com> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com> Co-authored-by: gab <79002163+gab8i@users.noreply.github.com> Co-authored-by: s0me0ne-unkn0wn <48632512+s0me0ne-unkn0wn@users.noreply.github.com> Co-authored-by: ron <yrong1997@gmail.com> Co-authored-by: Marian Radu <marian@parity.io> Co-authored-by: Nathaniel Bajo <73991674+Nathy-bajo@users.noreply.github.com> Co-authored-by: mertwole <mertwole@gmail.com> Co-authored-by: Andrei Trandafir <142614787+andreitrand@users.noreply.github.com> Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> Co-authored-by: jessechejieh <dev@jessechejieh.com> commit 22ea3e610ac1ace53bace4ba1aeee57e40b5360f Author: html//stephlou <141152972+Stephenlawrence00@users.noreply.github.com> Date: Wed Sep 9 15:44:14 2026 +0000 [EPMB] Add configurable reward source and slash destination to signed phase (#12843) Fixes #12813 Introduces `type RewardSource` (pay rewards from a pot account instead of minting) and `type Slash` (route slashed deposits to a handler instead of burning) to `pallet-election-provider-multi-block::signed::Config`, keeping `TotalIssuance` reconcilable with the DAP emission curve on Asset Hub. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Paolo La Camera <paolo@parity.io> commit 238533bc0dbf8261b6ad1da2282e5ab239fad82c Author: Davide Galassi <davxy@datawok.net> Date: Wed Sep 9 15:02:31 2026 +0000 keyring: fix stale bandersnatch static public keys (#13042) Fixes the pre-existing `sp-keyring` bandersnatch test failures reported in https://github.com/paritytech/polkadot-sdk/pull/12888#pullrequestreview-5021480123 The latest draft of the bandersnatch VRF spec (https://github.com/davxy/bandersnatch-vrf-spec) was reviewed by the Parity research team. The last revision changed some details of the scheme, including the key derivation method. This made the static public key table in `sp-keyring` stale. The tests are behind the `bandersnatch-experimental` feature, so CI never caught it. commit 8f373a27893b7140cc3cbf47ba5feed5e07a47ea Author: Adrian Catangiu <adrian@parity.io> Date: Wed Sep 9 14:54:52 2026 +0000 [RWF] A batch of fixes for issues 12903->12916 reported through the Runtime Whitebox Fuzzer (#13001) A batch of fixes to issues reported through the Runtime Whitebox Fuzzer. Fixes https://github.com/paritytech/polkadot-sdk/issues/12903 Fixes https://github.com/paritytech/polkadot-sdk/issues/12904 Fixes https://github.com/paritytech/polkadot-sdk/issues/12905 Fixes https://github.com/paritytech/polkadot-sdk/issues/12906 Fixes https://github.com/paritytech/polkadot-sdk/issues/12907 Fixes https://github.com/paritytech/polkadot-sdk/issues/12908 Fixes https://github.com/paritytech/polkadot-sdk/issues/12909 Fixes https://github.com/paritytech/polkadot-sdk/issues/12910 Fixes https://github.com/paritytech/polkadot-sdk/issues/12911 Fixes https://github.com/paritytech/polkadot-sdk/issues/12912 Fixes https://github.com/paritytech/polkadot-sdk/issues/12913 Fixes https://github.com/paritytech/polkadot-sdk/issues/12914 Fixes https://github.com/paritytech/polkadot-sdk/issues/12915 Fixes https://github.com/paritytech/polkadot-sdk/issues/12916 **dispute-coordinator: conclude cleanly before the first leaf** Fixed an issue where `dispute-coordinator` failed to shut down cleanly when receiving a `Conclude` signal before its first active leaf arrived. `initialize` now returns on `Conclude`, allowing the subsystem to exit cleanly. **ranked-collective: widen vote-weight arithmetic to avoid rank overflow** Widened intermediate calculations in `pallet-ranked-collective` to `u64` for `Linear` and `Geometric` vote-weight converters as well as `Tally::approval`. This prevents integer overflows when calculating vote weights or tally approval at `Rank::MAX` or with maxed votes. **derivatives: emit DerivativeMappingCreated on registration** `pallet-derivatives` now correctly emits `DerivativeMappingCreated` when registering a derivative mapping, rather than duplicating `DerivativeCreated`. The `DerivativeCreated` event is now only emitted once upon derivative creation. **nft-fractionalization: finish destroying the asset on unify** `pallet-nft-fractionalization::unify` now attempts to finish destroying the fractional asset upon unification, cleaning up asset metadata and freeing reserved deposits on the pallet account. If open accounts or approvals prevent immediate destruction, the asset remains in the destroying state without failing the `unify` call. **scheduler: set_retry rejects named tasks** `pallet_scheduler::set_retry` now rejects named tasks with `Error::Named`. Callers must use `set_retry_named` to configure retries for named tasks, ensuring the task ID is properly included in emitted events. Existing retry configurations and `cancel_retry` remain unaffected. **sc-consensus-slots: cap proposing duration on every path** `sc_consensus_slots::proposing_remaining_duration` now enforces the `max_block_proposal_slot_portion` cap across all execution paths, not only when slot lenience is applied. **chain-selection: saturating prune cutoff in `PruneOnly` mode** The chain selection subsystem now uses saturating subtraction when calculating the prune cutoff timestamp in `PruneOnly` mode, preventing underflow if the clock is behind the prune delay. **cumulus-primitives-timestamp: saturating relay-slot arithmetic** `cumulus_primitives_timestamp::InherentDataProvider::provide_inherent_data` now uses saturating arithmetic for slot and timestamp calculations, avoiding panics and integer overflows on large inputs. **conviction-voting: make `Tally::add`/`remove` all-or-nothing** `pallet-conviction-voting`'s `Tally::add` and `Tally::remove` now compute all field updates before applying them. If an arithmetic overflow or underflow occurs, the tally remains unmodified and returns `None`. **elections-phragmen: reject candidacies at the `MaxCandidates` limit** Fixed an off-by-one check in `pallet-elections-phragmen::submit_candidacy` that allowed one more candidate than `MaxCandidates`. It now properly rejects submissions when the limit is reached, returning `TooManyCandidates`. The corresponding benchmark component range was updated to `[0, MaxCandidates - 1]`. **collator-protocol: checked slot arithmetic in `is_scheduling_parent_valid`** Fixed an integer overflow in `is_scheduling_parent_valid` when calculating the next slot for a leaf with slot `u64::MAX`. Slot calculation now uses checked addition. --------- Signed-off-by: Adrian Catangiu <adrian@parity.io> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit acfa15e9a1d3be0a49b5aa0a7fc4a9d174d91496 Author: Dmitry Markin <dmitry@markin.tech> Date: Wed Sep 9 11:34:54 2026 +0000 WebRTC doc (#13095) The explanatory guide for node and chain operators. [Rendered](https://github.com/paritytech/polkadot-sdk/blob/dm-webrtc-doc/docs/sdk/src/guides/webrtc.md) commit 868d28e80ee217cd6a511e18c8ed0d56b19dd3a0 Author: Egor_P <egor@parity.io> Date: Wed Sep 9 10:50:49 2026 +0000 [Release|CI/CD] Fix runtimes publishing in the Create Draft flow (#13094) This PR fixes an issue in Publish Release Draft flow: `publish-runtimes` downloaded artifacts twice: the `release-notes-context` artifact of the current run (a leftover from before #9118, when the runtimes were built in this same flow) and, since #9118, the runtime artifacts of the build run. Error example: https://github.com/paritytech-release/polkadot-sdk/actions/runs/33851495289/job/100955705043#step:5:10 The build run's per-runtime artifacts contain the srtool digest next to the compressed wasm, so the first download is not needed at all. Now it is dropped and the digest are taken from the runtimes downloaded from the build run, which also fixes the `Get runtime info` path that still pointed at `release-notes-context/`. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> commit a01d49c4c36c192107563bcfe324344508375966 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed Sep 9 10:38:35 2026 +0000 Bump hickory-proto from 0.24.1 to 0.24.4 (#7935) Bumps [hickory-proto](https://github.com/hickory-dns/hickory-dns) from 0.24.1 to 0.24.4. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/hickory-dns/hickory-dns/releases">hickory-proto's releases</a>.</em></p> <blockquote> <h2>0.24.4</h2> <h2>What's Changed</h2> <ul> <li>[0.24] Use cargo environment variables for path to executable by <a href="https://github.com/msrd0"><code>@​msrd0</code></a> in <a href="https://redirect.github.com/hickory-dns/hickory-dns/pull/2773">hickory-dns/hickory-dns#2773</a></li> <li>[0.24] bump ring to 0.17.8 by <a href="https://github.com/drahnr"><code>@​drahnr</code></a> in <a href="https://redirect.github.com/hickory-dns/hickory-dns/pull/2759">hickory-dns/hickory-dns#2759</a></li> <li>Prepare 0.24.4 by <a href="https://github.com/djc"><code>@​djc</code></a> in <a href="https://redirect.github.com/hickory-dns/hickory-dns/pull/2784">hickory-dns/hickory-dns#2784</a></li> </ul> <h2>v0.24.3</h2> <h2>What's Changed</h2> <ul> <li>Fix tests on 0.24 release branch by <a href="https://github.com/divergentdave"><code>@​divergentdave</code></a> in <a href="https://redirect.github.com/hickory-dns/hickory-dns/pull/2752">hickory-dns/hickory-dns#2752</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/hickory-dns/hickory-dns/compare/v0.24.2...v0.24.3">https://github.com/hickory-dns/hickory-dns/compare/v0.24.2...v0.24.3</a></p> <h2>v0.24.2</h2> <h2>What's Changed</h2> <ul> <li>0.24: upgrade to idna 1 by <a href="https://github.com/djc"><code>@​djc</code></a> in <a href="https://redirect.github.com/hickory-dns/hickory-dns/pull/2664">hickory-dns/hickory-dns#2664</a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/hickory-dns/hickory-dns/commit/b00cc1052cf769250063005e9fa268519522778f"><code>b00cc10</code></a> Bump versions to 0.24.4</li> <li><a href="https://github.com/hickory-dns/hickory-dns/commit/653d03eb9e8afe994bf4dc011c924830c0beeeba"><code>653d03e</code></a> fix/test: use .1 ending of IP address in test, .0 will yield a different error</li> <li><a href="https://github.com/hickory-dns/hickory-dns/commit/5a5c9810458c4b0084050216b720c8c6fe02ffe9"><code>5a5c981</code></a> feat: add err log if not matching the expected kind</li> <li><a href="https://github.com/hickory-dns/hickory-dns/commit/321d53f8b69b74ee5627721114479c1c4438e875"><code>321d53f</code></a> chore/dependency(ring): bump to 0.17.8</li> <li><a href="https://github.com/hickory-dns/hickory-dns/commit/39bf9c824679b8e851623e78a07a1adce07ae50f"><code>39bf9c8</code></a> [0.24] Use cargo environment variables for path to executable (<a href="https://redirect.github.com/hickory-dns/hickory-dns/issues/2773">#2773</a>)</li> <li><a href="https://github.com/hickory-dns/hickory-dns/commit/7df98a4a5b8ec28969c2886f811425d824074f92"><code>7df98a4</code></a> Fix tests on 0.24 release branch (<a href="https://redirect.github.com/hickory-dns/hickory-dns/issues/2752">#2752</a>)</li> <li><a href="https://github.com/hickory-dns/hickory-dns/commit/fd25a74a9add698badf6975d6ef7b92fd78265bd"><code>fd25a74</code></a> Bump version to 0.24.3</li> <li><a href="https://github.com/hickory-dns/hickory-dns/commit/e118c6eec569f4340421f86ee0686714010c63e9"><code>e118c6e</code></a> Check RRSIG over DNSKEY RRset w/ authenticated key</li> <li><a href="https://github.com/hickory-dns/hickory-dns/commit/9cdb4845a5f3f1485cc0766ee56532d575d042d6"><code>9cdb484</code></a> Bump version to 0.24.2</li> <li><a href="https://github.com/hickory-dns/hickory-dns/commit/1b84e3acf6e5e9c1ee741da6fe60a00bae315bba"><code>1b84e3a</code></a> Upgrade h3 and h3-quinn to avoid instant</li> <li>Additional commits viewable in <a href="https://github.com/hickory-dns/hickory-dns/compare/v0.24.1...v0.24.4">compare view</a></li> </ul> </details> <br /> > **Note** > Automatic rebases have been disabled on this pull request as it has been open for over 30 days. Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit b41f345a99151bf933e39be0a23f23281a0a05fb Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed Sep 9 09:35:30 2026 +0000 Bump quinn-proto from 0.11.14 to 0.11.17 (#12738) Bumps [quinn-proto](https://github.com/quinn-rs/quinn) from 0.11.14 to 0.11.17. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/quinn-rs/quinn/releases">quinn-proto's releases</a>.</em></p> <blockquote> <h2>quinn-proto 0.11.17</h2> <p>This release fixes three remote memory exhaustion issues. See GHSA-qfwj-vfxf-92j2, GHSA-2hv7-gw8g-gpq5, and GHSA-hmxj-32vh-65vr for more details, and <a href="https://redirect.github.com/quinn-rs/quinn/pull/2789">quinn-rs/quinn#2789</a> for the fixes.</p> <h2>What's Changed</h2> <ul> <li>fix(ci): fix clippy lints by <a href="https://github.com/LesnyRumcajs"><code>@​LesnyRumcajs</code></a> in <a href="https://redirect.github.com/quinn-rs/quinn/pull/2752">quinn-rs/quinn#2752</a></li> <li>congestion: saturate CUBIC window increment to avoid overflow by <a href="https://github.com/LesnyRumcajs"><code>@​LesnyRumcajs</code></a> in <a href="https://redirect.github.com/quinn-rs/quinn/pull/2751">quinn-rs/quinn#2751</a></li> <li>0.11.x: Backport memory use fixes and prepare release by <a href="https://github.com/Ralith"><code>@​Ralith</code></a> in <a href="https://redirect.github.com/quinn-rs/quinn/pull/2790">quinn-rs/quinn#2790</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/quinn-rs/quinn/compare/quinn-proto-0.11.16...quinn-proto-0.11.17">https://github.com/quinn-rs/quinn/compare/quinn-proto-0.11.16...quinn-proto-0.11.17</a></p> <h2>quinn-proto-0.11.16</h2> <h2>What's Changed</h2> <ul> <li>0.11.x: upgrade dependencies by <a href="https://github.com/djc"><code>@​djc</code></a> in <a href="https://redirect.github.com/quinn-rs/quinn/pull/2707">quinn-rs/quinn#2707</a></li> </ul> <h2>quinn-proto 0.11.15, quinn 0.11.11</h2> <p>This release fixes a remote memory exhaustion issue in the quinn-proto <code>Assembler</code>. See <a href="https://github.com/quinn-rs/quinn/security/advisories/GHSA-4w2j-m93h-cj5j">https://github.com/quinn-rs/quinn/security/advisories/GHSA-4w2j-m93h-cj5j</a> for more details and <a href="https://redirect.github.com/quinn-rs/quinn/issues/2694">#2694</a> for the fix.</p> <p>Two sponsoring organizations participated in coordinated disclosure. If this is relevant to your organization, please contact us to keep support Quinn maintenance.</p> <h2>What's Changed</h2> <ul> <li>Prepare 0.11.x branch for release by <a href="https://github.com/djc"><code>@​djc</code></a> in <a href="https://redirect.github.com/quinn-rs/quinn/pull/2645">quinn-rs/quinn#2645</a></li> <li>Backport of <a href="https://redirect.github.com/quinn-rs/quinn/issues/2495">#2495</a> to 0.11.x by <a href="https://github.com/stablebits"><code>@​stablebits</code></a> in <a href="https://redirect.github.com/quinn-rs/quinn/pull/2674">quinn-rs/quinn#2674</a></li> <li>0.11.x backport | quinn-proto: drop Initials silently when saturated by <a href="https://github.com/stablebits"><code>@​stablebits</code></a> in <a href="https://redirect.github.com/quinn-rs/quinn/pull/2688">quinn-rs/quinn#2688</a></li> <li>Backport <a href="https://redirect.github.com/quinn-rs/quinn/issues/2677">#2677</a> to 0.11.x by <a href="https://github.com/syszery"><code>@​syszery</code></a> in <a href="https://redirect.github.com/quinn-rs/quinn/pull/2690">quinn-rs/quinn#2690</a></li> <li>congestion: avoid double-reducing CUBIC fast convergence (0.11.x) by <a href="https://github.com/0xdeafbeef"><code>@​0xdeafbeef</code></a> in <a href="https://redirect.github.com/quinn-rs/quinn/pull/2641">quinn-rs/quinn#2641</a></li> <li>proto: yield error on too many gaps in assembler by <a href="https://github.com/djc"><code>@​djc</code></a> in <a href="https://redirect.github.com/quinn-rs/quinn/pull/2694">quinn-rs/quinn#2694</a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/quinn-rs/quinn/commit/0343120eb7ccdd067a7e975613b96190c8562bf7"><code>0343120</code></a> proto: bump version to 0.11.17</li> <li><a href="https://github.com/quinn-rs/quinn/commit/d7bf3d0ca98678d4592d2342dc83bd85f0134cfd"><code>d7bf3d0</code></a> Limit total memory used to buffer outgoing datagrams</li> <li><a href="https://github.com/quinn-rs/quinn/commit/31ca5d2ac87acc6fd0a4d29c39424e1a2870d6d6"><code>31ca5d2</code></a> Limit total memory used to buffer incoming datagrams</li> <li><a href="https://github.com/quinn-rs/quinn/commit/3a78b60720fd293079f04c6009405dea15bb08cf"><code>3a78b60</code></a> Factor out DatagramBuffer for queues in either direction</li> <li><a href="https://github.com/quinn-rs/quinn/commit/b37ced30bdd18d81634af8616f73ae26a0232d7c"><code>b37ced3</code></a> proto: check limits when processing already retired CIDs</li> <li><a href="https://github.com/quinn-rs/quinn/commit/6a984b8d5f27bac35af551f839df65eb8c06c113"><code>6a984b8</code></a> proto: extract method for checking CID retirements</li> <li><a href="https://github.com/quinn-rs/quinn/commit/499dba8474c511e25277d8a5c05961ff09bb245d"><code>499dba8</code></a> proto: bound assembler chunk count regardless of over-allocation</li> <li><a href="https://github.com/quinn-rs/quinn/commit/33ce0c21de2100082983ab41a78b0347287fbb5f"><code>33ce0c2</code></a> congestion: saturate CUBIC window increment to avoid overflow</li> <li><a href="https://github.com/quinn-rs/quinn/commit/c8ad7e6cbef9225bdec2d48ed80a58d2f79e53f1"><code>c8ad7e6</code></a> fix(ci): fix clippy lints</li> <li><a href="https://github.com/quinn-rs/quinn/commit/a96949f6cd257c665f544626af4e8ce668a40b30"><code>a96949f</code></a> Take semver-compatible update for anyhow</li> <li>Additional commits viewable in <a href="https://github.com/quinn-rs/quinn/compare/quinn-proto-0.11.14...quinn-proto-0.11.17">compare view</a></li> </ul> </details> <br /> > **Note** > Automatic rebases have been disabled on this pull request as it has been open for over 30 days. Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 65e337ca02068ed79ba58e133a49208afa4d51c7 Author: Sebastian Kunert <mail@skunert.dev> Date: Wed Sep 9 09:16:06 2026 +0000 CI: Improve zombienet stability (#13019) Three small things bundled here: 1. Download of the binaries in `.github/zombienet-tests/zombienet_polkadot_tests.yml` could fail because of some connection reset during download that was not covered by the current `--retry` flag. Now retries on all errors. 2. Update zombienet to 0.4.16 to get [560](https://github.com/paritytech/zombienet-sdk/pull/560) 3. My tip sync zombienet was sometimes stumbling because the relay chain side was slow syncing. Now uses --relay-chain-rpc URL directly. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Javier Viola <363911+pepoviola@users.noreply.github.com> Co-authored-by: Javier Viola <javier@parity.io> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: Bastian Köcher <info@kchr.de> commit 2124c778df3a31dd3638684608951fa2ded15280 Author: Andrei Eres <eresav@me.com> Date: Tue Sep 8 18:04:55 2026 +0000 statement-store: land the gated v2 DHT-affinity path (#12319) Lands the statement-store DHT-affinity work: a v2 gossip path that routes statements to interested peers by topic affinity instead of flooding. Part of #11932, development continues on `master`. Off by default: dead code unless `STATEMENT_STORE_V2_DHT_ENABLED=1` is set. With the gate off, node behavior is unchanged. No action for node operators. Downstream API changes: - `sc_statement_store::Config` gains `affinity_topics`, `replication_factor`, `gossip_target`; no longer `Copy`. - `StatementHandlerPrototype::build()` takes the new config values and a `RetentionHandle`. - `sc_network::Event` gains `PeerRoutingTableUpdate` and `PeerIdentified` variants. New code (`sc-network-statement/src/v2dht/`) is gated and inert. Review effort belongs on changes to existing files: - `sc-network` emits the two new `Event` variants to all subscribers (litep2p backend only). - Store `submit()` consults a retention resolver, installed only under the gate; without it every submission persists as before. - Every v2 call site in `sc-network-statement/src/lib.rs` sits behind `v2dht_enabled()`. Gate invariants are documented in `substrate/client/network/statement/CLAUDE.md`. --------- Signed-off-by: Adrian Catangiu <adrian@parity.io> Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Signed-off-by: Tomasz Bartos <tomasz.bartos@iohk.io> Signed-off-by: Iulian Barbu <iulian.barbu@parity.io> Signed-off-by: Alexandru Gheorghe <alexandru.gheorghe@parity.io> Signed-off-by: Andrei Sandu <andrei-mihail@parity.io> Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Co-authored-by: Javier Viola <363911+pepoviola@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: PG Herveou <pgherveou@gmail.com> Co-authored-by: dharjeezy <dharjeezy@gmail.com> Co-authored-by: Adrian Catangiu <adrian@parity.io> Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Co-authored-by: Nasihudeen Jimoh <nasihudeen04@gmail.com> Co-authored-by: muharem <ismailov.m.h@gmail.com> Co-authored-by: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Co-authored-by: eskimor <jfanatiker@gmx.at> Co-authored-by: Davide Galassi <davxy@datawok.net> Co-authored-by: drskalman <35698397+drskalman@users.noreply.github.com> Co-authored-by: Paolo La Camera <paolo@parity.io> Co-authored-by: Egor_P <egor@parity.io> Co-authored-by: Sebastian Kunert <mail@skunert.dev> Co-authored-by: Ludovic Domingues <ludovic.domingues96@gmail.com> Co-authored-by: Branislav Kontur <bkontur@gmail.com> Co-authored-by: Serban Iorga <serban@parity.io> Co-authored-by: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> Co-authored-by: Klapeyron <11329616+Klapeyron@users.noreply.github.com> Co-authored-by: Serban Iorga <serban300@gmail.com> Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io> Co-authored-by: Ross Bulat <ross@jkrb.io> Co-authored-by: Milos Kriz <82968568+miloskriz@users.noreply.github.com> Co-authored-by: eskimor <robert@gonimo.com> Co-authored-by: eskimor <eskimor@noreply.com> Co-authored-by: Marios <marios@parity.io> Co-authored-by: Alin Dima <alin@parity.io> Co-authored-by: Rodrigo Quelhas <22591718+RomarQ@users.noreply.github.com> Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com> Co-authored-by: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com> Co-authored-by: DenzelPenzel <15388928+DenzelPenzel@users.noreply.github.com> Co-authored-by: eskimor <1527017+eskimor@users.noreply.github.com> Co-authored-by: Andrei <54316454+sandreim@users.noreply.github.com> Co-authored-by: Javier Viola <javier@parity.io> Co-authored-by: Luka Ciric <luka.ciric2106@gmail.com> Co-authored-by: Ankan <ankan.anurag@gmail.com> Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Co-authored-by: Francisco Aguirre <franciscoaguirreperez@gmail.com> Co-authored-by: Omar <OmarAbdulla7@hotmail.com> Co-authored-by: Kirill <pisarevkir@gmail.com> Co-authored-by: 0xRVE <robertvaneerdewijk@gmail.com> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com> Co-authored-by: gab <79002163+gab8i@users.noreply.github.com> Co-authored-by: s0me0ne-unkn0wn <48632512+s0me0ne-unkn0wn@users.noreply.github.com> Co-authored-by: ron <yrong1997@gmail.com> Co-authored-by: Marian Radu <marian@parity.io> Co-authored-by: Nathaniel Bajo <73991674+Nathy-bajo@users.noreply.github.com> Co-authored-by: mertwole <mertwole@gmail.com> Co-authored-by: Andrei Trandafir <142614787+andreitrand@users.noreply.github.com> Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> Co-authored-by: jessechejieh <dev@jessechejieh.com> commit 8e9a9efc409af2ed41244f8e6ebcbdde2b44ac36 Author: Evgeny Snitko <evgeny@parity.io> Date: Tue Sep 8 14:22:27 2026 +0000 Update ci-unified image to `bullseye-1.93.0-2026-01-27-v202609081126` (#13130) New bullseye ci-unified with temporary workaround for the expired `bullseye-security` cc https://github.com/paritytech/devops/issues/5593 commit bfac5667dd3b0ed7127022f98d55e8e788a29202 Author: Rohit Sarpotdar <rohit.sarpotdar@parity.io> Date: Tue Sep 8 09:46:16 2026 +0000 ci: compare bench weights against base repo master, not fork master (#12925) `/cmd bench` produces a meaningless Subweight table for pull requests opened from **forks**. The Subweight step in `.github/workflows/cmd-run.yml` compares the regenerated weights against `refs/remotes/origin/master`. But the checkout step of that same job points `origin` at the **PR head repository**: ```yaml - name: Checkout uses: actions/checkout@... with: repository: ${{ env.REPO }} # = pr.data.head.repo.full_name, i.e. the contributor's fork ref: ${{ env.PR_BRANCH }} ``` So `origin/master` resolves to the *fork's* master — whatever the contributor last synced — rather than the actual merge base. When that fork is behind, the "Old" column is read from a stale tree and the report becomes noise: - weight files added upstream since the fork was synced are listed as `Added`, with no baseline at all; - weights that merely moved upstream appear as huge phantom regressions. Reviewers are shown a diff that has nothing to do with what the PR actually did to weights. This PR points the comparison at the repository the workflow itself runs in. None. CI-only change — no crate is modified, nothing to integrate downstream. This issue was found on [paritytech/polkadot-bulletin-chain For example in PR's bench bot's comment [#753](https://github.com/paritytech/polkadot-bulletin-chain/pull/753#issuecomment-5326042048) , it reported enormouse % change for this: ``` pallets/transaction-storage/src/weights.rs authorize_account 1.00ns 143.10us +14309600.00 ``` pallets/transaction-storage/src/weights.rs was never touched by this bench run — it's absent from the modified list. The bot invented a +14,309,600% regression for a file the run didn't write, purely from diffing against the stale fork baseline. commit 4d63d92fa5e0a31c03385fa01f76c65be7ed83f4 Author: 0xRVE <robertvaneerdewijk@gmail.com> Date: Mon Sep 7 20:42:27 2026 +0000 [pallet-revive] EIP-7702 (continued) (#12229) Continuation of #10936 (itself continuing #10851). Implements [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) ("Set EOA Account Code") for `pallet-revive`: an EOA can sign an authorization designating a contract whose code runs on its behalf, while using the EOA's own storage and balance. See #9569 for background. **Pallet integration.** `eth_call` now takes an `authorization_list` (`Vec<AuthorizationListEntry>`) and processes it before the call. List size is bounded by gas: each entry must be covered by `worst_case_delegation_deposit()`, and an empty list on a type-4 tx is rejected in `into_call`. > Updating the `eth_call` signature is safe — it's not dispatched directly by users, but is the inner call of `eth_transact` (signed by an Ethereum wallet, submitted via `eth-rpc`). **Authorization processing.** `process_authorizations` validates each entry (chain ID, signature, nonce, account type), creates the authority account if needed, and sets/clears the delegation. Invalid entries are silently skipped per spec; each tuple's state changes are applied transactionally (all-or-nothing per tuple). Delegation changes are applied outside the call's transactional context, so they persist even if the call reverts. **Revive-specific cost.** Per-authorization gas is higher than EVM: an entry may create a new account (needs ED, drawn from the transaction fee), and delegating to a contract requires a code-lockup deposit plus a refcount bump on the code hash. **Storage.** New `AccountType::DelegatedEOA { delegate_target: Option<H160>, contract_info: ContractInfo<T>, payer: Option<AccountId> }`: - `EOA` → `DelegatedEOA` is permanent; clearing only sets `delegate_target = None`. - Delegated EOAs get their own child trie keyed by the EOA's address; re-delegating preserves it. - Code refcounts are incremented on set, decremented on clear. - Clearing refunds the `storage_base_deposit` (code-lockup portion) but keeps the child trie and per-item accounting. - `payer` records who funded the current deposit, so refunds reach the original payer even when a different relayer submits the next set/clear. **Execution.** - Callee is a delegated EOA → code loaded from the target, storage stays the EOA's. - Constructors skip delegation lookup. - No chain following: delegation is resolved at most once. Calling an authority whose target is itself delegated reverts (spec: execution traps on the `0xef` indicator byte). - `EXTCODESIZE`/`EXTCODEHASH`/`EXTCODECOPY`/`eth_getCode` report the 23-byte `0xef0100 || target` indicator for delegated EOAs. - `seal_terminate` on a delegated EOA is rejected with the new `CannotTerminateDelegatedAccount` error. **Benchmarks.** `process_new_account_authorization(n)` (worst case), `process_existing_account_authorization(n)` (best case, for weight refunds), and `process_invalid_authorization(n)` (signature-recovery-only cost of skipped tuples). **RPC.** `eth-rpc` can submit and dry-run EIP-7702 txs; `eth_getCode` returns the delegation indicator for delegated EOAs. The end-to-end test constructs 7702 transactions with alloy's `TransactionRequest::with_authorization_list`, the same path external tooling uses. Places where a trade-off or design decision was made, roughly in order of review value: 1. **`load_contract` semantics widened** (`storage.rs`): it now returns a `ContractInfo` for actively delegated EOAs (the authority's own info), not just deployed contracts. Every existing caller sees this change; `is_contract` remains the strict check. This is the highest-blast-radius change in the PR. 2. **Deposit payer routing** (`evm/eip7702.rs`, `payer` field): authorizations are relayable, so the account that paid the deposit and the account submitting the next set/clear can differ. Same-payer updates apply a net diff (avoids a refund/charge round-trip that would burn `1 - RefundPercent` under `PGasDeposit`); payer-change fully refunds the old payer via a direct `Funds::Balance` transfer (the `Funds::TxFee` rail would return it to the fee pot instead) and charges the new payer in full. The deposit reported to the metering budget reflects only what the submitter paid. 3. **Weight model** (`worst_case_authorization_weight`, `RuntimeCosts::Delegations`): pre-dispatch reserves `n ×` component-wise `max`(all-new, all-existing) — neither benchmark dominates on both `ref_time` and `proof_size` — and post-dispatch refunds the gap between reservation and actual (new/existing/invalid mix). Invalid tuples are billed at signature-recovery cost. 4. **Auth list bounded by gas, not by a hard cap** (`evm/call.rs`): validation requires the tx's max deposit budget to cover `worst_case_delegation_deposit() × len`. The net auth deposit is pre-charged into the root `TransactionMeter` (`metering/mod.rs`), and dry-run bumps `max_storage_deposit` to the worst case so estimates survive pool validation. 5. **Code snapshot at delegation time — spec deviation** (`set_delegation` doc): the target's code hash is resolved when the authorization is processed, not at call time. Delegating to an address that receives code later never activates (pinned by an `#[ignore]` test). Call-time resolution is the known fix, left as a follow-up. 6. **Chained delegation → trap** (`exec.rs`): the check lives in `new_frame` rather than per-call guards — a chained delegation always presents as an account with no loadable code but a delegation target (a delegation snapshot only carries a code hash when the target is a deployed contract, and a contract can never become delegated), so one read of the target decides. Nested callers observe `CalleeTrapped`, the same observable as an EVM invalid opcode; a top-level call fails with `ContractTrapped`. Pinned by `delegation_chain_does_not_execute` and `self_delegation_traps_on_call`. 7. **PVM host-function aliasing — spec deviation** (`exec.rs` `code_size`/`code_copy` comments): on PolkaVM, `CODESIZE`/`CODECOPY` and `EXTCODESIZE`/`EXTCODECOPY` lower to the same host functions, so inside a delegated EOA's execution `CODESIZE`/`CODECOPY` incorrectly report the 23-byte indicator. Fixing this needs a new host function plus a resolc change; follow-up. 8. **EIP-7702 → `RUNTIME_PALLETS_ADDR` rejected** (`evm/call.rs`): spec would process the auths; we invalidate the tx because `eth_substrate_call` has no `authorization_list` and the auths would be silently dropped while the user paid worst-case costs. 9. **EIP-3541 check moved** (`vm/evm.rs`): the `0xEF` rejection moved from init-code ingestion to the runtime-code path — it now guards exactly the collision that matters (deployed code that would masquerade as a delegation indicator). 10. **`Tracing` trait change** (`tracing.rs`): `enter_child_span` now takes `code_address: Option<H160>` + `is_delegate_call: bool` instead of `delegate_call: Option<H160>` (breaking for external `Tracing` impls). The prestate tracer additionally watches authorities before mutation so pre-state diffs capture pre-delegation code/nonce. 11. **Strict `y_parity ∈ {0, 1}`** (`recover_authority`): the shared `secp256k1_ecdsa_recover` primitive silently normalises legacy `v ∈ {27, 28}`; we filter before recovery so those are per-tuple skips as the spec requires. High-`s` signatures are rejected per EIP-2 in the shared recovery helper (`recover_eth_address_from_message`), so they are per-tuple skips too — pinned by `high_s_authorization_is_rejected`. 12. **`eth_estimate_gas` re-runs `process_authorizations` per bisection iteration** (`lib.rs` TODO): recovered authorities are invariant across iterations; caching them is a known optimization, deferred. - **Validation**: invalid chain_id / nonce skipped, chain_id 0 wildcard, contract accounts rejected, same-authority replay resolves to first valid entry, oversized nonce / y_parity invalidate the whole tx, empty auth list on type-4 rejected. - **Lifecycle**: set / update / clear, delegation resolution during calls, cleared delegations stop executing. - **Storage**: re-delegation preserves storage across targets; dust preserved on EOA transition. - **Deposits**: charges/refunds, re-delegation adjustments, refcount tracking, EOA→EOA charges nothing, multiple authorities each get their own deposit, payer-change refund routing (see review focus 2). - **Edge cases**: chains not followed, SELFDESTRUCT preserves delegation, delegation to a nonexistent address is a no-op, terminate precompile blocked. - **Tracing**: call tracer, prestate and prestate-diff coverage for set/revoke. - **RPC**: end-to-end delegate → call → clear flow via alloy. Note for reviewers: `tests/sol/host.rs` restructures `extcodesize/hash/copy_works` into table-driven tests — the pre-existing cases are unchanged, the delegated-EOA/EOA/nonexistent rows are appended. --------- Co-authored-by: pgherveou <pgherveou@gmail.com> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit a9522c5393682d44440ae4f9d9ea6d1aa9c247f2 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Sep 7 11:40:50 2026 +0000 Bump alloy-dyn-abi from 1.2.1 to 1.5.7 (#12748) Bumps [alloy-dyn-abi](https://github.com/alloy-rs/core) from 1.2.1 to 1.5.7. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/alloy-rs/core/releases">alloy-dyn-abi's releases</a>.</em></p> <blockquote> <h2>alloy-core v1.5.7</h2> <h2>What's Changed</h2> <ul> <li>fix(sol-macro): prevent direct String usage in expanded code by <a href="https://github.com/klkvr"><code>@​klkvr</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1076">alloy-rs/core#1076</a></li> <li>chore: release 1.5.7 by <a href="https://github.com/klkvr"><code>@​klkvr</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1077">alloy-rs/core#1077</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/alloy-rs/core/compare/v1.5.6...v1.5.7">https://github.com/alloy-rs/core/compare/v1.5.6...v1.5.7</a></p> <h2>alloy-core v1.5.6</h2> <h2>What's Changed</h2> <ul> <li>chore(deps): bump fixed-cache by <a href="https://github.com/DaniPopes"><code>@​DaniPopes</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1073">alloy-rs/core#1073</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/alloy-rs/core/compare/v1.5.5...v1.5.6">https://github.com/alloy-rs/core/compare/v1.5.5...v1.5.6</a></p> <h2>alloy-core v1.5.5</h2> <h2>What's Changed</h2> <ul> <li>chore: enable alloy-rlp MSRV features by <a href="https://github.com/DaniPopes"><code>@​DaniPopes</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1068">alloy-rs/core#1068</a></li> <li>chore(deps): bump breakings by <a href="https://github.com/DaniPopes"><code>@​DaniPopes</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1069">alloy-rs/core#1069</a></li> <li>feat(primitives): add <em>flatten</em> extensions by <a href="https://github.com/DaniPopes"><code>@​DaniPopes</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1070">alloy-rs/core#1070</a></li> <li>test: use checked methods in Signed tests for cranelift compat by <a href="https://github.com/DaniPopes"><code>@​DaniPopes</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1071">alloy-rs/core#1071</a></li> <li>test: speed up Miri tests by <a href="https://github.com/DaniPopes"><code>@​DaniPopes</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1072">alloy-rs/core#1072</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/alloy-rs/core/compare/v1.5.4...v1.5.5">https://github.com/alloy-rs/core/compare/v1.5.4...v1.5.5</a></p> <h2>alloy-core v1.5.4</h2> <h2>What's Changed</h2> <ul> <li>ci: fix rkyv miri breakage by <a href="https://github.com/DaniPopes"><code>@​DaniPopes</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1066">alloy-rs/core#1066</a></li> <li>chore(sol-macro): use sha3 by <a href="https://github.com/DaniPopes"><code>@​DaniPopes</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1064">alloy-rs/core#1064</a></li> <li>perf(primitives): remove unnecessary keccak cache length hash computation by <a href="https://github.com/DaniPopes"><code>@​DaniPopes</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1065">alloy-rs/core#1065</a></li> <li>perf(primitives): use keccak_asm::Keccak256::digest by <a href="https://github.com/DaniPopes"><code>@​DaniPopes</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1067">alloy-rs/core#1067</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/alloy-rs/core/compare/v1.5.3...v1.5.4">https://github.com/alloy-rs/core/compare/v1.5.3...v1.5.4</a></p> <h2>alloy-core v1.5.3</h2> <h2>What's Changed</h2> <ul> <li>chore(deps): run cargo shear by <a href="https://github.com/DaniPopes"><code>@​DaniPopes</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1055">alloy-rs/core#1055</a></li> <li>chore(primitives): switch default keccak to sha3 by <a href="https://github.com/DaniPopes"><code>@​DaniPopes</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1057">alloy-rs/core#1057</a></li> <li>perf(primitives): always enable 'sha3/asm' feature by <a href="https://github.com/DaniPopes"><code>@​DaniPopes</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1058">alloy-rs/core#1058</a></li> <li>feat(primitives): FixedBytes: schemars::JsonSchema by <a href="https://github.com/aatifsyed"><code>@​aatifsyed</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1059">alloy-rs/core#1059</a></li> <li>chore: allow bincode advisory in deny.toml by <a href="https://github.com/mattsse"><code>@​mattsse</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1060">alloy-rs/core#1060</a></li> <li>ci: update to tempoxyz by <a href="https://github.com/DaniPopes"><code>@​DaniPopes</code></a> in <a href="https://redirect.github.com/alloy-rs/core/pull/1062">alloy-rs/core#1062</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/aatifsyed"><code>@​aatifsyed</code></a> made their first contribution in <a href="https://redirect.github.com/alloy-rs/core/pull/1059">alloy-rs/core#1059</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/alloy-rs/core/compare/v1.5.2...v1.5.3">https://github.com/alloy-rs/core/compare/v1.5.2...v1.5.3</a></p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/alloy-rs/core/blob/main/CHANGELOG.md">alloy-dyn-abi's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/alloy-rs/core/releases/tag/v1.5.7">1.5.7</a> - 2026-02-27</h2> <h3>Bug Fixes</h3> <ul> <li>[sol-macro] Prevent direct String usage in expanded code (<a href="https://redirect.github.com/alloy-rs/core/issues/1076">#1076</a>)</li> </ul> <h3>Miscellaneous Tasks</h3> <ul> <li>Release 1.5.7 (<a href="https://redirect.github.com/alloy-rs/core/issues/1077">#1077</a>)</li> </ul> <h2><a href="https://github.com/alloy-rs/core/releases/tag/v1.5.6">1.5.6</a> - 2026-02-12</h2> <h3>Dependencies</h3> <ul> <li>[deps] Bump fixed-cache (<a href="https://redirect.github.com/alloy-rs/core/issues/1073">#1073</a>)</li> </ul> <h3>Miscellaneous Tasks</h3> <ul> <li>Release 1.5.6</li> <li>Fix changelog</li> </ul> <h2><a href="https://github.com/alloy-rs/core/releases/tag/v1.5.5">1.5.5</a> - 2026-02-11</h2> <h3>Dependencies</h3> <ul> <li>[deps] Bump breakings (<a href="https://redirect.github.com/alloy-rs/core/issues/1069">#1069</a>)</li> </ul> <h3>Features</h3> <ul> <li>[primitives] Add <em>flatten</em> extensions (<a href="https://redirect.github.com/alloy-rs/core/issues/1070">#1070</a>)</li> </ul> <h3>Miscellaneous Tasks</h3> <ul> <li>Release 1.5.5</li> <li>Enable alloy-rlp MSRV features (<a href="https://redirect.github.com/alloy-rs/core/issues/1068">#1068</a>)</li> </ul> <h3>Testing</h3> <ul> <li>Speed up Miri tests (<a href="https://redirect.github.com/alloy-rs/core/issues/1072">#1072</a>)</li> <li>Use checked methods in Signed tests for cranelift compat (<a href="https://redirect.github.com/alloy-rs/core/issues/1071">#1071</a>)</li> </ul> <h2><a href="https://github.com/alloy-rs/core/releases/tag/v1.5.4">1.5.4</a> - 2026-01-28</h2> <h3>Miscellaneous Tasks</h3> <ul> <li>Release 1.5.4</li> <li>[sol-macro] Use sha3 (<a href="https://redirect.github.com/alloy-rs/core/issues/1064">#1064</a>)</li> </ul> <h3>Other</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/alloy-rs/core/commit/e6b30e4c2407cd1d2ea93e79f2768e5a4f21d266"><code>e6b30e4</code></a> chore: release 1.5.7 (<a href="https://redirect.github.com/alloy-rs/core/issues/1077">#1077</a>)</li> <li><a href="https://github.com/alloy-rs/core/commit/b198aed364f5da85ccad5ad25ca2c5aaead5185c"><code>b198aed</code></a> fix(sol-macro): prevent direct String usage in expanded code (<a href="https://redirect.github.com/alloy-rs/core/issues/1076">#1076</a>)</li> <li><a href="https://github.com/alloy-rs/core/commit/0fc5ab481952347a594984b47e7fa64a6a29016e"><code>0fc5ab4</code></a> chore: release 1.5.6</li> <li><a href="https://github.com/alloy-rs/core/commit/f170adf94cc66d570db65c3d660ea42491c83480"><code>f170adf</code></a> chore(deps): bump fixed-cache (<a href="https://redirect.github.com/alloy-rs/core/issues/1073">#1073</a>)</li> <li><a href="https://github.com/alloy-rs/core/commit/b6ab15e06b29375911dde77997a8ed1fd789fa5b"><code>b6ab15e</code></a> chore: fix changelog</li> <li><a href="https://github.com/alloy-rs/core/commit/d91340207417b4b7c120b8abed87e8ad704f154e"><code>d913402</code></a> chore: release 1.5.5</li> <li><a href="https://github.com/alloy-rs/core/commit/a12d70389d0a6b5c9191f08110a9b0f2e9b7aba5"><code>a12d703</code></a> test: speed up Miri tests (<a href="https://redirect.github.com/alloy-rs/core/issues/1072">#1072</a>)</li> <li><a href="https://github.com/alloy-rs/core/commit/372b9d129381b665130d7a240e384a899399d71b"><code>372b9d1</code></a> test: use checked methods in Signed tests for cranelift compat (<a href="https://redirect.github.com/alloy-rs/core/issues/1071">#1071</a>)</li> <li><a href="https://github.com/alloy-rs/core/commit/25039848cfa2c171d2f52dd4b68eb03dae8ba53b"><code>2503984</code></a> feat(primitives): add <em>flatten</em> extensions (<a href="https://redirect.github.com/alloy-rs/core/issues/1070">#1070</a>)</li> <li><a href="https://github.com/alloy-rs/core/commit/9b846b99493d641c908ff0e9bd73dda9b172d5d4"><code>9b846b9</code></a> chore(deps): bump breakings (<a href="https://redirect.github.com/alloy-rs/core/issues/1069">#1069</a>)</li> <li>Additional commits viewable in <a href="https://github.com/alloy-rs/core/compare/v1.2.1...v1.5.7">compare view</a></li> </ul> </details> <br /> [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=alloy-dyn-abi&package-manager=cargo&previous-version=1.2.1&new-version=1.5.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) You can trigger a rebase of this PR by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/paritytech/polkadot-sdk/network/alerts). </details> > **Note** > Automatic rebases have been disabled on this pull request as it has been open for over 30 days. Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 7393f1891d0f96f3ff3e771b58929e1bd0580001 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Sep 7 11:27:20 2026 +0000 Bump the ci_dependencies group across 1 directory with 21 updates (#13109) Bumps the ci_dependencies group with 21 updates in the / directory: | Package | From | To | | --- | --- | --- | | [actions/checkout](https://github.com/actions/checkout) | `6.0.2` | `7.0.1` | | [actions/create-github-app-token](https://github.com/actions/create-github-app-token) | `3.1.1` | `3.2.0` | | [benchmark-action/github-action-benchmark](https://github.com/benchmark-action/github-action-benchmark) | `1.22.0` | `1.22.1` | | [docker/build-push-action](https://github.com/docker/build-push-action) | `7.1.0` | `7.3.0` | | [docker/login-action](https://github.com/docker/login-action) | `4.1.0` | `4.6.0` | | [actions/setup-node](https://github.com/actions/setup-node) | `6.4.0` | `7.0.0` | | [actions/cache](https://github.com/actions/cache) | `5.0.5` | `6.1.0` | | [lycheeverse/lychee-action](https://github.com/lycheeverse/lychee-action) | `2.8.0` | `2.9.0` | | [actions/cache/restore](https://github.com/actions/cache) | `5.0.5` | `6.1.0` | | [actions/cache/save](https://github.com/actions/cache) | `5.0.5` | `6.1.0` | | [Swatinem/rust-cache](https://github.com/swatinem/rust-cache) | `2.9.1` | `2.9.2` | | [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) | `1.16.0` | `1.17.0` | | [korthout/backport-action](https://github.com/korthout/backport-action) | `4.4.0` | `4.6.0` | | [stefanzweifel/git-auto-commit-action](https://github.com/stefanzweifel/git-auto-commit-action) | `7.1.0` | `7.2.0` | | [actions/setup-python](https://github.com/actions/setup-python) | `6.2.0` | `7.0.0` | | [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials) | `6.1.0` | `6.2.4` | | [actions/attest-build-provenance](https://github.com/actions/attest-build-provenance) | `4.1.0` | `4.2.2` | | [Homebrew/actions/setup-homebrew](https://github.com/homebrew/actions) | `1ccc07ccd54b6048295516a3eb89b192c35057dc` | `f8d4222eb633e65c2a0157383cf80861fc7fae7f` | | [paritytech/review-bot](https://github.com/paritytech/review-bot) | `2.7.2` | `2.7.3` | | [paritytech/revive-differential-tests/.github/actions/run-differential-tests](https://github.com/paritytech/revive-differential-tests) | `b12369430ec8184e62cc5fdcae8a140a8f1fadbd` | `fcaadf01d266e4d859984ec2dc6e4421825ef523` | | [codecov/codecov-action](https://github.com/codecov/codecov-action) | `6.0.0` | `7.0.0` | Updates `actions/checkout` from 6.0.2 to 7.0.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/checkout/releases">actions/checkout's releases</a>.</em></p> <blockquote> <h2>v7.0.1</h2> <h2>What's Changed</h2> <ul> <li>skip running unsafe pr check if input is default by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2518">actions/checkout#2518</a></li> <li>trim only ascii whitespace for branch by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2521">actions/checkout#2521</a></li> <li>escape values passed to --unset by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2530">actions/checkout#2530</a></li> <li>Various dependency updates</li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v7...v7.0.1">https://github.com/actions/checkout/compare/v7...v7.0.1</a></p> <h2>v7.0.0</h2> <h2>What's Changed</h2> <ul> <li>block checking out fork pr for pull_request_target and workflow_run by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li> <li>Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the minor-actions-dependencies group across 1 directory by <a href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2458">actions/checkout#2458</a></li> <li>Bump flatted from 3.3.1 to 3.4.2 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2460">actions/checkout#2460</a></li> <li>Bump js-yaml from 4.1.0 to 4.2.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2461">actions/checkout#2461</a></li> <li>Bump <code>@​actions/core</code> and <code>@​actions/tool-cache</code> and Remove uuid by <a href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2459">actions/checkout#2459</a></li> <li>upgrade module to esm and update dependencies by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2463">actions/checkout#2463</a></li> <li>Bump the minor-npm-dependencies group across 1 directory with 3 updates by <a href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2462">actions/checkout#2462</a></li> <li>getting ready for checkout v7 release by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2464">actions/checkout#2464</a></li> <li>update error wording by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2467">actions/checkout#2467</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> made their first contribution in <a href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v6.0.3...v7.0.0">https://github.com/actions/checkout/compare/v6.0.3...v7.0.0</a></p> <h2>v6.1.0</h2> <h2>What's Changed</h2> <ul> <li><strong>[BREAKING]</strong> backport <code>allow-unsafe-pr-checkout</code> to v6 by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2500">actions/checkout#2500</a></li> <li>backport fixes to releases-v6 by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2527">actions/checkout#2527</a></li> </ul> <p><a href="https://github.blog/changelog/2026-06-18-safer-pull_request_target-defaults-for-github-actions-checkout/">https://github.blog/changelog/2026-06-18-safer-pull_request_target-defaults-for-github-actions-checkout/</a> for more details about this breaking change</p> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v6.0.3...v6.1.0">https://github.com/actions/checkout/compare/v6.0.3...v6.1.0</a></p> <h2>v6.0.3</h2> <h2>What's Changed</h2> <ul> <li>Update changelog by <a href="https://github.com/ericsciple"><code>@​ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2357">actions/checkout#2357</a></li> <li>fix: expand merge commit SHA regex and add SHA-256 test cases by <a href="https://github.com/yaananth"><code>@​yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2414">actions/checkout#2414</a></li> <li>Fix checkout init for SHA-256 repositories by <a href="https://github.com/yaananth"><code>@​yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2439">actions/checkout#2439</a></li> <li>Update changelog for v6.0.3 by <a href="https://github.com/yaananth"><code>@​yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2446">actions/checkout#2446</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/yaananth"><code>@​yaananth</code></a> made their first contribution in <a href="https://redirect.github.com/actions/checkout/pull/2414">actions/checkout#2414</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v6...v6.0.3">https://github.com/actions/checkout/compare/v6...v6.0.3</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/actions/checkout/blob/main/CHANGELOG.md">actions/checkout's changelog</a>.</em></p> <blockquote> <h1>Changelog</h1> <h2>v7.0.1</h2> <ul> <li>Skip running unsafe pr check if input is default by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2518">actions/checkout#2518</a></li> <li>Trim only ascii whitespace for branch by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2521">actions/checkout#2521</a></li> <li>Escape values passed to --unset by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2530">actions/checkout#2530</a></li> <li>Various dependency updates</li> </ul> <h2>v7.0.0</h2> <ul> <li>Block checking out fork PR for pull_request_target and workflow_run by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li> <li>Various dependency updates</li> </ul> <h2>v6.0.3</h2> <ul> <li>Fix checkout init for SHA-256 repositories by <a href="https://github.com/yaananth"><code>@​yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2439">actions/checkout#2439</a></li> <li>fix: expand merge commit SHA regex and add SHA-256 test cases by <a href="https://github.com/yaananth"><code>@​yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2414">actions/checkout#2414</a></li> </ul> <h2>v6.0.2</h2> <ul> <li>Fix tag handling: preserve annotations and explicit fetch-tags by <a href="https://github.com/ericsciple"><code>@​ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2356">actions/checkout#2356</a></li> </ul> <h2>v6.0.1</h2> <ul> <li>Add worktree support for persist-credentials includeIf by <a href="https://github.com/ericsciple"><code>@​ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2327">actions/checkout#2327</a></li> </ul> <h2>v6.0.0</h2> <ul> <li>Persist creds to a separate file by <a href="https://github.com/ericsciple"><code>@​ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2286">actions/checkout#2286</a></li> <li>Update README to include Node.js 24 support details and requirements by <a href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2248">actions/checkout#2248</a></li> </ul> <h2>v5.0.1</h2> <ul> <li>Port v6 cleanup to v5 by <a href="https://github.com/ericsciple"><code>@​ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2301">actions/checkout#2301</a></li> </ul> <h2>v5.0.0</h2> <ul> <li>Update actions checkout to use node 24 by <a href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2226">actions/checkout#2226</a></li> </ul> <h2>v4.3.1</h2> <ul> <li>Port v6 cleanup to v4 by <a href="https://github.com/ericsciple"><code>@​ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2305">actions/checkout#2305</a></li> </ul> <h2>v4.3.0</h2> <ul> <li>docs: update README.md by <a href="https://github.com/motss"><code>@​motss</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1971">actions/checkout#1971</a></li> <li>Add internal repos for checking out multiple repositories by <a href="https://github.com/mouismail"><code>@​mouismail</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1977">actions/checkout#1977</a></li> <li>Documentation update - add recommended permissions to Readme by <a href="https://github.com/benwells"><code>@​benwells</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2043">actions/checkout#2043</a></li> <li>Adjust positioning of user email note and permissions heading by <a href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2044">actions/checkout#2044</a></li> <li>Update README.md by <a href="https://github.com/nebuk89"><code>@​nebuk89</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2194">actions/checkout#2194</a></li> <li>Update CODEOWNERS for actions by <a href="https://github.com/TingluoHuang"><code>@​TingluoHuang</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2224">actions/checkout#2224</a></li> <li>Update package dependencies by <a href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2236">actions/checkout#2236</a></li> </ul> <h2>v4.2.2</h2> <ul> <li><code>url-helper.ts</code> now leverages well-known environment variables by <a href="https://github.com/jww3"><code>@​jww3</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1941">actions/checkout#1941</a></li> <li>Expand unit test coverage for <code>isGhes</code> by <a href="https://github.com/jww3"><code>@​jww3</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1946">actions/checkout#1946</a></li> </ul> <h2>v4.2.1</h2> <ul> <li>Check out other refs/* by commit if provided, fall back to ref by <a href="https://github.com/orhantoy"><code>@​orhantoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1924">actions/checkout#1924</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/actions/checkout/commit/3d3c42e5aac5ba805825da76410c181273ba90b1"><code>3d3c42e</code></a> prep v7.0.1 release (<a href="https://redirect.github.com/actions/checkout/issues/2531">#2531</a>)</li> <li><a href="https://github.com/actions/checkout/commit/28802689a136bfcdb721715abd713740beecbe07"><code>2880268</code></a> escape values passed to --unset (<a href="https://redirect.github.com/actions/checkout/issues/2530">#2530</a>)</li> <li><a href="https://github.com/actions/checkout/commit/12cd2235efa0937479335606d7c3ac9f6c0973b1"><code>12cd223</code></a> trim only ascii whitespace for branch (<a href="https://redirect.github.com/actions/checkout/issues/2521">#2521</a>)</li> <li><a href="https://github.com/actions/checkout/commit/62661c4e71a304b2823ed026347b8d34c3eac541"><code>62661c4</code></a> skip running unsafe pr check if input is default (<a href="https://redirect.github.com/actions/checkout/issues/2518">#2518</a>)</li> <li><a href="https://github.com/actions/checkout/commit/e8d4307400f9427dba7cb98e488d6ab85f1cec5f"><code>e8d4307</code></a> Bump the minor-actions-dependencies group with 2 updates (<a href="https://redirect.github.com/actions/checkout/issues/2499">#2499</a>)</li> <li><a href="https://github.com/actions/checkout/commit/631c942040754b6e095e929c1677c07e10ed4f87"><code>631c942</code></a> eslint 9 (<a href="https://redirect.github.com/actions/checkout/issues/2474">#2474</a>)</li> <li><a href="https://github.com/actions/checkout/commit/4f1f4aec02e41874fa0262ea8ff5172d7978ad1e"><code>4f1f4ae</code></a> Bump actions/upload-artifact from 4 to 7 (<a href="https://redirect.github.com/actions/checkout/issues/2476">#2476</a>)</li> <li><a href="https://github.com/actions/checkout/commit/ba097532fb203f7e88c9c3c0b899b49469908a92"><code>ba09753</code></a> Bump actions/checkout from 6 to 7 (<a href="https://redirect.github.com/actions/checkout/issues/2488">#2488</a>)</li> <li><a href="https://github.com/actions/checkout/commit/b9e0990d219a03df7633c93f6f005a8fecbcab22"><code>b9e0990</code></a> Bump docker/login-action from 3.3.0 to 4.2.0 (<a href="https://redirect.github.com/actions/checkout/issues/2479">#2479</a>)</li> <li><a href="https://github.com/actions/checkout/commit/e8cb398be4a550817e382abf69e4c12c76fce1f2"><code>e8cb398</code></a> Bump docker/build-push-action from 6.5.0 to 7.2.0 (<a href="https://redirect.github.com/actions/checkout/issues/2478">#2478</a>)</li> <li>Additional commits viewable in <a href="https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...3d3c42e5aac5ba805825da76410c181273ba90b1">compare view</a></li> </ul> </details> <br /> Updates `actions/create-github-app-token` from 3.1.1 to 3.2.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/create-github-app-token/releases">actions/create-github-app-token's releases</a>.</em></p> <blockquote> <h2>v3.2.0</h2> <h2><a href="https://github.com/actions/create-github-app-token/compare/v3.1.1...v3.2.0">3.2.0</a> (2026-05-12)</h2> <h3>Features</h3> <ul> <li>add support for enterprise-level GitHub Apps (<a href="https://redirect.github.com/actions/create-github-app-token/issues/263">#263</a>) (<a href="https://github.com/actions/create-github-app-token/commit/952a2a7073df6bfa5f49bc469ec895b6ec1acea4">952a2a7</a>)</li> <li>support full repository names in <code>repositories</code> input (<a href="https://redirect.github.com/actions/create-github-app-token/issues/372">#372</a>) (<a href="https://github.com/actions/create-github-app-token/commit/85eb8dd41472213aed25d1a126460e0069138ab6">85eb8dd</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>deps:</strong> bump <code>@​actions/core</code> from 3.0.0 to 3.0.1 in the production-dependencies group (<a href="https://redirect.github.com/actions/create-github-app-token/issues/364">#364</a>) (<a href="https://github.com/actions/create-github-app-token/commit/43e5c345bfd4d4f3ecea019ad0042001a09dd857">43e5c34</a>)</li> <li>validate private-key input (<a href="https://redirect.github.com/actions/create-github-app-token/issues/376">#376</a>) (<a href="https://github.com/actions/create-github-app-token/commit/f24bbd89643991c0de27ae823c01791b2c6bafdd">f24bbd8</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/actions/create-github-app-token/blob/main/CHANGELOG.md">actions/create-github-app-token's changelog</a>.</em></p> <blockquote> <h1>Changelog</h1> <h2><a href="https://github.com/actions/create-github-app-token/compare/v3.1.1...v3.2.0">3.2.0</a> (2026-05-12)</h2> <h3>Features</h3> <ul> <li>add support for enterprise-level GitHub Apps (<a href="https://redirect.github.com/actions/create-github-app-token/issues/263">#263</a>) (<a href="https://github.com/actions/create-github-app-token/commit/952a2a7073df6bfa5f49bc469ec895b6ec1acea4">952a2a7</a>)</li> <li>support full repository names in <code>repositories</code> input (<a href="https://redirect.github.com/actions/create-github-app-token/issues/372">#372</a>) (<a href="https://github.com/actions/create-github-app-token/commit/85eb8dd41472213aed25d1a126460e0069138ab6">85eb8dd</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>deps:</strong> bump <code>@​actions/core</code> from 3.0.0 to 3.0.1 in the production-dependencies group (<a href="https://redirect.github.com/actions/create-github-app-token/issues/364">#364</a>) (<a href="https://github.com/actions/create-github-app-token/commit/43e5c345bfd4d4f3ecea019ad0042001a09dd857">43e5c34</a>)</li> <li>validate private-key input (<a href="https://redirect.github.com/actions/create-github-app-token/issues/376">#376</a>) (<a href="https://github.com/actions/create-github-app-token/commit/f24bbd89643991c0de27ae823c01791b2c6bafdd">f24bbd8</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/actions/create-github-app-token/commit/bcd2ba49218906704ab6c1aa796996da409d3eb1"><code>bcd2ba4</code></a> chore(main): release 3.2.0 (<a href="https://redirect.github.com/actions/create-github-app-token/issues/370">#370</a>)</li> <li><a href="https://github.com/actions/create-github-app-token/commit/f24bbd89643991c0de27ae823c01791b2c6bafdd"><code>f24bbd8</code></a> fix: validate private-key input (<a href="https://redirect.github.com/actions/create-github-app-token/issues/376">#376</a>)</li> <li><a href="https://github.com/actions/create-github-app-token/commit/363531b6d972a60a00b3f1e6bb139e5e6c764cd9"><code>363531b</code></a> docs: capitalize Git as a proper noun in README (<a href="https://redirect.github.com/actions/create-github-app-token/issues/374">#374</a>)</li> <li><a href="https://github.com/actions/create-github-app-token/commit/fd2801133e469d2950f2c5af5e591d6b2ad833c8"><code>fd28011</code></a> docs: update procedure to configure Git (<a href="https://redirect.github.com/actions/create-github-app-token/issues/287">#287</a>)</li> <li><a href="https://github.com/actions/create-github-app-token/commit/85eb8dd41472213aed25d1a126460e0069138ab6"><code>85eb8dd</code></a> feat: support full repository names in <code>repositories</code> input (<a href="https://redirect.github.com/actions/create-github-app-token/issues/372">#372</a>)</li> <li><a href="https://github.com/actions/create-github-app-token/commit/c9aabb83728c3bd519212fa657ebc07e1f2a5dec"><code>c9aabb8</code></a> build(deps-dev): bump yaml from 2.8.3 to 2.8.4 in the development-dependencie...</li> <li><a href="https://github.com/actions/create-github-app-token/commit/e02e816e5591415258a53bf735aff57977dcd5e2"><code>e02e816</code></a> build(deps-dev): bump undici from 7.24.6 to 8.2.0 (<a href="https://redirect.github.com/actions/create-github-app-token/issues/366">#366</a>)</li> <li><a href="https://github.com/actions/create-github-app-token/commit/8d835bfd37aa48fcb8e709925115857568d98bc4"><code>8d835bf</code></a> build(deps-dev): bump esbuild from 0.27.4 to 0.28.0 in the development-depend...</li> <li><a href="https://github.com/actions/create-github-app-token/commit/952a2a7073df6bfa5f49bc469ec895b6ec1acea4"><code>952a2a7</code></a> feat: add support for enterprise-level GitHub Apps (<a href="https://redirect.github.com/actions/create-github-app-token/issues/263">#263</a>)</li> <li><a href="https://github.com/actions/create-github-app-token/commit/43e5c345bfd4d4f3ecea019ad0042001a09dd857"><code>43e5c34</code></a> fix(deps): bump <code>@​actions/core</code> from 3.0.0 to 3.0.1 in the production-dependenc...</li> <li>Additional commits viewable in <a href="https://github.com/actions/create-github-app-token/compare/1b10c78c7865c340bc4f6099eb2f838309f1e8c3...bcd2ba49218906704ab6c1aa796996da409d3eb1">compare view</a></li> </ul> </details> <br /> Updates `benchmark-action/github-action-benchmark` from 1.22.0 to 1.22.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/benchmark-action/github-action-benchmark/releases">benchmark-action/github-action-benchmark's releases</a>.</em></p> <blockquote> <h2>v1.22.1</h2> <ul> <li><strong>fix</strong> scope tsconfig.build.json to src/ for reproducibility (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/352">#352</a>)</li> <li><strong>chore</strong> bump minimatch from 3.1.2 to 3.1.5 (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/347">#347</a>)</li> <li><strong>chore</strong> bump uuid and <code>@​actions/core</code> (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/350">#350</a>)</li> <li><strong>chore</strong> bump flatted from 3.2.4 to 3.4.2 (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/346">#346</a>)</li> <li><strong>chore</strong> bump js-yaml (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/344">#344</a>)</li> <li><strong>chore</strong> bump picomatch from 2.3.0 to 2.3.2 (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/342">#342</a>)</li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/benchmark-action/github-action-benchmark/compare/v1.22.0...v1.22.1">https://github.com/benchmark-action/github-action-benchmark/compare/v1.22.0...v1.22.1</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/benchmark-action/github-action-benchmark/blob/master/CHANGELOG.md">benchmark-action/github-action-benchmark's changelog</a>.</em></p> <blockquote> <h2>Unreleased</h2> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> <h1><a href="https://github.com/benchmark-action/github-action-benchmark/releases/tag/v1.22.1">v1.22.1</a> - 6 May 2026</h1> <ul> <li><strong>fix</strong> scope tsconfig.build.json to src/ for reproducibility (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/352">#352</a>)</li> <li><strong>chore</strong> bump minimatch from 3.1.2 to 3.1.5 (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/347">#347</a>)</li> <li><strong>chore</strong> bump uuid and <code>@​actions/core</code> (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/350">#350</a>)</li> <li><strong>chore</strong> bump flatted from 3.2.4 to 3.4.2 (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/346">#346</a>)</li> <li><strong>chore</strong> bump js-yaml (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/344">#344</a>)</li> <li><strong>chore</strong> bump picomatch from 2.3.0 to 2.3.2 (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/342">#342</a>)</li> </ul> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> <h1><a href="https://github.com/benchmark-action/github-action-benchmark/releases/tag/v1.22.0">v1.22.0</a> - 31 Mar 2026</h1> <ul> <li><strong>chore</strong> bump node to 24 (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/339">#339</a>)</li> </ul> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> <h1><a href="https://github.com/benchmark-action/github-action-benchmark/releases/tag/v1.21.0">v1.21.0</a> - 02 Mar 2026</h1> <ul> <li><strong>fix</strong> include package name for duplicate bench names (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/330">#330</a>)</li> <li><strong>fix</strong> avoid duplicate package suffix in Go benchmarks (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/337">#337</a>)</li> </ul> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> <h1><a href="https://github.com/benchmark-action/github-action-benchmark/releases/tag/v1.20.7">v1.20.7</a> - 06 Sep 2025</h1> <ul> <li><strong>fix</strong> improve parsing for custom benchmarks (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/323">#323</a>)</li> </ul> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> <h1><a href="https://github.com/benchmark-action/github-action-benchmark/releases/tag/v1.20.5">v1.20.5</a> - 02 Sep 2025</h1> <ul> <li><strong>feat</strong> allow to parse generic cargo bench/criterion units (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/280">#280</a>)</li> <li><strong>fix</strong> add summary even when failure threshold is surpassed (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/285">#285</a>)</li> <li><strong>fix</strong> time units are not normalized (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/318">#318</a>)</li> </ul> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> <h1><a href="https://github.com/benchmark-action/github-action-benchmark/releases/tag/v1.20.4">v1.20.4</a> - 23 Oct 2024</h1> <ul> <li><strong>feat</strong> add typings and validation workflow (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/257">#257</a>)</li> </ul> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> <h1><a href="https://github.com/benchmark-action/github-action-benchmark/releases/tag/v1.20.3">v1.20.3</a> - 19 May 2024</h1> <ul> <li><strong>fix</strong> Catch2 v.3.5.0 changed output format (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/247">#247</a>)</li> </ul> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> <h1><a href="https://github.com/benchmark-action/github-action-benchmark/releases/tag/v1.20.2">v1.20.2</a> - 19 May 2024</h1> <ul> <li><strong>fix</strong> Support sub-nanosecond precision on Cargo benchmarks (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/246">#246</a>)</li> </ul> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> <h1><a href="https://github.com/benchmark-action/github-action-benchmark/releases/tag/v1.20.1">v1.20.1</a> - 02 Apr 2024</h1> <ul> <li><strong>fix</strong> release script</li> </ul> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> <h1><a href="https://github.com/benchmark-action/github-action-benchmark/releases/tag/v1.20.0">v1.20.0</a> - 02 Apr 2024</h1> <ul> <li><strong>fix</strong> Rust benchmarks not comparing to baseline (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/235">#235</a>)</li> <li><strong>feat</strong> Comment on PR and auto update comment (<a href="https://redirect.github.com/benchmark-action/github-action-benchmark/issues/223">#223</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/benchmark-action/github-action-benchmark/commit/52576c92bccf6ac60c8223ec7eb2565637cae9ba"><code>52576c9</code></a> release v1.22.1</li> <li>See full diff in <a href="https://github.com/benchmark-action/github-action-benchmark/compare/a60cea5bc7b49e15c1f58f411161f99e0df48372...52576c92bccf6ac60c8223ec7eb2565637cae9ba">compare view</a></li> </ul> </details> <br /> Updates `docker/build-push-action` from 7.1.0 to 7.3.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/docker/build-push-action/releases">docker/build-push-action's releases</a>.</em></p> <blockquote> <h2>v7.3.0</h2> <ul> <li>Preserve names in esbuild bundle by <a href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a href="https://redirect.github.com/docker/build-push-action/pull/1567">docker/build-push-action#1567</a></li> <li>Bump <code>@​docker/actions-toolkit</code> from 0.90.0 to 0.92.0 in <a href="https://redirect.github.com/docker/build-push-action/pull/1545">docker/build-push-action#1545</a> <a href="https://redirect.github.com/docker/build-push-action/pull/1572">docker/build-push-action#1572</a></li> <li>Bump <code>@​sigstore/core</code> from 3.1.0 to 3.2.1 in <a href="https://redirect.github.com/docker/build-push-action/pull/1568">docker/build-push-action#1568</a></li> <li>Bump js-yaml from 4.1.1 to 4.3.0 in <a href="https://redirect.github.com/docker/build-push-action/pull/1566">docker/build-push-action#1566</a></li> <li>Bump tmp from 0.2.5 to 0.2.7 in <a href="https://redirect.github.com/docker/build-push-action/pull/1547">docker/build-push-action#1547</a></li> <li>Bump undici from 6.24.1 to 6.27.0 in <a href="https://redirect.github.com/docker/build-push-action/pull/1564">docker/build-push-action#1564</a></li> <li>Bump vite from 7.3.2 to 7.3.6 in <a href="https://redirect.github.com/docker/build-push-action/pull/1563">docker/build-push-action#1563</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/build-push-action/compare/v7.2.0...v7.3.0">https://github.com/docker/build-push-action/compare/v7.2.0...v7.3.0</a></p> <h2>v7.2.0</h2> <ul> <li>Bump <code>@​actions/core</code> from 3.0.0 to 3.0.1 in <a href="https://redirect.github.com/docker/build-push-action/pull/1525">docker/build-push-action#1525</a></li> <li>Bump <code>@​docker/actions-toolkit</code> from 0.87.0 to 0.90.0 in <a href="https://redirect.github.com/docker/build-push-action/pull/1517">docker/build-push-action#1517</a></li> <li>Bump brace-expansion from 2.0.2 to 5.0.6 in <a href="https://redirect.github.com/docker/build-push-action/pull/1534">docker/build-push-action#1534</a></li> <li>Bump fast-xml-builder from 1.1.4 to 1.2.0 in <a href="https://redirect.github.com/docker/build-push-action/pull/1529">docker/build-push-action#1529</a></li> <li>Bump fast-xml-parser from 5.5.7 to 5.8.0 in <a href="https://redirect.github.com/docker/build-push-action/pull/1521">docker/build-push-action#1521</a></li> <li>Bump postcss from 8.5.6 to 8.5.10 in <a href="https://redirect.github.com/docker/build-push-action/pull/1526">docker/build-push-action#1526</a></li> <li>Bump tar from 6.2.1 to 7.5.15 in <a href="https://redirect.github.com/docker/build-push-action/pull/1533">docker/build-push-action#1533</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/build-push-action/compare/v7.1.0...v7.2.0">https://github.com/docker/build-push-action/compare/v7.1.0...v7.2.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/docker/build-push-action/commit/53b7df96c91f9c12dcc8a07bcb9ccacbed38856a"><code>53b7df9</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1572">#1572</a> from docker/dependabot/npm_and_yarn/docker/actions-t...</li> <li><a href="https://github.com/docker/build-push-action/commit/154298c1ca89be1c0e019084f0611ddca621aafc"><code>154298c</code></a> [dependabot skip] chore: update generated content</li> <li><a href="https://github.com/docker/build-push-action/commit/cb1238b9c9eb453d106b4e4142a5bd9cde710040"><code>cb1238b</code></a> chore(deps): Bump <code>@​docker/actions-toolkit</code> from 0.91.0 to 0.92.0</li> <li><a href="https://github.com/docker/build-push-action/commit/24f845d5cbe75d2d350a984fd0e18cb7a3f29c1c"><code>24f845d</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1566">#1566</a> from docker/dependabot/npm_and_yarn/js-yaml-4.2.0</li> <li><a href="https://github.com/docker/build-push-action/commit/9c6973007b52c322651c38915d5e8824cea95c50"><code>9c69730</code></a> [dependabot skip] chore: update generated content</li> <li><a href="https://github.com/docker/build-push-action/commit/bc3a3a5f72a6dca16c2c2468d1dfc55ee66d2193"><code>bc3a3a5</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1574">#1574</a> from docker/dependabot/github_actions/aws-actions/co...</li> <li><a href="https://github.com/docker/build-push-action/commit/a82c504a2387bb8bedc50072f9c554ae2a7dab5d"><code>a82c504</code></a> chore(deps): Bump js-yaml from 4.1.1 to 4.3.0</li> <li><a href="https://github.com/docker/build-push-action/commit/0285a75190c039d6dac52b7711abcef3f5d8f6f6"><code>0285a75</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1573">#1573</a> from docker/dependabot/github_actions/actions/cache-...</li> <li><a href="https://github.com/docker/build-push-action/commit/c6ad2a3f9644680619de938b97c8a10a87b2a88d"><code>c6ad2a3</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1575">#1575</a> from docker/dependabot/github_actions/actions/checko...</li> <li><a href="https://github.com/docker/build-push-action/commit/d37484fb9737c5442a257e2f0ae5a8d756ed7d92"><code>d37484f</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1564">#1564</a> from docker/dependabot/npm_and_yarn/undici-6.27.0</li> <li>Additional commits viewable in <a href="https://github.com/docker/build-push-action/compare/bcafcacb16a39f128d818304e6c9c0c18556b85f...53b7df96c91f9c12dcc8a07bcb9ccacbed38856a">compare view</a></li> </ul> </details> <br /> Updates `docker/login-action` from 4.1.0 to 4.6.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/docker/login-action/releases">docker/login-action's releases</a>.</em></p> <blockquote> <h2>v4.6.0</h2> <ul> <li>Harden buildx scoped config path handling by <a href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a href="https://redirect.github.com/docker/login-action/pull/1059">docker/login-action#1059</a></li> <li>Bump <code>@​aws-sdk/client-ecr</code> and <code>@​aws-sdk/client-ecr-public</code> to 3.1095.0 in <a href="https://redirect.github.com/docker/login-action/pull/1051">docker/login-action#1051</a></li> <li>Bump js-yaml from 5.2.1 to 5.2.2 in <a href="https://redirect.github.com/docker/login-action/pull/1057">docker/login-action#1057</a></li> <li>Bump postcss from 8.5.10 to 8.5.22 in <a href="https://redirect.github.com/docker/login-action/pull/1056">docker/login-action#1056</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/login-action/compare/v4.5.2...v4.6.0">https://github.com/docker/login-action/compare/v4.5.2...v4.6.0</a></p> <h2>v4.5.2</h2> <ul> <li>Surface Docker Hub OIDC error responses by <a href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a href="https://redirect.github.com/docker/login-action/pull/1058">docker/login-action#1058</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/login-action/compare/v4.5.1...v4.5.2">https://github.com/docker/login-action/compare/v4.5.1...v4.5.2</a></p> <h2>v4.5.1</h2> <ul> <li>Support <code>dhi.io</code> as Docker Hub OIDC registry by <a href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a href="https://redirect.github.com/docker/login-action/pull/1054">docker/login-action#1054</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/login-action/compare/v4.5.0...v4.5.1">https://github.com/docker/login-action/compare/v4.5.0...v4.5.1</a></p> <h2>v4.5.0</h2> <ul> <li><a href="https://github.com/docker/login-action#docker-hub">Docker Hub OIDC</a> login support by <a href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a href="https://redirect.github.com/docker/login-action/pull/1048">docker/login-action#1048</a></li> <li>Bump <code>@​aws-sdk/client-ecr</code> and <code>@​aws-sdk/client-ecr-public</code> to 3.1091.0 in <a href="https://redirect.github.com/docker/login-action/pull/1037">docker/login-action#1037</a></li> <li>Bump <code>@​docker/actions-toolkit</code> from 0.92.0 to 0.94.0 in <a href="https://redirect.github.com/docker/login-action/pull/1044">docker/login-action#1044</a> <a href="https://redirect.github.com/docker/login-action/pull/1050">docker/login-action#1050</a></li> <li>Bump brace-expansion from 1.1.13 to 1.1.16 in <a href="https://redirect.github.com/docker/login-action/pull/1046">docker/login-action#1046</a></li> <li>Bump js-yaml from 5.2.0 to 5.2.1 in <a href="https://redirect.github.com/docker/login-action/pull/1038">docker/login-action#1038</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/login-action/compare/v4.4.0...v4.5.0">https://github.com/docker/login-action/compare/v4.4.0...v4.5.0</a></p> <h2>v4.4.0</h2> <ul> <li>Skip empty <code>registry-auth</code> secret mask by <a href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a href="https://redirect.github.com/docker/login-action/pull/1035">docker/login-action#1035</a></li> <li>Bump <code>@​aws-sdk/client-ecr</code> and <code>@​aws-sdk/client-ecr-public</code> to 3.1077.0 <a href="https://redirect.github.com/docker/login-action/pull/1034">docker/login-action#1034</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/login-action/compare/v4.3.0...v4.4.0">https://github.com/docker/login-action/compare/v4.3.0...v4.4.0</a></p> <h2>v4.3.0</h2> <ul> <li>Preserve names in esbuild bundle by <a href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a href="https://redirect.github.com/docker/login-action/pull/1022">docker/login-action#1022</a></li> <li>Bump <code>@​aws-sdk/client-ecr</code> and <code>@​aws-sdk/client-ecr-public</code> to 3.1076.0 <a href="https://redirect.github.com/docker/login-action/pull/999">docker/login-action#999</a> <a href="https://redirect.github.com/docker/login-action/pull/1030">docker/login-action#1030</a></li> <li>Bump <code>@​docker/actions-toolkit</code> from 0.90.0 to 0.92.0 in <a href="https://redirect.github.com/docker/login-action/pull/1004">docker/login-action#1004</a> <a href="https://redirect.github.com/docker/login-action/pull/1027">docker/login-action#1027</a></li> <li>Bump <code>@​sigstore/core</code> from 3.1.0 to 3.2.1 in <a href="https://redirect.github.com/docker/login-action/pull/1023">docker/login-action#1023</a></li> <li>Bump <code>@​sigstore/verify</code> from 3.1.0 to 3.1.1 in <a href="https://redirect.github.com/docker/login-action/pull/1029">docker/login-action#1029</a></li> <li>Bump http-proxy-agent and https-proxy-agent to 9.1.0 in <a href="https://redirect.github.com/docker/login-action/pull/1017">docker/login-action#1017</a></li> <li>Bump js-yaml from 4.1.1 to 5.2.0 in <a href="https://redirect.github.com/docker/login-action/pull/1028">docker/login-action#1028</a></li> <li>Bump sigstore from 4.1.0 to 4.1.1 in <a href="https://redirect.github.com/docker/login-action/pull/1031">docker/login-action#1031</a></li> <li>Bump tmp from 0.2.5 to 0.2.7 in <a href="https://redirect.github.com/docker/login-action/pull/1002">docker/login-action#1002</a></li> <li>Bump undici from 6.24.1 to 6.27.0 in <a href="https://redirect.github.com/docker/login-action/pull/1020">docker/login-action#1020</a></li> <li>Bump vite from 7.3.3 to 7.3.6 in <a href="https://redirect.github.com/docker/login-action/pull/1019">docker/login-action#1019</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/login-action/compare/v4.2.0...v4.3.0">https://github.com/docker/login-action/compare/v4.2.0...v4.3.0</a></p> <h2>v4.2.0</h2> <ul> <li>Bump <code>@​actions/core</code> from 3.0.0 to 3.0.1 in <a href="https://redirect.github.com/docker/login-action/pull/976">docker/login-action#976</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/docker/login-action/commit/dbcb813823bdd20940b903addbd779551569679f"><code>dbcb813</code></a> Merge pull request <a href="https://redirect.github.com/docker/login-action/issues/1051">#1051</a> from docker/dependabot/npm_and_yarn/aws-sdk-dependen...</li> <li><a href="https://github.com/docker/login-action/commit/5bcb015ee6ec720ecdeaef2dc1164122e9b209fc"><code>5bcb015</code></a> [dependabot skip] chore: update generated content</li> <li><a href="https://github.com/docker/login-action/commit/b30b2f2d3196c1714318ba0c3c3bec211d949752"><code>b30b2f2</code></a> build(deps): bump the aws-sdk-dependencies group across 1 directory with 2 up...</li> <li><a href="https://github.com/docker/login-action/commit/9087f1e6d666fe0292409e3c819680c18526e108"><code>9087f1e</code></a> Merge pull request <a href="https://redirect.github.com/docker/login-action/issues/1057">#1057</a> from docker/dependabot/npm_and_yarn/js-yaml-5.2.2</li> <li><a href="https://github.com/docker/login-action/commit/0009830ea169ca16c24c0ea4cac1c325bfa3aee4"><code>0009830</code></a> [dependabot skip] chore: update generated content</li> <li><a href="https://github.com/docker/login-action/commit/23255232d3e43c8f0052d9a0dba82a515a88ce92"><code>2325523</code></a> build(deps): bump js-yaml from 5.2.1 to 5.2.2</li> <li><a href="https://github.com/docker/login-action/commit/4ec1d4a769e8b05a89a7396551dc38b329211688"><code>4ec1d4a</code></a> Merge pull request <a href="https://redirect.github.com/docker/login-action/issues/1056">#1056</a> from docker/dependabot/npm_and_yarn/postcss-8.5.22</li> <li><a href="https://github.com/docker/login-action/commit/5fc99ba47bca274c5a499688f71c7ea79c0ea1b3"><code>5fc99ba</code></a> Merge pull request <a href="https://redirect.github.com/docker/login-action/issues/1053">#1053</a> from docker/dependabot/github_actions/aws-actions/co...</li> <li><a href="https://github.com/docker/login-action/commit/e512bd59d16c53d79ea5c0f0e345fe554453c4bb"><code>e512bd5</code></a> Merge pull request <a href="https://redirect.github.com/docker/login-action/issues/1052">#1052</a> from docker/dependabot/github_actions/codeql-actions...</li> <li><a href="https://github.com/docker/login-action/commit/a146c91b8f371700d323bae808af7cbdc2766ed5"><code>a146c91</code></a> Merge pull request <a href="https://redirect.github.com/docker/login-action/issues/1059">#1059</a> from crazy-max/harden-buildx-scope-paths</li> <li>Additional commits viewable in <a href="https://github.com/docker/login-action/compare/4907a6ddec9925e35a0a9e82d7399ccc52663121...dbcb813823bdd20940b903addbd779551569679f">compare view</a></li> </ul> </details> <br /> Updates `actions/setup-node` from 6.4.0 to 7.0.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/setup-node/releases">actions/setup-node's releases</a>.</em></p> <blockquote> <h2>v7.0.0</h2> <h2>What's Changed</h2> <h3>Enhancements:</h3> <ul> <li>Add cache-primary-key and cache-matched-key as outputs by <a href="https://github.com/gowridurgad"><code>@​gowridurgad</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1577">actions/setup-node#1577</a></li> <li>Migrate to ESM and upgrade dependencies by <a href="https://github.com/gowridurgad"><code>@​gowridurgad</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1574">actions/setup-node#1574</a></li> </ul> <h3>Bug fixes:</h3> <ul> <li>Remove dummy NODE_AUTH_TOKEN export by <a href="https://github.com/gowridurgad"><code>@​gowridurgad</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1558">actions/setup-node#1558</a></li> <li>Only use <code>mirrorToken</code> in <code>getManifest</code> if it's provided by <a href="https://github.com/deiga"><code>@​deiga</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1548">actions/setup-node#1548</a></li> </ul> <h3>Documentation updates:</h3> <ul> <li>Add documentation for publishing to npm with Trusted Publisher (OIDC) by <a href="https://github.com/chiranjib-swain"><code>@​chiranjib-swain</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1536">actions/setup-node#1536</a></li> <li>docs: Update restore-only cache documentation by <a href="https://github.com/priya-kinthali"><code>@​priya-kinthali</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1550">actions/setup-node#1550</a></li> <li>docs: Update caching recommendations to mitigate cache poisoning risks by <a href="https://github.com/chiranjib-swain"><code>@​chiranjib-swain</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1567">actions/setup-node#1567</a></li> </ul> <h3>Dependency update:</h3> <ul> <li>Upgrade <code>@​actions/cache</code> to 5.1.0, log cache write denied by <a href="https://github.com/jasongin"><code>@​jasongin</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1569">actions/setup-node#1569</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/chiranjib-swain"><code>@​chiranjib-swain</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-node/pull/1536">actions/setup-node#1536</a></li> <li><a href="https://github.com/deiga"><code>@​deiga</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-node/pull/1548">actions/setup-node#1548</a></li> <li><a href="https://github.com/jasongin"><code>@​jasongin</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-node/pull/1569">actions/setup-node#1569</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/setup-node/compare/v6...v7.0.0">https://github.com/actions/setup-node/compare/v6...v7.0.0</a></p> <h2>v6.5.0</h2> <h2>What's Changed</h2> <ul> <li>Update <code>@​actions/cache</code> to 5.1.0 and add security overrides for undici and fast-xml-parser by <a href="https://github.com/HarithaVattikuti"><code>@​HarithaVattikuti</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1579">actions/setup-node#1579</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/setup-node/compare/v6.4.0...v6.5.0">https://github.com/actions/setup-node/compare/v6.4.0...v6.5.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/actions/setup-node/commit/820762786026740c76f36085b0efc47a31fe5020"><code>8207627</code></a> Migrate to ESM and upgrade dependencies (<a href="https://redirect.github.com/actions/setup-node/issues/1574">#1574</a>)</li> <li><a href="https://github.com/actions/setup-node/commit/04be95cf3511ea51ebf9f224ddfb99cc7ab87cd4"><code>04be95c</code></a> Add cache-primary-key and cache-matched-key as outputs (<a href="https://redirect.github.com/actions/setup-node/issues/1577">#1577</a>)</li> <li><a href="https://github.com/actions/setup-node/commit/7c2c68d20d402ed6a201ada70a81341941093140"><code>7c2c68d</code></a> docs: Update caching recommendations to mitigate cache poisoning risks (<a href="https://redirect.github.com/actions/setup-node/issues/1567">#1567</a>)</li> <li><a href="https://github.com/actions/setup-node/commit/6a61c0375d66246de94630495909f12cf8dac84d"><code>6a61c03</code></a> Merge pull request <a href="https://redirect.github.com/actions/setup-node/issues/1569">#1569</a> from jasongin/update-actions-cache-5.1.0</li> <li><a href="https://github.com/actions/setup-node/commit/30eb73b41ded577900c1ebf968ef95cdf8f7434f"><code>30eb73b</code></a> Resolve high-severity audit issues</li> <li><a href="https://github.com/actions/setup-node/commit/4e1a87a501d0302f99e30e2748568adcb388d09f"><code>4e1a87a</code></a> Update dist</li> <li><a href="https://github.com/actions/setup-node/commit/360237f0c01778d0c17291f75c56d6feae4f7574"><code>360237f</code></a> Strict equality</li> <li><a href="https://github.com/actions/setup-node/commit/4f8aac5beb2f0854bc79651567a18c67eb0b9de3"><code>4f8aac5</code></a> Bump <code>@​actions/cache</code> to 5.1.0, log cache write denied</li> <li><a href="https://github.com/actions/setup-node/commit/f4a67bbeca970f103397d3d2b9462cf787cd2980"><code>f4a67bb</code></a> Only use <code>mirrorToken</code> in <code>getManifest</code> if it's provided (<a href="https://redirect.github.com/actions/setup-node/issues/1548">#1548</a>)</li> <li><a href="https://github.com/actions/setup-node/commit/0355742c943ddb13ca8a6b700f824231caa91e75"><code>0355742</code></a> Remove dummy NODE_AUTH_TOKEN export (<a href="https://redirect.github.com/actions/setup-node/issues/1558">#1558</a>)</li> <li>Additional commits viewable in <a href="https://github.com/actions/setup-node/compare/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e...820762786026740c76f36085b0efc47a31fe5020">compare view</a></li> </ul> </details> <br /> Updates `actions/cache` from 5.0.5 to 6.1.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/cache/releases">actions/cache's releases</a>.</em></p> <blockquote> <h2>v6.1.0</h2> <h2>What's Changed</h2> <ul> <li>Bump <code>@​actions/cache</code> to v6.1.0 - handle read-only cache access by <a href="https://github.com/jasongin"><code>@​jasongin</code></a> in <a href="https://redirect.github.com/actions/cache/pull/1768">actions/cache#1768</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/cache/compare/v6...v6.1.0">https://github.com/actions/cache/compare/v6...v6.1.0</a></p> <h2>v6.0.0</h2> <h2>What's Changed</h2> <ul> <li>Update packages, migrate to ESM by <a href="https://github.com/Samirat"><code>@​Samirat</code></a> in <a href="https://redirect.github.com/actions/cache/pull/1760">actions/cache#1760</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/cache/compare/v5...v6.0.0">https://github.com/actions/cache/compare/v5...v6.0.0</a></p> <h2>v5.1.0</h2> <h2>What's Changed</h2> <ul> <li>Bump <code>@​actions/cache</code> to v5.1.0 - handle read-only cache access by <a href="https://github.com/jasongin"><code>@​jasongin</code></a> in <a href="https://redirect.github.com/actions/cache/pull/1775">actions/cache#1775</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/cache/compare/v5...v5.1.0">https://github.com/actions/cache/compare/v5...v5.1.0</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/actions/cache/blob/main/RELEASES.md">actions/cache's changelog</a>.</em></p> <blockquote> <h1>Releases</h1> <h2>How to prepare a release</h2> <blockquote> <p>[!NOTE] Relevant for maintainers with write access only.</p> </blockquote> <ol> <li>Switch to a new branch from <code>main</code>.</li> <li>Run <code>npm test</code> to ensure all tests are passing.</li> <li>Update the version in <a href="https://github.com/actions/cache/blob/main/package.json"><code>https://github.com/actions/cache/blob/main/package.json</code></a>.</li> <li>Run <code>npm run build</code> to update the compiled files.</li> <li>Update this <a href="https://github.com/actions/cache/blob/main/RELEASES.md"><code>https://github.com/actions/cache/blob/main/RELEASES.md</code></a> with the new version and changes in the <code>## Changelog</code> section.</li> <li>Run <code>licensed cache</code> to update the license report.</li> <li>Run <code>licensed status</code> and resolve any warnings by updating the <a href="https://github.com/actions/cache/blob/main/.licensed.yml"><code>https://github.com/actions/cache/blob/main/.licensed.yml</code></a> file with the exceptions.</li> <li>Commit your changes and push your branch upstream.</li> <li>Open a pull request against <code>main</code> and get it reviewed and merged.</li> <li>Draft a new release <a href="https://github.com/actions/cache/releases">https://github.com/actions/cache/releases</a> use the same version number used in <code>package.json</code> <ol> <li>Create a new tag with the version number.</li> <li>Auto generate release notes and update them to match the changes you made in <code>RELEASES.md</code>.</li> <li>Toggle the set as the latest release option.</li> <li>Publish the release.</li> </ol> </li> <li>Navigate to <a href="https://github.com/actions/cache/actions/workflows/release-new-action-version.yml">https://github.com/actions/cache/actions/workflows/release-new-action-version.yml</a> <ol> <li>There should be a workflow run queued with the same version number.</li> <li>Approve the run to publish the new version and update the major tags for this action.</li> </ol> </li> </ol> <h2>Changelog</h2> <h3>6.1.0</h3> <ul> <li>Bump <code>@actions/cache</code> to v6.1.0 to pick up <a href="https://redirect.github.com/actions/toolkit/pull/2435">actions/toolkit#2435 Handle cache write error due to read-only token</a></li> <li>Switch redundant &quot;Cache save failed&quot; warning to debug log in save-only</li> </ul> <h3>6.0.0</h3> <ul> <li>Updated <code>@actions/cache</code> to ^6.0.1, <code>@actions/core</code> to ^3.0.1, <code>@actions/exec</code> to ^3.0.0, <code>@actions/io</code> to ^3.0.2</li> <li>Migrated to ESM module system</li> <li>Upgraded Jest to v30 and test infrastructure to be ESM compatible</li> </ul> <h3>5.0.4</h3> <ul> <li>Bump <code>minimatch</code> to v3.1.5 (fixes ReDoS via globstar patterns)</li> <li>Bump <code>undici</code> to v6.24.1 (WebSocket decompression bomb protection, header validation fixes)</li> <li>Bump <code>fast-xml-parser</code> to v5.5.6</li> </ul> <h3>5.0.3</h3> <ul> <li>Bump <code>@actions/cache</code> to v5.0.5 (Resolves: <a href="https://github.com/actions/cache/security/dependabot/33">https://github.com/actions/cache/security/dependabot/33</a>)</li> <li>Bump <code>@actions/core</code> to v2.0.3</li> </ul> <h3>5.0.2</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/actions/cache/commit/55cc8345863c7cc4c66a329aec7e433d2d1c52a9"><code>55cc834</code></a> Merge pull request <a href="https://redirect.github.com/actions/cache/issues/1768">#1768</a> from jasongin/readonly-cache</li> <li><a href="https://github.com/actions/cache/commit/d8cd72f230726cdf4457ebb61ec1b593a8d12337"><code>d8cd72f</code></a> Bump <code>@​actions/cache</code> to v6.1.0 - handle cache write error due to RO token</li> <li><a href="https://github.com/actions/cache/commit/2c8a9bd7457de244a408f35966fab2fb45fda9c8"><code>2c8a9bd</code></a> Merge pull request <a href="https://redirect.github.com/actions/cache/issues/1760">#1760</a> from actions/samirat/esm_migration_and_package_update</li> <li><a href="https://github.com/actions/cache/commit/e9b91fdc3fea7d79165fceb79042ef45c2d51023"><code>e9b91fd</code></a> Prettier fixes</li> <li><a href="https://github.com/actions/cache/commit/e4884b8ff7f92ef6b52c79eda480bbc86e685adb"><code>e4884b8</code></a> Rebuild dist</li> <li><a href="https://github.com/actions/cache/commit/10baf0191a3c426ea0fa4a3253a5c04233b6e18f"><code>10baf01</code></a> Fixed licenses</li> <li><a href="https://github.com/actions/cache/commit/e39b386c9004d72a15d864ade8c0b3a702d47a37"><code>e39b386</code></a> Fix test mock return order</li> <li><a href="https://github.com/actions/cache/commit/b6928203372a8571ff984c0c883ef3a1adfb0c06"><code>b692820</code></a> PR feedback</li> <li><a href="https://github.com/actions/cache/commit/60749128a44d25d3c520a489e576380cf00ff3f1"><code>6074912</code></a> Rebuild dist bundles as ESM to match type:module</li> <li><a href="https://github.com/actions/cache/commit/5a912e8b4af820fa082a0e75cfd2c782f8fbfe0e"><code>5a912e8</code></a> Fix lint and jest issues</li> <li>Additional commits viewable in <a href="https://github.com/actions/cache/compare/27d5ce7f107fe9357f9df03efb73ab90386fccae...55cc8345863c7cc4c66a329aec7e433d2d1c52a9">compare view</a></li> </ul> </details> <br /> Updates `lycheeverse/lychee-action` from 2.8.0 to 2.9.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/lycheeverse/lychee-action/releases">lycheeverse/lychee-action's releases</a>.</em></p> <blockquote> <h2>v2.9.0</h2> <h2>Summary</h2> <p>This release updates the default lychee version from <code>v0.23.0</code> to <code>v0.24.2</code>.</p> <p>The main reason for this release is compatibility with the new lychee <code>0.24.x</code> release artifacts. Starting with lychee <code>v0.24.0</code>, the archive layout changed, and the <code>lychee</code> binary may now be packaged inside a subdirectory. <code>lychee-action</code> now detects that layout automatically, so users can upgrade without changing their workflows.</p> <p>If you use:</p> <pre lang="yaml"><code>uses: lycheeverse/lychee-action@v2 </code></pre> <p>you will get the new version once the floating <code>v2</code> tag has been updated. If you pin exact versions, update to:</p> <pre lang="yaml"><code>uses: lycheeverse/lychee-action@v2.9.0 </code></pre> <h2>What’s new from lychee <code>v0.24.x</code></h2> <h3>Better diagnostics</h3> <p>lychee now reports line and column numbers for detected links. This makes broken link reports easier to act on, especially in larger documentation sites or generated reports.</p> <h3>Text fragment checking</h3> <p>lychee can now check URL text fragments, such as links containing <code>#:~:text=...</code>. This helps catch links that point to a valid page but no longer points to the intended highlighted text.</p> <h3>Sitemap support</h3> <p>lychee can now read <code>sitemap.xml</code> inputs. This is useful for checking published websites or generated documentation sites where the sitemap is the easiest source of URLs to validate.</p> <h3>JUnit output</h3> <p>lychee now supports JUnit output. This makes it easier to integrate link checking results with CI systems and test reporting tools that understand JUnit XML.</p> <h3>Redirect and remap visibility</h3> <p>lychee can now show redirects and remaps more clearly. This helps explain why a URL was checked as a different final URL and makes debugging link-checking behavior easier.</p> <h3>Multiple config files</h3> <p>lychee now supports multiple configuration files and expanded config handling. This is useful for repositories that split documentation, website, or package-specific link-checking settings.</p> <h3>Timeout handling</h3> <p>lychee can now accept timeouts explicitly. This gives users more control over how strict their link checks should be for flaky or slow endpoints.</p> <h2>Fixes and reliability improvements</h2> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/lycheeverse/lychee-action/commit/e7477775783ea5526144ba13e8db5eec57747ce8"><code>e747777</code></a> Bump actions/cache from 5 to 6 (<a href="https://redirect.github.com/lycheeverse/lychee-action/issues/340">#340</a>)</li> <li><a href="https://github.com/lycheeverse/lychee-action/commit/39066c6d1f0de280863a3760160617e188b607ad"><code>39066c6</code></a> Bump actions/checkout from 6 to 7 (<a href="https://redirect.github.com/lycheeverse/lychee-action/issues/339">#339</a>)</li> <li><a href="https://github.com/lycheeverse/lychee-action/commit/6da1d14f3a43098a294b7696d93d938aa8d20fc0"><code>6da1d14</code></a> Install into $RUNNER_TEMP instead of $HOME (<a href="https://redirect.github.com/lycheeverse/lychee-action/issues/338">#338</a>)</li> <li><a href="https://github.com/lycheeverse/lychee-action/commit/a63497c75a5435b151e800818e2286764b6e119a"><code>a63497c</code></a> fixes <a href="https://redirect.github.com/lycheeverse/lychee-action/issues/322">#322</a> check for null (<a href="https://redirect.github.com/lycheeverse/lychee-action/issues/336">#336</a>)</li> <li><a href="https://github.com/lycheeverse/lychee-action/commit/b40e218fdac9481d3c13098d4e1ee56f3b589356"><code>b40e218</code></a> [create-pull-request] automated change</li> <li><a href="https://github.com/lycheeverse/lychee-action/commit/faea714062690f6c2e6f7f388469ec4fa6d9c4e1"><code>faea714</code></a> bump default to 0.24.1 and auto-detect lychee bin in subfolder (<a href="https://redirect.github.com/lycheeverse/lychee-action/issues/330">#330</a>)</li> <li>See full diff in <a href="https://github.com/lycheeverse/lychee-action/compare/8646ba30535128ac92d33dfc9133794bfdd9b411...e7477775783ea5526144ba13e8db5eec57747ce8">compare view</a></li> </ul> </details> <br /> Updates `actions/cache/restore` from 5.0.5 to 6.1.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/cache/releases">actions/cache/restore's releases</a>.</em></p> <blockquote> <h2>v6.1.0</h2> <h2>What's Changed</h2> <ul> <li>Bump <code>@​actions/cache</code> to v6.1.0 - handle read-only cache access by <a href="https://github.com/jasongin"><code>@​jasongin</code></a> in <a href="https://redirect.github.com/actions/cache/pull/1768">actions/cache#1768</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/cache/compare/v6...v6.1.0">https://github.com/actions/cache/compare/v6...v6.1.0</a></p> <h2>v6.0.0</h2> <h2>What's Changed</h2> <ul> <li>Update packages, migrate to ESM by <a href="https://github.com/Samirat"><code>@​Samirat</code></a> in <a href="https://redirect.github.com/actions/cache/pull/1760">actions/cache#1760</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/cache/compare/v5...v6.0.0">https://github.com/actions/cache/compare/v5...v6.0.0</a></p> <h2>v5.1.0</h2> <h2>What's Changed</h2> <ul> <li>Bump <code>@​actions/cache</code> to v5.1.0 - handle read-only cache access by <a href="https://github.com/jasongin"><code>@​jasongin</code></a> in <a href="https://redirect.github.com/actions/cache/pull/1775">actions/cache#1775</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/cache/compare/v5...v5.1.0">https://github.com/actions/cache/compare/v5...v5.1.0</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/actions/cache/blob/main/RELEASES.md">actions/cache/restore's changelog</a>.</em></p> <blockquote> <h1>Releases</h1> <h2>How to prepare a release</h2> <blockquote> <p>[!NOTE] Relevant for maintainers with write access only.</p> </blockquote> <ol> <li>Switch to a new branch from <code>main</code>.</li> <li>Run <code>npm test</code> to ensure all tests are passing.</li> <li>Update the version in <a href="https://github.com/actions/cache/blob/main/package.json"><code>https://github.com/actions/cache/blob/main/package.json</code></a>.</li> <li>Run <code>npm run build</code> to update the compiled files.</li> <li>Update this <a href="https://github.com/actions/cache/blob/main/RELEASES.md"><code>https://github.com/actions/cache/blob/main/RELEASES.md</co... _Description has been truncated_ Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 78ef156b85dbd1753497f49138125a237bb589ed Author: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Mon Sep 7 08:52:32 2026 +0000 Fix auto-renewal charging tasks for foreign workloads (#12750) A core index doesn't permanently belong to a task. Core assignments are rebuilt every region, and a renewal buys a core in the next sale, so a workload can end up on a different core index each region. Because of this, `PotentialRenewals` can hold records for the same core index belonging to different tasks at the same time. For example, the pending renewal of the task running on that core in the current bulk period, and the renewal record of the task that will run on it in the next bulk period. `enable_auto_renew` didn't account for this. It first checks whether there is any renewable workload at (core, current region begin), and if there is one it renews it immediately and charges the task's sovereign account, without checking whose workload it is and without looking at the hint. So a task following the documented flow (passing its own core and its own renewal record's timeslice as the hint) could end up paying for the renewal of a completely unrelated task. The stored auto-renewal record then keeps charging it for that foreign workload every sale. This happened on Polkadot Coretime: task 3428 enabled auto-renewal for its twelve cores with correct parameters, but five of those core indices were still carrying other tasks' pending renewals for the current sale. One went through, so task 3428 paid for task 2094's renewal: [Link](https://coretime-polkadot.subscan.io/event/4766580-87) - `enable_auto_renew` only renews immediately if the expiring workload includes the task. If the core is expiring with another task's workload, we fall through to the workload_end_hint path instead, which must point to the task's own renewal record (otherwise the call fails with the new `TaskNotInWorkload` error). - `renew_cores` re-checks this before charging the sovereign account. On a mismatch it emits `AutoRenewalFailed` and drops the record instead of charging. This also cleans up the mismatched record that is currently on-chain. - If the core was renewed immediately when enabling, `next_renewal` is now set to the end of the period that was just renewed. Previously the `workload_end_hint` was stored instead, so auto-renewal would skip the next renewal and the task would lose its core. --------- Co-authored-by: Dónal Murray <donal.murray@parity.io> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 0433ae35e33efcff9a2bfaddd42fe8f3230dcd3a Author: Xiliang Chen <xlchen1291@gmail.com> Date: Mon Sep 7 02:19:39 2026 +0000 pallet-psm: use recorded decimals when minting (#13062) PSM debt is denominated using decimal snapshots recorded when the PSM and external asset are registered. Redemption already uses those snapshots, while minting rejected calls when mutable asset metadata no longer matched them. Use the recorded decimals for minting as well, keeping both directions on the same conversion rate and preventing metadata-only updates from disabling minting. No downstream integration changes are required. commit 32b52bbbf8076d1de938e5d2fbf391f0cb7a5532 Author: Klapeyron <11329616+Klapeyron@users.noreply.github.com> Date: Sun Sep 6 21:06:25 2026 +0000 feat(sc-consensus-babe): expose build_verifier like Aura (#13061) **Motivation:** BABE cannot be used with a custom import queue today, because `BabeVerifier` is only constructed inside `import_queue` and immediately wrapped in `BasicQueue`. Aura already exposes `build_verifier` for that. This PR adds the same API for BABE (`build_verifier` + `BuildVerifierParams`) so a node can compose `BabeVerifier` into its own `ImportQueue`. `import_queue` is unchanged for existing callers: it still builds a `BasicQueue` and still spawns the epoch-data worker. No change for callers of `import_queue`. To compose BABE with a custom queue (same pattern as Aura): ```rust let verifier = sc_consensus_babe::build_verifier(sc_consensus_babe::BuildVerifierParams { client: client.clone(), slot_duration, config: babe_link.config().clone(), epoch_changes: babe_link.epoch_changes().clone(), telemetry, }); // pass `verifier` into BasicQueue::new or any ImportQueue ``` `BabeVerifier::new` stays `pub(crate)`. Epoch RPC still comes only from `import_queue` (`BabeWorkerHandle`). - `BuildVerifierParams` + `build_verifier` are the Aura equivalents (`sc_consensus_aura::{BuildVerifierParams, build_verifier}`). - `import_queue` now calls `build_verifier` instead of constructing `BabeVerifier { ... }` inline. Worker spawn and `BasicQueue::new` are unchanged. - No verification or import-path behavior change. No tests: API surface only. Signed-off-by: Tomasz Bartos <tomasz.bartos@shielded.io> commit 1dce1e4c9029215c6f2c1c082d02cb42f80e39d3 Author: Paolo La Camera <paolo@parity.io> Date: Sat Sep 5 11:39:56 2026 +0000 Re-export WeightInfo from the assets and vesting precompile crates (#13092) `pallet-assets-precompiles` and `pallet-vesting-precompiles` now re-export their `WeightInfo` trait at the crate root like every other pallet, so weight files generated by `frame-omni-bencher`'s default template (`<crate>::WeightInfo`) compile without hand edits (see polkadot-fellows/runtimes#1280). --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Jason Colapietro <55137770+JasonColapietro@users.noreply.github.com> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> commit e3b5699e26a4ffff2a6dcbf51af00ff3b2a272f4 Author: Alexandre R. Baldé <alexandre.balde@parity.io> Date: Sat Sep 5 00:15:40 2026 +0000 Aggregate the genesis vesting lock across an account's schedules (#13016) `GenesisConfig::build` called `set_lock` once per entry with that entry's amount. `set_lock` replaces rather than adds, so an account with several genesis entries kept a lock covering only the last one. The runtime path already aggregates through `write_lock`. commit 2aa08d3336790474a90221573cd8eea214bc6796 Author: Jason Colapietro <55137770+JasonColapietro@users.noreply.github.com> Date: Fri Sep 4 08:14:03 2026 +0000 fix(rpc): release capacity after registration failure (#12853) Fixes #12787. Keep a reserved RPC connection owned by `ReservedConnection` until identifier registration succeeds. If registration rejects a duplicate identifier, `Drop` now releases the reserved capacity instead of leaking it. The regression test reserves capacity, triggers duplicate registration, and verifies that another reservation can still use the released slot. - `rustfmt` on the changed source - isolated crate harness including `connections.rs`: 3 unit tests and doc tests pass A schema-validated `prdoc/stable2606/pr_12853.prdoc` entry is included with a patch bump for `sc-rpc-spec-v2`. --------- Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> commit fd42d2f58404290bfff77492f4e48c531d209bf4 Author: Paolo La Camera <paolo@parity.io> Date: Thu Sep 3 20:15:32 2026 +0000 [EPMB] bound the tx-fee refund of a signed submission (#12877) The winner of the signed phase is paid `RewardBase` plus the transaction fees their submission cost them, tracked in `SubmissionMetadata::fee`. Two changes: - A new `signed::Config::MaxFeeRefund` caps the refundable portion, both for the winner and for an invulnerable clearing a discarded submission. The payout is now bounded by config - Storing a page that is already stored no longer accrues a fee, matching what the refund is meant to cover. Runtimes should set `MaxFeeRefund` to `signed::FullSubmissionFee<Runtime, TransactionPayment>`, which prices one `register` plus `Pages` `submit_page` calls at the maximum encoded page size. `FullSubmissionFee` needs the fee of a call it cannot afford to build, so `frame_support` gains `EstimateFee`, a sibling of `EstimateCallFee` that takes an encoded length and a `DispatchInfo` instead of a call, implemented by `pallet-transaction-payment`. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com> commit c18c52159413f3dc3dafed0053e41b36e14f2b7b Author: Egor_P <egor@parity.io> Date: Thu Sep 3 08:47:34 2026 +0000 [Release] Changelog refactoring (#13037) Closes: https://github.com/paritytech/release-engineering/issues/299 This PR reworks the changelog that is published with each polkadot-sdk release on GitHub. The main changes are: - A `💥 Breaking Changes` section at the top of the changelog a compilation of all changes that carry a major crate bump, across all prdocs included in the release. - New grouping: changes are grouped by topic (`Bridges`, `XCM`, `Node`, …), derived automatically from the crates listed in each prdoc via the taxonomy in prdoc/topics.yaml. - Inside each topic, entries are sub-grouped by audience (`🛠️ Runtime Dev`, `🔧 Node Dev`, …), so the audience label is read once per group instead of being repeated on every entry and readers who preferred the old audience-oriented changelog still get that view. - Extended Dockerhub section, listing the full set of images that we publish with each release The release body shows a condensed changelog (kept under GitHub's release-body size cap); the complete changelog is attached to the release as CHANGELOG.md, together with a machine-readable changelog.json (schema: scripts/release/changelog/schema.json). A new CI regression check renders everything against real prdoc folders on any PR touching the tooling. Rendered example can be found here: https://github.com/EgorPopelyaev/polkadot-sdk/releases/tag/polkadot-stable3436-rc1 Follow-up for the free text topics that can be added to the existing prdoc field: paritytech/release-engineering#300 --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> commit 9c2323b3b3429764ffce37ce37be93f1182d53c5 Author: Chima <psykyodai@proton.me> Date: Wed Sep 2 21:03:52 2026 +0000 `frame-support`: fix `CountedStorageMap` and `CountedStorageNMap` counter drift (#13031) Closes #12782. `try_append` increments the counter on every append that fits the bound: ```rust if current < bound { CounterFor::<Prefix>::mutate(|value| value.saturating_inc()); ``` Appending to an existing key creates no entry, so `count()` climbs above the number of stored keys. remove decrements once per key, so the drift never clears. Every other method in the file already guards this: `insert`, `append` and `remove` check `contains_key`, and `try_mutate_exists` tracks the `existed/exist` transition. ```rust if !<Self as MapWrapper>::Map::contains_key(Ref::from(&key)) { CounterFor::<Prefix>::mutate(|value| value.saturating_inc()); } ``` The same guard `append` uses. `contains_key` rather than `current == 0`, because `decode_len(..).unwrap_or_default()` returns 0 both for an absent key and for an existing empty value. `try_append_decode_len_works` already appends twice to one key but asserts only on `decode_len`, which is why this went unnoticed. The new test asserts `count()`. No pallet calls `try_append` on a `CountedStorageMap` today, so nothing on-chain changes. The cost is one extra storage read per call, the same read insert and append already pay. commit 5c52f17d7029a06185c811da79f3e0d016cf0ef7 Author: georgepisaltu <52418509+georgepisaltu@users.noreply.github.com> Date: Wed Sep 2 17:07:53 2026 +0000 Add sufficiency method in `fungibles` (#13059) This PR adds a method in the `fungibles` trait family to query whether an asset is sufficient or not. The notion of sufficiency was already introduced in `fungibles::Create` but up until now it has only been used internally. The new method has a default impl so that this would not be a breaking change. The same could be accomplished with another trait extending `Inspect`, but that seemed too complex for what we are trying to achieve here. If the breaking change is acceptable, we can remove the default impl. Also, the method does not assume anything about `fungible` impls as they never carried any notion of sufficiency. `fungible` is generally used as the native currency but this is not necessarily so since it's just a trait for a single fungible currency. IMO it is worse to add "sufficient" logic to `fungible` than to just default to `false` in our `UnionOf` adapters when `fungible` is encountered. * [x] My PR includes a detailed description as outlined in the "Description" and its two subsections above. * [x] My PR follows the [labeling requirements]( https://github.com/paritytech/polkadot-sdk/blob/master/docs/contributor/CONTRIBUTING.md#Process ) of this project (at minimum one label for `T` required) * External contributors: Use `/cmd label <label-name>` to add labels * Maintainers can also add labels manually * [x] I have made corresponding changes to the documentation (if applicable) * [x] I have added tests that prove my fix is effective or that my feature works (if applicable) --------- Signed-off-by: georgepisaltu <george.pisaltu@parity.io>

Commit:67c1257
Author:Sebastian Kunert
Committer:GitHub

Cleanup: Remove unused INDEXED_BODY attribute (#13399) In our substrate backend, there has been a `SyncMode::LightState` which held a `storage_chain_mode` flag which was supposed to sync storage chains. However, this has been unused for years and is also not in use in the current storage chain syncing solution. This is because the original design had the problem that Blocks on storage chains can hold more than 16MB of data (including renewals) and it is not reasonable or possible to fetch them in one go with the block request. The mechanism has been superseeded by a blockimport which fetches this data based on info from the runtime, see #12242. This cleans up the never-used leftovers from the previous approach. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com>

Commit:937c50e
Author:Sebastian Kunert

Remove INDEXED_BODY attribute

Commit:a133bcf
Author:Bastian Köcher

Offchain code support

Commit:6f1085b
Author:Bastian Köcher

Merge branch 'mku-jam-collator-poc' of github.com:paritytech/polkadot-sdk into parchain-service

Commit:28e8b89
Author:Bastian Köcher

Adds additional data

Commit:6d43339
Author:Sebastian Kunert
Committer:GitHub

Rework bitswap client and server (#12686) This PR extracts Bitswap from `sc-network` into a dedicated `sc-network-bitswap` crate and replaces the backend-specific implementations with a single actor-driven service and streaming handle API. ## New API `BitswapHandle::request_stream(cids)` accepts a wantlist of arbitrary size and returns a bounded channel yielding hash-verified (Cid, Vec<u8>) pairs as each block resolves, so a slow CID never holds back completed ones. The service retries unresolved CIDs indefinitely and has no internal timeout — the caller sets its own deadline and cancels by dropping the receiver. All scheduling now lives in the actor: peers tracked via sync events, HAVE-based peer preference, per-peer timeouts, failover on disconnect, and deduplication so concurrent requests for the same CID share one network request. **Backpressure:** Outbound, a dispatch window caps in-flight CIDs at 1024 with a FIFO behind it, and the bounded command channel returns Overloaded immediately instead of queueing unboundedly. Inbound, wantlists go into capped per-peer queues served round-robin, and database lookups run on at most 8 semaphore-guarded blocking workers. Each permit is only released after the response has been forwarded to the transport, so network backpressure propagates back into the lookup pool. *Note:* The rewrite here only supports litep2p. I don't see a good reason to support libp2p for this. But up for debate, we could try to introduce libp2p compatibility here again. ## New structure - `handle.rs`: public request-stream API and errors - `service.rs`: request scheduling, peer management, and inbound serving - `metrics.rs`: Bitswap metrics - `service/tests.rs`: unit and property tests - Storage-chain sync and node wiring consume the new handle API --------- Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com>

Commit:795e110
Author:Sebastian Kunert
Committer:Sebastian Kunert

Refactor bitswap client

Commit:740487f
Author:Sebastian Kunert
Committer:Sebastian Kunert

Refactor bitswap client

Commit:0350e69
Author:Sebastian Kunert
Committer:Sebastian Kunert

Refactor bitswap client

Commit:2cc3797
Author:Sebastian Kunert

Refactor bitswap client

Commit:6a9934b
Author:Tiago Tavares

feat(sc-network): increase bitswap message size limit to 8MB - Vendor litep2p 0.12.3 with increased MAX_PAYLOAD_SIZE from 2MB to 8MB - Add response batching in bitswap to avoid exceeding message size limit - Fixes timeout issues when fetching large transaction chunks via IPFS Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Commit:350a192
Author:Bastian Köcher

Start

Commit:0e55f3a
Author:Dmitry Markin
Committer:castillax

RFC-0008: Store parachain bootnodes in the relay chain DHT (#8072) Implement [RFC-0008 "DHT bootnodes"](https://polkadot-fellows.github.io/RFCs/approved/0008-parachain-bootnodes-dht.html). Close https://github.com/paritytech/polkadot-sdk/issues/1825. With this mechanism, every parachain node is eligible to act as a bootnode. If its peer ID is close to the parachain key for the current relay chain epoch, it becomes discoverable by other parachain nodes via the relay chain DHT. This removes the need to specify bootnodes in the parachain chainspec, eliminating a single point of failure and simplifying things for parachain operators. The mechanism is enabled by default. The embedded DHT bootnode can be disabled using the `--no-dht-bootnode` flag, and discovery of such nodes can be disabled with the `--no-dht-bootnode-discovery` flag. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com>

The documentation is generated from this commit.

Commit:3ff1b1d
Author:Dmitry Markin
Committer:GitHub

RFC-0008: Store parachain bootnodes in the relay chain DHT (#8072) Implement [RFC-0008 "DHT bootnodes"](https://polkadot-fellows.github.io/RFCs/approved/0008-parachain-bootnodes-dht.html). Close https://github.com/paritytech/polkadot-sdk/issues/1825. With this mechanism, every parachain node is eligible to act as a bootnode. If its peer ID is close to the parachain key for the current relay chain epoch, it becomes discoverable by other parachain nodes via the relay chain DHT. This removes the need to specify bootnodes in the parachain chainspec, eliminating a single point of failure and simplifying things for parachain operators. The mechanism is enabled by default. The embedded DHT bootnode can be disabled using the `--no-dht-bootnode` flag, and discovery of such nodes can be disabled with the `--no-dht-bootnode-discovery` flag. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com>

The documentation is generated from this commit.

Commit:d34a426
Author:Dmitry Markin

minor: fix whitespace in protobuf schema

The documentation is generated from this commit.

Commit:95f1757
Author:Dmitry Markin

Downgrade to `proto2` to resolve `protoc` compatibility with `optional`

Commit:fc7c5a3
Author:Dmitry Markin

Add paranode req-resp protocol protobuf schema

Commit:e8c3e9b
Author:alindima

post-state POC

Commit:6720279
Author:Alexandru Gheorghe
Committer:GitHub

authorithy-discovery: Make changing of peer-id while active a bit more robust (#3786) In the case when nodes don't persist their node-key or they want to generate a new one while being in the active set, things go wrong because both the old addresses and the new ones will still be present in DHT, so because of the distributed nature of the DHT both will survive in the network untill the old ones expires which is 36 hours. Nodes in the network will randomly resolve the authorithy-id to the old address or the new one. More details in: https://github.com/paritytech/polkadot-sdk/issues/3673 This PR proposes we mitigate this problem, by: 1. Let the query for a DHT key retrieve more than one results(4), that is also bounded by the replication factor which is 20, currently we interrupt the querry on the first result. ~2. Modify the authority-discovery service to keep all the discovered addresses around for 24h since they last seen an address.~ ~3. Plumb through other subsystems where the assumption was that an authorithy-id will resolve only to one PeerId. Currently, the authorithy-discovery keeps just the last record it received from DHT and queries the DHT every 10 minutes. But they could always receive only the old address, only the new address or a flip-flop between them depending on what node wins the race to provide the record~ 2. Extend the `SignedAuthorityRecord` with a signed creation_time. 3. Modify authority discovery to keep track of nodes that sent us old record and once we are made aware of a new record update the nodes we know about with the new record. 4. Update gossip-support to try resolve authorities more often than every session. ~This would gives us a lot more chances for the nodes in the networks to also discover not only the old address of the node but also the new one and should improve the time it takes for a node to be properly connected in the network. The behaviour won't be deterministic because there is no guarantee the all nodes will see the new record at least once, since they could query only nodes that have the old one.~ ## TODO - [x] Add unittests for the new paths. - [x] Make sure the implementation is backwards compatible - [x] Evaluate if there are any bad consequence of letting the query continue rather than finish it at first record found. - [x] Bake in versi the new changes. --------- Signed-off-by: Alexandru Gheorghe <alexandru.gheorghe@parity.io> Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com>

Commit:527e039
Author:Aaro Altonen
Committer:Ankan

Integrate litep2p into Polkadot SDK (#2944) [litep2p](https://github.com/altonen/litep2p) is a libp2p-compatible P2P networking library. It supports all of the features of `rust-libp2p` that are currently being utilized by Polkadot SDK. Compared to `rust-libp2p`, `litep2p` has a quite different architecture which is why the new `litep2p` network backend is only able to use a little of the existing code in `sc-network`. The design has been mainly influenced by how we'd wish to structure our networking-related code in Polkadot SDK: independent higher-levels protocols directly communicating with the network over links that support bidirectional backpressure. A good example would be `NotificationHandle`/`RequestResponseHandle` abstractions which allow, e.g., `SyncingEngine` to directly communicate with peers to announce/request blocks. I've tried running `polkadot --network-backend litep2p` with a few different peer configurations and there is a noticeable reduction in networking CPU usage. For high load (`--out-peers 200`), networking CPU usage goes down from ~110% to ~30% (80 pp) and for normal load (`--out-peers 40`), the usage goes down from ~55% to ~18% (37 pp). These should not be taken as final numbers because: a) there are still some low-hanging optimization fruits, such as enabling [receive window auto-tuning](https://github.com/libp2p/rust-yamux/pull/176), integrating `Peerset` more closely with `litep2p` or improving memory usage of the WebSocket transport b) fixing bugs/instabilities that incorrectly cause `litep2p` to do less work will increase the networking CPU usage c) verification in a more diverse set of tests/conditions is needed Nevertheless, these numbers should give an early estimate for CPU usage of the new networking backend. This PR consists of three separate changes: * introduce a generic `PeerId` (wrapper around `Multihash`) so that we don't have use `NetworkService::PeerId` in every part of the code that uses a `PeerId` * introduce `NetworkBackend` trait, implement it for the libp2p network stack and make Polkadot SDK generic over `NetworkBackend` * implement `NetworkBackend` for litep2p The new library should be considered experimental which is why `rust-libp2p` will remain as the default option for the time being. This PR currently depends on the master branch of `litep2p` but I'll cut a new release for the library once all review comments have been addresses. --------- Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: Alexandru Vasile <alexandru.vasile@parity.io>

Commit:80616f6
Author:Aaro Altonen
Committer:GitHub

Integrate litep2p into Polkadot SDK (#2944) [litep2p](https://github.com/altonen/litep2p) is a libp2p-compatible P2P networking library. It supports all of the features of `rust-libp2p` that are currently being utilized by Polkadot SDK. Compared to `rust-libp2p`, `litep2p` has a quite different architecture which is why the new `litep2p` network backend is only able to use a little of the existing code in `sc-network`. The design has been mainly influenced by how we'd wish to structure our networking-related code in Polkadot SDK: independent higher-levels protocols directly communicating with the network over links that support bidirectional backpressure. A good example would be `NotificationHandle`/`RequestResponseHandle` abstractions which allow, e.g., `SyncingEngine` to directly communicate with peers to announce/request blocks. I've tried running `polkadot --network-backend litep2p` with a few different peer configurations and there is a noticeable reduction in networking CPU usage. For high load (`--out-peers 200`), networking CPU usage goes down from ~110% to ~30% (80 pp) and for normal load (`--out-peers 40`), the usage goes down from ~55% to ~18% (37 pp). These should not be taken as final numbers because: a) there are still some low-hanging optimization fruits, such as enabling [receive window auto-tuning](https://github.com/libp2p/rust-yamux/pull/176), integrating `Peerset` more closely with `litep2p` or improving memory usage of the WebSocket transport b) fixing bugs/instabilities that incorrectly cause `litep2p` to do less work will increase the networking CPU usage c) verification in a more diverse set of tests/conditions is needed Nevertheless, these numbers should give an early estimate for CPU usage of the new networking backend. This PR consists of three separate changes: * introduce a generic `PeerId` (wrapper around `Multihash`) so that we don't have use `NetworkService::PeerId` in every part of the code that uses a `PeerId` * introduce `NetworkBackend` trait, implement it for the libp2p network stack and make Polkadot SDK generic over `NetworkBackend` * implement `NetworkBackend` for litep2p The new library should be considered experimental which is why `rust-libp2p` will remain as the default option for the time being. This PR currently depends on the master branch of `litep2p` but I'll cut a new release for the library once all review comments have been addresses. --------- Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: Alexandru Vasile <alexandru.vasile@parity.io>

Commit:265a674
Author:Aaro Altonen
Committer:Aaro Altonen

Make Polkadot SDK generic over the networking implementation Implement `NetworkBackend` for `NetworkWorker`, introduce more traits related to making notification/request-response protocols generic over the underlying networking backend and start using these traits throughout the codebase. `sc_network::NetworkService` is no longer provided as an object but instead as `Arc<dyn NetworkService>` which abstracts the underlying networking backend without introducing generics across the entire codebase. Notification/request-response protocol configurations are generic over the networking backend as libp2p and litep2p have slightly different ways of providing said protocols and thus require custom ways of initializing them. The network backend be selected with `--network-backend` switch

Commit:b52e64d
Author:Pierre Krieger
Committer:GitHub

Fix the light client protocol protobuf schema (#12732) * Fix the light client protocol protobuf schema * Add another test * Remove unused protobuf struct * Ok you have to use the nightly rustfmt apparently

Commit:8920b1c
Author:Pierre Krieger
Committer:GitHub

Clarify the "direction" field of block requests (#12438)

Commit:d61b086
Author:Pierre Krieger
Committer:GitHub

Remove the unused light client requests (#12470) * Remove the unused light client requests * Add comment about new ids

Commit:4a6c7aa
Author:Pierre Krieger
Committer:GitHub

Remove "to_block" field from BlockRequests (#12447) * Remove "to_block" field from BlockRequests * Maybe fix the tests

Commit:b494167
Author:Aaro Altonen
Committer:GitHub

Move bitswap to its own crate (#12242) * Introduce `sc-network-bitswap` Move the bitswap protocol out of `sc-network` to its own crate. * Improve test coverage * Remove mention of bitswap from `sc-network` * Fix documentation * Fix clippy and remove the void dependency * Remove unneeded trait bound and bump prost to 0.11

Commit:1988c4a
Author:Roman
Committer:GitHub

Upgrade to libp2p 0.45.1 (#11682) * Upgrade to libp2p 0.45.1 * Limit max_negotiating_inbound_streams to 512 * Upgrade prost-build to 0.10 * Set max_negotiating_inbound_streams to 2048 Co-authored-by: Pierre Krieger <pierre.krieger1708@gmail.com> * Fix authority discovery protobuf * Fix comments in authority-discovery schema Co-authored-by: Pierre Krieger <pierre.krieger1708@gmail.com> * Add a comment about transport initialization Co-authored-by: Pierre Krieger <pierre.krieger1708@gmail.com>

Commit:8a45870
Author:Nazar Mokrynskyi
Committer:GitHub

Network sync refactoring (part 3) (#11347) * Move `light.v1.proto` schema into new crate `sc-network-light` * Move `sc_network::light_client_requests` and submodule to `sc_network_light::light_client_requests` * Fix apparently outdated reference in documentation and visibility modifier * Fix rustdoc check * Update lock file

Commit:e397e0b
Author:Nazar Mokrynskyi
Committer:GitHub

Network sync refactoring (part 2) (#11322) * Move `api.v1.proto` schema into new crate `sc-network-sync` * Move `sc_network::protocol::sync::state` module into `sc_network_sync::state` * Move `sc_network::protocol::sync::blocks` module into `sc_network_sync::blocks` and some data structures from `sc_network::protocol::message` module into `sc_network_sync::message` * Move some data structures from `sc_network::config` and `sc_network::request_responses` into new `sc-network-common` crate * Move `sc_network::protocol::sync::warm` and `sc_network::warp_request_handler` modules into `sc_network_sync` * Move `client/network/sync/src/lib.rs` to `client/network/sync/src/lib_old.rs` to preserve history of changes of the file in the next commit * Move `client/network/src/protocol/sync.rs` on top of `client/network/sync/src/lib.rs` to preserve history of changes * Move `sc_network::protocol::sync` to `sc_network_sync` with submodules, move message data structures around accordingly * Move `sc_network::block_request_handler` to `sc_network_sync::block_request_handler` * Move `sc_network::state_request_handler` to `sc_network_sync::state_request_handler` * Add re-exports for compatibility reasons * Apply suggestions from code review Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>

Commit:5fd7fdc
Author:wigy
Committer:GitHub

Authentication of PeerIds in authority discovery records (#10317) * Consolidating test and production code * Signing/verifying authority discovery records with PeerId Unsigned records cannot be rejected yet, they just produce a warning in the log. * Upgrading to libp2p 0.40 * libp2p::identity and sp_core::crypto Ed25519 are compatible * Rejecting authority records unsigned by peer id can be configured * Fixes based on review comments * No command-line argument needed * info was still too much spam in the logs * Added tests for both strict and loose validation * Fixing based on review comments * Pierre preferred a signing method * Ooops, I need to slow down * Update bin/node/cli/src/service.rs * Reexport libp2p crypto used in sc-network * Added proto3 compatibility tests. And import noise. Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>

Commit:ca5b072
Author:cheme
Committer:GitHub

Fast sync child trie support. (#9239) * state machine proofs. * initial implementation * Remove todo. * Extend test and fix import. * fix no proof, with proof ko. * fix start at logic. * Restore response size. * Rework comments. * Add explicit ref * Use compact proof. * ref change * elaborato on empty change set condition. * KeyValueState renaming. * Do not add two time child trie with same root to sync reply. * rust format * Fix merge. * fix warnings and fmt * fmt * update protocol id to V2

Commit:5a65bf5
Author:Arkadiy Paronyan
Committer:GitHub

Storage chains sync (#9171) * Sync storage chains * Test * Apply suggestions from code review Co-authored-by: cheme <emericchevalier.pro@gmail.com> * Separate block body and indexed body * Update client/db/src/lib.rs Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> Co-authored-by: cheme <emericchevalier.pro@gmail.com> Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com> Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com>

Commit:77a4b98
Author:Arkadiy Paronyan
Committer:GitHub

Fast sync (#8884) * State sync * Importing state fixes * Bugfixes * Sync with proof * Status reporting * Unsafe sync mode * Sync test * Cleanup * Apply suggestions from code review Co-authored-by: cheme <emericchevalier.pro@gmail.com> Co-authored-by: Pierre Krieger <pierre.krieger1708@gmail.com> * set_genesis_storage * Extract keys from range proof * Detect iter completion * Download and import bodies with fast sync * Replaced meta updates tuple with a struct * Fixed reverting finalized state * Reverted timeout * Typo * Doc * Doc * Fixed light client test * Fixed error handling * Tweaks * More UpdateMeta changes * Rename convert_transaction * Apply suggestions from code review Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Code review suggestions * Fixed count handling Co-authored-by: cheme <emericchevalier.pro@gmail.com> Co-authored-by: Pierre Krieger <pierre.krieger1708@gmail.com> Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>

Commit:d3d02d8
Author:Jon Häggblad
Committer:GitHub

Support sending and receiving multiple Justifications (#8266) * client/network: support sending multiple justifications * network: flag support for multiple justifications in protobuf request * Update client/network/src/protocol.rs Co-authored-by: Pierre Krieger <pierre.krieger1708@gmail.com> * network: update comment on protobuf field Co-authored-by: Pierre Krieger <pierre.krieger1708@gmail.com>

Commit:e905c9a
Author:Arkadiy Paronyan
Committer:GitHub

Storage chains: serve transactions over IPFS/bitswap (#7963) * IPFS server for transactions * Style * Indent * Log message * CLI option * Apply suggestions from code review Co-authored-by: Pierre Krieger <pierre.krieger1708@gmail.com> * Style * Style * Minor fixes Co-authored-by: Pierre Krieger <pierre.krieger1708@gmail.com>

Commit:1871a95
Author:André Silva
Committer:GitHub

grandpa: remove light-client specific block import pipeline (#7546) * grandpa: remove light-client specific block import * consensus, network: remove finality proofs

Commit:2d5ec72
Author:Max Inden
Committer:GitHub

client/authority-discovery: Introduce AuthorityDiscoveryService (#6760) * client/authority-discovery: Rename AuthorityDiscovery to XXXWorker * client/authority-discovery: Introduce AuthorityDiscoveryService Add a basic `AuthorityDiscoveryService` implementation which enables callers to get the addresses for a given `AuthorityId` from the local cache. * client/authority-discovery: Split into worker and service mod Move `Service` and `Worker` to their own Rust modules resulting in the following file structure. ├── build.rs ├── Cargo.toml └── src ├── error.rs ├── lib.rs ├── service.rs ├── tests.rs ├── worker │   ├── addr_cache.rs │   ├── schema │   │   └── dht.proto │   └── tests.rs └── worker.rs * client/authority-discovery: Cache PeerId -> AuthorityId mapping * client/authority-discovery: Update priority group on interval Instead of updating the authority discovery peerset priority group each time a new DHT value is found, update it regularly on an interval. This removes the need for deterministic random selection. Instead of trying to return a random stable set of `Multiaddr`s, the `AddrCache` now returns a random set on each call. * client/authority-discovery: Implement Service::get_authority_id * client/authority-discovery: Use HashMap instead of BTreeMap * client/authority-discovery: Rework priority group interval * client/authority-discovery: Fix comment * bin/node/cli: Update authority discovery constructor * client/authority-discovery: Fuse from_service receiver * client/authority-discovery: Remove Rng import * client/authority-discovery: Ignore Multiaddr without PeerId * client/authority-discovery/service: Add note on returned None * client/authority-discovery/addr_cache: Replace double clone with deref

Commit:929bd07
Author:Pierre Krieger
Committer:GitHub

Move around stuff in sc_network (#5847)

Commit:6a7e86e
Author:Pierre Krieger
Committer:GitHub

Use new block requests protocol (#5760) * Use new block requests protocol * Tweak comment

Commit:a7f578d
Author:Pierre Krieger
Committer:GitHub

Add a protocol that answers finality proofs (#5718) * Add a protocol that answers finality proofs * Fix documentation * Use Toggle

Commit:4ffcf98
Author:cheme
Committer:GitHub

Child trie api changes BREAKING (#4857) Co-Authored-By: thiolliere <gui.thiolliere@gmail.com>

Commit:9ab9134
Author:Pierre Krieger
Committer:GitHub

Remove request ID from the new protocol (#5049)

Commit:c7a14db
Author:Shawn Tabrizi
Committer:GitHub

Fix various spelling errors (#4940) * meaningfull -> meaningful * initialise -> initialize * tokans -> tokens * incentivise -> incentivize * lenght -> length * incentivisation -> incentivization * doesnt't -> doesn't * overwriten -> overwritten * lifecycle -> life cycle * lifecycle -> life cycle * usefull -> useful * noone -> no one * spaming -> spamming * defered -> deferred * hieght -> height * sumation -> summation * ingore -> ignore * registed -> registered * Auxialary -> Auxiliary * loggin -> logging * independance -> independence * trailling -> trailing * responsability -> responsibility * trunkated -> truncated * Weither -> Whether * informations -> information * Runtume -> Runtime * choosen -> chosen * delcataion -> declaration * Unchekced -> Unchecked * defintion -> definition * scrach -> scratch * imput -> input * transfered -> transferred * endownment -> endowment * Determinator -> Determiner * relevent -> relevant * emited -> emitted * acocunt -> account * proprotional -> proportional * instantiaion -> instantiation * commited -> committed * tombstonedead -> tombstone * uwnrap -> unwrap * acount -> account * specialised -> specialized * existant -> existent * requried -> required * Anull -> Annul * AUTHORITES -> AUTHORITIES * underyling -> underlying * recognisable -> recognizable * Capitalise -> Capitalize * reportfor -> report for * hearbeat -> heartbeat * onlineness -> being online * creater -> creator * Bytearray -> Byte array * Despoit -> Deposit * substratced -> subtracted * Curent -> Current * imbalanes -> imbalances * countfown -> countdown * inexisting -> inexistent * additionaly -> additionally * substracted -> subtracted * auxilary -> auxiliary * parital -> partial * in't -> isn't * compatability -> compatibility * infomation -> information * etected -> detected * extrinsiscs -> extrinsics * reprensentation -> representation * coonfiguration -> configuration * primtives -> primitives * miscelanious -> miscellaneous * VERISON -> VERSION * endcoded -> encoded * Genrates -> Generates * miliseconds -> milliseconds * occured -> occurred * trully -> truely * truely -> truly * conjuction -> conjunction * encouters -> encounters * customised -> customized * deterministicly -> deterministically * finalisation -> finalization * pluggable -> plugable * wakeup -> wake-up * interemdiate -> intermediate * intepreting -> interpreting * finalzied -> finalized * throgh -> through * extinsic -> extrinsic * convient -> convenient * allocater -> allocator * propagateable -> propagatable * succesfuly -> successfully * finalising -> finalizing * publically -> publicly * phrasee -> phrase * substration -> substractions * substractions -> subtractions * neccessarily -> necessarily * Inlucde -> Include * unefficient -> inefficient * thay -> they * funtion -> function * datastructures -> data structures * infromation -> information * propagatable -> propagable * ecountered -> encountered * recognise -> recognize * intergration -> integration * lastet -> latest * datatypes -> data types * datatype -> data type * Strongarming -> Strong Arming * avaible -> available * Commiting -> Committing * Retreiving -> Retrieving * shoud -> should * canonicaliziation -> canonicalization * comitted -> committed * clonable -> cloneable * Uknown -> Unknown * reponse -> response * arbitary -> arbitrary * Capapbilities -> Capabilities * responsbile -> responsible * initialisation -> initialization * cames -> came * intemediate -> intermediate * reqeust -> request * intance -> instance * explcitly -> explicitly * neighor -> neighbor * reolving -> resolving * untill -> until * Validte -> Validate * deserailize -> deserialize * literaly -> literally * preceeding -> preceding * abpve -> above * chcecked -> checked * numbet -> number * Unknow -> Unknown * halfs -> halves * gossup -> gossip * givent -> given * immediatelly -> immediately * slicable -> sliceable * conensus -> consensus * Mimicks -> Mimics * acccept -> accept * serialise -> serialize * exstrinsics -> extrinsics * panicks -> panics * maintaince -> maintenance * repeatidely -> repeatedly * anecstor -> ancestor * becasue -> because * processer -> processor * Prunning -> Pruning * insterested -> interested * unuseful -> not useful * yeided -> yielded * descendfing -> descending * corresponts -> corresponds * survivew -> survive * keps -> keeps * ligh -> light * prerequisities -> prerequisites * positiion -> position * depedency -> dependency * extrinisic -> extrinsic * atomicaly -> atomically * staticly -> statically * resul -> result * timestamb -> timestamp * Utilites -> Utilities * ammount -> amount * pocess -> process * exteral -> external * Update client/finality-grandpa/src/tests.rs * Update primitives/io/src/lib.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update primitives/blockchain/src/lib.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update frame/support/src/weights.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update bin/node/cli/tests/common.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update client/api/src/execution_extensions.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update client/cli/src/params.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update client/executor/common/src/sandbox.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update client/api/src/execution_extensions.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update client/finality-grandpa/src/communication/mod.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update client/state-db/src/pruning.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update frame/contracts/src/tests.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update client/api/src/execution_extensions.rs * bump impl * timestamb -> timestamp Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com>

Commit:51a45c5
Author:Toralf Wittner
Committer:GitHub

network: Use "one shot" protocol handler. (#3520) * network: Use "one shot" protocol handler. Add two new `NetworkBehaviour`s, one handling remote block requests and another one to handle light client requests (both local and from remote). The change is motivated by the desire to use multiple substreams of a single connection for different protocols. To achieve this, libp2p's `OneShotHandler` is used as a protocol handler in each behaviour. It will open a fresh substream for the duration of the request and close it afterwards. For block requests, we currently only handle incoming requests from remote and tests are missing. For light client handling we support incoming requests from remote and also ported a substantial amount of functionality over from `light_dispatch.rs` (including several tests). However the result lacks in at least two aspects: (1) We require external updates w.r.t. the best block per peer and currently nothing updates this information. (2) We carry a lot of peer-related state around. Both aspects could be simplified by externalising peer selection and just requiring a specific peer ID where the request should be sent to. We still have to maintain some peer related state due to the way libp2p's swarm and network behaviour work (e.g. we must make sure to always issue `NetworkBehaviourAction::SendEvent`s to peers we are connected to, otherwise the actions die a silent death. Another change implemented here is the use of protocol buffers as the encoding for network messages. Certain individual fields of messages are still SCALE encoded. There has been some discussion about this in another PR (https://github.com/paritytech/substrate/pull/3452), so far without resolution. * Uncomment `Behaviour::light_client_request`. * Add license headers.

Commit:60e5011
Author:Benjamin Kampmann
Committer:Bastian Köcher

Reorganising the repository - external renames and moves (#4074) * Adding first rough ouline of the repository structure * Remove old CI stuff * add title * formatting fixes * move node-exits job's script to scripts dir * Move docs into subdir * move to bin * move maintainence scripts, configs and helpers into its own dir * add .local to ignore * move core->client * start up 'test' area * move test client * move test runtime * make test move compile * Add dependencies rule enforcement. * Fix indexing. * Update docs to reflect latest changes * Moving /srml->/paint * update docs * move client/sr-* -> primitives/ * clean old readme * remove old broken code in rhd * update lock * Step 1. * starting to untangle client * Fix after merge. * start splitting out client interfaces * move children and blockchain interfaces * Move trie and state-machine to primitives. * Fix WASM builds. * fixing broken imports * more interface moves * move backend and light to interfaces * move CallExecutor * move cli off client * moving around more interfaces * re-add consensus crates into the mix * fix subkey path * relieve client from executor * starting to pull out client from grandpa * move is_decendent_of out of client * grandpa still depends on client directly * lemme tests pass * rename srml->paint * Make it compile. * rename interfaces->client-api * Move keyring to primitives. * fixup libp2p dep * fix broken use * allow dependency enforcement to fail * move fork-tree * Moving wasm-builder * make env * move build-script-utils * fixup broken crate depdencies and names * fix imports for authority discovery * fix typo * update cargo.lock * fixing imports * Fix paths and add missing crates * re-add missing crates

Commit:027d887
Author:Max Inden
Committer:GitHub

core/authority-discovery: Enable authorities to discover each other (#3452) With the *authority-discovery* module an authoritative node makes itself discoverable and is able to discover other authorities. Once discovered, a node can directly connect to other authorities instead of multi-hop gossiping information. 1. **Making itself discoverable** 1. Retrieve its external addresses 2. Adds its network peer id to the addresses 3. Sign the above 4. Put the signature and the addresses on the libp2p Kademlia DHT 2. **Discovering other authorities** 1. Retrieve the current set of authorities 2. Start DHT queries for the ids of the authorities 3. Validate the signatures of the retrieved key value pairs 4. Add the retrieved external addresses as ~reserved~ priority nodes to the peerset * node/runtime: Add authority-discovery as session handler The srml/authority-discovery module implements the OneSessionHandler in order to keep its authority set in sync. This commit adds the module to the set of session handlers. * core/network: Make network worker return Dht events on poll Instead of network worker implement the Future trait, have it implement the Stream interface returning Dht events. For now these events are ignored in build_network_future but will be used by the core/authority-discovery module in subsequent commits. * *: Add scaffolding and integration for core/authority-discovery module * core/authority-discovery: Implement module logic itself