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

Treasury spends various asset kinds #1333

Merged
merged 29 commits into from
Oct 7, 2023
Merged

Conversation

muharem
Copy link
Contributor

@muharem muharem commented Aug 31, 2023

Summary

This PR introduces new dispatchables to the treasury pallet, allowing spends of various asset types. The enhanced features of the treasury pallet, in conjunction with the asset-rate pallet, are set up and enabled for Westend and Rococo.

Westend and Rococo runtimes.

Polkadot/Kusams/Rococo Treasury can accept proposals for spends of various asset kinds by specifying the asset's location and ID.

Treasury Instance New Dispatchables:

  • spend(AssetKind, AssetBalance, Beneficiary, Option<ValidFrom>) - propose and approve a spend;
  • payout(SpendIndex) - payout an approved spend or retry a failed payout
  • check_payment(SpendIndex) - check the status of a payout;
  • void_spend(SpendIndex) - void previously approved spend;

existing spend dispatchable renamed to spend_local

in this context, the AssetKind parameter contains the asset's location and it's corresponding asset_id, for example:
USDT on AssetHub,

location = MultiLocation(0, X1(Parachain(1000)))
asset_id = MultiLocation(0, X2(PalletInstance(50), GeneralIndex(1984)))

the Beneficiary parameter is a MultiLocation in the context of the asset's location, for example

// the Fellowship salary pallet's location / account
FellowshipSalaryPallet = MultiLocation(1, X2(Parachain(1001), PalletInstance(64)))
// or custom `AccountId`
Alice = MultiLocation(0, AccountId32(network: None, id: [1,...]))

the AssetBalance represents the amount of the AssetKind to be transferred to the Beneficiary. For permission checks, the asset amount is converted to the native amount and compared against the maximum spendable amount determined by the commanding spend origin.

the spend dispatchable allows for batching spends with different ValidFrom arguments, enabling milestone-based spending. If the expectations tied to an approved spend are not met, it is possible to void the spend later using the void_spend dispatchable.

Asset Rate Pallet provides the conversion rate from the AssetKind to the native balance.

Asset Rate Instance Dispatchables:

  • create(AssetKind, Rate) - initialize a conversion rate to the native balance for the given asset
  • update(AssetKind, Rate) - update the conversion rate to the native balance for the given asset
  • remove(AssetKind) - remove an existing conversion rate to the native balance for the given asset

the pallet's dispatchables can be executed by the Root or Treasurer origins.

Treasury Pallet

Treasury Pallet can accept proposals for spends of various asset kinds and pay them out through the implementation of the Pay trait.

New Dispatchables:

  • spend(Config::AssetKind, AssetBalance, Config::Beneficiary, Option<ValidFrom>) - propose and approve a spend;
  • payout(SpendIndex) - payout an approved spend or retry a failed payout;
  • check_payment(SpendIndex) - check the status of a payout;
  • void_spend(SpendIndex) - void previously approved spend;

existing spend dispatchable renamed to spend_local

The parameters' types of the spend dispatchable exposed via the pallet's Config and allows to propose and accept a spend of a certain amount.

An approved spend can be claimed via the payout within the Config::SpendPeriod. Clients provide an implementation of the Pay trait which can pay an asset of the AssetKind to the Beneficiary in AssetBalance units.

The implementation of the Pay trait might not have an immediate final payment status, for example if implemented over XCM and the actual transfer happens on a remote chain.

The check_status dispatchable can be executed to update the spend's payment state and retry the payout if the payment has failed.

@muharem muharem added T1-FRAME This PR/Issue is related to core FRAME, the framework. T8-polkadot This PR/Issue is related to/affects the Polkadot network. T9-cumulus This PR/Issue is related to cumulus. labels Aug 31, 2023
@ggwpez ggwpez mentioned this pull request Sep 1, 2023
muharem added a commit that referenced this pull request Sep 14, 2023
Enable `runtime-benchmarks` feature for `parachain-common` and
`cumulus-primitives-utility` crates' dependencies.

After adding `runtime-benchmarks = []` under `features` category in
`Cargo.toml` files for the creates, I did run,
> zepter lint propagate-feature --feature runtime-benchmarks --workspace
--fix --feature-enables-dep="runtime-benchmarks:frame-benchmarking"

This changes required for
#1333
@muharem muharem marked this pull request as ready for review September 15, 2023 09:18
@muharem muharem requested review from a team September 15, 2023 09:18
@Polkadot-Forum
Copy link

This pull request has been mentioned on Polkadot Forum. There might be relevant details there:

https://forum.polkadot.network/t/polkadot-release-analysis-v1-3-0/4614/1

@Polkadot-Forum
Copy link

This pull request has been mentioned on Polkadot Forum. There might be relevant details there:

https://forum.polkadot.network/t/collective-based-multi-asset-treasuries/2899/24

