Skip to content
Snippets Groups Projects
  1. Feb 26, 2025
    • clangenb's avatar
      remove leftovers of the contracts-rococo parachain (#7638) · 51170495
      clangenb authored
      There were already previous efforts to remove the contracts-rococo
      chain, see #5471, which was done as a response to this comment
      https://github.com/paritytech/polkadot-sdk/pull/5288#discussion_r1711157476.
      
      This PR intends to fix the parts that were overlooked back then, and
      remove all traces of contracts-rococo as it is intended to be replaced
      by a new testnet including pallet-revive.
  2. Feb 25, 2025
  3. Feb 20, 2025
    • Alexandru Vasile's avatar
      net/litep2p: Bring the latest compatibility fixes via v0.9.1 (#7640) · 42e9de7f
      Alexandru Vasile authored
      
      This PR updates litep2p to version 0.9.1. The yamux config is entirely
      removed to mirror the libp2p yamux upstream version.
      While at it, I had to bump indexmap and URL as well. 
      
      
      ## [0.9.1] - 2025-01-19
      
      This release enhances compatibility between litep2p and libp2p by using
      the latest Yamux upstream version. Additionally, it includes various
      improvements and fixes to boost the stability and performance of the
      WebSocket stream and the multistream-select protocol.
      
      ### Changed
      
      - yamux: Switch to upstream implementation while keeping the controller
      API ([#320](https://github.com/paritytech/litep2p/pull/320))
      - req-resp: Replace SubstreamSet with FuturesStream
      ([#321](https://github.com/paritytech/litep2p/pull/321))
      - cargo: Bring up to date multiple dependencies
      ([#324](https://github.com/paritytech/litep2p/pull/324))
      - build(deps): bump hickory-proto from 0.24.1 to 0.24.3
      ([#323](https://github.com/paritytech/litep2p/pull/323))
      - build(deps): bump openssl from 0.10.66 to 0.10.70
      ([#322](https://github.com/paritytech/litep2p/pull/322))
      
      ### Fixed
      
      - websocket/stream: Fix unexpected EOF on `Poll::Pending` state
      poisoning ([#327](https://github.com/paritytech/litep2p/pull/327))
      - websocket/stream: Avoid memory allocations on flushing
      ([#325](https://github.com/paritytech/litep2p/pull/325))
      - multistream-select: Enforce `io::error` instead of empty protocols
      ([#318](https://github.com/paritytech/litep2p/pull/318))
      - multistream: Do not wait for negotiation in poll_close
      ([#319](https://github.com/paritytech/litep2p/pull/319))
      
      cc @paritytech/networking
      
      ---------
      
      Signed-off-by: default avatarAlexandru Vasile <alexandru.vasile@parity.io>
    • Alexander Theißen's avatar
      Update to Rust stable 1.84.1 (#7625) · e2d3da61
      Alexander Theißen authored
      
      Ref https://github.com/paritytech/ci_cd/issues/1107
      
      We mainly need that so that we can finally compile the `pallet_revive`
      fixtures on stable. I did my best to keep the commits focused on one
      thing to make review easier.
      
      All the changes are needed because rustc introduced more warnings or is
      more strict about existing ones. Most of the stuff could just be fixed
      and the commits should be pretty self explanatory. However, there are a
      few this that are notable:
      
      ## `non_local_definitions `
      
      A lot of runtimes to write `impl` blocks inside functions. This makes
      sense to reduce the amount of conditional compilation. I guess I could
      have moved them into a module instead. But I think allowing it here
      makes sense to avoid the code churn.
      
      ## `unexpected_cfgs`
      
      The FRAME macros emit code that references various features like `std`,
      `runtime-benchmarks` or `try-runtime`. If a create that uses those
      macros does not have those features we get this warning. Those were
      mostly when defining a `mock` runtime. I opted for silencing the warning
      in this case rather than adding not needed features.
      
      For the benchmarking ui tests I opted for adding the `runtime-benchmark`
      feature to the `Cargo.toml`.
      
      ## Failing UI test
      
      I am bumping the `trybuild` version and regenerating the ui tests. The
      old version seems to be incompatible. This requires us to pass
      `deny_warnings` in `CARGO_ENCODED_RUSTFLAGS` as `RUSTFLAGS` is ignored
      in the new version.
      
      ## Removing toolchain file from the pallet revive fixtures
      
      This is no longer needed since the latest stable will compile them fine
      using the `RUSTC_BOOTSTRAP=1`.
      
      ---------
      
      Co-authored-by: default avatarcmd[bot] <41898282+github-actions[bot]@users.noreply.github.com>
  4. Feb 18, 2025
    • Tsvetomir Dimitrov's avatar
      Implementation of ah-client and rc-client staking pallets (#7582) · 669b8890
      Tsvetomir Dimitrov authored
      Recreation of https://github.com/paritytech/polkadot-sdk/pull/7357 on
      top of master. The old PR messes up the git history too much so I am
      recreating it from scratch.
      
      This PR is work in progress. It's purpose is to commit initial structure
      of `pallet-staking-ah-client` and `pallet-staking-rc-client` to master.
      The changes will be polished by a follow up PRs which will be
      backported.
      
      Related issues: https://github.com/paritytech/polkadot-sdk/issues/6167
      and https://github.com/paritytech/polkadot-sdk/issues/6166
      
      This PR introduces the initial structure for `pallet-ah-client` and
      `pallet-rc-client`. These pallets will reside on the relay chain and
      AssetHub, respectively, and will manage the interaction between
      `pallet-session` on the relay chain and `pallet-staking` on AssetHub.
      
      Both pallets are experimental and not intended for production use.
      
      TODOs:
      - [ ] Probably handle
      https://github.com/paritytech/polkadot-sdk/issues/6344 here.
      
      ----...
  5. Feb 17, 2025
  6. Feb 16, 2025
    • dependabot[bot]'s avatar
      Bump enumflags2 from 0.7.7 to 0.7.11 (#7426) · 0f2024f5
      dependabot[bot] authored
      
      Bumps [enumflags2](https://github.com/meithecatte/enumflags2) from 0.7.7
      to 0.7.11.
      <details>
      <summary>Release notes</summary>
      <p><em>Sourced from <a
      href="https://github.com/meithecatte/enumflags2/releases">enumflags2's
      releases</a>.</em></p>
      <blockquote>
      <h2>Release 0.7.10</h2>
      <ul>
      <li>Fix a case where the <code>#[bitflags]</code> macro would access the
      crate through <code>enumflags2::...</code> instead of
      <code>::enumflags2::...</code>. This makes the generated code more
      robust and avoids triggering the <code>unused_qualifications</code>
      lint. (<a
      href="https://redirect.github.com/meithecatte/enumflags2/issues/58">#58</a>)</li>
      <li>Rework the proc-macro to use <code>syn</code> with the
      <code>derive</code> feature (as opposed to <code>full</code>). This
      reduces the <code>cargo build</code> time for <code>enumflags2</code> by
      about 20%.</li>
      </ul>
      <h2>Release 0.7.9</h2>
      <ul>
      <li>The <code>BitFlag</code> trait now includes convenience re-exports
      for the constructors of <code>BitFlags</code>. This lets you do
      <code>MyFlag::from_bits</code> instead
      <code>BitFlags::&lt;MyFlag&gt;::from_bits</code> where the type of the
      flag cannot be inferred from context (thanks <a
      href="https://github.com/ronnodas"><code>@​ronnodas</code></a>).</li>
      <li>The documentation now calls out the fact that the implementation of
      <code>PartialOrd</code> may not be what you expect (reported by <a
      href="https://github.com/ronnodas"><code>@​ronnodas</code></a>).</li>
      </ul>
      <h2>Release 0.7.8</h2>
      <ul>
      <li>New API: <code>BitFlags::set</code>. Sets the value of a specific
      flag to that of the <code>bool</code> passed as argument. (thanks, <a
      href="https://github.com/m4dh0rs3"><code>@​m4dh0rs3</code></a>)</li>
      <li><code>BitFlags</code> now implements <code>PartialOrd</code> and
      <code>Ord</code>, to make it possible to use it as a key in a
      <code>BTreeMap</code>.</li>
      <li>The bounds on the implementation of <code>Hash</code> got improved,
      so that it is possible to use it in code generic over <code>T:
      BitFlag</code>.</li>
      </ul>
      </blockquote>
      </details>
      <details>
      <summary>Commits</summary>
      <ul>
      <li><a
      href="https://github.com/meithecatte/enumflags2/commit/cc09d89bc4ef20fbf4c8016a40e160fe47b2d042"><code>cc09d89</code></a>
      Release 0.7.11</li>
      <li><a
      href="https://github.com/meithecatte/enumflags2/commit/24f03afbd0c23adaf0873a941600bd0b3b7ba302"><code>24f03af</code></a>
      make_bitflags: Allow omitting { } for singular flags</li>
      <li><a
      href="https://github.com/meithecatte/enumflags2/commit/754a8de723c54c79b2a8ab6993adc59b478273b0"><code>754a8de</code></a>
      Expand some aspects of the documentation</li>
      <li><a
      href="https://github.com/meithecatte/enumflags2/commit/aec9558136a53a952f39b74a4a0688a31423b815"><code>aec9558</code></a>
      Update ui tests for latest nightly</li>
      <li><a
      href="https://github.com/meithecatte/enumflags2/commit/8205d5ba03ccc9ccb7407693440f8e47f8ceeeb4"><code>8205d5b</code></a>
      Release 0.7.10</li>
      <li><a
      href="https://github.com/meithecatte/enumflags2/commit/1c78f097165436d043f48b9f6183501f84ff965f"><code>1c78f09</code></a>
      Run clippy with only the declared syn features</li>
      <li><a
      href="https://github.com/meithecatte/enumflags2/commit/561fe5eaf7ba6daeb267a41343f6def2a8b86ad7"><code>561fe5e</code></a>
      Emit a proper error if bitflags enum is generic</li>
      <li><a
      href="https://github.com/meithecatte/enumflags2/commit/f3bb174beb27a1d1ef28dcf03fb607a3bb7c6e55"><code>f3bb174</code></a>
      Avoid depending on syn's <code>full</code> feature flag</li>
      <li><a
      href="https://github.com/meithecatte/enumflags2/commit/e01808be0f151ac251121833d3225debd253ca3a"><code>e01808b</code></a>
      Always use absolute paths in generated proc macro code</li>
      <li><a
      href="https://github.com/meithecatte/enumflags2/commit/f08cd33a18511608f4a881e53c4f4c1b951301e0"><code>f08cd33</code></a>
      Specify the Rust edition for the whole test package</li>
      <li>Additional commits viewable in <a
      href="https://github.com/meithecatte/enumflags2/compare/v0.7.7...v0.7.11">compare
      view</a></li>
      </ul>
      </details>
      <br />
      
      
      [![Dependabot compatibility
      score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=enumflags2&package-manager=cargo&previous-version=0.7.7&new-version=0.7.11)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
      
      Dependabot will resolve any conflicts with this PR as long as you don't
      alter it yourself. You can also trigger a rebase manually 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 merge` will merge this PR after your CI passes on it
      - `@dependabot squash and merge` will squash and merge this PR after
      your CI passes on it
      - `@dependabot cancel merge` will cancel a previously requested merge
      and block automerging
      - `@dependabot reopen` will reopen this PR if it is closed
      - `@dependabot close` will close this PR and stop Dependabot recreating
      it. You can achieve the same result by closing it manually
      - `@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)
      
      
      </details>
      
      Signed-off-by: default avatardependabot[bot] <support@github.com>
      Co-authored-by: default avatardependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
      Co-authored-by: default avatarBastian Köcher <git@kchr.de>
  7. Feb 14, 2025
    • Kian Paimani's avatar
      [AHM] Multi-block staking election pallet (#7282) · a025562b
      Kian Paimani authored
      ## Multi Block Election Pallet
      
      This PR adds the first iteration of the multi-block staking pallet. 
      
      From this point onwards, the staking and its election provider pallets
      are being customized to work in AssetHub. While usage in solo-chains is
      still possible, it is not longer the main focus of this pallet. For a
      safer usage, please fork and user an older version of this pallet.
      
      ---
      
      ## Replaces
      
      - [x] https://github.com/paritytech/polkadot-sdk/pull/6034 
      - [x] https://github.com/paritytech/polkadot-sdk/pull/5272
      
      ## Related PRs: 
      
      - [x] https://github.com/paritytech/polkadot-sdk/pull/7483
      - [ ] https://github.com/paritytech/polkadot-sdk/pull/7357
      - [ ] https://github.com/paritytech/polkadot-sdk/pull/7424
      - [ ] https://github.com/paritytech/polkadot-staking-miner/pull/955
      
      This branch can be periodically merged into
      https://github.com/paritytech/polkadot-sdk/pull/7358 ->
      https://github.com/paritytech/polkadot-sdk/pull/6996
      
      ## TODOs: 
      
      - [x] rebase to mas...
  8. Feb 13, 2025
  9. Feb 12, 2025
    • Serban Iorga's avatar
      Update some dependencies (#7548) · af4c745b
      Serban Iorga authored
      Related to https://github.com/paritytech/polkadot-sdk/issues/7360
      
      Update some dependencies needed for implementing
      `DecodeWithMemTracking`:
      `parity-scale-codec` -> 3.7.4
      `finality-grandpa` -> 0.16.3
      `bounded-collections` -> 0.2.3
      `impl-codec` -> 0.7.1
  10. Jan 30, 2025
    • Jeeyong Um's avatar
      Replace derivative dependency with derive-where (#7324) · 0d644ca0
      Jeeyong Um authored
      
      # Description
      
      Close #7122.
      
      This PR replaces the unmaintained `derivative` dependency with
      `derive-where`.
      
      ## Integration
      
      This PR doesn't change the public interfaces.
      
      ## Review Notes
      
      The `derivative` crate, previously used to derive basic traits for
      structs with generics or enums, is no longer actively maintained. It has
      been replaced with the `derive-where` crate, which offers a more
      straightforward syntax while providing the same features as
      `derivative`.
      
      ---------
      
      Co-authored-by: default avatarGuillaume Thiolliere <gui.thiolliere@gmail.com>
  11. Jan 28, 2025
    • Andrew Jones's avatar
      Implement pallet view function queries (#4722) · 0b8d7441
      Andrew Jones authored
      
      Closes #216.
      
      This PR allows pallets to define a `view_functions` impl like so:
      
      ```rust
      #[pallet::view_functions]
      impl<T: Config> Pallet<T>
      where
      	T::AccountId: From<SomeType1> + SomeAssociation1,
      {
      	/// Query value no args.
      	pub fn get_value() -> Option<u32> {
      		SomeValue::<T>::get()
      	}
      
      	/// Query value with args.
      	pub fn get_value_with_arg(key: u32) -> Option<u32> {
      		SomeMap::<T>::get(key)
      	}
      }
      ```
      ### `QueryId`
      
      Each view function is uniquely identified by a `QueryId`, which for this
      implementation is generated by:
      
      ```twox_128(pallet_name) ++ twox_128("fn_name(fnarg_types) -> return_ty")```
      
      The prefix `twox_128(pallet_name)` is the same as the storage prefix for pallets and take into account multiple instances of the same pallet.
      
      The suffix is generated from the fn type signature so is guaranteed to be unique for that pallet impl. For one of the view fns in the example above it would be `twox_128("get_value_with_arg(u32) -> Option<u32>")`. It is a known limitation that only the type names themselves are taken into account: in the case of type aliases the signature may have the same underlying types but a different id; for generics the concrete types may be different but the signatures will remain the same.
      
      The existing Runtime `Call` dispatchables are addressed by their concatenated indices `pallet_index ++ call_index`, and the dispatching is handled by the SCALE decoding of the `RuntimeCallEnum::PalletVariant(PalletCallEnum::dispatchable_variant(payload))`. For `view_functions` the runtime/pallet generated enum structure is replaced by implementing the `DispatchQuery` trait on the outer (runtime) scope, dispatching to a pallet based on the id prefix, and the inner (pallet) scope dispatching to the specific function based on the id suffix.
      
      Future implementations could also modify/extend this scheme and routing to pallet agnostic queries.
      
      ### Executing externally
      
      These view functions can be executed externally via the system runtime api:
      
      ```rust
      pub trait ViewFunctionsApi<QueryId, Query, QueryResult, Error> where
      	QueryId: codec::Codec,
      	Query: codec::Codec,
      	QueryResult: codec::Codec,
      	Error: codec::Codec,
      {
      	/// Execute a view function query.
      fn execute_query(query_id: QueryId, query: Query) -> Result<QueryResult,
      Error>;
      }
      ```
      ### `XCQ`
      Currently there is work going on by @xlc to implement [`XCQ`](https://github.com/open-web3-stack/XCQ/) which may eventually supersede this work.
      
      It may be that we still need the fixed function local query dispatching in addition to XCQ, in the same way that we have chain specific runtime dispatchables and XCM.
      
      I have kept this in mind and the high level query API is agnostic to the underlying query dispatch and execution. I am just providing the implementation for the `view_function` definition.
      
      ### Metadata
      Currently I am utilizing the `custom` section of the frame metadata, to avoid modifying the official metadata format until this is standardized.
      
      ### vs `runtime_api`
      There are similarities with `runtime_apis`, some differences being:
      - queries can be defined directly on pallets, so no need for boilerplate declarations and implementations
      - no versioning, the `QueryId` will change if the signature changes. 
      - possibility for queries to be executed from smart contracts (see below)
      
      ### Calling from contracts
      Future work would be to add `weight` annotations to the view function queries, and a host function to `pallet_contracts` to allow executing these queries from contracts.
      
      ### TODO
      
      - [x] Consistent naming (view functions pallet impl, queries, high level api?)
      - [ ] End to end tests via `runtime_api`
      - [ ] UI tests
      - [x] Mertadata tests
      - [ ] Docs
      
      ---------
      
      Co-authored-by: default avatarkianenigma <kian@parity.io>
      Co-authored-by: default avatarJames Wilson <james@jsdw.me>
      Co-authored-by: default avatarGiuseppe Re <giuseppe.re@parity.io>
      Co-authored-by: default avatarGuillaume Thiolliere <guillaume.thiolliere@parity.io>
  12. Jan 26, 2025
  13. Jan 20, 2025
    • seemantaggarwal's avatar
      Use docify export for parachain template hardcoded configuration and embed it... · 4937f779
      seemantaggarwal authored
      Use docify export for parachain template hardcoded configuration and embed it in its README #6333 (#7093)
      
      Use docify export for parachain template hardcoded configuration and
      embed it in its README #6333
      
      Docify currently has a limitation of not being able to embed a
      variable/const in its code, without embedding it's definition, even if
      do something in a string like
      
      "this is a sample string ${sample_variable}"
      
      It will embed the entire string 
      "this is a sample string ${sample_variable}"
      without replacing the value of sample_variable from the code
      
      Hence, the goal was just to make it obvious in the README where the
      PARACHAIN_ID value is coming from, so a note has been added at the start
      for the same, so whenever somebody is running these commands, they will
      be aware about the value and replace accordingly.
      
      To make it simpler, we added a 
      rust ignore block so the user can just look it up in the readme itself
      and does not have to scan through the runtime directory for the value.
      
      ---------
      
      Co-authored-by...
  14. Jan 16, 2025
    • Ankan's avatar
      [Staking] Currency <> Fungible migration (#5501) · f5673cf2
      Ankan authored
      Migrate staking currency from `traits::LockableCurrency` to
      `traits::fungible::holds`.
      
      Resolves part of https://github.com/paritytech/polkadot-sdk/issues/226.
      
      ## Changes
      ### Nomination Pool
      TransferStake is now incompatible with fungible migration as old pools
      were not meant to have additional ED. Since they are anyways deprecated,
      removed its usage from all test runtimes.
      
      ### Staking
      - Config: `Currency` becomes of type `Fungible` while `OldCurrency` is
      the `LockableCurrency` used before.
      - Lazy migration of accounts. Any ledger update will create a new hold
      with no extra reads/writes. A permissionless extrinsic
      `migrate_currency()` releases the old `lock` along with some
      housekeeping.
      - Staking now requires ED to be left free. It also adds no consumer to
      staking accounts.
      - If hold cannot be applied to all stake, the un-holdable part is force
      withdrawn from the ledger.
      
      ### Delegated Staking
      The pallet does not add provider for agents anymore.
      
      ## Migr...
    • Liam Aharon's avatar
      Implement `pallet-asset-rewards` (#3926) · be2404cc
      Liam Aharon authored
      
      Closes #3149 
      
      ## Description
      
      This PR introduces `pallet-asset-rewards`, which allows accounts to be
      rewarded for freezing `fungible` tokens. The motivation for creating
      this pallet is to allow incentivising LPs.
      
      See the pallet docs for more info about the pallet.
      
      ## Runtime changes
      
      The pallet has been added to
      - `asset-hub-rococo`
      - `asset-hub-westend`
      
      The `NativeAndAssets` `fungibles` Union did not contain `PoolAssets`, so
      it has been renamed `NativeAndNonPoolAssets`
      
      A new `fungibles` Union `NativeAndAllAssets` was created to encompass
      all assets and the native token.
      
      ## TODO
      - [x] Emulation tests
      - [x] Fill in Freeze logic (blocked
      https://github.com/paritytech/polkadot-sdk/issues/3342) and re-run
      benchmarks
      
      ---------
      
      Co-authored-by: command-bot <>
      Co-authored-by: default avatarOliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
      Co-authored-by: default avatarmuharem <ismailov.m.h@gmail.com>
      Co-authored-by: default avatarGuillaume Thiolliere <gui.thiolliere@gmail.com>
  15. Jan 15, 2025
    • Alexandru Vasile's avatar
      litep2p: Provide partial results to speedup GetRecord queries (#7099) · 77c78e15
      Alexandru Vasile authored
      
      This PR provides the partial results of the `GetRecord` kademlia query.
      
      This significantly improves the authority discovery records, from ~37
      minutes to ~2/3 minutes.
      In contrast, libp2p discovers authority records in around ~10 minutes. 
      
      The authority discovery was slow because litep2p provided the records
      only after the Kademlia query was completed. A normal Kademlia query
      completes in around 40 seconds to a few minutes.
      In this PR, partial records are provided as soon as they are discovered
      from the network.
      
      ### Testing Done
      
      Started a node in Kusama with `--validator` and litep2p backend.
      The node discovered 996/1000 authority records in ~ 1 minute 45 seconds.
      
      ![Screenshot 2025-01-09 at 12 26
      08](https://github.com/user-attachments/assets/b618bf7c-2bba-43a0-a021-4047e854c075)
      
      
      ### Before & After
      
      In this image, on the left side is libp2p, in the middle litep2p without
      this PR, on the right litep2p with this PR
      
      ![Screenshot 2025-01-07 at 17 57
      56](https://github.com/user-attachments/assets/a8d467f7-8dc7-461c-bcff-163b94d01ae8)
      
      
      
      Closes: https://github.com/paritytech/polkadot-sdk/issues/7077
      
      cc @paritytech/networking
      
      ---------
      
      Signed-off-by: default avatarAlexandru Vasile <alexandru.vasile@parity.io>
  16. Jan 07, 2025
  17. Jan 05, 2025
    • thiolliere's avatar
      Implement cumulus StorageWeightReclaim as wrapping transaction extension +... · 63c73bf6
      thiolliere authored
      Implement cumulus StorageWeightReclaim as wrapping transaction extension + frame system ReclaimWeight (#6140)
      
      (rebasing of https://github.com/paritytech/polkadot-sdk/pull/5234)
      
      ## Issues:
      
      * Transaction extensions have weights and refund weight. So the
      reclaiming of unused weight must happen last in the transaction
      extension pipeline. Currently it is inside `CheckWeight`.
      * cumulus storage weight reclaim transaction extension misses the proof
      size of logic happening prior to itself.
      
      ## Done:
      
      * a new storage `ExtrinsicWeightReclaimed` in frame-system. Any logic
      which attempts to do some reclaim must use this storage to avoid double
      reclaim.
      * a new function `reclaim_weight` in frame-system pallet: info and post
      info in arguments, read the already reclaimed weight, calculate the new
      unused weight from info and post info. do the more accurate reclaim if
      higher.
      * `CheckWeight` is unchanged and still reclaim the weight in post
      dispatch
      * `ReclaimWeight` is a new transaction extension in frame system. For
      s...
  18. Dec 18, 2024
  19. Dec 16, 2024
    • Jun Jiang's avatar
      Upgrade nix and reqwest (#6898) · 5b04b459
      Jun Jiang authored
      # Description
      
      Upgrade `nix` and `reqwest` to reduce outdated dependencies and speed up
      compilation.
    • Nazar Mokrynskyi's avatar
      Upgrade libp2p from 0.52.4 to 0.54.1 (#6248) · c8812883
      Nazar Mokrynskyi authored
      
      # Description
      
      Fixes https://github.com/paritytech/polkadot-sdk/issues/5996
      
      https://github.com/libp2p/rust-libp2p/releases/tag/libp2p-v0.53.0
      https://github.com/libp2p/rust-libp2p/blob/master/CHANGELOG.md
      
      ## Integration
      
      Nothing special is needed, just note that `yamux_window_size` is no
      longer applicable to libp2p (litep2p seems to still have it though).
      
      ## Review Notes
      
      There are a few simplifications and improvements done in libp2p 0.53
      regarding swarm interface, I'll list a few key/applicable here.
      
      https://github.com/libp2p/rust-libp2p/pull/4788 removed
      `write_length_prefixed` function, so I inlined its code instead.
      
      https://github.com/libp2p/rust-libp2p/pull/4120 introduced new
      `libp2p::SwarmBuilder` instead of now deprecated
      `libp2p::swarm::SwarmBuilder`, the transition is straightforward and
      quite ergonomic (can be seen in tests).
      
      https://github.com/libp2p/rust-libp2p/pull/4581 is the most annoying
      change I have seen that basically makes many enums `#[non_exhaustive]`.
      I mapped some, but those that couldn't be mapped I dealt with by
      printing log messages once they are hit (the best solution I could come
      up with, at least with stable Rust).
      
      https://github.com/libp2p/rust-libp2p/issues/4306 makes connection close
      as soon as there are no handler using it, so I had to replace
      `KeepAlive::Until` with an explicit future that flips internal boolean
      after timeout, achieving the old behavior, though it should ideally be
      removed completely at some point.
      
      `yamux_window_size` is no longer used by libp2p thanks to
      https://github.com/libp2p/rust-libp2p/pull/4970 and generally Yamux
      should have a higher performance now.
      
      I have resolved and cleaned up all deprecations related to libp2p except
      `BandwidthSinks`. Libp2p deprecated it (though it is still present in
      0.54.1, which is why I didn't handle it just yet). Ideally Substrate
      would finally [switch to the official Prometheus
      client](https://github.com/paritytech/substrate/issues/12699), in which
      case we'd get metrics for free. Otherwise a bit of code will need to be
      copy-pasted to maintain current behavior with `BandwidthSinks` gone,
      which I left a TODO about.
      
      The biggest change in 0.54.0 is
      https://github.com/libp2p/rust-libp2p/pull/4568 that changed transport
      APIs and enabled unconditional potential port reuse, which can lead to
      very confusing errors if running two Substrate nodes on the same machine
      without changing listening port explicitly.
      
      Overall nothing scary here, but testing is always appreciated.
      
      # Checklist
      
      * [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: ask maintainers to put the right label on your
      PR.
      
      ---
      
      Polkadot Address: 1vSxzbyz2cJREAuVWjhXUT1ds8vBzoxn2w4asNpusQKwjJd
      
      ---------
      
      Co-authored-by: default avatarDmitry Markin <dmitry@markin.tech>
  20. Dec 14, 2024
  21. Dec 13, 2024
  22. Dec 12, 2024
    • Alexandru Vasile's avatar
      chore: Update litep2p to version 0.8.4 (#6860) · 5788ae86
      Alexandru Vasile authored
      
      ## [0.8.4] - 2024-12-12
      
      This release aims to make the MDNS component more robust by fixing a bug
      that caused the MDNS service to fail to register opened substreams.
      Additionally, the release includes several improvements to the
      `identify` protocol, replacing `FuturesUnordered` with `FuturesStream`
      for better performance.
      
      ### Fixed
      
      - mdns/fix: Failed to register opened substream
      ([#301](https://github.com/paritytech/litep2p/pull/301))
      
      ### Changed
      
      - identify: Replace FuturesUnordered with FuturesStream
      ([#302](https://github.com/paritytech/litep2p/pull/302))
      - chore: Update hickory-resolver to version 0.24.2
      ([#304](https://github.com/paritytech/litep2p/pull/304))
      - ci: Ensure cargo-machete is working with rust version from CI
      ([#303](https://github.com/paritytech/litep2p/pull/303))
      
      
      cc @paritytech/networking
      
      ---------
      
      Signed-off-by: default avatarAlexandru Vasile <alexandru.vasile@parity.io>
    • Iulian Barbu's avatar
      omni-node: add metadata checks for runtime/parachain compatibility (#6450) · 7cc5cdd0
      Iulian Barbu authored
      # Description
      
      Get runtime's metadata, parse it and verify pallets list for a pallet
      named `ParachainSystem` (for now), and block number to be the same for
      both node and runtime. Ideally we'll add other pallets checks too, at
      least a small set of pallets we think right away as mandatory for
      parachain compatibility.
      Closes: #5565 
      
      ## Integration
      
      Runtime devs must be made aware that to be fully compatible with Omni
      Node, certain naming conventions should be respected when defining
      pallets (e.g we verify parachain-system pallet existence by searching
      for a pallet with `name` `ParachainSystem` in runtime's metadata). Not
      finding such a pallet will not influence the functionality yet, but by
      doing these checks we could provide useful feedback for runtimes that
      are clearly not implementing what's required for full parachain
      compatibility with Omni Node.
      
      ## Review Notes
      
      - [x] parachain system check
      - [x] check frame_system's metadata ...
  23. Dec 11, 2024
    • Alexander Theißen's avatar
      snowbridge: Update alloy-core (#6808) · da2dd9b7
      Alexander Theißen authored
      I am planning to use `alloy_core` to implement precompile support in
      `pallet_revive`. I noticed that it is already used by snowbridge. In
      order to unify the dependencies I did the following:
      
      1. Switch to the `alloy-core` umbrella crate so that we have less
      individual dependencies to update.
      2. Bump the latest version and fixup the resulting compile errors.
  24. Dec 04, 2024
  25. Nov 29, 2024
  26. Nov 28, 2024
    • Alexandru Vasile's avatar
      chore: Update litep2p to v0.8.2 (#6677) · 51c3e95a
      Alexandru Vasile authored
      
      This includes a critical fix for debug release versions of litep2p
      (which are running in Kusama as validators).
      
      While at it, have stopped the oncall pain of alerts around
      `incoming_connections_total`. We can rethink the metric expose of
      litep2p in Q1.
      
      
      
      
      
      ## [0.8.2] - 2024-11-27
      
      This release ensures that the provided peer identity is verified at the
      crypto/noise protocol level, enhancing security and preventing potential
      misuses.
      The release also includes a fix that caused `TransportService` component
      to panic on debug builds.
      
      ### Fixed
      
      - req-resp: Fix panic on connection closed for substream open failure
      ([#291](https://github.com/paritytech/litep2p/pull/291))
      - crypto/noise: Verify crypto/noise signature payload
      ([#278](https://github.com/paritytech/litep2p/pull/278))
      
      ### Changed
      
      - transport_service/logs: Provide less details for trace logs
      ([#292](https://github.com/paritytech/litep2p/pull/292))
      
      
      ## Testing Done
      
      This has been extensively tested in Kusama on all validators, that are
      now running litep2p.
      
      Deployed PR: https://github.com/paritytech/polkadot-sdk/pull/6638
      
      ### Litep2p Dashboards
      ![Screenshot 2024-11-26 at 19 19
      41](https://github.com/user-attachments/assets/e00b2b2b-7e64-4d96-ab26-165e2b8d0dc9)
      
      
      ### Libp2p vs Litep2p CPU usage
      
      After deploying litep2p we have reduced CPU usage from around 300-400%
      to 200%, this is a significant boost in performance, freeing resources
      for other subcomponents to function more optimally.
      
      
      ![image(1)](https://github.com/user-attachments/assets/fa793df5-4d58-4601-963d-246e56dd2a26)
      
      
      
      cc @paritytech/sdk-node
      
      ---------
      
      Signed-off-by: default avatarAlexandru Vasile <alexandru.vasile@parity.io>
      Co-authored-by: default avatarGitHub Action <action@github.com>
  27. Nov 27, 2024
    • Alexandru Vasile's avatar
      v16: Expose the unstable metadata v16 (#5732) · 5b1b34db
      Alexandru Vasile authored
      
      This PR exposes the *unstable* metadata V16. The metadata is exposed
      under the unstable u32::MAX number.
      
      Developers can start experimenting with the new features of the metadata
      v16. *Please note that this metadata is under development and expect
      breaking changes until stabilization.*
      
      The `ExtrinsicMetadata` trait receives a breaking change. Its associated
      type `VERSION` is rename to `VERSIONS` and now supports a constant
      static list of metadata versions.
      The versions implemented for `UncheckedExtrinsic` are v4 (legacy
      version) and v5 (new version).
      
      For metadata collection, it is assumed that all `TransactionExtensions`
      are under version 0.
      
      Builds on top of: https://github.com/paritytech/polkadot-sdk/pull/5274
      
      Closes: https://github.com/paritytech/polkadot-sdk/issues/5980
      Closes: https://github.com/paritytech/polkadot-sdk/issues/5347
      Closes: https://github.com/paritytech/polkadot-sdk/issues/5285
      
      cc @paritytech/subxt-team
      
      ---------
      
      Signed-off-by: default avatarAlexandru Vasile <alexandru.vasile@parity.io>
      Co-authored-by: default avatarNiklas Adolfsson <niklasadolfsson1@gmail.com>
      Co-authored-by: default avatarBastian Köcher <git@kchr.de>
      Co-authored-by: default avatarJames Wilson <james@jsdw.me>
      Co-authored-by: default avatarGitHub Action <action@github.com>
  28. Nov 26, 2024
    • dependabot[bot]'s avatar
      Bump rustls from 0.23.14 to 0.23.18 (#6641) · 86a917f5
      dependabot[bot] authored
      
      Bumps [rustls](https://github.com/rustls/rustls) from 0.23.14 to
      0.23.18.
      <details>
      <summary>Commits</summary>
      <ul>
      <li><a
      href="https://github.com/rustls/rustls/commit/33af2c38b0f1e4abf44d59d5b74ccf12f5cf5e56"><code>33af2c3</code></a>
      Prepare 0.23.18</li>
      <li><a
      href="https://github.com/rustls/rustls/commit/ffe646d1ff07d3e1d9f009daadd94228d462425d"><code>ffe646d</code></a>
      Add reproducer for bug 2227</li>
      <li><a
      href="https://github.com/rustls/rustls/commit/69b6f7473a7ae096a9cf9e2d6eb3cd8b22743597"><code>69b6f74</code></a>
      Record and restore the processed cursor in first_handshake_message</li>
      <li><a
      href="https://github.com/rustls/rustls/commit/4ef3532cf2fceda9fdd19947f871adf7020d0b49"><code>4ef3532</code></a>
      Upgrade to mio 1</li>
      <li><a
      href="https://github.com/rustls/rustls/commit/092a16427e81e58ecd6bcfdacc0b49f02bad8db3"><code>092a164</code></a>
      Manage dependencies via the workspace</li>
      <li><a
      href="https://github.com/rustls/rustls/commit/a01bd6bcb536c6cdd490942b0eae2903abcfcab3"><code>a01bd6b</code></a>
      rustls-bench: fix warnings with no features</li>
      <li><a
      href="https://github.com/rustls/rustls/commit/7d74de2c1bdf265531036f50abd3fc04df8c148a"><code>7d74de2</code></a>
      tests: linearize new test code helper</li>
      <li><a
      href="https://github.com/rustls/rustls/commit/499d797b267e0b548fef5225b044b99fc215a8ff"><code>499d797</code></a>
      fix: do not send session_ticket(35) extension for TLS 1.3</li>
      <li><a
      href="https://github.com/rustls/rustls/commit/faca28904efcb3b5a4a5f05be8e03374bf5086df"><code>faca289</code></a>
      chore(deps): lock file maintenance</li>
      <li><a
      href="https://github.com/rustls/rustls/commit/d12f42385c2da74e1ec16826af68d17a13101152"><code>d12f423</code></a>
      fix(deps): update rust crate asn1 to 0.20</li>
      <li>Additional commits viewable in <a
      href="https://github.com/rustls/rustls/compare/v/0.23.14...v/0.23.18">compare
      view</a></li>
      </ul>
      </details>
      <br />
      
      
      [![Dependabot compatibility
      score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls&package-manager=cargo&previous-version=0.23.14&new-version=0.23.18)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
      
      Dependabot will resolve any conflicts with this PR as long as you don't
      alter it yourself. You can also trigger a rebase manually 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 merge` will merge this PR after your CI passes on it
      - `@dependabot squash and merge` will squash and merge this PR after
      your CI passes on it
      - `@dependabot cancel merge` will cancel a previously requested merge
      and block automerging
      - `@dependabot reopen` will reopen this PR if it is closed
      - `@dependabot close` will close this PR and stop Dependabot recreating
      it. You can achieve the same result by closing it manually
      - `@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>
      
      Signed-off-by: default avatardependabot[bot] <support@github.com>
      Co-authored-by: default avatardependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    • Javier Viola's avatar
  29. Nov 15, 2024
    • Alexandru Vasile's avatar
      network/litep2p: Update litep2p network backend to version 0.8.1 (#6484) · 8bea091e
      Alexandru Vasile authored
      This PR updates the litep2p backend to version 0.8.1 from 0.8.0.
      - Check the [litep2p updates forum
      post](https://forum.polkadot.network/t/litep2p-network-backend-updates/9973/3)
      for performance dashboards.
      - Check [litep2p release
      notes](https://github.com/paritytech/litep2p/pull/288)
      
      The v0.8.1 release includes key fixes that enhance the stability and
      performance of the litep2p library. The focus is on long-running
      stability and improvements to polling mechanisms.
      
      ### Long Running Stability Improvements
      
      This issue caused long-running nodes to reject all incoming connections,
      impacting overall stability.
      
      Addressed a bug in the connection limits functionality that incorrectly
      tracked connections due for rejection.
      
      This issue caused an artificial increase in inbound peers, which were
      not being properly removed from the connection limit count.
      
      This fix ensures more accurate tracking and management of peer
      connections [#286](https://github.com/paritytech/litep2p/pull/286).
      
      ### Polling implementation fixes
      
      This release provides multiple fixes to the polling mechanism, improving
      how connections and events are processed:
      - Resolved an overflow issue in TransportContext’s polling index for
      streams, preventing potential crashes
      ([#283](https://github.com/paritytech/litep2p/pull/283)).
      - Fixed a delay in the manager’s poll_next function that prevented
      immediate polling of newly added futures
      ([#287](https://github.com/paritytech/litep2p/pull/287)).
      - Corrected an issue where the listener did not return Poll::Ready(None)
      when it was closed, ensuring proper signal handling
      ([#285](https://github.com/paritytech/litep2p/pull/285)).
      
      
      ### Fixed
      
      - manager: Fix connection limits tracking of rejected connections
      ([#286](https://github.com/paritytech/litep2p/pull/286))
      - transport: Fix waking up on filtered events from `poll_next`
      ([#287](https://github.com/paritytech/litep2p/pull/287))
      - transports: Fix missing Poll::Ready(None) event from listener
      ([#285](https://github.com/paritytech/litep2p/pull/285))
      - manager: Avoid overflow on stream implementation for
      `TransportContext`
      ([#283](https://github.com/paritytech/litep2p/pull/283))
      - manager: Log when polling returns Ready(None)
      ([#284](https://github.com/paritytech/litep2p/pull/284))
      
      
      ### Testing Done
      
      Started kusama nodes running side by side with a higher number of
      inbound and outbound connections (500).
      We previously tested with peers bounded at 50. This testing filtered out
      the fixes included in the latest release.
      
      With this high connection testing setup, litep2p outperforms libp2p in
      almost every domain, from performance to the warnings / errors
      encountered while operating the nodes.
      
      TLDR: this is the version we need to test on kusama validators next
      
      - Litep2p
      
      Repo            | Count      | Level      | Triage report
      -|-|-|-
      polkadot-sdk | 409 | warn | Report .*: .* to .*. Reason: .*. Banned,
      disconnecting. ( Peer disconnected with inflight after backoffs. Banned,
      disconnecting. )
      litep2p | 128 | warn | Refusing to add known address that corresponds to
      a different peer ID
      litep2p | 54 | warn | inbound identify substream opened for peer who
      doesn't exist
      polkadot-sdk | 7 | error | :broken_heart: Called `on_validated_block_announce` with a
      bad peer ID .*
      polkadot-sdk    | 1          | warn       | :x: Error while dialing .*: .*
      polkadot-sdk | 1 | warn | Report .*: .* to .*. Reason: .*. Banned,
      disconnecting. ( Invalid justification. Banned, disconnecting. )
      
      - Libp2p
      
      Repo            | Count      | Level      | Triage report
      -|-|-|-
      polkadot-sdk | 1023 | warn | :broken_heart: Ignored block \(#.* -- .*\) announcement
      from .* because all validation slots are occupied.
      polkadot-sdk | 472 | warn | Report .*: .* to .*. Reason: .*. Banned,
      disconnecting. ( Unsupported protocol. Banned, disconnecting. )
      polkadot-sdk | 379 | error | :broken_heart: Called `on_validated_block_announce` with
      a bad peer ID .*
      polkadot-sdk | 163 | warn | Report .*: .* to .*. Reason: .*. Banned,
      disconnecting. ( Invalid justification. Banned, disconnecting. )
      polkadot-sdk | 116 | warn | Report .*: .* to .*. Reason: .*. Banned,
      disconnecting. ( Peer disconnected with inflight after backoffs. Banned,
      disconnecting. )
      polkadot-sdk | 83 | warn | Report .*: .* to .*. Reason: .*. Banned,
      disconnecting. ( Same block request multiple times. Banned,
      disconnecting. )
      polkadot-sdk | 4 | warn | Re-finalized block #.* \(.*\) in the canonical
      chain, current best finalized is #.*
      polkadot-sdk | 2 | warn | Report .*: .* to .*. Reason: .*. Banned,
      disconnecting. ( Genesis mismatch. Banned, disconnecting. )
      polkadot-sdk | 2 | warn | Report .*: .* to .*. Reason: .*. Banned,
      disconnecting. ( Not requested block data. Banned, disconnecting. )
      polkadot-sdk | 2 | warn | Can't listen on .* because: .*
      polkadot-sdk    | 1          | warn       | :x:
      
       Error while dialing .*: .*
      
      ---------
      
      Signed-off-by: default avatarAlexandru Vasile <alexandru.vasile@parity.io>
  30. Nov 12, 2024
    • Jeeyong Um's avatar
      Introduce `ConstUint` to make dependent types in `DefaultConfig` more adaptable (#6425) · 872d9491
      Jeeyong Um authored
      # Description
      
      Resolves #6193
      
      This PR introduces `ConstUint` as a replacement for existing constant
      getter types like `ConstU8`, `ConstU16`, etc., providing a more flexible
      and unified approach.
      
      ## Integration
      
      This update is backward compatible, so developers can choose to adopt
      `ConstUint` in new implementations or continue using the existing types
      as needed.
      
      ## Review Notes
      
      `ConstUint` is a convenient alternative to `ConstU8`, `ConstU16`, and
      similar types, particularly useful for configuring `DefaultConfig` in
      pallets. It enables configuring the underlying integer for a specific
      type without the need to update all dependent types, offering enhanced
      flexibility in type management.
      
      # Checklist
      
      * [x] My PR includes a detailed description as outlined in the
      "Description" and its two subsections above.
      * [ ] 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: ask maintainers to put the right label on your
      PR.
      * [ ] I have made corresponding changes to the documentation (if
      applicable)
      * [ ] I have added tests that prove my fix is effective or that my
      feature works (if applicable)
    • PG Herveou's avatar
      [pallet-revive] adjust fee dry-run calculation (#6393) · 9f8656ba
      PG Herveou authored
      
      - Fix bare_eth_transact so that it estimate more precisely the
      transaction fee
      - Add some context to the build.rs to make it easier to troubleshoot
      errors
      - Add TransactionBuilder for the RPC tests.
      - Improve error message, proxy rpc error from the node and handle
      reverted error message
      - Add logs in ReceiptInfo
      
      ---------
      
      Co-authored-by: default avatarGitHub Action <action@github.com>
  31. Nov 07, 2024
    • dependabot[bot]'s avatar
      Bump futures from 0.3.30 to 0.3.31 (#6252) · 27bf54b4
      dependabot[bot] authored
      Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.30 to
      0.3.31.
      <details>
      <summary>Release notes</summary>
      <p><em>Sourced from <a
      href="https://github.com/rust-lang/futures-rs/releases">futures's
      releases</a>.</em></p>
      <blockquote>
      <h2>0.3.31</h2>
      <ul>
      <li>Fix use after free of task in <code>FuturesUnordered</code> when
      dropped future panics (<a
      href="https://redirect.github.com/rust-lang/futures-rs/issues/2886">#2886</a>)</li>
      <li>Fix soundness bug in <code>task::waker_ref</code> (<a
      href="https://redirect.github.com/rust-lang/futures-rs/issues/2830">#2830</a>)
      This is a breaking change but allowed because it is soundness bug
      fix.</li>
      <li>Fix bugs in <code>AsyncBufRead::read_line</code> and
      <code>AsyncBufReadExt::lines</code> (<a
      href="https://redirect.github.com/rust-lang/futures-rs/issues/2884">#2884</a>)</li>
      <li>Fix parsing issue in
      <code>select!</code>/<code>select_biased!</code> (<a
      href="https://redirect.github.com/rust-lang/futures-rs/is...
  32. Nov 06, 2024
    • Bastian Köcher's avatar
      polkadot-service: Fix flaky tests (#6376) · d1620f06
      Bastian Köcher authored
      The tests used the same paths. When run on CI, each test is run in its
      own process and thus, this "serial_test" crate wasn't used. The tests
      are now using their own thread local tempdir, which ensures that the
      tests are working when running in parallel in the same program or when
      being run individually.