Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport changes from polkadot-sdk/master #2887

Merged
merged 23 commits into from
Mar 25, 2024

Commits on Mar 22, 2024

  1. Add two new zombienet tests for bridges (manual run) (paritytech#3072)

    extracted useful code from paritytech#2982
    
    This PR:
    - adds test 2 for Rococo <> Westend bridge: checks that relayer doesn't
    submit any extra headers while there are no any messages;
    - adds test 3 for Rococo <> Westend bridge: checks that relayer doesn't
    submit any extra headers when there are messages;
    - fixes most of comments from paritytech#2439 (like: log names, ability to run
    specify test number when calling `run-tests.sh`).
    
    Right now of all our tests, only test 2 is working (until BHs will be
    upgraded to use async backing), so you can test it with
    `./bridges/zombienet/run-tests.sh --test 2` locally.
    
    (cherry picked from commit 2e6067d)
    svyatonik authored and serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    c117089 View commit details
    Browse the repository at this point in the history
  2. [cumulus] Improved check for sane bridge fees calculations (#3175)

    - [x] change constants when CI fails (should fail :) )
    
    On the AssetHubRococo: 1701175800126 -> 1700929825257 = 0.15 %
    decreased.
    ```
    Feb 02 12:59:05.520 ERROR bridges::estimate: `bridging::XcmBridgeHubRouterBaseFee` actual value: 1701175800126 for runtime: statemine-1006000 (statemine-0.tx14.au1)
    
    Feb 02 13:02:40.647 ERROR bridges::estimate: `bridging::XcmBridgeHubRouterBaseFee` actual value: 1700929825257 for runtime: statemine-1006000 (statemine-0.tx14.au1)
    
    ```
    
    On the AssetHubWestend: 2116038876326 -> 1641718372993 = 22.4 %
    decreased.
    ```
    Feb 02 12:56:00.880 ERROR bridges::estimate: `bridging::XcmBridgeHubRouterBaseFee` actual value: 2116038876326 for runtime: westmint-1006000 (westmint-0.tx14.au1)
    
    Feb 02 13:04:42.515 ERROR bridges::estimate: `bridging::XcmBridgeHubRouterBaseFee` actual value: 1641718372993 for runtime: westmint-1006000 (westmint-0.tx14.au1)
    ```
    
    (cherry picked from commit 74b597f)
    bkontur authored and serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    d51f2f4 View commit details
    Browse the repository at this point in the history
  3. Enable async backing on all testnet system chains (paritytech#2949)

    Built on top of paritytech/polkadot-sdk#2826
    which was a trial run.
    
    Guide:
    https://github.com/w3f/polkadot-wiki/blob/master/docs/maintain/maintain-guides-async-backing.md
    
    ---------
    
    Signed-off-by: georgepisaltu <[email protected]>
    Co-authored-by: Branislav Kontur <[email protected]>
    Co-authored-by: Dónal Murray <[email protected]>
    Co-authored-by: Dmitry Sinyavin <[email protected]>
    Co-authored-by: s0me0ne-unkn0wn <[email protected]>
    Co-authored-by: Svyatoslav Nikolsky <[email protected]>
    Co-authored-by: Bastian Köcher <[email protected]>
    Co-authored-by: georgepisaltu <[email protected]>
    (cherry picked from commit 700d5f8)
    mrcnski authored and serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    7d54426 View commit details
    Browse the repository at this point in the history
  4. Introduce submit_finality_proof_ex call to bridges GRANDPA pallet (#3…

    …225)
    
    backport of
    paritytech#2821 (see
    detailed description there)
    
    (cherry picked from commit a462207)
    svyatonik authored and serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    a435b32 View commit details
    Browse the repository at this point in the history
  5. Bridge zombienet tests refactoring (#3260)

    Related to paritytech/polkadot-sdk#3242
    
    Reorganizing the bridge zombienet tests in order to:
    - separate the environment spawning from the actual tests
    - offer better control over the tests and some possibility to
    orchestrate them as opposed to running everything from the zndsl file
    
    Only rewrote the asset transfer test using this new "framework". The old
    logic and old tests weren't functionally modified or deleted. The plan
    is to get feedback on this approach first and if this is agreed upon,
    migrate the other 2 tests later in separate PRs and also do other
    improvements later.
    
    (cherry picked from commit dfc8e46)
    serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    b334d49 View commit details
    Browse the repository at this point in the history
  6. Bridges: add test 0002 to CI (#3310)

    Bridges: add test 0002 to CI
    (cherry picked from commit 1b66bb5)
    serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    30f05b7 View commit details
    Browse the repository at this point in the history
  7. Bridge zombienet tests - move all test scripts to the same folder (#3…

    …333)
    
    Related to paritytech/polkadot-sdk#3242
    
    (cherry picked from commit 5fc7622)
    serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    b29a3af View commit details
    Browse the repository at this point in the history
  8. Lift dependencies to the workspace (Part 2/x) (#3366)

    Lifting some more dependencies to the workspace. Just using the
    most-often updated ones for now.
    It can be reproduced locally.
    
    ```sh
    $ zepter transpose dependency lift-to-workspace --ignore-errors syn quote thiserror "regex:^serde.*"
    
    $ zepter transpose dependency lift-to-workspace --version-resolver=highest syn quote thiserror "regex:^serde.*" --fix
    
    $ taplo format --config .config/taplo.toml
    ```
    
    ---------
    
    Signed-off-by: Oliver Tale-Yazdi <[email protected]>
    (cherry picked from commit e89d0fc)
    ggwpez authored and serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    a35d063 View commit details
    Browse the repository at this point in the history
  9. Add support for BHP local and BHK local (#3443)

    Related to paritytech/polkadot-sdk#3400
    
    Extracting small parts of
    paritytech/polkadot-sdk#3429 into separate PR:
    
    - Add support for BHP local and BHK local
    - Increase the timeout for the bridge zomienet tests
    
    (cherry picked from commit e4b6b8c)
    serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    ae25a7b View commit details
    Browse the repository at this point in the history
  10. Bridge zombienet tests: move all "framework" files under one folder (…

    …#3462)
    
    Related to paritytech/polkadot-sdk#3400
    
    Moving all bridges testing "framework" files under one folder in order
    to be able to download the entire folder when we want to add tests in
    other repos
    
    No significant functional changes
    
    (cherry picked from commit 6fc1d41)
    serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    8bcc45d View commit details
    Browse the repository at this point in the history
  11. Configuration menu
    Copy the full SHA
    60ebad1 View commit details
    Browse the repository at this point in the history
  12. FRAME: Create TransactionExtension as a replacement for `SignedExte…

    …nsion` (#2280)
    
    Closes paritytech#2160
    
    First part of [Extrinsic
    Horizon](paritytech/polkadot-sdk#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 the latter. (Ultimately, the latter will be phased out as
    a type of transaction, and Bare will only be used for Inherents.)
    
    Types of extrinsic are now therefore:
    - Bare (no hardcoded signature, no Extra data; used to be known as
    "Unsigned")
    - Bare transactions (deprecated): Gossiped, validated with
    `ValidateUnsigned` (deprecated) and the `_bare_compat` bits of
    `TransactionExtension` (deprecated).
      - Inherents: Not gossiped, validated with `ProvideInherent`.
    - Extended (Extra data): Gossiped, validated via `TransactionExtension`.
      - Signed transactions (with a hardcoded signature).
      - General transactions (without a hardcoded signature).
    
    `TransactionExtension` differs from `SignedExtension` because:
    - A signature on the underlying transaction may validly not be present.
    - It may alter the origin during validation.
    - `pre_dispatch` is renamed to `prepare` and need not contain the checks
    present in `validate`.
    - `validate` and `prepare` is passed an `Origin` rather than a
    `AccountId`.
    - `validate` may pass arbitrary information into `prepare` via a new
    user-specifiable type `Val`.
    - `AdditionalSigned`/`additional_signed` is renamed to
    `Implicit`/`implicit`. It is encoded *for the entire transaction* and
    passed in to each extension as a new argument to `validate`. This
    facilitates the ability of extensions to acts as underlying crypto.
    
    There is a new `DispatchTransaction` trait which contains only default
    function impls and is impl'ed for any `TransactionExtension` impler. It
    provides several utility functions which reduce some of the tedium from
    using `TransactionExtension` (indeed, none of its regular functions
    should now need to be called directly).
    
    Three transaction version discriminator ("versions") are now
    permissible:
    - 0b000000100: Bare (used to be called "Unsigned"): contains Signature
    or Extra (extension data). After bare transactions are no longer
    supported, this will strictly identify an Inherents only.
    - 0b100000100: Old-school "Signed" Transaction: contains Signature and
    Extra (extension data).
    - 0b010000100: New-school "General" Transaction: contains Extra
    (extension data), but no Signature.
    
    For the New-school General Transaction, it becomes trivial for authors
    to publish extensions to the mechanism for authorizing an Origin, e.g.
    through new kinds of key-signing schemes, ZK proofs, pallet state,
    mutations over pre-authenticated origins or any combination of the
    above.
    
    Wrap your `SignedExtension`s in `AsTransactionExtension`. This should be
    accompanied by renaming your aggregate type in line with the new
    terminology. E.g. Before:
    
    ```rust
    /// The SignedExtension to the basic transaction logic.
    pub type SignedExtra = (
    	/* snip */
    	MySpecialSignedExtension,
    );
    /// Unchecked extrinsic type as expected by this runtime.
    pub type UncheckedExtrinsic =
    	generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
    ```
    
    After:
    
    ```rust
    /// The extension to the basic transaction logic.
    pub type TxExtension = (
    	/* snip */
    	AsTransactionExtension<MySpecialSignedExtension>,
    );
    /// Unchecked extrinsic type as expected by this runtime.
    pub type UncheckedExtrinsic =
    	generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>;
    ```
    
    You'll also need to alter any transaction building logic to add a
    `.into()` to make the conversion happen. E.g. Before:
    
    ```rust
    fn construct_extrinsic(
    		/* snip */
    ) -> UncheckedExtrinsic {
    	let extra: SignedExtra = (
    		/* snip */
    		MySpecialSignedExtension::new(/* snip */),
    	);
    	let payload = SignedPayload::new(call.clone(), extra.clone()).unwrap();
    	let signature = payload.using_encoded(|e| sender.sign(e));
    	UncheckedExtrinsic::new_signed(
    		/* snip */
    		Signature::Sr25519(signature),
    		extra,
    	)
    }
    ```
    
    After:
    
    ```rust
    fn construct_extrinsic(
    		/* snip */
    ) -> UncheckedExtrinsic {
    	let tx_ext: TxExtension = (
    		/* snip */
    		MySpecialSignedExtension::new(/* snip */).into(),
    	);
    	let payload = SignedPayload::new(call.clone(), tx_ext.clone()).unwrap();
    	let signature = payload.using_encoded(|e| sender.sign(e));
    	UncheckedExtrinsic::new_signed(
    		/* snip */
    		Signature::Sr25519(signature),
    		tx_ext,
    	)
    }
    ```
    
    Most `SignedExtension`s can be trivially converted to become a
    `TransactionExtension`. There are a few things to know.
    
    - Instead of a single trait like `SignedExtension`, you should now
    implement two traits individually: `TransactionExtensionBase` and
    `TransactionExtension`.
    - Weights are now a thing and must be provided via the new function `fn
    weight`.
    
    This trait takes care of anything which is not dependent on types
    specific to your runtime, most notably `Call`.
    
    - `AdditionalSigned`/`additional_signed` is renamed to
    `Implicit`/`implicit`.
    - Weight must be returned by implementing the `weight` function. If your
    extension is associated with a pallet, you'll probably want to do this
    via the pallet's existing benchmarking infrastructure.
    
    Generally:
    - `pre_dispatch` is now `prepare` and you *should not reexecute the
    `validate` functionality in there*!
    - You don't get an account ID any more; you get an origin instead. If
    you need to presume an account ID, then you can use the trait function
    `AsSystemOriginSigner::as_system_origin_signer`.
    - You get an additional ticket, similar to `Pre`, called `Val`. This
    defines data which is passed from `validate` into `prepare`. This is
    important since you should not be duplicating logic from `validate` to
    `prepare`, you need a way of passing your working from the former into
    the latter. This is it.
    - This trait takes two type parameters: `Call` and `Context`. `Call` is
    the runtime call type which used to be an associated type; you can just
    move it to become a type parameter for your trait impl. `Context` is not
    currently used and you can safely implement over it as an unbounded
    type.
    - There's no `AccountId` associated type any more. Just remove it.
    
    Regarding `validate`:
    - You get three new parameters in `validate`; all can be ignored when
    migrating from `SignedExtension`.
    - `validate` returns a tuple on success; the second item in the tuple is
    the new ticket type `Self::Val` which gets passed in to `prepare`. If
    you use any information extracted during `validate` (off-chain and
    on-chain, non-mutating) in `prepare` (on-chain, mutating) then you can
    pass it through with this. For the tuple's last item, just return the
    `origin` argument.
    
    Regarding `prepare`:
    - This is renamed from `pre_dispatch`, but there is one change:
    - FUNCTIONALITY TO VALIDATE THE TRANSACTION NEED NOT BE DUPLICATED FROM
    `validate`!!
    - (This is different to `SignedExtension` which was required to run the
    same checks in `pre_dispatch` as in `validate`.)
    
    Regarding `post_dispatch`:
    - Since there are no unsigned transactions handled by
    `TransactionExtension`, `Pre` is always defined, so the first parameter
    is `Self::Pre` rather than `Option<Self::Pre>`.
    
    If you make use of `SignedExtension::validate_unsigned` or
    `SignedExtension::pre_dispatch_unsigned`, then:
    - Just use the regular versions of these functions instead.
    - Have your logic execute in the case that the `origin` is `None`.
    - Ensure your transaction creation logic creates a General Transaction
    rather than a Bare Transaction; this means having to include all
    `TransactionExtension`s' data.
    - `ValidateUnsigned` can still be used (for now) if you need to be able
    to construct transactions which contain none of the extension data,
    however these will be phased out in stage 2 of the Transactions Horizon,
    so you should consider moving to an extension-centric design.
    
    - [x] Introduce `CheckSignature` impl of `TransactionExtension` to
    ensure it's possible to have crypto be done wholly in a
    `TransactionExtension`.
    - [x] Deprecate `SignedExtension` and move all uses in codebase to
    `TransactionExtension`.
      - [x] `ChargeTransactionPayment`
      - [x] `DummyExtension`
      - [x] `ChargeAssetTxPayment` (asset-tx-payment)
      - [x] `ChargeAssetTxPayment` (asset-conversion-tx-payment)
      - [x] `CheckWeight`
      - [x] `CheckTxVersion`
      - [x] `CheckSpecVersion`
      - [x] `CheckNonce`
      - [x] `CheckNonZeroSender`
      - [x] `CheckMortality`
      - [x] `CheckGenesis`
      - [x] `CheckOnlySudoAccount`
      - [x] `WatchDummy`
      - [x] `PrevalidateAttests`
      - [x] `GenericSignedExtension`
      - [x] `SignedExtension` (chain-polkadot-bulletin)
      - [x] `RefundSignedExtensionAdapter`
    - [x] Implement `fn weight` across the board.
    - [ ] Go through all pre-existing extensions which assume an account
    signer and explicitly handle the possibility of another kind of origin.
    - [x] `CheckNonce` should probably succeed in the case of a non-account
    origin.
    - [x] `CheckNonZeroSender` should succeed in the case of a non-account
    origin.
    - [x] `ChargeTransactionPayment` and family should fail in the case of a
    non-account origin.
      - [ ]
    - [x] Fix any broken tests.
    
    ---------
    
    Signed-off-by: georgepisaltu <[email protected]>
    Signed-off-by: Alexandru Vasile <[email protected]>
    Signed-off-by: dependabot[bot] <[email protected]>
    Signed-off-by: Oliver Tale-Yazdi <[email protected]>
    Signed-off-by: Alexandru Gheorghe <[email protected]>
    Signed-off-by: Andrei Sandu <[email protected]>
    Co-authored-by: Nikhil Gupta <[email protected]>
    Co-authored-by: georgepisaltu <[email protected]>
    Co-authored-by: Chevdor <[email protected]>
    Co-authored-by: Bastian Köcher <[email protected]>
    Co-authored-by: Maciej <[email protected]>
    Co-authored-by: Javier Viola <[email protected]>
    Co-authored-by: Marcin S. <[email protected]>
    Co-authored-by: Tsvetomir Dimitrov <[email protected]>
    Co-authored-by: Javier Bullrich <[email protected]>
    Co-authored-by: Koute <[email protected]>
    Co-authored-by: Adrian Catangiu <[email protected]>
    Co-authored-by: Vladimir Istyufeev <[email protected]>
    Co-authored-by: Ross Bulat <[email protected]>
    Co-authored-by: Gonçalo Pestana <[email protected]>
    Co-authored-by: Liam Aharon <[email protected]>
    Co-authored-by: Svyatoslav Nikolsky <[email protected]>
    Co-authored-by: André Silva <[email protected]>
    Co-authored-by: Oliver Tale-Yazdi <[email protected]>
    Co-authored-by: s0me0ne-unkn0wn <[email protected]>
    Co-authored-by: ordian <[email protected]>
    Co-authored-by: Sebastian Kunert <[email protected]>
    Co-authored-by: Aaro Altonen <[email protected]>
    Co-authored-by: Dmitry Markin <[email protected]>
    Co-authored-by: Alexandru Vasile <[email protected]>
    Co-authored-by: Alexander Samusev <[email protected]>
    Co-authored-by: Julian Eager <[email protected]>
    Co-authored-by: Michal Kucharczyk <[email protected]>
    Co-authored-by: Davide Galassi <[email protected]>
    Co-authored-by: Dónal Murray <[email protected]>
    Co-authored-by: yjh <[email protected]>
    Co-authored-by: Tom Mi <[email protected]>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    Co-authored-by: Will | Paradox | ParaNodes.io <[email protected]>
    Co-authored-by: Bastian Köcher <[email protected]>
    Co-authored-by: Joshy Orndorff <[email protected]>
    Co-authored-by: Joshy Orndorff <[email protected]>
    Co-authored-by: PG Herveou <[email protected]>
    Co-authored-by: Alexander Theißen <[email protected]>
    Co-authored-by: Kian Paimani <[email protected]>
    Co-authored-by: Juan Girini <[email protected]>
    Co-authored-by: bader y <[email protected]>
    Co-authored-by: James Wilson <[email protected]>
    Co-authored-by: joe petrowski <[email protected]>
    Co-authored-by: asynchronous rob <[email protected]>
    Co-authored-by: Parth <[email protected]>
    Co-authored-by: Andrew Jones <[email protected]>
    Co-authored-by: Jonathan Udd <[email protected]>
    Co-authored-by: Serban Iorga <[email protected]>
    Co-authored-by: Egor_P <[email protected]>
    Co-authored-by: Branislav Kontur <[email protected]>
    Co-authored-by: Evgeny Snitko <[email protected]>
    Co-authored-by: Just van Stam <[email protected]>
    Co-authored-by: Francisco Aguirre <[email protected]>
    Co-authored-by: gupnik <[email protected]>
    Co-authored-by: dzmitry-lahoda <[email protected]>
    Co-authored-by: zhiqiangxu <[email protected]>
    Co-authored-by: Nazar Mokrynskyi <[email protected]>
    Co-authored-by: Anwesh <[email protected]>
    Co-authored-by: cheme <[email protected]>
    Co-authored-by: Sam Johnson <[email protected]>
    Co-authored-by: kianenigma <[email protected]>
    Co-authored-by: Jegor Sidorenko <[email protected]>
    Co-authored-by: Muharem <[email protected]>
    Co-authored-by: joepetrowski <[email protected]>
    Co-authored-by: Alexandru Gheorghe <[email protected]>
    Co-authored-by: Gabriel Facco de Arruda <[email protected]>
    Co-authored-by: Squirrel <[email protected]>
    Co-authored-by: Andrei Sandu <[email protected]>
    Co-authored-by: georgepisaltu <[email protected]>
    Co-authored-by: command-bot <>
    (cherry picked from commit fd5f929)
    gavofyork authored and serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    357377f View commit details
    Browse the repository at this point in the history
  13. Revert "FRAME: Create TransactionExtension as a replacement for `Si…

    …gnedExtension` (#2280)" (#3665)
    
    This PR reverts #2280 which introduced `TransactionExtension` to replace
    `SignedExtension`.
    
    As a result of the discussion
    [here](paritytech/polkadot-sdk#3623 (comment)),
    the changes will be reverted for now with plans to reintroduce the
    concept in the future.
    
    ---------
    
    Signed-off-by: georgepisaltu <[email protected]>
    (cherry picked from commit bbd51ce)
    georgepisaltu authored and serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    2299b69 View commit details
    Browse the repository at this point in the history
  14. Increase timeout for assertions (#3680)

    Prevents timeouts in ci like
    https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/5516019
    
    (cherry picked from commit c4c9257)
    pepoviola authored and serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    3e31ebe View commit details
    Browse the repository at this point in the history
  15. Removes as [disambiguation_path] from derive_impl usage (#3652)

    Step in paritytech/polkadot-sdk#171
    
    This PR removes `as [disambiguation_path]` syntax from `derive_impl`
    usage across the polkadot-sdk as introduced in
    paritytech/polkadot-sdk#3505
    
    (cherry picked from commit 7099f6e)
    codekitz authored and serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    33f1c41 View commit details
    Browse the repository at this point in the history
  16. Fix typo (#3691)

    (cherry picked from commit 6b1179f)
    jokess123 authored and serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    ae768c7 View commit details
    Browse the repository at this point in the history
  17. Bridge zombienet tests: remove unneeded accounts (#3700)

    Bridge zombienet tests: remove unneeded accounts
    
    (cherry picked from commit 0c6c837)
    serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    5162e0d View commit details
    Browse the repository at this point in the history
  18. Fix typos (#3753)

    (cherry picked from commit 7241a8d)
    slicejoke authored and serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    050473d View commit details
    Browse the repository at this point in the history
  19. Update polkadot-sdk refs

    serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    d1f6557 View commit details
    Browse the repository at this point in the history
  20. Fix dependency conflicts

    serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    b2f8104 View commit details
    Browse the repository at this point in the history
  21. Fix build

    serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    3b39a13 View commit details
    Browse the repository at this point in the history
  22. cargo fmt

    serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    6393f19 View commit details
    Browse the repository at this point in the history
  23. Fix spellcheck test

    serban300 committed Mar 22, 2024
    Configuration menu
    Copy the full SHA
    c54029a View commit details
    Browse the repository at this point in the history