fellowship-merge-bot bot pushed a commit to polkadot-fellows/runtimes that referenced this pull request Nov 30, 2023
Opening PR mostly for visibility - I expect #56 to be finished before,
which would bump everything to v1.2 and then I'll convert this PR to
v1.2 -> v1.3. In its current state, this PR does v1.0 -> v1.3 bump,
although I've only been looking at [v1.2 -> v1.3
changelog](https://github.com/paritytech/polkadot-sdk/releases/tag/polkadot-v1.3.0),
so everything else just compiles.

TODOs left in this PR (which I'd like to address after #56 is finished):
- [x] revert `[cargo upgrade --pinned
--incompatible](https://github.com/polkadot-fellows/runtimes/commit/8df27a586b598d2f783b53cd62b127b8f8ac846a)`
and only leave sdk crates bump;
- [x] rebase on top of #56;
- [x] ensure that remaining PRs from v1.2 -> v1.3 are either not
required for P/K or shall be added later
(paritytech/polkadot-sdk#1344,
paritytech/polkadot-sdk#1333);
- [x] update weights
- [x] ~(maybe worth a separate PR) there's a lot of unused weight files
in this repo - I'd like to remove it~ will do it in a separate PR -
tracked here:
https://github.com/svyatonik/runtimes/tree/remove-unused-weight-files

@liamaharon Can you, please, confirm that the
paritytech/polkadot-sdk#1344 was necessary only
for sdk CI fixes - that PR caught my eye when I was looking at 1.3
CHANGELOG and I was wondering if we need to do the same for Polkadot,
Kusama and system parachains?

---------

Co-authored-by: Branislav Kontur <[email protected]>
Co-authored-by: muharem <[email protected]>
Co-authored-by: Bastian Köcher <[email protected]>
Co-authored-by: joe petrowski <[email protected]>
Co-authored-by: Adrian Catangiu <[email protected]>
fellowship-merge-bot bot pushed a commit to polkadot-fellows/runtimes that referenced this pull request Dec 8, 2023
Treasury Pallet Instance for the Fellowship in Polkadot Collectives.

In this update, we present a Treasury Pallet Instance that is under the
control of the Fellowship body, with oversight from the Root and
Treasurer origins. Here's how it is governed:
- the Root origin have the authority to reject or approve spend
proposals, with no amount limit for approvals.
- the Treasurer origin have the authority to reject or approve spend
proposals, with approval limits of up to 10,000,000 DOT.
- Voice of all Fellows ranked at 3 or above can reject or approve spend
proposals, with a maximum approval limit of 10,000 DOT.
- Voice of Fellows ranked at 4 or above can also reject or approve spend
proposals, with a maximum approval limit of 10,000,000 DOT.

Additionally, we introduce the Asset Rate Pallet Instance to establish
conversion rates from asset A to B. This is used to determine if a
proposed spend amount involving a non-native asset is permissible by the
commanding origin. The rates can be set up by the Root, Treasurer
origins, or Voice of all Fellows.

test with xcm-emulator for the same setup in Westend -
paritytech/polkadot-sdk#2532
more details on new treasury features and asset rate pallet -
paritytech/polkadot-sdk#1333

---------

Co-authored-by: Bastian Köcher <[email protected]>
Co-authored-by: joepetrowski <[email protected]>
Co-authored-by: Bastian Köcher <[email protected]>
Co-authored-by: Oliver Tale-Yazdi <[email protected]>
simonsso added a commit to NodleCode/open-runtime-module-library that referenced this pull request Dec 15, 2023
simonsso added a commit to NodleCode/open-runtime-module-library that referenced this pull request Dec 15, 2023
* Integrate 1.3.0
* Integrate sdk#1333
  paritytech/polkadot-sdk#1333
* Stub mock tests
@Polkadot-Forum
Copy link

This pull request has been mentioned on Polkadot Forum. There might be relevant details there:

https://forum.polkadot.network/t/polkadot-treasury-diversification-proposal/5344/3

@Polkadot-Forum
Copy link

This pull request has been mentioned on Polkadot Forum. There might be relevant details there:

https://forum.polkadot.network/t/figuring-out-the-first-polkadot-treasury-spend-in-usdt/6545/2

@Polkadot-Forum
Copy link

This pull request has been mentioned on Polkadot Forum. There might be relevant details there:

https://forum.polkadot.network/t/parity-tech-update-for-february/6630/1

@Polkadot-Forum
Copy link

This pull request has been mentioned on Polkadot Forum. There might be relevant details there:

https://forum.polkadot.network/t/treasury-spends-multiple-assets-and-milestone-based-spends/6780/1

bgallois pushed a commit to duniter/duniter-polkadot-sdk that referenced this pull request Mar 25, 2024
The `AssetKind` type parameter of a dispatchable, defined by the user,
might be large — like `xcm::MultiLocation`. To prevent inflating the
size of the `Call` type, we `Box` it.

This changes required for
paritytech#1333

---------

Co-authored-by: Oliver Tale-Yazdi <[email protected]>
bgallois pushed a commit to duniter/duniter-polkadot-sdk that referenced this pull request Mar 25, 2024
### Summary 

This PR introduces new dispatchables to the treasury pallet, allowing
spends of various asset types. The enhanced features of the treasury
pallet, in conjunction with the asset-rate pallet, are set up and
enabled for Westend and Rococo.

### Westend and Rococo runtimes.

Polkadot/Kusams/Rococo Treasury can accept proposals for `spends` of
various asset kinds by specifying the asset's location and ID.

#### Treasury Instance New Dispatchables:
- `spend(AssetKind, AssetBalance, Beneficiary, Option<ValidFrom>)` -
propose and approve a spend;
- `payout(SpendIndex)` - payout an approved spend or retry a failed
payout
- `check_payment(SpendIndex)` - check the status of a payout;
- `void_spend(SpendIndex)` - void previously approved spend;
> existing spend dispatchable renamed to spend_local

in this context, the `AssetKind` parameter contains the asset's location
and it's corresponding `asset_id`, for example:
`USDT` on `AssetHub`,
``` rust
location = MultiLocation(0, X1(Parachain(1000)))
asset_id = MultiLocation(0, X2(PalletInstance(50), GeneralIndex(1984)))
```

the `Beneficiary` parameter is a `MultiLocation` in the context of the
asset's location, for example
``` rust
// the Fellowship salary pallet's location / account
FellowshipSalaryPallet = MultiLocation(1, X2(Parachain(1001), PalletInstance(64)))
// or custom `AccountId`
Alice = MultiLocation(0, AccountId32(network: None, id: [1,...]))
```

the `AssetBalance` represents the amount of the `AssetKind` to be
transferred to the `Beneficiary`. For permission checks, the asset
amount is converted to the native amount and compared against the
maximum spendable amount determined by the commanding spend origin.

the `spend` dispatchable allows for batching spends with different
`ValidFrom` arguments, enabling milestone-based spending. If the
expectations tied to an approved spend are not met, it is possible to
void the spend later using the `void_spend` dispatchable.

Asset Rate Pallet provides the conversion rate from the `AssetKind` to
the native balance.

#### Asset Rate Instance Dispatchables:
- `create(AssetKind, Rate)` - initialize a conversion rate to the native
balance for the given asset
- `update(AssetKind, Rate)` - update the conversion rate to the native
balance for the given asset
- `remove(AssetKind)` - remove an existing conversion rate to the native
balance for the given asset

the pallet's dispatchables can be executed by the Root or Treasurer
origins.

### Treasury Pallet

Treasury Pallet can accept proposals for `spends` of various asset kinds
and pay them out through the implementation of the `Pay` trait.

New Dispatchables:
- `spend(Config::AssetKind, AssetBalance, Config::Beneficiary,
Option<ValidFrom>)` - propose and approve a spend;
- `payout(SpendIndex)` - payout an approved spend or retry a failed
payout;
- `check_payment(SpendIndex)` - check the status of a payout;
- `void_spend(SpendIndex)` - void previously approved spend;
> existing spend dispatchable renamed to spend_local

The parameters' types of the `spend` dispatchable exposed via the
pallet's `Config` and allows to propose and accept a spend of a certain
amount.

An approved spend can be claimed via the `payout` within the
`Config::SpendPeriod`. Clients provide an implementation of the `Pay`
trait which can pay an asset of the `AssetKind` to the `Beneficiary` in
`AssetBalance` units.

The implementation of the Pay trait might not have an immediate final
payment status, for example if implemented over `XCM` and the actual
transfer happens on a remote chain.

The `check_status` dispatchable can be executed to update the spend's
payment state and retry the `payout` if the payment has failed.

---------

Co-authored-by: joe petrowski <[email protected]>
Co-authored-by: command-bot <>
bkchr pushed a commit that referenced this pull request Apr 10, 2024
ntn-x2 pushed a commit to KILTprotocol/kilt-node that referenced this pull request Jul 26, 2024
## fixes
[KILTprotocol/ticket#3439](KILTprotocol/ticket#3439)


### notable Changes

- rust version 1.7.4 (Toolchain and gitlab runner are updated) 
- the preimage_pallet is no longer using deposits, instead it uses
[consideration](paritytech/polkadot-sdk#1361),
which is an abstration over the balance. The exact footprint of an
storage entry is used to calculate the cost storing entries. Might be
interesting for our current deposit model.
- The pallet-xcm introduced a new benchmarking logic 

### Pallets

- Removed cumulus_pallet_dmp_queue (Replaced by pallet_message_queue).
There is a lazy migration provided, which is running automatically. Once
the the [Complete
event](paritytech/polkadot-sdk#1246) is emitted,
we can delete the pallet.
- Treasur introduced a new [spending
support](paritytech/polkadot-sdk#1333), which is
currently disabled. Might be interesting at some point, if other
currencies are available.
- `transfer` extrinsic in `pallet_balances` is removed. Will be a
breaking change for Sporran. For other new introduced extrinsics, please
have a lookin the diffs below.
- Tips: A max tip amount has to be specified, which is currently set to
1_000_000 KILT


### Emulated Tests

I am quite unhappy with the current state of the emulated tests. I would
like to refactor those tests as described in this
[issue](KILTprotocol/ticket#3241 (comment)).
For this PR, I only fixed problems arised by updating the dependencies.

Since the polkadot-runtime is no longer part of the Polkadot-SDK, the
relay chain for Spiritnet has been changed to Rococo. The purpose of
these tests is to ensure that the expectations of the xcm-configuration
match the implementation. The specific relay chain used should not
matter.

### XCM 

- XCM version 4 is out which is also the LTS for XCM. 
- In version 4 a new instruction `Transfer` is introduced, which needed
to be denied by the Barrier
- renaming of paramters: The `Multi` is removed: MultiLocation ->
Location, MultiAsset -> Asset, ...


### Try-runtime

In version 1.7.0 additional try-runtime tests are introduced, where it
is tried to decode the whole storage of the chain. This error should
only occur for chains which are still running on an ancient SDK version
and will be fixed automatically in the next runtime upgrade.

### Weights

Since a lot of new extrinsics are introduced, I updated all weights.

### Todos

- [x] execute Benchmarking 

## Metadata Diff to Develop Branch

<details>
<summary>Peregrine Diff</summary>

```
!!! THE SUBWASM REDUCED DIFFER IS EXPERIMENTAL, DOUBLE CHECK THE RESULTS !!!
[≠] pallet 0: System -> 8 change(s)
  - calls changes:
    [+] CallDesc { index: 9, name: "authorize_upgrade", signature: SignatureDesc { args: [ArgDesc { name: "code_hash", ty: "T::Hash" }] } }
    [+] CallDesc { index: 10, name: "authorize_upgrade_without_checks", signature: SignatureDesc { args: [ArgDesc { name: "code_hash", ty: "T::Hash" }] } }
    [+] CallDesc { index: 11, name: "apply_authorized_upgrade", signature: SignatureDesc { args: [ArgDesc { name: "code", ty: "Vec<u8>" }] } }

  - events changes:
    [+] EventDesc { index: 6, name: "UpgradeAuthorized", signature: SignatureDesc { args: [ArgDesc { name: "code_hash", ty: "T::Hash" }, ArgDesc { name: "check_version", ty: "bool" }] } }

  - errors changes:
    [+] ErrorDesc { index: 6, name: "NothingAuthorized" }
    [+] ErrorDesc { index: 7, name: "Unauthorized" }

  - constants changes:
    [≠] Version: [ 48, 109, 97, 115, 104, 110, 101, 116, 45, 110, 111, 100, 101, 48, 109, 97, 115, 104, 110, 101, 116, 45, 110, 111, 100, 101, 4, 0, 0, 0, 136, 44, ... ]
        [Value([Changed(38, U8Change(60, 68)), Changed(159, U8Change(234, 215)), Changed(160, U8Change(147, 189)), Changed(161, U8Change(227, 216)), Changed(162, U8Change(241, 162)), Changed(163, U8Change(111, 114)), Changed(164, U8Change(61, 202)), Changed(165, U8Change(105, 13)), Changed(166, U8Change(98, 101)), Changed(167, U8Change(2, 1)), Changed(171, U8Change(38, 234)), Changed(172, U8Change(96, 147)), Changed(173, U8Change(149, 227)), Changed(174, U8Change(85, 241)), Changed(175, U8Change(192, 111)), Changed(176, U8Change(101, 61)), Changed(177, U8Change(102, 105)), Changed(178, U8Change(3, 98)), Changed(183, U8Change(164, 38)), Changed(184, U8Change(123, 96)), Changed(185, U8Change(125, 149)), Changed(186, U8Change(84, 85)), Changed(187, U8Change(73, 192)), Changed(188, U8Change(148, 101)), Changed(189, U8Change(201, 102)), Changed(190, U8Change(155, 3)), Changed(191, U8Change(1, 2)), Changed(195, U8Change(69, 164)), Changed(196, U8Change(191, 123)), Changed(197, U8Change(186, 125)), Changed(198, U8Change(81, 84)), Changed(199, U8Change(163, 73)), Changed(200, U8Change(16, 148)), Changed(201, U8Change(178, 201)), Changed(202, U8Change(35, 155)), Changed(207, U8Change(195, 69)), Changed(208, U8Change(179, 191)), Changed(209, U8Change(232, 186)), Changed(210, U8Change(211, 81)), Changed(211, U8Change(50, 163)), Changed(212, U8Change(115, 16)), Changed(213, U8Change(153, 178)), Changed(214, U8Change(13, 35)), Changed(219, U8Change(8, 195)), Changed(220, U8Change(0, 179)), Changed(221, U8Change(0, 232)), Changed(222, U8Change(0, 211)), Changed(223, U8Change(0, 50)), Added(224, 115), Added(225, 153), Added(226, 13), Added(227, 1), Added(228, 0), Added(229, 0), Added(230, 0), Added(231, 251), Added(232, 197), Added(233, 119), Added(234, 185), Added(235, 215), Added(236, 71), Added(237, 239), Added(238, 214), Added(239, 1), Added(240, 0), Added(241, 0), Added(242, 0), Added(243, 8), Added(244, 0), Added(245, 0), Added(246, 0), Added(247, 0)])]

  - storages changes:
    [+] StorageDesc { name: "AuthorizedUpgrade", modifier: "Optional", default_value: [0] }

[≠] pallet 6: Balances -> 7 change(s)
  - calls changes:
    [+] CallDesc { index: 9, name: "force_adjust_total_issuance", signature: SignatureDesc { args: [ArgDesc { name: "direction", ty: "AdjustmentDirection" }, ArgDesc { name: "delta", ty: "T::Balance" }] } }
    [-] "set_balance_deprecated"
    [-] "transfer"

  - events changes:
    [+] EventDesc { index: 21, name: "TotalIssuanceForced", signature: SignatureDesc { args: [ArgDesc { name: "old", ty: "T::Balance" }, ArgDesc { name: "new", ty: "T::Balance" }] } }

  - errors changes:
    [+] ErrorDesc { index: 10, name: "IssuanceDeactivated" }
    [+] ErrorDesc { index: 11, name: "DeltaZero" }

  - constants changes:
    [-] "MaxHolds"

[≠] pallet 8: Sudo -> 4 change(s)
  - calls changes:
    [+] CallDesc { index: 4, name: "remove_key", signature: SignatureDesc { args: [] } }

  - events changes:
    [≠]  1: KeyChanged ( old_sudoer: Option<T::AccountId>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Name(StringChange("old_sudoer", "old"))]), Added(1, ArgDesc { name: "new", ty: "T::AccountId" })] })]
    [≠]  2: SudoAsDone ( sudo_result: DispatchResult, )  )
        [Name(StringChange("SudoAsDone", "KeyRemoved")), Signature(SignatureChange { args: [Removed(0, ArgDesc { name: "sudo_result", ty: "DispatchResult" })] })]
    [+] EventDesc { index: 3, name: "SudoAsDone", signature: SignatureDesc { args: [ArgDesc { name: "sudo_result", ty: "DispatchResult" }] } }

[≠] pallet 24: AuraExt -> 1 change(s)
  - storages changes:
    [+] StorageDesc { name: "SlotInfo", modifier: "Optional", default_value: [0] }

[≠] pallet 30: Democracy -> 9 change(s)
  - calls changes:
    [≠]  7: fast_track ( proposal_hash: H256, voting_period: BlockNumberFor<T>, delay: BlockNumberFor<T>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠]  8: veto_external ( proposal_hash: H256, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 16: blacklist ( proposal_hash: H256, maybe_ref_index: Option<ReferendumIndex>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 18: set_metadata ( owner: MetadataOwner, maybe_hash: Option<PreimageHash>, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("Option<PreimageHash>", "Option<T::Hash>"))])] })]

  - events changes:
    [≠]  9: Vetoed ( who: T::AccountId, proposal_hash: H256, until: BlockNumberFor<T>, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 10: Blacklisted ( proposal_hash: H256, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 14: MetadataSet ( owner: MetadataOwner, hash: PreimageHash, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("PreimageHash", "T::Hash"))])] })]
    [≠] 15: MetadataCleared ( owner: MetadataOwner, hash: PreimageHash, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("PreimageHash", "T::Hash"))])] })]
    [≠] 16: MetadataTransferred ( prev_owner: MetadataOwner, owner: MetadataOwner, hash: PreimageHash, )  )
        [Signature(SignatureChange { args: [Changed(2, [Ty(StringChange("PreimageHash", "T::Hash"))])] })]

[≠] pallet 31: Council -> 1 change(s)
  - errors changes:
    [+] ErrorDesc { index: 10, name: "PrimeAccountNotMember" }

[≠] pallet 32: TechnicalCommittee -> 1 change(s)
  - errors changes:
    [+] ErrorDesc { index: 10, name: "PrimeAccountNotMember" }

[≠] pallet 35: Treasury -> 20 change(s)
  - calls changes:
    [≠]  3: spend ( amount: BalanceOf<T, I>, beneficiary: AccountIdLookupOf<T>, )  )
        [Name(StringChange("spend", "spend_local"))]
    [+] CallDesc { index: 5, name: "spend", signature: SignatureDesc { args: [ArgDesc { name: "asset_kind", ty: "Box<T::AssetKind>" }, ArgDesc { name: "amount", ty: "AssetBalanceOf<T, I>" }, ArgDesc { name: "beneficiary", ty: "Box<BeneficiaryLookupOf<T, I>>" }, ArgDesc { name: "valid_from", ty: "Option<BlockNumberFor<T>>" }] } }
    [+] CallDesc { index: 6, name: "payout", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }
    [+] CallDesc { index: 7, name: "check_status", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }
    [+] CallDesc { index: 8, name: "void_spend", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }

  - events changes:
    [+] EventDesc { index: 9, name: "AssetSpendApproved", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }, ArgDesc { name: "asset_kind", ty: "T::AssetKind" }, ArgDesc { name: "amount", ty: "AssetBalanceOf<T, I>" }, ArgDesc { name: "beneficiary", ty: "T::Beneficiary" }, ArgDesc { name: "valid_from", ty: "BlockNumberFor<T>" }, ArgDesc { name: "expire_at", ty: "BlockNumberFor<T>" }] } }
    [+] EventDesc { index: 10, name: "AssetSpendVoided", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }
    [+] EventDesc { index: 11, name: "Paid", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }, ArgDesc { name: "payment_id", ty: "<T::Paymaster as Pay>::Id" }] } }
    [+] EventDesc { index: 12, name: "PaymentFailed", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }, ArgDesc { name: "payment_id", ty: "<T::Paymaster as Pay>::Id" }] } }
    [+] EventDesc { index: 13, name: "SpendProcessed", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }

  - errors changes:
    [+] ErrorDesc { index: 5, name: "FailedToConvertBalance" }
    [+] ErrorDesc { index: 6, name: "SpendExpired" }
    [+] ErrorDesc { index: 7, name: "EarlyPayout" }
    [+] ErrorDesc { index: 8, name: "AlreadyAttempted" }
    [+] ErrorDesc { index: 9, name: "PayoutError" }
    [+] ErrorDesc { index: 10, name: "NotAttempted" }
    [+] ErrorDesc { index: 11, name: "Inconclusive" }

  - constants changes:
    [+] ConstantDesc { name: "PayoutPeriod", value: [192, 75, 3, 0, 0, 0, 0, 0] }

  - storages changes:
    [+] StorageDesc { name: "SpendCount", modifier: "Default", default_value: [0, 0, 0, 0] }
    [+] StorageDesc { name: "Spends", modifier: "Optional", default_value: [0] }

[≠] pallet 41: Vesting -> 1 change(s)
  - calls changes:
    [+] CallDesc { index: 5, name: "force_remove_vesting_schedule", signature: SignatureDesc { args: [ArgDesc { name: "target", ty: "<T::Lookup as StaticLookup>::Source" }, ArgDesc { name: "schedule_index", ty: "u32" }] } }

[≠] pallet 44: Preimage -> 4 change(s)
  - calls changes:
    [+] CallDesc { index: 4, name: "ensure_updated", signature: SignatureDesc { args: [ArgDesc { name: "hashes", ty: "Vec<T::Hash>" }] } }

  - errors changes:
    [+] ErrorDesc { index: 6, name: "TooMany" }
    [+] ErrorDesc { index: 7, name: "TooFew" }

  - storages changes:
    [+] StorageDesc { name: "RequestStatusFor", modifier: "Optional", default_value: [0] }

[≠] pallet 46: Tips -> 5 change(s)
  - errors changes:
    [≠]  3: NotFinder       
        [Name(StringChange("NotFinder", "MaxTipAmountExceeded"))]
    [≠]  4: StillOpen       
        [Name(StringChange("StillOpen", "NotFinder"))]
    [≠]  5: Premature       
        [Name(StringChange("Premature", "StillOpen"))]
    [+] ErrorDesc { index: 6, name: "Premature" }

  - constants changes:
    [+] ConstantDesc { name: "MaxTipAmount", value: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }

[≠] pallet 80: ParachainSystem -> 9 change(s)
  - events changes:
    [≠]  3: UpgradeAuthorized ( code_hash: T::Hash, )  )
        [Name(StringChange("UpgradeAuthorized", "DownwardMessagesReceived")), Signature(SignatureChange { args: [Changed(0, [Name(StringChange("code_hash", "count")), Ty(StringChange("T::Hash", "u32"))])] })]
    [≠]  4: DownwardMessagesReceived ( count: u32, )  )
        [Name(StringChange("DownwardMessagesReceived", "DownwardMessagesProcessed")), Signature(SignatureChange { args: [Changed(0, [Name(StringChange("count", "weight_used")), Ty(StringChange("u32", "Weight"))]), Added(1, ArgDesc { name: "dmq_head", ty: "relay_chain::Hash" })] })]
    [≠]  5: DownwardMessagesProcessed ( weight_used: Weight, dmq_head: relay_chain::Hash, )  )
        [Name(StringChange("DownwardMessagesProcessed", "UpwardMessageSent")), Signature(SignatureChange { args: [Changed(0, [Name(StringChange("weight_used", "message_hash")), Ty(StringChange("Weight", "Option<XcmHash>"))]), Removed(1, ArgDesc { name: "dmq_head", ty: "relay_chain::Hash" })] })]
    [-] "UpwardMessageSent"

  - storages changes:
    [+] StorageDesc { name: "AggregatedUnincludedSegment", modifier: "Optional", default_value: [0] }
    [+] StorageDesc { name: "UnincludedSegment", modifier: "Default", default_value: [0] }
    [+] StorageDesc { name: "UpgradeGoAhead", modifier: "Default", default_value: [0] }
    [+] StorageDesc { name: "UpwardDeliveryFeeFactor", modifier: "Default", default_value: [0, 0, 100, 167, 179, 182, 224, 13, 0, 0, 0, 0, 0, 0, 0, 0] }
    [-] "AuthorizedUpgrade"

[≠] pallet 82: XcmpQueue -> 25 change(s)
  - calls changes:
    [-] "service_overweight"
    [-] "update_threshold_weight"
    [-] "update_weight_restrict_decay"
    [-] "update_xcmp_max_individual_weight"

  - events changes:
    [≠]  0: Success ( message_hash: XcmHash, message_id: XcmHash, weight: Weight, )  )
        [Name(StringChange("Success", "XcmpMessageSent")), Signature(SignatureChange { args: [Removed(1, ArgDesc { name: "message_id", ty: "XcmHash" }), Removed(2, ArgDesc { name: "weight", ty: "Weight" })] })]
    [-] "Fail"
    [-] "BadVersion"
    [-] "BadFormat"
    [-] "XcmpMessageSent"
    [-] "OverweightEnqueued"
    [-] "OverweightServiced"

  - errors changes:
    [≠]  0: FailedToSend    
        [Name(StringChange("FailedToSend", "BadQueueConfig"))]
    [≠]  1: BadXcmOrigin    
        [Name(StringChange("BadXcmOrigin", "AlreadySuspended"))]
    [≠]  2: BadXcm          
        [Name(StringChange("BadXcm", "AlreadyResumed"))]
    [-] "BadOverweightIndex"
    [-] "WeightOverLimit"

  - constants changes:
    [+] ConstantDesc { name: "MaxInboundSuspended", value: [0, 0, 0, 0] }

  - storages changes:
    [+] StorageDesc { name: "DeliveryFeeFactor", modifier: "Default", default_value: [0, 0, 100, 167, 179, 182, 224, 13, 0, 0, 0, 0, 0, 0, 0, 0] }
    [+] StorageDesc { name: "InboundXcmpSuspended", modifier: "Default", default_value: [0] }
    [≠] Default  QueueConfig: [2, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 130, 26, 6, 0, 0, 8, 0, 7, 0, 200, 23, 168, 4, 2, 0, 4, 0]
        [DefaultValue([Changed(0, U8Change(2, 32)), Changed(4, U8Change(5, 48)), Changed(8, U8Change(1, 8)), Removed(12, 130), Removed(13, 26), Removed(14, 6), Removed(15, 0), Removed(16, 0), Removed(17, 8), Removed(18, 0), Removed(19, 7), Removed(20, 0), Removed(21, 200), Removed(22, 23), Removed(23, 168), Removed(24, 4), Removed(25, 2), Removed(26, 0), Removed(27, 4), Removed(28, 0)])]
    [-] "CounterForOverweight"
    [-] "InboundXcmpMessages"
    [-] "InboundXcmpStatus"
    [-] "Overweight"
    [-] "OverweightCount"

[≠] pallet 83: PolkadotXcm -> 35 change(s)
  - calls changes:
    [≠]  0: send ( dest: Box<VersionedMultiLocation>, message: Box<VersionedXcm<()>>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))])] })]
    [≠]  1: teleport_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [≠]  2: reserve_transfer_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [≠]  3: execute ( message: Box<VersionedXcm<<T as SysConfig>::RuntimeCall>>, max_weight: Weight, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedXcm<<T as SysConfig>::RuntimeCall>>", "Box<VersionedXcm<<T as Config>::RuntimeCall>>"))])] })]
    [≠]  4: force_xcm_version ( location: Box<MultiLocation>, version: XcmVersion, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<MultiLocation>", "Box<Location>"))])] })]
    [≠]  6: force_subscribe_version_notify ( location: Box<VersionedMultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))])] })]
    [≠]  7: force_unsubscribe_version_notify ( location: Box<VersionedMultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))])] })]
    [≠]  8: limited_reserve_transfer_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, weight_limit: WeightLimit, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [≠]  9: limited_teleport_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, weight_limit: WeightLimit, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [+] CallDesc { index: 11, name: "transfer_assets", signature: SignatureDesc { args: [ArgDesc { name: "dest", ty: "Box<VersionedLocation>" }, ArgDesc { name: "beneficiary", ty: "Box<VersionedLocation>" }, ArgDesc { name: "assets", ty: "Box<VersionedAssets>" }, ArgDesc { name: "fee_asset_item", ty: "u32" }, ArgDesc { name: "weight_limit", ty: "WeightLimit" }] } }
    [+] CallDesc { index: 12, name: "claim_assets", signature: SignatureDesc { args: [ArgDesc { name: "assets", ty: "Box<VersionedAssets>" }, ArgDesc { name: "beneficiary", ty: "Box<VersionedLocation>" }] } }
    [+] CallDesc { index: 13, name: "transfer_assets_using_type_and_then", signature: SignatureDesc { args: [ArgDesc { name: "dest", ty: "Box<VersionedLocation>" }, ArgDesc { name: "assets", ty: "Box<VersionedAssets>" }, ArgDesc { name: "assets_transfer_type", ty: "Box<TransferType>" }, ArgDesc { name: "remote_fees_id", ty: "Box<VersionedAssetId>" }, ArgDesc { name: "fees_transfer_type", ty: "Box<TransferType>" }, ArgDesc { name: "custom_xcm_on_dest", ty: "Box<VersionedXcm<()>>" }, ArgDesc { name: "weight_limit", ty: "WeightLimit" }] } }

  - events changes:
    [≠]  1: Sent ( origin: MultiLocation, destination: MultiLocation, message: Xcm<()>, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠]  2: UnexpectedResponse ( origin: MultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠]  8: InvalidResponder ( origin: MultiLocation, query_id: QueryId, expected_location: Option<MultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("Option<MultiLocation>", "Option<Location>"))])] })]
    [≠]  9: InvalidResponderVersion ( origin: MultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 11: AssetsTrapped ( hash: H256, origin: MultiLocation, assets: VersionedMultiAssets, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("VersionedMultiAssets", "VersionedAssets"))])] })]
    [≠] 12: VersionChangeNotified ( destination: MultiLocation, result: XcmVersion, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 13: SupportedVersionChanged ( location: MultiLocation, version: XcmVersion, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 14: NotifyTargetSendFail ( location: MultiLocation, query_id: QueryId, error: XcmError, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 15: NotifyTargetMigrationFail ( location: VersionedMultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("VersionedMultiLocation", "VersionedLocation"))])] })]
    [≠] 16: InvalidQuerierVersion ( origin: MultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 17: InvalidQuerier ( origin: MultiLocation, query_id: QueryId, expected_querier: MultiLocation, maybe_actual_querier: Option<MultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("MultiLocation", "Location"))]), Changed(3, [Ty(StringChange("Option<MultiLocation>", "Option<Location>"))])] })]
    [≠] 18: VersionNotifyStarted ( destination: MultiLocation, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 19: VersionNotifyRequested ( destination: MultiLocation, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 20: VersionNotifyUnrequested ( destination: MultiLocation, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 21: FeesPaid ( paying: MultiLocation, fees: MultiAssets, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 22: AssetsClaimed ( hash: H256, origin: MultiLocation, assets: VersionedMultiAssets, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("VersionedMultiAssets", "VersionedAssets"))])] })]
    [+] EventDesc { index: 23, name: "VersionMigrationFinished", signature: SignatureDesc { args: [ArgDesc { name: "version", ty: "XcmVersion" }] } }

  - errors changes:
    [≠] 13: InvalidAsset    
        [Name(StringChange("InvalidAsset", "CannotCheckOutTeleport"))]
    [+] ErrorDesc { index: 20, name: "InvalidAssetNotConcrete" }
    [+] ErrorDesc { index: 21, name: "InvalidAssetUnknownReserve" }
    [+] ErrorDesc { index: 22, name: "InvalidAssetUnsupportedReserve" }
    [+] ErrorDesc { index: 23, name: "TooManyReserves" }
    [+] ErrorDesc { index: 24, name: "LocalExecutionIncomplete" }

[+] id: 86 - new pallet: MessageQueue
[-] pallet 9: Configuration
[-] pallet 85: DmpQueue
SUMMARY:
- Compatible.......................: false
- Require transaction_version bump.: true

!!! THE SUBWASM REDUCED DIFFER IS EXPERIMENTAL, DOUBLE CHECK THE RESULTS !!!
```

</details>

<details>
<summary>Spiritnet Diff</summary>

```
!!! THE SUBWASM REDUCED DIFFER IS EXPERIMENTAL, DOUBLE CHECK THE RESULTS !!!
[≠] pallet 0: System -> 8 change(s)
  - calls changes:
    [+] CallDesc { index: 9, name: "authorize_upgrade", signature: SignatureDesc { args: [ArgDesc { name: "code_hash", ty: "T::Hash" }] } }
    [+] CallDesc { index: 10, name: "authorize_upgrade_without_checks", signature: SignatureDesc { args: [ArgDesc { name: "code_hash", ty: "T::Hash" }] } }
    [+] CallDesc { index: 11, name: "apply_authorized_upgrade", signature: SignatureDesc { args: [ArgDesc { name: "code", ty: "Vec<u8>" }] } }

  - events changes:
    [+] EventDesc { index: 6, name: "UpgradeAuthorized", signature: SignatureDesc { args: [ArgDesc { name: "code_hash", ty: "T::Hash" }, ArgDesc { name: "check_version", ty: "bool" }] } }

  - errors changes:
    [+] ErrorDesc { index: 6, name: "NothingAuthorized" }
    [+] ErrorDesc { index: 7, name: "Unauthorized" }

  - constants changes:
    [≠] Version: [ 56, 107, 105, 108, 116, 45, 115, 112, 105, 114, 105, 116, 110, 101, 116, 56, 107, 105, 108, 116, 45, 115, 112, 105, 114, 105, 116, 110, 101, 116, 1, 0, ... ]
        [Value([Changed(42, U8Change(60, 68)), Changed(163, U8Change(234, 215)), Changed(164, U8Change(147, 189)), Changed(165, U8Change(227, 216)), Changed(166, U8Change(241, 162)), Changed(167, U8Change(111, 114)), Changed(168, U8Change(61, 202)), Changed(169, U8Change(105, 13)), Changed(170, U8Change(98, 101)), Changed(171, U8Change(2, 1)), Changed(175, U8Change(38, 234)), Changed(176, U8Change(96, 147)), Changed(177, U8Change(149, 227)), Changed(178, U8Change(85, 241)), Changed(179, U8Change(192, 111)), Changed(180, U8Change(101, 61)), Changed(181, U8Change(102, 105)), Changed(182, U8Change(3, 98)), Changed(187, U8Change(164, 38)), Changed(188, U8Change(123, 96)), Changed(189, U8Change(125, 149)), Changed(190, U8Change(84, 85)), Changed(191, U8Change(73, 192)), Changed(192, U8Change(148, 101)), Changed(193, U8Change(201, 102)), Changed(194, U8Change(155, 3)), Changed(195, U8Change(1, 2)), Changed(199, U8Change(69, 164)), Changed(200, U8Change(191, 123)), Changed(201, U8Change(186, 125)), Changed(202, U8Change(81, 84)), Changed(203, U8Change(163, 73)), Changed(204, U8Change(16, 148)), Changed(205, U8Change(178, 201)), Changed(206, U8Change(35, 155)), Changed(211, U8Change(195, 69)), Changed(212, U8Change(179, 191)), Changed(213, U8Change(232, 186)), Changed(214, U8Change(211, 81)), Changed(215, U8Change(50, 163)), Changed(216, U8Change(115, 16)), Changed(217, U8Change(153, 178)), Changed(218, U8Change(13, 35)), Changed(223, U8Change(8, 195)), Changed(224, U8Change(0, 179)), Changed(225, U8Change(0, 232)), Changed(226, U8Change(0, 211)), Changed(227, U8Change(0, 50)), Added(228, 115), Added(229, 153), Added(230, 13), Added(231, 1), Added(232, 0), Added(233, 0), Added(234, 0), Added(235, 251), Added(236, 197), Added(237, 119), Added(238, 185), Added(239, 215), Added(240, 71), Added(241, 239), Added(242, 214), Added(243, 1), Added(244, 0), Added(245, 0), Added(246, 0), Added(247, 8), Added(248, 0), Added(249, 0), Added(250, 0), Added(251, 0)])]

  - storages changes:
    [+] StorageDesc { name: "AuthorizedUpgrade", modifier: "Optional", default_value: [0] }

[≠] pallet 6: Balances -> 7 change(s)
  - calls changes:
    [+] CallDesc { index: 9, name: "force_adjust_total_issuance", signature: SignatureDesc { args: [ArgDesc { name: "direction", ty: "AdjustmentDirection" }, ArgDesc { name: "delta", ty: "T::Balance" }] } }
    [-] "set_balance_deprecated"
    [-] "transfer"

  - events changes:
    [+] EventDesc { index: 21, name: "TotalIssuanceForced", signature: SignatureDesc { args: [ArgDesc { name: "old", ty: "T::Balance" }, ArgDesc { name: "new", ty: "T::Balance" }] } }

  - errors changes:
    [+] ErrorDesc { index: 10, name: "IssuanceDeactivated" }
    [+] ErrorDesc { index: 11, name: "DeltaZero" }

  - constants changes:
    [-] "MaxHolds"

[≠] pallet 24: AuraExt -> 1 change(s)
  - storages changes:
    [+] StorageDesc { name: "SlotInfo", modifier: "Optional", default_value: [0] }

[≠] pallet 30: Democracy -> 9 change(s)
  - calls changes:
    [≠]  7: fast_track ( proposal_hash: H256, voting_period: BlockNumberFor<T>, delay: BlockNumberFor<T>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠]  8: veto_external ( proposal_hash: H256, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 16: blacklist ( proposal_hash: H256, maybe_ref_index: Option<ReferendumIndex>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 18: set_metadata ( owner: MetadataOwner, maybe_hash: Option<PreimageHash>, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("Option<PreimageHash>", "Option<T::Hash>"))])] })]

  - events changes:
    [≠]  9: Vetoed ( who: T::AccountId, proposal_hash: H256, until: BlockNumberFor<T>, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 10: Blacklisted ( proposal_hash: H256, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 14: MetadataSet ( owner: MetadataOwner, hash: PreimageHash, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("PreimageHash", "T::Hash"))])] })]
    [≠] 15: MetadataCleared ( owner: MetadataOwner, hash: PreimageHash, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("PreimageHash", "T::Hash"))])] })]
    [≠] 16: MetadataTransferred ( prev_owner: MetadataOwner, owner: MetadataOwner, hash: PreimageHash, )  )
        [Signature(SignatureChange { args: [Changed(2, [Ty(StringChange("PreimageHash", "T::Hash"))])] })]

[≠] pallet 31: Council -> 1 change(s)
  - errors changes:
    [+] ErrorDesc { index: 10, name: "PrimeAccountNotMember" }

[≠] pallet 32: TechnicalCommittee -> 1 change(s)
  - errors changes:
    [+] ErrorDesc { index: 10, name: "PrimeAccountNotMember" }

[≠] pallet 35: Treasury -> 20 change(s)
  - calls changes:
    [≠]  3: spend ( amount: BalanceOf<T, I>, beneficiary: AccountIdLookupOf<T>, )  )
        [Name(StringChange("spend", "spend_local"))]
    [+] CallDesc { index: 5, name: "spend", signature: SignatureDesc { args: [ArgDesc { name: "asset_kind", ty: "Box<T::AssetKind>" }, ArgDesc { name: "amount", ty: "AssetBalanceOf<T, I>" }, ArgDesc { name: "beneficiary", ty: "Box<BeneficiaryLookupOf<T, I>>" }, ArgDesc { name: "valid_from", ty: "Option<BlockNumberFor<T>>" }] } }
    [+] CallDesc { index: 6, name: "payout", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }
    [+] CallDesc { index: 7, name: "check_status", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }
    [+] CallDesc { index: 8, name: "void_spend", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }

  - events changes:
    [+] EventDesc { index: 9, name: "AssetSpendApproved", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }, ArgDesc { name: "asset_kind", ty: "T::AssetKind" }, ArgDesc { name: "amount", ty: "AssetBalanceOf<T, I>" }, ArgDesc { name: "beneficiary", ty: "T::Beneficiary" }, ArgDesc { name: "valid_from", ty: "BlockNumberFor<T>" }, ArgDesc { name: "expire_at", ty: "BlockNumberFor<T>" }] } }
    [+] EventDesc { index: 10, name: "AssetSpendVoided", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }
    [+] EventDesc { index: 11, name: "Paid", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }, ArgDesc { name: "payment_id", ty: "<T::Paymaster as Pay>::Id" }] } }
    [+] EventDesc { index: 12, name: "PaymentFailed", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }, ArgDesc { name: "payment_id", ty: "<T::Paymaster as Pay>::Id" }] } }
    [+] EventDesc { index: 13, name: "SpendProcessed", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }

  - errors changes:
    [+] ErrorDesc { index: 5, name: "FailedToConvertBalance" }
    [+] ErrorDesc { index: 6, name: "SpendExpired" }
    [+] ErrorDesc { index: 7, name: "EarlyPayout" }
    [+] ErrorDesc { index: 8, name: "AlreadyAttempted" }
    [+] ErrorDesc { index: 9, name: "PayoutError" }
    [+] ErrorDesc { index: 10, name: "NotAttempted" }
    [+] ErrorDesc { index: 11, name: "Inconclusive" }

  - constants changes:
    [+] ConstantDesc { name: "PayoutPeriod", value: [192, 75, 3, 0, 0, 0, 0, 0] }

  - storages changes:
    [+] StorageDesc { name: "SpendCount", modifier: "Default", default_value: [0, 0, 0, 0] }
    [+] StorageDesc { name: "Spends", modifier: "Optional", default_value: [0] }

[≠] pallet 41: Vesting -> 1 change(s)
  - calls changes:
    [+] CallDesc { index: 5, name: "force_remove_vesting_schedule", signature: SignatureDesc { args: [ArgDesc { name: "target", ty: "<T::Lookup as StaticLookup>::Source" }, ArgDesc { name: "schedule_index", ty: "u32" }] } }

[≠] pallet 44: Preimage -> 4 change(s)
  - calls changes:
    [+] CallDesc { index: 4, name: "ensure_updated", signature: SignatureDesc { args: [ArgDesc { name: "hashes", ty: "Vec<T::Hash>" }] } }

  - errors changes:
    [+] ErrorDesc { index: 6, name: "TooMany" }
    [+] ErrorDesc { index: 7, name: "TooFew" }

  - storages changes:
    [+] StorageDesc { name: "RequestStatusFor", modifier: "Optional", default_value: [0] }

[≠] pallet 46: Tips -> 5 change(s)
  - errors changes:
    [≠]  3: NotFinder       
        [Name(StringChange("NotFinder", "MaxTipAmountExceeded"))]
    [≠]  4: StillOpen       
        [Name(StringChange("StillOpen", "NotFinder"))]
    [≠]  5: Premature       
        [Name(StringChange("Premature", "StillOpen"))]
    [+] ErrorDesc { index: 6, name: "Premature" }

  - constants changes:
    [+] ConstantDesc { name: "MaxTipAmount", value: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }

[≠] pallet 80: ParachainSystem -> 9 change(s)
  - events changes:
    [≠]  3: UpgradeAuthorized ( code_hash: T::Hash, )  )
        [Name(StringChange("UpgradeAuthorized", "DownwardMessagesReceived")), Signature(SignatureChange { args: [Changed(0, [Name(StringChange("code_hash", "count")), Ty(StringChange("T::Hash", "u32"))])] })]
    [≠]  4: DownwardMessagesReceived ( count: u32, )  )
        [Name(StringChange("DownwardMessagesReceived", "DownwardMessagesProcessed")), Signature(SignatureChange { args: [Changed(0, [Name(StringChange("count", "weight_used")), Ty(StringChange("u32", "Weight"))]), Added(1, ArgDesc { name: "dmq_head", ty: "relay_chain::Hash" })] })]
    [≠]  5: DownwardMessagesProcessed ( weight_used: Weight, dmq_head: relay_chain::Hash, )  )
        [Name(StringChange("DownwardMessagesProcessed", "UpwardMessageSent")), Signature(SignatureChange { args: [Changed(0, [Name(StringChange("weight_used", "message_hash")), Ty(StringChange("Weight", "Option<XcmHash>"))]), Removed(1, ArgDesc { name: "dmq_head", ty: "relay_chain::Hash" })] })]
    [-] "UpwardMessageSent"

  - storages changes:
    [+] StorageDesc { name: "AggregatedUnincludedSegment", modifier: "Optional", default_value: [0] }
    [+] StorageDesc { name: "UnincludedSegment", modifier: "Default", default_value: [0] }
    [+] StorageDesc { name: "UpgradeGoAhead", modifier: "Default", default_value: [0] }
    [+] StorageDesc { name: "UpwardDeliveryFeeFactor", modifier: "Default", default_value: [0, 0, 100, 167, 179, 182, 224, 13, 0, 0, 0, 0, 0, 0, 0, 0] }
    [-] "AuthorizedUpgrade"

[≠] pallet 82: XcmpQueue -> 25 change(s)
  - calls changes:
    [-] "service_overweight"
    [-] "update_threshold_weight"
    [-] "update_weight_restrict_decay"
    [-] "update_xcmp_max_individual_weight"

  - events changes:
    [≠]  0: Success ( message_hash: XcmHash, message_id: XcmHash, weight: Weight, )  )
        [Name(StringChange("Success", "XcmpMessageSent")), Signature(SignatureChange { args: [Removed(1, ArgDesc { name: "message_id", ty: "XcmHash" }), Removed(2, ArgDesc { name: "weight", ty: "Weight" })] })]
    [-] "Fail"
    [-] "BadVersion"
    [-] "BadFormat"
    [-] "XcmpMessageSent"
    [-] "OverweightEnqueued"
    [-] "OverweightServiced"

  - errors changes:
    [≠]  0: FailedToSend    
        [Name(StringChange("FailedToSend", "BadQueueConfig"))]
    [≠]  1: BadXcmOrigin    
        [Name(StringChange("BadXcmOrigin", "AlreadySuspended"))]
    [≠]  2: BadXcm          
        [Name(StringChange("BadXcm", "AlreadyResumed"))]
    [-] "BadOverweightIndex"
    [-] "WeightOverLimit"

  - constants changes:
    [+] ConstantDesc { name: "MaxInboundSuspended", value: [0, 0, 0, 0] }

  - storages changes:
    [+] StorageDesc { name: "DeliveryFeeFactor", modifier: "Default", default_value: [0, 0, 100, 167, 179, 182, 224, 13, 0, 0, 0, 0, 0, 0, 0, 0] }
    [+] StorageDesc { name: "InboundXcmpSuspended", modifier: "Default", default_value: [0] }
    [≠] Default  QueueConfig: [2, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 130, 26, 6, 0, 0, 8, 0, 7, 0, 200, 23, 168, 4, 2, 0, 4, 0]
        [DefaultValue([Changed(0, U8Change(2, 32)), Changed(4, U8Change(5, 48)), Changed(8, U8Change(1, 8)), Removed(12, 130), Removed(13, 26), Removed(14, 6), Removed(15, 0), Removed(16, 0), Removed(17, 8), Removed(18, 0), Removed(19, 7), Removed(20, 0), Removed(21, 200), Removed(22, 23), Removed(23, 168), Removed(24, 4), Removed(25, 2), Removed(26, 0), Removed(27, 4), Removed(28, 0)])]
    [-] "CounterForOverweight"
    [-] "InboundXcmpMessages"
    [-] "InboundXcmpStatus"
    [-] "Overweight"
    [-] "OverweightCount"

[≠] pallet 83: PolkadotXcm -> 35 change(s)
  - calls changes:
    [≠]  0: send ( dest: Box<VersionedMultiLocation>, message: Box<VersionedXcm<()>>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))])] })]
    [≠]  1: teleport_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [≠]  2: reserve_transfer_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [≠]  3: execute ( message: Box<VersionedXcm<<T as SysConfig>::RuntimeCall>>, max_weight: Weight, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedXcm<<T as SysConfig>::RuntimeCall>>", "Box<VersionedXcm<<T as Config>::RuntimeCall>>"))])] })]
    [≠]  4: force_xcm_version ( location: Box<MultiLocation>, version: XcmVersion, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<MultiLocation>", "Box<Location>"))])] })]
    [≠]  6: force_subscribe_version_notify ( location: Box<VersionedMultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))])] })]
    [≠]  7: force_unsubscribe_version_notify ( location: Box<VersionedMultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))])] })]
    [≠]  8: limited_reserve_transfer_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, weight_limit: WeightLimit, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [≠]  9: limited_teleport_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, weight_limit: WeightLimit, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [+] CallDesc { index: 11, name: "transfer_assets", signature: SignatureDesc { args: [ArgDesc { name: "dest", ty: "Box<VersionedLocation>" }, ArgDesc { name: "beneficiary", ty: "Box<VersionedLocation>" }, ArgDesc { name: "assets", ty: "Box<VersionedAssets>" }, ArgDesc { name: "fee_asset_item", ty: "u32" }, ArgDesc { name: "weight_limit", ty: "WeightLimit" }] } }
    [+] CallDesc { index: 12, name: "claim_assets", signature: SignatureDesc { args: [ArgDesc { name: "assets", ty: "Box<VersionedAssets>" }, ArgDesc { name: "beneficiary", ty: "Box<VersionedLocation>" }] } }
    [+] CallDesc { index: 13, name: "transfer_assets_using_type_and_then", signature: SignatureDesc { args: [ArgDesc { name: "dest", ty: "Box<VersionedLocation>" }, ArgDesc { name: "assets", ty: "Box<VersionedAssets>" }, ArgDesc { name: "assets_transfer_type", ty: "Box<TransferType>" }, ArgDesc { name: "remote_fees_id", ty: "Box<VersionedAssetId>" }, ArgDesc { name: "fees_transfer_type", ty: "Box<TransferType>" }, ArgDesc { name: "custom_xcm_on_dest", ty: "Box<VersionedXcm<()>>" }, ArgDesc { name: "weight_limit", ty: "WeightLimit" }] } }

  - events changes:
    [≠]  1: Sent ( origin: MultiLocation, destination: MultiLocation, message: Xcm<()>, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠]  2: UnexpectedResponse ( origin: MultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠]  8: InvalidResponder ( origin: MultiLocation, query_id: QueryId, expected_location: Option<MultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("Option<MultiLocation>", "Option<Location>"))])] })]
    [≠]  9: InvalidResponderVersion ( origin: MultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 11: AssetsTrapped ( hash: H256, origin: MultiLocation, assets: VersionedMultiAssets, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("VersionedMultiAssets", "VersionedAssets"))])] })]
    [≠] 12: VersionChangeNotified ( destination: MultiLocation, result: XcmVersion, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 13: SupportedVersionChanged ( location: MultiLocation, version: XcmVersion, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 14: NotifyTargetSendFail ( location: MultiLocation, query_id: QueryId, error: XcmError, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 15: NotifyTargetMigrationFail ( location: VersionedMultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("VersionedMultiLocation", "VersionedLocation"))])] })]
    [≠] 16: InvalidQuerierVersion ( origin: MultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 17: InvalidQuerier ( origin: MultiLocation, query_id: QueryId, expected_querier: MultiLocation, maybe_actual_querier: Option<MultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("MultiLocation", "Location"))]), Changed(3, [Ty(StringChange("Option<MultiLocation>", "Option<Location>"))])] })]
    [≠] 18: VersionNotifyStarted ( destination: MultiLocation, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 19: VersionNotifyRequested ( destination: MultiLocation, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 20: VersionNotifyUnrequested ( destination: MultiLocation, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 21: FeesPaid ( paying: MultiLocation, fees: MultiAssets, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 22: AssetsClaimed ( hash: H256, origin: MultiLocation, assets: VersionedMultiAssets, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("VersionedMultiAssets", "VersionedAssets"))])] })]
    [+] EventDesc { index: 23, name: "VersionMigrationFinished", signature: SignatureDesc { args: [ArgDesc { name: "version", ty: "XcmVersion" }] } }

  - errors changes:
    [≠] 13: InvalidAsset    
        [Name(StringChange("InvalidAsset", "CannotCheckOutTeleport"))]
    [+] ErrorDesc { index: 20, name: "InvalidAssetNotConcrete" }
    [+] ErrorDesc { index: 21, name: "InvalidAssetUnknownReserve" }
    [+] ErrorDesc { index: 22, name: "InvalidAssetUnsupportedReserve" }
    [+] ErrorDesc { index: 23, name: "TooManyReserves" }
    [+] ErrorDesc { index: 24, name: "LocalExecutionIncomplete" }

[+] id: 86 - new pallet: MessageQueue
[-] pallet 85: DmpQueue
SUMMARY:
- Compatible.......................: false
- Require transaction_version bump.: true

!!! THE SUBWASM REDUCED DIFFER IS EXPERIMENTAL, DOUBLE CHECK THE RESULTS !!!
```

</details>
## Checklist:

- [ ] I have verified that the code works
- [ ] No panics! (checked arithmetic ops, no indexing `array[3]` use
`get(3)`, ...)
- [ ] I have verified that the code is easy to understand
  - [ ] If not, I have left a well-balanced amount of inline comments
- [ ] I have [left the code in a better
state](https://deviq.com/principles/boy-scout-rule)
- [ ] I have documented the changes (where applicable)
* Either PR or Ticket to update [the
Docs](https://github.com/KILTprotocol/docs)
    * Link the PR/Ticket here
Ad96el added a commit to KILTprotocol/kilt-node that referenced this pull request Aug 20, 2024
## fixes
[KILTprotocol/ticket#3439](KILTprotocol/ticket#3439)


### notable Changes

- rust version 1.7.4 (Toolchain and gitlab runner are updated) 
- the preimage_pallet is no longer using deposits, instead it uses
[consideration](paritytech/polkadot-sdk#1361),
which is an abstration over the balance. The exact footprint of an
storage entry is used to calculate the cost storing entries. Might be
interesting for our current deposit model.
- The pallet-xcm introduced a new benchmarking logic 

### Pallets

- Removed cumulus_pallet_dmp_queue (Replaced by pallet_message_queue).
There is a lazy migration provided, which is running automatically. Once
the the [Complete
event](paritytech/polkadot-sdk#1246) is emitted,
we can delete the pallet.
- Treasur introduced a new [spending
support](paritytech/polkadot-sdk#1333), which is
currently disabled. Might be interesting at some point, if other
currencies are available.
- `transfer` extrinsic in `pallet_balances` is removed. Will be a
breaking change for Sporran. For other new introduced extrinsics, please
have a lookin the diffs below.
- Tips: A max tip amount has to be specified, which is currently set to
1_000_000 KILT


### Emulated Tests

I am quite unhappy with the current state of the emulated tests. I would
like to refactor those tests as described in this
[issue](KILTprotocol/ticket#3241 (comment)).
For this PR, I only fixed problems arised by updating the dependencies.

Since the polkadot-runtime is no longer part of the Polkadot-SDK, the
relay chain for Spiritnet has been changed to Rococo. The purpose of
these tests is to ensure that the expectations of the xcm-configuration
match the implementation. The specific relay chain used should not
matter.

### XCM 

- XCM version 4 is out which is also the LTS for XCM. 
- In version 4 a new instruction `Transfer` is introduced, which needed
to be denied by the Barrier
- renaming of paramters: The `Multi` is removed: MultiLocation ->
Location, MultiAsset -> Asset, ...


### Try-runtime

In version 1.7.0 additional try-runtime tests are introduced, where it
is tried to decode the whole storage of the chain. This error should
only occur for chains which are still running on an ancient SDK version
and will be fixed automatically in the next runtime upgrade.

### Weights

Since a lot of new extrinsics are introduced, I updated all weights.

### Todos

- [x] execute Benchmarking 

## Metadata Diff to Develop Branch

<details>
<summary>Peregrine Diff</summary>

```
!!! THE SUBWASM REDUCED DIFFER IS EXPERIMENTAL, DOUBLE CHECK THE RESULTS !!!
[≠] pallet 0: System -> 8 change(s)
  - calls changes:
    [+] CallDesc { index: 9, name: "authorize_upgrade", signature: SignatureDesc { args: [ArgDesc { name: "code_hash", ty: "T::Hash" }] } }
    [+] CallDesc { index: 10, name: "authorize_upgrade_without_checks", signature: SignatureDesc { args: [ArgDesc { name: "code_hash", ty: "T::Hash" }] } }
    [+] CallDesc { index: 11, name: "apply_authorized_upgrade", signature: SignatureDesc { args: [ArgDesc { name: "code", ty: "Vec<u8>" }] } }

  - events changes:
    [+] EventDesc { index: 6, name: "UpgradeAuthorized", signature: SignatureDesc { args: [ArgDesc { name: "code_hash", ty: "T::Hash" }, ArgDesc { name: "check_version", ty: "bool" }] } }

  - errors changes:
    [+] ErrorDesc { index: 6, name: "NothingAuthorized" }
    [+] ErrorDesc { index: 7, name: "Unauthorized" }

  - constants changes:
    [≠] Version: [ 48, 109, 97, 115, 104, 110, 101, 116, 45, 110, 111, 100, 101, 48, 109, 97, 115, 104, 110, 101, 116, 45, 110, 111, 100, 101, 4, 0, 0, 0, 136, 44, ... ]
        [Value([Changed(38, U8Change(60, 68)), Changed(159, U8Change(234, 215)), Changed(160, U8Change(147, 189)), Changed(161, U8Change(227, 216)), Changed(162, U8Change(241, 162)), Changed(163, U8Change(111, 114)), Changed(164, U8Change(61, 202)), Changed(165, U8Change(105, 13)), Changed(166, U8Change(98, 101)), Changed(167, U8Change(2, 1)), Changed(171, U8Change(38, 234)), Changed(172, U8Change(96, 147)), Changed(173, U8Change(149, 227)), Changed(174, U8Change(85, 241)), Changed(175, U8Change(192, 111)), Changed(176, U8Change(101, 61)), Changed(177, U8Change(102, 105)), Changed(178, U8Change(3, 98)), Changed(183, U8Change(164, 38)), Changed(184, U8Change(123, 96)), Changed(185, U8Change(125, 149)), Changed(186, U8Change(84, 85)), Changed(187, U8Change(73, 192)), Changed(188, U8Change(148, 101)), Changed(189, U8Change(201, 102)), Changed(190, U8Change(155, 3)), Changed(191, U8Change(1, 2)), Changed(195, U8Change(69, 164)), Changed(196, U8Change(191, 123)), Changed(197, U8Change(186, 125)), Changed(198, U8Change(81, 84)), Changed(199, U8Change(163, 73)), Changed(200, U8Change(16, 148)), Changed(201, U8Change(178, 201)), Changed(202, U8Change(35, 155)), Changed(207, U8Change(195, 69)), Changed(208, U8Change(179, 191)), Changed(209, U8Change(232, 186)), Changed(210, U8Change(211, 81)), Changed(211, U8Change(50, 163)), Changed(212, U8Change(115, 16)), Changed(213, U8Change(153, 178)), Changed(214, U8Change(13, 35)), Changed(219, U8Change(8, 195)), Changed(220, U8Change(0, 179)), Changed(221, U8Change(0, 232)), Changed(222, U8Change(0, 211)), Changed(223, U8Change(0, 50)), Added(224, 115), Added(225, 153), Added(226, 13), Added(227, 1), Added(228, 0), Added(229, 0), Added(230, 0), Added(231, 251), Added(232, 197), Added(233, 119), Added(234, 185), Added(235, 215), Added(236, 71), Added(237, 239), Added(238, 214), Added(239, 1), Added(240, 0), Added(241, 0), Added(242, 0), Added(243, 8), Added(244, 0), Added(245, 0), Added(246, 0), Added(247, 0)])]

  - storages changes:
    [+] StorageDesc { name: "AuthorizedUpgrade", modifier: "Optional", default_value: [0] }

[≠] pallet 6: Balances -> 7 change(s)
  - calls changes:
    [+] CallDesc { index: 9, name: "force_adjust_total_issuance", signature: SignatureDesc { args: [ArgDesc { name: "direction", ty: "AdjustmentDirection" }, ArgDesc { name: "delta", ty: "T::Balance" }] } }
    [-] "set_balance_deprecated"
    [-] "transfer"

  - events changes:
    [+] EventDesc { index: 21, name: "TotalIssuanceForced", signature: SignatureDesc { args: [ArgDesc { name: "old", ty: "T::Balance" }, ArgDesc { name: "new", ty: "T::Balance" }] } }

  - errors changes:
    [+] ErrorDesc { index: 10, name: "IssuanceDeactivated" }
    [+] ErrorDesc { index: 11, name: "DeltaZero" }

  - constants changes:
    [-] "MaxHolds"

[≠] pallet 8: Sudo -> 4 change(s)
  - calls changes:
    [+] CallDesc { index: 4, name: "remove_key", signature: SignatureDesc { args: [] } }

  - events changes:
    [≠]  1: KeyChanged ( old_sudoer: Option<T::AccountId>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Name(StringChange("old_sudoer", "old"))]), Added(1, ArgDesc { name: "new", ty: "T::AccountId" })] })]
    [≠]  2: SudoAsDone ( sudo_result: DispatchResult, )  )
        [Name(StringChange("SudoAsDone", "KeyRemoved")), Signature(SignatureChange { args: [Removed(0, ArgDesc { name: "sudo_result", ty: "DispatchResult" })] })]
    [+] EventDesc { index: 3, name: "SudoAsDone", signature: SignatureDesc { args: [ArgDesc { name: "sudo_result", ty: "DispatchResult" }] } }

[≠] pallet 24: AuraExt -> 1 change(s)
  - storages changes:
    [+] StorageDesc { name: "SlotInfo", modifier: "Optional", default_value: [0] }

[≠] pallet 30: Democracy -> 9 change(s)
  - calls changes:
    [≠]  7: fast_track ( proposal_hash: H256, voting_period: BlockNumberFor<T>, delay: BlockNumberFor<T>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠]  8: veto_external ( proposal_hash: H256, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 16: blacklist ( proposal_hash: H256, maybe_ref_index: Option<ReferendumIndex>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 18: set_metadata ( owner: MetadataOwner, maybe_hash: Option<PreimageHash>, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("Option<PreimageHash>", "Option<T::Hash>"))])] })]

  - events changes:
    [≠]  9: Vetoed ( who: T::AccountId, proposal_hash: H256, until: BlockNumberFor<T>, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 10: Blacklisted ( proposal_hash: H256, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 14: MetadataSet ( owner: MetadataOwner, hash: PreimageHash, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("PreimageHash", "T::Hash"))])] })]
    [≠] 15: MetadataCleared ( owner: MetadataOwner, hash: PreimageHash, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("PreimageHash", "T::Hash"))])] })]
    [≠] 16: MetadataTransferred ( prev_owner: MetadataOwner, owner: MetadataOwner, hash: PreimageHash, )  )
        [Signature(SignatureChange { args: [Changed(2, [Ty(StringChange("PreimageHash", "T::Hash"))])] })]

[≠] pallet 31: Council -> 1 change(s)
  - errors changes:
    [+] ErrorDesc { index: 10, name: "PrimeAccountNotMember" }

[≠] pallet 32: TechnicalCommittee -> 1 change(s)
  - errors changes:
    [+] ErrorDesc { index: 10, name: "PrimeAccountNotMember" }

[≠] pallet 35: Treasury -> 20 change(s)
  - calls changes:
    [≠]  3: spend ( amount: BalanceOf<T, I>, beneficiary: AccountIdLookupOf<T>, )  )
        [Name(StringChange("spend", "spend_local"))]
    [+] CallDesc { index: 5, name: "spend", signature: SignatureDesc { args: [ArgDesc { name: "asset_kind", ty: "Box<T::AssetKind>" }, ArgDesc { name: "amount", ty: "AssetBalanceOf<T, I>" }, ArgDesc { name: "beneficiary", ty: "Box<BeneficiaryLookupOf<T, I>>" }, ArgDesc { name: "valid_from", ty: "Option<BlockNumberFor<T>>" }] } }
    [+] CallDesc { index: 6, name: "payout", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }
    [+] CallDesc { index: 7, name: "check_status", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }
    [+] CallDesc { index: 8, name: "void_spend", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }

  - events changes:
    [+] EventDesc { index: 9, name: "AssetSpendApproved", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }, ArgDesc { name: "asset_kind", ty: "T::AssetKind" }, ArgDesc { name: "amount", ty: "AssetBalanceOf<T, I>" }, ArgDesc { name: "beneficiary", ty: "T::Beneficiary" }, ArgDesc { name: "valid_from", ty: "BlockNumberFor<T>" }, ArgDesc { name: "expire_at", ty: "BlockNumberFor<T>" }] } }
    [+] EventDesc { index: 10, name: "AssetSpendVoided", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }
    [+] EventDesc { index: 11, name: "Paid", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }, ArgDesc { name: "payment_id", ty: "<T::Paymaster as Pay>::Id" }] } }
    [+] EventDesc { index: 12, name: "PaymentFailed", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }, ArgDesc { name: "payment_id", ty: "<T::Paymaster as Pay>::Id" }] } }
    [+] EventDesc { index: 13, name: "SpendProcessed", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }

  - errors changes:
    [+] ErrorDesc { index: 5, name: "FailedToConvertBalance" }
    [+] ErrorDesc { index: 6, name: "SpendExpired" }
    [+] ErrorDesc { index: 7, name: "EarlyPayout" }
    [+] ErrorDesc { index: 8, name: "AlreadyAttempted" }
    [+] ErrorDesc { index: 9, name: "PayoutError" }
    [+] ErrorDesc { index: 10, name: "NotAttempted" }
    [+] ErrorDesc { index: 11, name: "Inconclusive" }

  - constants changes:
    [+] ConstantDesc { name: "PayoutPeriod", value: [192, 75, 3, 0, 0, 0, 0, 0] }

  - storages changes:
    [+] StorageDesc { name: "SpendCount", modifier: "Default", default_value: [0, 0, 0, 0] }
    [+] StorageDesc { name: "Spends", modifier: "Optional", default_value: [0] }

[≠] pallet 41: Vesting -> 1 change(s)
  - calls changes:
    [+] CallDesc { index: 5, name: "force_remove_vesting_schedule", signature: SignatureDesc { args: [ArgDesc { name: "target", ty: "<T::Lookup as StaticLookup>::Source" }, ArgDesc { name: "schedule_index", ty: "u32" }] } }

[≠] pallet 44: Preimage -> 4 change(s)
  - calls changes:
    [+] CallDesc { index: 4, name: "ensure_updated", signature: SignatureDesc { args: [ArgDesc { name: "hashes", ty: "Vec<T::Hash>" }] } }

  - errors changes:
    [+] ErrorDesc { index: 6, name: "TooMany" }
    [+] ErrorDesc { index: 7, name: "TooFew" }

  - storages changes:
    [+] StorageDesc { name: "RequestStatusFor", modifier: "Optional", default_value: [0] }

[≠] pallet 46: Tips -> 5 change(s)
  - errors changes:
    [≠]  3: NotFinder       
        [Name(StringChange("NotFinder", "MaxTipAmountExceeded"))]
    [≠]  4: StillOpen       
        [Name(StringChange("StillOpen", "NotFinder"))]
    [≠]  5: Premature       
        [Name(StringChange("Premature", "StillOpen"))]
    [+] ErrorDesc { index: 6, name: "Premature" }

  - constants changes:
    [+] ConstantDesc { name: "MaxTipAmount", value: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }

[≠] pallet 80: ParachainSystem -> 9 change(s)
  - events changes:
    [≠]  3: UpgradeAuthorized ( code_hash: T::Hash, )  )
        [Name(StringChange("UpgradeAuthorized", "DownwardMessagesReceived")), Signature(SignatureChange { args: [Changed(0, [Name(StringChange("code_hash", "count")), Ty(StringChange("T::Hash", "u32"))])] })]
    [≠]  4: DownwardMessagesReceived ( count: u32, )  )
        [Name(StringChange("DownwardMessagesReceived", "DownwardMessagesProcessed")), Signature(SignatureChange { args: [Changed(0, [Name(StringChange("count", "weight_used")), Ty(StringChange("u32", "Weight"))]), Added(1, ArgDesc { name: "dmq_head", ty: "relay_chain::Hash" })] })]
    [≠]  5: DownwardMessagesProcessed ( weight_used: Weight, dmq_head: relay_chain::Hash, )  )
        [Name(StringChange("DownwardMessagesProcessed", "UpwardMessageSent")), Signature(SignatureChange { args: [Changed(0, [Name(StringChange("weight_used", "message_hash")), Ty(StringChange("Weight", "Option<XcmHash>"))]), Removed(1, ArgDesc { name: "dmq_head", ty: "relay_chain::Hash" })] })]
    [-] "UpwardMessageSent"

  - storages changes:
    [+] StorageDesc { name: "AggregatedUnincludedSegment", modifier: "Optional", default_value: [0] }
    [+] StorageDesc { name: "UnincludedSegment", modifier: "Default", default_value: [0] }
    [+] StorageDesc { name: "UpgradeGoAhead", modifier: "Default", default_value: [0] }
    [+] StorageDesc { name: "UpwardDeliveryFeeFactor", modifier: "Default", default_value: [0, 0, 100, 167, 179, 182, 224, 13, 0, 0, 0, 0, 0, 0, 0, 0] }
    [-] "AuthorizedUpgrade"

[≠] pallet 82: XcmpQueue -> 25 change(s)
  - calls changes:
    [-] "service_overweight"
    [-] "update_threshold_weight"
    [-] "update_weight_restrict_decay"
    [-] "update_xcmp_max_individual_weight"

  - events changes:
    [≠]  0: Success ( message_hash: XcmHash, message_id: XcmHash, weight: Weight, )  )
        [Name(StringChange("Success", "XcmpMessageSent")), Signature(SignatureChange { args: [Removed(1, ArgDesc { name: "message_id", ty: "XcmHash" }), Removed(2, ArgDesc { name: "weight", ty: "Weight" })] })]
    [-] "Fail"
    [-] "BadVersion"
    [-] "BadFormat"
    [-] "XcmpMessageSent"
    [-] "OverweightEnqueued"
    [-] "OverweightServiced"

  - errors changes:
    [≠]  0: FailedToSend    
        [Name(StringChange("FailedToSend", "BadQueueConfig"))]
    [≠]  1: BadXcmOrigin    
        [Name(StringChange("BadXcmOrigin", "AlreadySuspended"))]
    [≠]  2: BadXcm          
        [Name(StringChange("BadXcm", "AlreadyResumed"))]
    [-] "BadOverweightIndex"
    [-] "WeightOverLimit"

  - constants changes:
    [+] ConstantDesc { name: "MaxInboundSuspended", value: [0, 0, 0, 0] }

  - storages changes:
    [+] StorageDesc { name: "DeliveryFeeFactor", modifier: "Default", default_value: [0, 0, 100, 167, 179, 182, 224, 13, 0, 0, 0, 0, 0, 0, 0, 0] }
    [+] StorageDesc { name: "InboundXcmpSuspended", modifier: "Default", default_value: [0] }
    [≠] Default  QueueConfig: [2, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 130, 26, 6, 0, 0, 8, 0, 7, 0, 200, 23, 168, 4, 2, 0, 4, 0]
        [DefaultValue([Changed(0, U8Change(2, 32)), Changed(4, U8Change(5, 48)), Changed(8, U8Change(1, 8)), Removed(12, 130), Removed(13, 26), Removed(14, 6), Removed(15, 0), Removed(16, 0), Removed(17, 8), Removed(18, 0), Removed(19, 7), Removed(20, 0), Removed(21, 200), Removed(22, 23), Removed(23, 168), Removed(24, 4), Removed(25, 2), Removed(26, 0), Removed(27, 4), Removed(28, 0)])]
    [-] "CounterForOverweight"
    [-] "InboundXcmpMessages"
    [-] "InboundXcmpStatus"
    [-] "Overweight"
    [-] "OverweightCount"

[≠] pallet 83: PolkadotXcm -> 35 change(s)
  - calls changes:
    [≠]  0: send ( dest: Box<VersionedMultiLocation>, message: Box<VersionedXcm<()>>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))])] })]
    [≠]  1: teleport_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [≠]  2: reserve_transfer_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [≠]  3: execute ( message: Box<VersionedXcm<<T as SysConfig>::RuntimeCall>>, max_weight: Weight, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedXcm<<T as SysConfig>::RuntimeCall>>", "Box<VersionedXcm<<T as Config>::RuntimeCall>>"))])] })]
    [≠]  4: force_xcm_version ( location: Box<MultiLocation>, version: XcmVersion, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<MultiLocation>", "Box<Location>"))])] })]
    [≠]  6: force_subscribe_version_notify ( location: Box<VersionedMultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))])] })]
    [≠]  7: force_unsubscribe_version_notify ( location: Box<VersionedMultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))])] })]
    [≠]  8: limited_reserve_transfer_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, weight_limit: WeightLimit, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [≠]  9: limited_teleport_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, weight_limit: WeightLimit, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [+] CallDesc { index: 11, name: "transfer_assets", signature: SignatureDesc { args: [ArgDesc { name: "dest", ty: "Box<VersionedLocation>" }, ArgDesc { name: "beneficiary", ty: "Box<VersionedLocation>" }, ArgDesc { name: "assets", ty: "Box<VersionedAssets>" }, ArgDesc { name: "fee_asset_item", ty: "u32" }, ArgDesc { name: "weight_limit", ty: "WeightLimit" }] } }
    [+] CallDesc { index: 12, name: "claim_assets", signature: SignatureDesc { args: [ArgDesc { name: "assets", ty: "Box<VersionedAssets>" }, ArgDesc { name: "beneficiary", ty: "Box<VersionedLocation>" }] } }
    [+] CallDesc { index: 13, name: "transfer_assets_using_type_and_then", signature: SignatureDesc { args: [ArgDesc { name: "dest", ty: "Box<VersionedLocation>" }, ArgDesc { name: "assets", ty: "Box<VersionedAssets>" }, ArgDesc { name: "assets_transfer_type", ty: "Box<TransferType>" }, ArgDesc { name: "remote_fees_id", ty: "Box<VersionedAssetId>" }, ArgDesc { name: "fees_transfer_type", ty: "Box<TransferType>" }, ArgDesc { name: "custom_xcm_on_dest", ty: "Box<VersionedXcm<()>>" }, ArgDesc { name: "weight_limit", ty: "WeightLimit" }] } }

  - events changes:
    [≠]  1: Sent ( origin: MultiLocation, destination: MultiLocation, message: Xcm<()>, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠]  2: UnexpectedResponse ( origin: MultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠]  8: InvalidResponder ( origin: MultiLocation, query_id: QueryId, expected_location: Option<MultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("Option<MultiLocation>", "Option<Location>"))])] })]
    [≠]  9: InvalidResponderVersion ( origin: MultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 11: AssetsTrapped ( hash: H256, origin: MultiLocation, assets: VersionedMultiAssets, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("VersionedMultiAssets", "VersionedAssets"))])] })]
    [≠] 12: VersionChangeNotified ( destination: MultiLocation, result: XcmVersion, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 13: SupportedVersionChanged ( location: MultiLocation, version: XcmVersion, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 14: NotifyTargetSendFail ( location: MultiLocation, query_id: QueryId, error: XcmError, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 15: NotifyTargetMigrationFail ( location: VersionedMultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("VersionedMultiLocation", "VersionedLocation"))])] })]
    [≠] 16: InvalidQuerierVersion ( origin: MultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 17: InvalidQuerier ( origin: MultiLocation, query_id: QueryId, expected_querier: MultiLocation, maybe_actual_querier: Option<MultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("MultiLocation", "Location"))]), Changed(3, [Ty(StringChange("Option<MultiLocation>", "Option<Location>"))])] })]
    [≠] 18: VersionNotifyStarted ( destination: MultiLocation, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 19: VersionNotifyRequested ( destination: MultiLocation, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 20: VersionNotifyUnrequested ( destination: MultiLocation, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 21: FeesPaid ( paying: MultiLocation, fees: MultiAssets, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 22: AssetsClaimed ( hash: H256, origin: MultiLocation, assets: VersionedMultiAssets, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("VersionedMultiAssets", "VersionedAssets"))])] })]
    [+] EventDesc { index: 23, name: "VersionMigrationFinished", signature: SignatureDesc { args: [ArgDesc { name: "version", ty: "XcmVersion" }] } }

  - errors changes:
    [≠] 13: InvalidAsset    
        [Name(StringChange("InvalidAsset", "CannotCheckOutTeleport"))]
    [+] ErrorDesc { index: 20, name: "InvalidAssetNotConcrete" }
    [+] ErrorDesc { index: 21, name: "InvalidAssetUnknownReserve" }
    [+] ErrorDesc { index: 22, name: "InvalidAssetUnsupportedReserve" }
    [+] ErrorDesc { index: 23, name: "TooManyReserves" }
    [+] ErrorDesc { index: 24, name: "LocalExecutionIncomplete" }

[+] id: 86 - new pallet: MessageQueue
[-] pallet 9: Configuration
[-] pallet 85: DmpQueue
SUMMARY:
- Compatible.......................: false
- Require transaction_version bump.: true

!!! THE SUBWASM REDUCED DIFFER IS EXPERIMENTAL, DOUBLE CHECK THE RESULTS !!!
```

</details>

<details>
<summary>Spiritnet Diff</summary>

```
!!! THE SUBWASM REDUCED DIFFER IS EXPERIMENTAL, DOUBLE CHECK THE RESULTS !!!
[≠] pallet 0: System -> 8 change(s)
  - calls changes:
    [+] CallDesc { index: 9, name: "authorize_upgrade", signature: SignatureDesc { args: [ArgDesc { name: "code_hash", ty: "T::Hash" }] } }
    [+] CallDesc { index: 10, name: "authorize_upgrade_without_checks", signature: SignatureDesc { args: [ArgDesc { name: "code_hash", ty: "T::Hash" }] } }
    [+] CallDesc { index: 11, name: "apply_authorized_upgrade", signature: SignatureDesc { args: [ArgDesc { name: "code", ty: "Vec<u8>" }] } }

  - events changes:
    [+] EventDesc { index: 6, name: "UpgradeAuthorized", signature: SignatureDesc { args: [ArgDesc { name: "code_hash", ty: "T::Hash" }, ArgDesc { name: "check_version", ty: "bool" }] } }

  - errors changes:
    [+] ErrorDesc { index: 6, name: "NothingAuthorized" }
    [+] ErrorDesc { index: 7, name: "Unauthorized" }

  - constants changes:
    [≠] Version: [ 56, 107, 105, 108, 116, 45, 115, 112, 105, 114, 105, 116, 110, 101, 116, 56, 107, 105, 108, 116, 45, 115, 112, 105, 114, 105, 116, 110, 101, 116, 1, 0, ... ]
        [Value([Changed(42, U8Change(60, 68)), Changed(163, U8Change(234, 215)), Changed(164, U8Change(147, 189)), Changed(165, U8Change(227, 216)), Changed(166, U8Change(241, 162)), Changed(167, U8Change(111, 114)), Changed(168, U8Change(61, 202)), Changed(169, U8Change(105, 13)), Changed(170, U8Change(98, 101)), Changed(171, U8Change(2, 1)), Changed(175, U8Change(38, 234)), Changed(176, U8Change(96, 147)), Changed(177, U8Change(149, 227)), Changed(178, U8Change(85, 241)), Changed(179, U8Change(192, 111)), Changed(180, U8Change(101, 61)), Changed(181, U8Change(102, 105)), Changed(182, U8Change(3, 98)), Changed(187, U8Change(164, 38)), Changed(188, U8Change(123, 96)), Changed(189, U8Change(125, 149)), Changed(190, U8Change(84, 85)), Changed(191, U8Change(73, 192)), Changed(192, U8Change(148, 101)), Changed(193, U8Change(201, 102)), Changed(194, U8Change(155, 3)), Changed(195, U8Change(1, 2)), Changed(199, U8Change(69, 164)), Changed(200, U8Change(191, 123)), Changed(201, U8Change(186, 125)), Changed(202, U8Change(81, 84)), Changed(203, U8Change(163, 73)), Changed(204, U8Change(16, 148)), Changed(205, U8Change(178, 201)), Changed(206, U8Change(35, 155)), Changed(211, U8Change(195, 69)), Changed(212, U8Change(179, 191)), Changed(213, U8Change(232, 186)), Changed(214, U8Change(211, 81)), Changed(215, U8Change(50, 163)), Changed(216, U8Change(115, 16)), Changed(217, U8Change(153, 178)), Changed(218, U8Change(13, 35)), Changed(223, U8Change(8, 195)), Changed(224, U8Change(0, 179)), Changed(225, U8Change(0, 232)), Changed(226, U8Change(0, 211)), Changed(227, U8Change(0, 50)), Added(228, 115), Added(229, 153), Added(230, 13), Added(231, 1), Added(232, 0), Added(233, 0), Added(234, 0), Added(235, 251), Added(236, 197), Added(237, 119), Added(238, 185), Added(239, 215), Added(240, 71), Added(241, 239), Added(242, 214), Added(243, 1), Added(244, 0), Added(245, 0), Added(246, 0), Added(247, 8), Added(248, 0), Added(249, 0), Added(250, 0), Added(251, 0)])]

  - storages changes:
    [+] StorageDesc { name: "AuthorizedUpgrade", modifier: "Optional", default_value: [0] }

[≠] pallet 6: Balances -> 7 change(s)
  - calls changes:
    [+] CallDesc { index: 9, name: "force_adjust_total_issuance", signature: SignatureDesc { args: [ArgDesc { name: "direction", ty: "AdjustmentDirection" }, ArgDesc { name: "delta", ty: "T::Balance" }] } }
    [-] "set_balance_deprecated"
    [-] "transfer"

  - events changes:
    [+] EventDesc { index: 21, name: "TotalIssuanceForced", signature: SignatureDesc { args: [ArgDesc { name: "old", ty: "T::Balance" }, ArgDesc { name: "new", ty: "T::Balance" }] } }

  - errors changes:
    [+] ErrorDesc { index: 10, name: "IssuanceDeactivated" }
    [+] ErrorDesc { index: 11, name: "DeltaZero" }

  - constants changes:
    [-] "MaxHolds"

[≠] pallet 24: AuraExt -> 1 change(s)
  - storages changes:
    [+] StorageDesc { name: "SlotInfo", modifier: "Optional", default_value: [0] }

[≠] pallet 30: Democracy -> 9 change(s)
  - calls changes:
    [≠]  7: fast_track ( proposal_hash: H256, voting_period: BlockNumberFor<T>, delay: BlockNumberFor<T>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠]  8: veto_external ( proposal_hash: H256, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 16: blacklist ( proposal_hash: H256, maybe_ref_index: Option<ReferendumIndex>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 18: set_metadata ( owner: MetadataOwner, maybe_hash: Option<PreimageHash>, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("Option<PreimageHash>", "Option<T::Hash>"))])] })]

  - events changes:
    [≠]  9: Vetoed ( who: T::AccountId, proposal_hash: H256, until: BlockNumberFor<T>, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 10: Blacklisted ( proposal_hash: H256, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("H256", "T::Hash"))])] })]
    [≠] 14: MetadataSet ( owner: MetadataOwner, hash: PreimageHash, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("PreimageHash", "T::Hash"))])] })]
    [≠] 15: MetadataCleared ( owner: MetadataOwner, hash: PreimageHash, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("PreimageHash", "T::Hash"))])] })]
    [≠] 16: MetadataTransferred ( prev_owner: MetadataOwner, owner: MetadataOwner, hash: PreimageHash, )  )
        [Signature(SignatureChange { args: [Changed(2, [Ty(StringChange("PreimageHash", "T::Hash"))])] })]

[≠] pallet 31: Council -> 1 change(s)
  - errors changes:
    [+] ErrorDesc { index: 10, name: "PrimeAccountNotMember" }

[≠] pallet 32: TechnicalCommittee -> 1 change(s)
  - errors changes:
    [+] ErrorDesc { index: 10, name: "PrimeAccountNotMember" }

[≠] pallet 35: Treasury -> 20 change(s)
  - calls changes:
    [≠]  3: spend ( amount: BalanceOf<T, I>, beneficiary: AccountIdLookupOf<T>, )  )
        [Name(StringChange("spend", "spend_local"))]
    [+] CallDesc { index: 5, name: "spend", signature: SignatureDesc { args: [ArgDesc { name: "asset_kind", ty: "Box<T::AssetKind>" }, ArgDesc { name: "amount", ty: "AssetBalanceOf<T, I>" }, ArgDesc { name: "beneficiary", ty: "Box<BeneficiaryLookupOf<T, I>>" }, ArgDesc { name: "valid_from", ty: "Option<BlockNumberFor<T>>" }] } }
    [+] CallDesc { index: 6, name: "payout", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }
    [+] CallDesc { index: 7, name: "check_status", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }
    [+] CallDesc { index: 8, name: "void_spend", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }

  - events changes:
    [+] EventDesc { index: 9, name: "AssetSpendApproved", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }, ArgDesc { name: "asset_kind", ty: "T::AssetKind" }, ArgDesc { name: "amount", ty: "AssetBalanceOf<T, I>" }, ArgDesc { name: "beneficiary", ty: "T::Beneficiary" }, ArgDesc { name: "valid_from", ty: "BlockNumberFor<T>" }, ArgDesc { name: "expire_at", ty: "BlockNumberFor<T>" }] } }
    [+] EventDesc { index: 10, name: "AssetSpendVoided", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }
    [+] EventDesc { index: 11, name: "Paid", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }, ArgDesc { name: "payment_id", ty: "<T::Paymaster as Pay>::Id" }] } }
    [+] EventDesc { index: 12, name: "PaymentFailed", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }, ArgDesc { name: "payment_id", ty: "<T::Paymaster as Pay>::Id" }] } }
    [+] EventDesc { index: 13, name: "SpendProcessed", signature: SignatureDesc { args: [ArgDesc { name: "index", ty: "SpendIndex" }] } }

  - errors changes:
    [+] ErrorDesc { index: 5, name: "FailedToConvertBalance" }
    [+] ErrorDesc { index: 6, name: "SpendExpired" }
    [+] ErrorDesc { index: 7, name: "EarlyPayout" }
    [+] ErrorDesc { index: 8, name: "AlreadyAttempted" }
    [+] ErrorDesc { index: 9, name: "PayoutError" }
    [+] ErrorDesc { index: 10, name: "NotAttempted" }
    [+] ErrorDesc { index: 11, name: "Inconclusive" }

  - constants changes:
    [+] ConstantDesc { name: "PayoutPeriod", value: [192, 75, 3, 0, 0, 0, 0, 0] }

  - storages changes:
    [+] StorageDesc { name: "SpendCount", modifier: "Default", default_value: [0, 0, 0, 0] }
    [+] StorageDesc { name: "Spends", modifier: "Optional", default_value: [0] }

[≠] pallet 41: Vesting -> 1 change(s)
  - calls changes:
    [+] CallDesc { index: 5, name: "force_remove_vesting_schedule", signature: SignatureDesc { args: [ArgDesc { name: "target", ty: "<T::Lookup as StaticLookup>::Source" }, ArgDesc { name: "schedule_index", ty: "u32" }] } }

[≠] pallet 44: Preimage -> 4 change(s)
  - calls changes:
    [+] CallDesc { index: 4, name: "ensure_updated", signature: SignatureDesc { args: [ArgDesc { name: "hashes", ty: "Vec<T::Hash>" }] } }

  - errors changes:
    [+] ErrorDesc { index: 6, name: "TooMany" }
    [+] ErrorDesc { index: 7, name: "TooFew" }

  - storages changes:
    [+] StorageDesc { name: "RequestStatusFor", modifier: "Optional", default_value: [0] }

[≠] pallet 46: Tips -> 5 change(s)
  - errors changes:
    [≠]  3: NotFinder       
        [Name(StringChange("NotFinder", "MaxTipAmountExceeded"))]
    [≠]  4: StillOpen       
        [Name(StringChange("StillOpen", "NotFinder"))]
    [≠]  5: Premature       
        [Name(StringChange("Premature", "StillOpen"))]
    [+] ErrorDesc { index: 6, name: "Premature" }

  - constants changes:
    [+] ConstantDesc { name: "MaxTipAmount", value: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }

[≠] pallet 80: ParachainSystem -> 9 change(s)
  - events changes:
    [≠]  3: UpgradeAuthorized ( code_hash: T::Hash, )  )
        [Name(StringChange("UpgradeAuthorized", "DownwardMessagesReceived")), Signature(SignatureChange { args: [Changed(0, [Name(StringChange("code_hash", "count")), Ty(StringChange("T::Hash", "u32"))])] })]
    [≠]  4: DownwardMessagesReceived ( count: u32, )  )
        [Name(StringChange("DownwardMessagesReceived", "DownwardMessagesProcessed")), Signature(SignatureChange { args: [Changed(0, [Name(StringChange("count", "weight_used")), Ty(StringChange("u32", "Weight"))]), Added(1, ArgDesc { name: "dmq_head", ty: "relay_chain::Hash" })] })]
    [≠]  5: DownwardMessagesProcessed ( weight_used: Weight, dmq_head: relay_chain::Hash, )  )
        [Name(StringChange("DownwardMessagesProcessed", "UpwardMessageSent")), Signature(SignatureChange { args: [Changed(0, [Name(StringChange("weight_used", "message_hash")), Ty(StringChange("Weight", "Option<XcmHash>"))]), Removed(1, ArgDesc { name: "dmq_head", ty: "relay_chain::Hash" })] })]
    [-] "UpwardMessageSent"

  - storages changes:
    [+] StorageDesc { name: "AggregatedUnincludedSegment", modifier: "Optional", default_value: [0] }
    [+] StorageDesc { name: "UnincludedSegment", modifier: "Default", default_value: [0] }
    [+] StorageDesc { name: "UpgradeGoAhead", modifier: "Default", default_value: [0] }
    [+] StorageDesc { name: "UpwardDeliveryFeeFactor", modifier: "Default", default_value: [0, 0, 100, 167, 179, 182, 224, 13, 0, 0, 0, 0, 0, 0, 0, 0] }
    [-] "AuthorizedUpgrade"

[≠] pallet 82: XcmpQueue -> 25 change(s)
  - calls changes:
    [-] "service_overweight"
    [-] "update_threshold_weight"
    [-] "update_weight_restrict_decay"
    [-] "update_xcmp_max_individual_weight"

  - events changes:
    [≠]  0: Success ( message_hash: XcmHash, message_id: XcmHash, weight: Weight, )  )
        [Name(StringChange("Success", "XcmpMessageSent")), Signature(SignatureChange { args: [Removed(1, ArgDesc { name: "message_id", ty: "XcmHash" }), Removed(2, ArgDesc { name: "weight", ty: "Weight" })] })]
    [-] "Fail"
    [-] "BadVersion"
    [-] "BadFormat"
    [-] "XcmpMessageSent"
    [-] "OverweightEnqueued"
    [-] "OverweightServiced"

  - errors changes:
    [≠]  0: FailedToSend    
        [Name(StringChange("FailedToSend", "BadQueueConfig"))]
    [≠]  1: BadXcmOrigin    
        [Name(StringChange("BadXcmOrigin", "AlreadySuspended"))]
    [≠]  2: BadXcm          
        [Name(StringChange("BadXcm", "AlreadyResumed"))]
    [-] "BadOverweightIndex"
    [-] "WeightOverLimit"

  - constants changes:
    [+] ConstantDesc { name: "MaxInboundSuspended", value: [0, 0, 0, 0] }

  - storages changes:
    [+] StorageDesc { name: "DeliveryFeeFactor", modifier: "Default", default_value: [0, 0, 100, 167, 179, 182, 224, 13, 0, 0, 0, 0, 0, 0, 0, 0] }
    [+] StorageDesc { name: "InboundXcmpSuspended", modifier: "Default", default_value: [0] }
    [≠] Default  QueueConfig: [2, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 130, 26, 6, 0, 0, 8, 0, 7, 0, 200, 23, 168, 4, 2, 0, 4, 0]
        [DefaultValue([Changed(0, U8Change(2, 32)), Changed(4, U8Change(5, 48)), Changed(8, U8Change(1, 8)), Removed(12, 130), Removed(13, 26), Removed(14, 6), Removed(15, 0), Removed(16, 0), Removed(17, 8), Removed(18, 0), Removed(19, 7), Removed(20, 0), Removed(21, 200), Removed(22, 23), Removed(23, 168), Removed(24, 4), Removed(25, 2), Removed(26, 0), Removed(27, 4), Removed(28, 0)])]
    [-] "CounterForOverweight"
    [-] "InboundXcmpMessages"
    [-] "InboundXcmpStatus"
    [-] "Overweight"
    [-] "OverweightCount"

[≠] pallet 83: PolkadotXcm -> 35 change(s)
  - calls changes:
    [≠]  0: send ( dest: Box<VersionedMultiLocation>, message: Box<VersionedXcm<()>>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))])] })]
    [≠]  1: teleport_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [≠]  2: reserve_transfer_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [≠]  3: execute ( message: Box<VersionedXcm<<T as SysConfig>::RuntimeCall>>, max_weight: Weight, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedXcm<<T as SysConfig>::RuntimeCall>>", "Box<VersionedXcm<<T as Config>::RuntimeCall>>"))])] })]
    [≠]  4: force_xcm_version ( location: Box<MultiLocation>, version: XcmVersion, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<MultiLocation>", "Box<Location>"))])] })]
    [≠]  6: force_subscribe_version_notify ( location: Box<VersionedMultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))])] })]
    [≠]  7: force_unsubscribe_version_notify ( location: Box<VersionedMultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))])] })]
    [≠]  8: limited_reserve_transfer_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, weight_limit: WeightLimit, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [≠]  9: limited_teleport_assets ( dest: Box<VersionedMultiLocation>, beneficiary: Box<VersionedMultiLocation>, assets: Box<VersionedMultiAssets>, fee_asset_item: u32, weight_limit: WeightLimit, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(1, [Ty(StringChange("Box<VersionedMultiLocation>", "Box<VersionedLocation>"))]), Changed(2, [Ty(StringChange("Box<VersionedMultiAssets>", "Box<VersionedAssets>"))])] })]
    [+] CallDesc { index: 11, name: "transfer_assets", signature: SignatureDesc { args: [ArgDesc { name: "dest", ty: "Box<VersionedLocation>" }, ArgDesc { name: "beneficiary", ty: "Box<VersionedLocation>" }, ArgDesc { name: "assets", ty: "Box<VersionedAssets>" }, ArgDesc { name: "fee_asset_item", ty: "u32" }, ArgDesc { name: "weight_limit", ty: "WeightLimit" }] } }
    [+] CallDesc { index: 12, name: "claim_assets", signature: SignatureDesc { args: [ArgDesc { name: "assets", ty: "Box<VersionedAssets>" }, ArgDesc { name: "beneficiary", ty: "Box<VersionedLocation>" }] } }
    [+] CallDesc { index: 13, name: "transfer_assets_using_type_and_then", signature: SignatureDesc { args: [ArgDesc { name: "dest", ty: "Box<VersionedLocation>" }, ArgDesc { name: "assets", ty: "Box<VersionedAssets>" }, ArgDesc { name: "assets_transfer_type", ty: "Box<TransferType>" }, ArgDesc { name: "remote_fees_id", ty: "Box<VersionedAssetId>" }, ArgDesc { name: "fees_transfer_type", ty: "Box<TransferType>" }, ArgDesc { name: "custom_xcm_on_dest", ty: "Box<VersionedXcm<()>>" }, ArgDesc { name: "weight_limit", ty: "WeightLimit" }] } }

  - events changes:
    [≠]  1: Sent ( origin: MultiLocation, destination: MultiLocation, message: Xcm<()>, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠]  2: UnexpectedResponse ( origin: MultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠]  8: InvalidResponder ( origin: MultiLocation, query_id: QueryId, expected_location: Option<MultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("Option<MultiLocation>", "Option<Location>"))])] })]
    [≠]  9: InvalidResponderVersion ( origin: MultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 11: AssetsTrapped ( hash: H256, origin: MultiLocation, assets: VersionedMultiAssets, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("VersionedMultiAssets", "VersionedAssets"))])] })]
    [≠] 12: VersionChangeNotified ( destination: MultiLocation, result: XcmVersion, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 13: SupportedVersionChanged ( location: MultiLocation, version: XcmVersion, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 14: NotifyTargetSendFail ( location: MultiLocation, query_id: QueryId, error: XcmError, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 15: NotifyTargetMigrationFail ( location: VersionedMultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("VersionedMultiLocation", "VersionedLocation"))])] })]
    [≠] 16: InvalidQuerierVersion ( origin: MultiLocation, query_id: QueryId, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))])] })]
    [≠] 17: InvalidQuerier ( origin: MultiLocation, query_id: QueryId, expected_querier: MultiLocation, maybe_actual_querier: Option<MultiLocation>, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("MultiLocation", "Location"))]), Changed(3, [Ty(StringChange("Option<MultiLocation>", "Option<Location>"))])] })]
    [≠] 18: VersionNotifyStarted ( destination: MultiLocation, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 19: VersionNotifyRequested ( destination: MultiLocation, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 20: VersionNotifyUnrequested ( destination: MultiLocation, cost: MultiAssets, message_id: XcmHash, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 21: FeesPaid ( paying: MultiLocation, fees: MultiAssets, )  )
        [Signature(SignatureChange { args: [Changed(0, [Ty(StringChange("MultiLocation", "Location"))]), Changed(1, [Ty(StringChange("MultiAssets", "Assets"))])] })]
    [≠] 22: AssetsClaimed ( hash: H256, origin: MultiLocation, assets: VersionedMultiAssets, )  )
        [Signature(SignatureChange { args: [Changed(1, [Ty(StringChange("MultiLocation", "Location"))]), Changed(2, [Ty(StringChange("VersionedMultiAssets", "VersionedAssets"))])] })]
    [+] EventDesc { index: 23, name: "VersionMigrationFinished", signature: SignatureDesc { args: [ArgDesc { name: "version", ty: "XcmVersion" }] } }

  - errors changes:
    [≠] 13: InvalidAsset    
        [Name(StringChange("InvalidAsset", "CannotCheckOutTeleport"))]
    [+] ErrorDesc { index: 20, name: "InvalidAssetNotConcrete" }
    [+] ErrorDesc { index: 21, name: "InvalidAssetUnknownReserve" }
    [+] ErrorDesc { index: 22, name: "InvalidAssetUnsupportedReserve" }
    [+] ErrorDesc { index: 23, name: "TooManyReserves" }
    [+] ErrorDesc { index: 24, name: "LocalExecutionIncomplete" }

[+] id: 86 - new pallet: MessageQueue
[-] pallet 85: DmpQueue
SUMMARY:
- Compatible.......................: false
- Require transaction_version bump.: true

!!! THE SUBWASM REDUCED DIFFER IS EXPERIMENTAL, DOUBLE CHECK THE RESULTS !!!
```

</details>
## Checklist:

- [ ] I have verified that the code works
- [ ] No panics! (checked arithmetic ops, no indexing `array[3]` use
`get(3)`, ...)
- [ ] I have verified that the code is easy to understand
  - [ ] If not, I have left a well-balanced amount of inline comments
- [ ] I have [left the code in a better
state](https://deviq.com/principles/boy-scout-rule)
- [ ] I have documented the changes (where applicable)
* Either PR or Ticket to update [the
Docs](https://github.com/KILTprotocol/docs)
    * Link the PR/Ticket here
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
T1-FRAME This PR/Issue is related to core FRAME, the framework. T4-runtime_API This PR/Issue is related to runtime APIs. T8-polkadot This PR/Issue is related to/affects the Polkadot network. T9-cumulus This PR/Issue is related to cumulus.
Projects
Status: Audited
Development

Successfully merging this pull request may close these issues.

5 participants