Skip to content
Snippets Groups Projects
  1. Nov 14, 2024
    • georgepisaltu's avatar
      Follow up work on `TransactionExtension` - fix weights and clean up `UncheckedExtrinsic` (#6418) · ae4b68b3
      georgepisaltu authored
      
      Follow up to https://github.com/paritytech/polkadot-sdk/pull/3685
      Partially fixes https://github.com/paritytech/polkadot-sdk/issues/6403
      
      The main PR introduced bare support for the new extension version byte
      as well as extension weights and benchmarking.
      
      This PR:
      - Removes the redundant extension version byte from the signed v4
      extrinsic, previously unused and defaulted to 0.
      - Adds the extension version byte to the inherited implication passed to
      `General` transactions.
      - Whitelists the `pallet_authorship::Author`, `frame_system::Digest` and
      `pallet_transaction_payment::NextFeeMultiplier` storage items as they
      are read multiple times by extensions for each transaction, but are hot
      in memory and currently overestimate the weight.
      - Whitelists the benchmark caller for `CheckEra` and `CheckGenesis` as
      the reads are performed for every transaction and overestimate the
      weight.
      - Updates the umbrella frame weight template to work with the system
      extension changes.
      - Plans on re-running the benchmarks at least for the `frame_system`
      extensions.
      
      ---------
      
      Signed-off-by: default avatargeorgepisaltu <george.pisaltu@parity.io>
      Co-authored-by: command-bot <>
      Co-authored-by: default avatargui <gui.thiolliere@gmail.com>
      ae4b68b3
  2. Nov 13, 2024
    • Branislav Kontur's avatar
      Fixed bridges zombienet tests because of removed NetworkId::Rococo/Westend from xcm::v5 (#6465) · bff395f8
      Branislav Kontur authored
      Closes: https://github.com/paritytech/polkadot-sdk/issues/6449
      bff395f8
    • thiolliere's avatar
      [Tx ext stage 2: 1/4] Add `TransactionSource` as argument in... · 8e3d9296
      thiolliere authored
      [Tx ext stage 2: 1/4] Add `TransactionSource` as argument in `TransactionExtension::validate` (#6323)
      
      ## Meta 
      
      This PR is part of 4 PR:
      * https://github.com/paritytech/polkadot-sdk/pull/6323
      * https://github.com/paritytech/polkadot-sdk/pull/6324
      * https://github.com/paritytech/polkadot-sdk/pull/6325
      * https://github.com/paritytech/polkadot-sdk/pull/6326
      
      ## Description
      
      One goal of transaction extension is to get rid or unsigned
      transactions.
      But unsigned transaction validation has access to the
      `TransactionSource`.
      
      The source is used for unsigned transactions that the node trust and
      don't want to pay upfront.
      Instead of using transaction source we could do: the transaction is
      valid if it is signed by the block author, conceptually it should work,
      but it doesn't look so easy.
      
      This PR add `TransactionSource` to the validate function for transaction
      extensions
      8e3d9296
  3. Nov 06, 2024
    • Francisco Aguirre's avatar
      XCM v5 (#4826) · 85521e87
      Francisco Aguirre authored
      # Context
      
      This PR aims to introduce XCMv5, for now it's in progress and will be
      updated over time.
      This branch will serve as a milestone branch for merging in all features
      we want to add to XCM, roughly outlined
      [here](https://github.com/polkadot-fellows/xcm-format/issues/60).
      More features could be added.
      
      ## TODO
      - [x] Migrate foreign assets from v3 to v4
      - [x] Setup v5 skeleton
      - [x] Remove XCMv2
      - [x] https://github.com/paritytech/polkadot-sdk/pull/5390
      - [x] https://github.com/paritytech/polkadot-sdk/pull/5585
      - [x] https://github.com/paritytech/polkadot-sdk/pull/5420
      - [x] https://github.com/paritytech/polkadot-sdk/pull/5876
      - [x] https://github.com/paritytech/polkadot-sdk/pull/5971
      - [x] https://github.com/paritytech/polkadot-sdk/pull/6148
      - [x] https://github.com/paritytech/polkadot-sdk/pull/6228
      
      Fixes #3434 
      Fixes https://github.com/paritytech/polkadot-sdk/issues/4190
      Fixes https://github.com/paritytech/polkadot-sdk/issues/5209
      Fixes https://github.com/paritytech/polkadot-sdk/iss...
      85521e87
  4. Nov 05, 2024
    • Adrian Catangiu's avatar
      Remove leftover references of Wococo (#6361) · ec61396e
      Adrian Catangiu authored
      Remove references of now defunct Wococo network.
      
      The XCM `NetworkId::Wococo` will also be removed with [XCMv5
      PR](https://github.com/paritytech/polkadot-sdk/pull/4826)
      ec61396e
    • Adrian Catangiu's avatar
      snowbridge: allow account conversion for Ethereum accounts (#6221) · 6969be36
      Adrian Catangiu authored
      Replace `GlobalConsensusEthereumConvertsFor` with
      `EthereumLocationsConverterFor` that allows `Location` to `AccountId`
      conversion for the Ethereum network root as before, but also for
      Ethereum contracts and accounts.
      
      The new converter only matches explicit `parents: 2` Ethereum locations,
      meaning it should be used only on/by parachains.
      6969be36
  5. Oct 24, 2024
    • Alistair Singh's avatar
      Snowbridge: PNA Audit Better Documentation and minor Refactorings (#6216) · 5682f9a2
      Alistair Singh authored
      # Description
      
      Snowbridge PNA has been audited. A number of issues where raised due to
      not understanding the fee model for Polkadot Native Assets(PNA)
      implementation. This PR addresses this by adding more comments and
      better naming of private functions.
      
      ## Integration
      
      None, documentation and private method name changes.
      5682f9a2
    • Serban Iorga's avatar
      Fix `zombienet-bridges-0001-asset-transfer-works` (#6175) · 2324bd7b
      Serban Iorga authored
      Closes https://github.com/paritytech/polkadot-sdk/issues/6161
      
      Westend BridgeHub freezes for a while at block 3 and if we try to init
      the bridge and fund the accounts during that time, it fails. So we wait
      untill all the parachains produced at least 10 blocks, in order to make
      sure that they work reliably.
      2324bd7b
  6. Oct 18, 2024
    • georgepisaltu's avatar
      FRAME: Reintroduce `TransactionExtension` as a replacement for `SignedExtension` (#3685) · b76e91ac
      georgepisaltu authored
      Original PR https://github.com/paritytech/polkadot-sdk/pull/2280
      reverted in https://github.com/paritytech/polkadot-sdk/pull/3665
      
      This PR reintroduces the reverted functionality with additional changes,
      related effort
      [here](https://github.com/paritytech/polkadot-sdk/pull/3623).
      Description is copied over from the original PR
      
      First part of [Extrinsic
      Horizon](https://github.com/paritytech/polkadot-sdk/issues/2415)
      
      Introduces a new trait `TransactionExtension` to replace
      `SignedExtension`. Introduce the idea of transactions which obey the
      runtime's extensions and have according Extension data (né Extra data)
      yet do not have hard-coded signatures.
      
      Deprecate the terminology of "Unsigned" when used for
      transactions/extrinsics owing to there now being "proper" unsigned
      transactions which obey the extension framework and "old-style" unsigned
      which do not. Instead we have __*General*__ for the former and
      __*Bare*__ for ...
      b76e91ac
  7. Oct 17, 2024
    • drewstone's avatar
      Import vec to bridges/primitives/header-chain (#6031) · 31dfc9f6
      drewstone authored
      # Description
      
      I'm unable to build a bridge library due to the errors below, so I am
      adding the explicit import to `sp_std::vec`.
      
      ## Integration
      
      Projects using it can update their dependency. We are using the branch
      `stable2407` (mixed them up in my branch).
      
      ## Errors
      ```
      error: cannot find macro `vec` in this scope
        --> /Users/drew/.cargo/git/checkouts/polkadot-sdk-cff69157b985ed76/88c32501/bridges/primitives/header-chain/src/justification/verification/mod.rs:99:19
         |
      99 |         let mut route = vec![];
         |                         ^^^
         |
      help: consider importing one of these items
         |
      23 + use scale_info::prelude::vec;
         |
      23 + use sp_std::vec;
         |
      
      error: cannot find macro `vec` in this scope
         --> /Users/drew/.cargo/git/checkouts/polkadot-sdk-cff69157b985ed76/88c32501/bridges/primitives/header-chain/src/justification/verification/optimizer.rs:135:36
          |
      135 |         duplicate_votes_ancestries_idxs: vec![],
          |                                          ^^^
          |
      help: consider importing one of these items
          |
      19  + use scale_info::prelude::vec;
          |
      19  + use sp_std::vec;
          |
      
      error: cannot find macro `vec` in this scope
         --> /Users/drew/.cargo/git/checkouts/polkadot-sdk-cff69157b985ed76/88c32501/bridges/primitives/header-chain/src/justification/verification/optimizer.rs:134:21
          |
      134 |         extra_precommits: vec![],
          |                           ^^^
          |
      help: consider importing one of these items
          |
      19  + use scale_info::prelude::vec;
          |
      19  + use sp_std::vec;
          |
      
      error: cannot find macro `vec` in this scope
        --> /Users/drew/.cargo/git/checkouts/polkadot-sdk-cff69157b985ed76/88c32501
      
      /bridges/primitives/header-chain/src/justification/verification/equivocation.rs:89:27
         |
      89 |         let mut equivocations = vec![];
         |                                 ^^^
         |
      help: consider importing one of these items
         |
      19 + use scale_info::prelude::vec;
         |
      19 + use sp_std::vec;
      ```
      
      ---------
      
      Co-authored-by: default avatarBastian Köcher <git@kchr.de>
      Co-authored-by: default avatarSerban Iorga <serban@parity.io>
      Co-authored-by: command-bot <>
      Co-authored-by: default avatarAdrian Catangiu <adrian@parity.io>
      31dfc9f6
  8. Oct 10, 2024
    • Francisco Aguirre's avatar
      Remove redundant XCMs from dry run's forwarded xcms (#5913) · 4a70b2cf
      Francisco Aguirre authored
      # Description
      
      This PR addresses
      https://github.com/paritytech/polkadot-sdk/issues/5878.
      
      After dry running an xcm on asset hub, we had redundant xcms showing up
      in the `forwarded_xcms` field of the dry run effects returned.
      These were caused by two things:
      - The `UpwardMessageSender` router always added an element even if there
      were no messages.
      - The two routers on asset hub westend related to bridging (to rococo
      and sepolia) getting the message from their queues when their queues is
      actually the same xcmp queue that was already contemplated.
      
      In order to fix this, we check for no messages in UMP and clear the
      implementation of `InspectMessageQueues` for these bridging routers.
      Keep in mind that the bridged message is still sent, as normal via the
      xcmp-queue to Bridge Hub.
      To keep on dry-running the journey of the message, the next hop to
      dry-run is Bridge Hub.
      That'll be tackled in a different PR.
      
      Added a test in `bridge-hub-westend-integration-tests` and
      `bridge-hub-rococo-integration-tests` that show that dry-running a
      transfer across the bridge from asset hub results in one and only one
      message sent to bridge hub.
      
      ## TODO
      - [x] Functionality
      - [x] Test
      
      ---------
      
      Co-authored-by: command-bot <>
      4a70b2cf
  9. Oct 09, 2024
  10. Oct 08, 2024
  11. Oct 07, 2024
  12. Oct 05, 2024
  13. Oct 04, 2024
  14. Oct 03, 2024
  15. Sep 26, 2024
  16. Sep 24, 2024
    • Branislav Kontur's avatar
      Bridges lane id agnostic for backwards compatibility (#5649) · 710e74dd
      Branislav Kontur authored
      This PR primarily fixes the issue with
      `zombienet-bridges-0001-asset-transfer-works` (see:
      https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/7404903).
      
      The PR looks large, but most of the changes involve splitting `LaneId`
      into `LegacyLaneId` and `HashedLaneId`. All pallets now use `LaneId` as
      a generic parameter.
      
      The actual bridging pallets are now backward compatible and work with
      actual **substrate-relay v1.6.10**, which does not even known anything
      about permissionless lanes or the new pallet changes.
      
      
      
      ## Important
      
      - [x] added migration for `pallet_bridge_relayers` and
      `RewardsAccountParams` change order of params, which generates different
      accounts
      
      ## Deployment follow ups
      - [ ] fix monitoring for
      `at_{}_relay_{}_reward_for_msgs_from_{}_on_lane_{}`
      - [ ] check sovereign reward accounts - because of changed
      `RewardsAccountParams`
      - [ ] deploy another messages instances for permissionless lanes - on
      BHs or AHs?
      - [ ] return bac...
      710e74dd
    • Clara van Staden's avatar
      Fix border condition in Snowbridge free consensus Updates (#5671) · 1790e427
      Clara van Staden authored
      
      # Description
      
      A fix for a border condition introduced with new feature
      https://github.com/paritytech/polkadot-sdk/pull/5201. A malicious
      relayer could spam the Ethereum client with sync committee updates that
      have already been imported for the period. This PR adds a storage item
      to track the last imported sync committee period, so that subsequent
      irrelevant updates are not free.
      
      Original PR: https://github.com/Snowfork/polkadot-sdk/pull/172
      
      ## Integration
      
      Downstream projects are not affected. Relayers will not be able to spam
      the Ethereum client with irrelevant sync committee updates for free.
      
      ## Review Notes
      
      Adds a storage item to track the last free sync committee update period,
      so that duplicate imports are not free.
      
      ---------
      
      Co-authored-by: default avatarAdrian Catangiu <adrian@parity.io>
      1790e427
    • Adrian Catangiu's avatar
      snowbridge: improve destination fee handling to avoid trapping fees dust (#5563) · 62534e53
      Adrian Catangiu authored
      On messages Ethereum -> Polkadot Asset Hub: whether they are a token
      transfer or a `Transact` for registering new token, make sure to handle
      unspent fees, rather than trapping them.
      
      This PR deposits them to Snowbridge's sovereign account on Asset Hub.
      
      ---------
      
      Co-authored-by: command-bot <>
      62534e53
  17. Sep 13, 2024
    • Ron's avatar
      Transfer Polkadot-native assets to Ethereum (#5546) · fb7300ce
      Ron authored
      # Description
      
      Adding support for send polkadot native assets(PNA) to Ethereum network
      through snowbridge. Asset with location in view of AH Including:
      
      - Relay token `(1,Here)`
      - Native asset `(0,[PalletInstance(instance),GenereIndex(index)])`
      managed by Assets Pallet
      - Native asset of Parachain `(1,[Parachain(paraId)])` managed by Foreign
      Assets Pallet
      
      The original PR in https://github.com/Snowfork/polkadot-sdk/pull/128
      which has been internally reviewed by Snowbridge team.
      
      # Notes
      
      - This feature depends on the companion solidity change in
      https://github.com/Snowfork/snowbridge/pull/1155. Currently register PNA
      is only allowed from
      [sudo](https://github.com/Snowfork/polkadot-sdk/blob/46cb3528
      
      /bridges/snowbridge/pallets/system/src/lib.rs#L621),
      so it's actually not enabled. Will require another runtime upgrade to
      make the call permissionless together with upgrading the Gateway
      contract.
      
      - To make things easy multi-hop transfer(i.e. sending PNA from Ethereum
      through AH to Destination chain) is not support ed in this PR. For this
      case user can switch to 2-phases transfer instead.
      
      ---------
      
      Co-authored-by: default avatarClara van Staden <claravanstaden64@gmail.com>
      Co-authored-by: default avatarAlistair Singh <alistair.singh7@gmail.com>
      Co-authored-by: default avatarVincent Geddes <117534+vgeddes@users.noreply.github.com>
      Co-authored-by: default avatarFrancisco Aguirre <franciscoaguirreperez@gmail.com>
      Co-authored-by: default avatarAdrian Catangiu <adrian@parity.io>
      fb7300ce
  18. Sep 05, 2024
  19. Sep 02, 2024
    • Clara van Staden's avatar
      Snowbridge free consensus updates (#5201) · c8015b2e
      Clara van Staden authored
      
      Allow free Snowbridge consensus updates, if the header interval is
      larger than the configured value (set to 32, so once a epoch).
      
      This PR also moves the Rococo Snowbridge pallet config into its own
      module.
      
      Original PR: https://github.com/Snowfork/polkadot-sdk/pull/159
      
      ---------
      
      Co-authored-by: default avatarFrancisco Aguirre <franciscoaguirreperez@gmail.com>
      c8015b2e
    • Branislav Kontur's avatar
      [bridges-v2] Permissionless lanes (#4949) · 22100999
      Branislav Kontur authored
      Relates to:
      https://github.com/paritytech/parity-bridges-common/issues/2451
      Closes: https://github.com/paritytech/parity-bridges-common/issues/2500
      
      ## Summary
      
      Now, the bridging pallet supports only static lanes, which means lanes
      that are hard-coded in the runtime files. This PR fixes that and adds
      support for dynamic, also known as permissionless, lanes. This means
      that allowed origins (relay chain, sibling parachains) can open and
      close bridges (through BridgeHubs) with another bridged (substrate-like)
      consensus using just `xcm::Transact` and `OriginKind::Xcm`.
      
      _This PR is based on the migrated code from the Bridges V2
      [branch](https://github.com/paritytech/polkadot-sdk/pull/4427) from the
      old `parity-bridges-common`
      [repo](https://github.com/paritytech/parity-bridges-common/tree/bridges-v2)._
      
      ## Explanation
      
      Please read
      [bridges/modules/xcm-bridge-hub/src/lib.rs](https://github.com/paritytech/polkadot-sdk/blob/149b0ac2/bridg...
      22100999
  20. Aug 28, 2024
  21. Aug 23, 2024
    • Branislav Kontur's avatar
      [bridges] Prune messages from confirmation tx body, not from the on_idle (#5006) · e4ffba6e
      Branislav Kontur authored
      
      (Please, do not merge until SA, reverted and restored of
      https://github.com/paritytech/polkadot-sdk/pull/4944)
      
      Original PR with more context:
      https://github.com/paritytech/parity-bridges-common/pull/2211
      Relates to:
      https://github.com/paritytech/parity-bridges-common/issues/2210
      
      ## TODO
      
      - [x] fresh weighs for `pallet_bridge_messages`
      - [x] add `try_state` for `pallet_bridge_messages` which checks for
      unpruned messages - relates to the
      [comment](https://github.com/paritytech/parity-bridges-common/pull/2211#issuecomment-1643224831)
      - [x] ~prepare migration, that prunes leftovers, which would be pruned
      eventually from `on_idle` the
      [comment](https://github.com/paritytech/parity-bridges-common/pull/2211#issuecomment-1643224831)~
      can be done also by `set_storage` / `kill_storage` or with
      `OnRuntimeUpgrade` implementatino when `do_try_state_for_outbound_lanes`
      detects problem.
      
      ## Open question
      
      - [ ] Do we really need `oldest_unpruned_nonce` afterwards?
      - after the runtime upgrade and when `do_try_state_for_outbound_lanes`
      pass, we won't need any migrations here
          - we won't even need `do_try_state_for_outbound_lanes`
      - please check comments bellow:
      https://github.com/paritytech/polkadot-sdk/pull/4944#discussion_r1666737961
      
      ---------
      
      Signed-off-by: default avatarBranislav Kontur <bkontur@gmail.com>
      Co-authored-by: default avatarSerban Iorga <serban@parity.io>
      Co-authored-by: default avatarSvyatoslav Nikolsky <svyatonik@gmail.com>
      Co-authored-by: command-bot <>
      e4ffba6e
  22. Aug 16, 2024
  23. Aug 07, 2024
  24. Aug 01, 2024
  25. Jul 25, 2024
  26. Jul 23, 2024
  27. Jul 12, 2024
    • Branislav Kontur's avatar
      Bridges V2 refactoring backport and `pallet_bridge_messages` simplifications (#4935) · 1f8e4483
      Branislav Kontur authored
      ## Summary
      
      This PR contains migrated code from the Bridges V2
      [branch](https://github.com/paritytech/polkadot-sdk/pull/4427) from the
      old `parity-bridges-common`
      [repo](https://github.com/paritytech/parity-bridges-common/tree/bridges-v2).
      Even though the PR looks large, it does not (or should not) contain any
      significant changes (also not relevant for audit).
      This PR is a requirement for permissionless lanes, as they were
      implemented on top of these changes.
      
      ## TODO
      
      - [x] generate fresh weights for BridgeHubs
      - [x] run `polkadot-fellows` bridges zombienet tests with actual runtime
      1.2.5. or 1.2.6 to check compatibility
      - :ballot_box_with_check: working, checked with 1.2.8 fellows BridgeHubs
      - [x] run `polkadot-sdk` bridges zombienet tests
        - :ballot_box_with_check:
      
       with old relayer in CI (1.6.5) 
      - [x] run `polkadot-sdk` bridges zombienet tests (locally) - with the
      relayer based on this branch -
      https://github.com/paritytech/parity-bridges-common/pull/3022
      - [x] check/fix relayer companion in bridges repo -
      https://github.com/paritytech/parity-bridges-common/pull/3022
      - [x] extract pruning stuff to separate PR
      https://github.com/paritytech/polkadot-sdk/pull/4944
      
      Relates to:
      https://github.com/paritytech/parity-bridges-common/issues/2976
      Relates to:
      https://github.com/paritytech/parity-bridges-common/issues/2451
      
      ---------
      
      Signed-off-by: default avatarBranislav Kontur <bkontur@gmail.com>
      Co-authored-by: default avatarSerban Iorga <serban@parity.io>
      Co-authored-by: default avatarSvyatoslav Nikolsky <svyatonik@gmail.com>
      Co-authored-by: command-bot <>
      1f8e4483
  28. Jun 27, 2024
  29. Jun 26, 2024
    • Niklas Adolfsson's avatar
      rpc: upgrade jsonrpsee v0.23 (#4730) · 7a2592e8
      Niklas Adolfsson authored
      
      This is PR updates jsonrpsee v0.23 which mainly changes:
      - Add `Extensions` which we now is using to get the connection id (used
      by the rpc spec v2 impl)
      - Update hyper to v1.0, http v1.0, soketto and related crates
      (hyper::service::make_service_fn is removed)
      - The subscription API for the client is modified to know why a
      subscription was closed.
      
      Full changelog here:
      https://github.com/paritytech/jsonrpsee/releases/tag/v0.23.0
      
      ---------
      
      Co-authored-by: default avatarBastian Köcher <git@kchr.de>
      7a2592e8
  30. Jun 25, 2024
  31. Jun 24, 2024
    • Oliver Tale-Yazdi's avatar
      Lift all dependencies (the big one) (#4716) · 8efa0544
      Oliver Tale-Yazdi authored
      
      After preparing in https://github.com/paritytech/polkadot-sdk/pull/4633,
      we can lift also all internal dependencies up to the workspace.
      
      This does not actually change anything, but uses `workspace = true` for
      all dependencies. You can check it with:
      ```bash
      git checkout -q $(git merge-base oty-lift-all-deps origin/master)
      cargo tree -e features > master.out
      
      git checkout -q oty-lift-all-deps
      cargo tree -e features > new.out
      diff master.out new.out
      ```
      
      It did not yet lift 100% of dependencies, some inside of `target.*` or
      some that had conflicting aliases introduced recently. But i will do
      these together in a follow-up with CI checks.
      
      Can be reproduced with [zepter](https://github.com/ggwpez/zepter/):
      `zepter transpose d lift-to-workspace "regex:.*" --version-resolver
      highest --skip-package "polkadot-sdk" --ignore-errors --fix`.
      
      ---------
      
      Signed-off-by: default avatarOliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
      8efa0544
  32. Jun 21, 2024
    • dependabot[bot]'s avatar
      Bump ws from 8.16.0 to 8.17.1 in /bridges/testing/framework/utils/generate_hex_encoded_call (#4825) · a23abb17
      dependabot[bot] authored
      Bumps [ws](https://github.com/websockets/ws) from 8.16.0 to 8.17.1.
      <details>
      <summary>Release notes</summary>
      <p><em>Sourced from <a
      href="https://github.com/websockets/ws/releases">ws's
      releases</a>.</em></p>
      <blockquote>
      <h2>8.17.1</h2>
      <h1>Bug fixes</h1>
      <ul>
      <li>Fixed a DoS vulnerability (<a
      href="https://redirect.github.com/websockets/ws/issues/2231">#2231</a>).</li>
      </ul>
      <p>A request with a number of headers exceeding
      the[<code>server.maxHeadersCount</code>][]
      threshold could be used to crash a ws server.</p>
      <pre lang="js"><code>const http = require('http');
      const WebSocket = require('ws');
      <p>const wss = new WebSocket.Server({ port: 0 }, function () {
      const chars =
      &quot;!#$%&amp;'*+-.0123456789abcdefghijklmnopqrstuvwxyz^_`|~&quot;.split('');
      const headers = {};
      let count = 0;</p>
      <p>for (let i = 0; i &lt; chars.length; i++) {
      if (count === 2000) break;</p>
      <pre><code>for (let j = 0; j &amp;lt; ch...
      a23abb17