mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-31 09:51:02 +00:00
79d9164fd0
* Add two new zombienet tests for bridges (manual run) (#3072) extracted useful code from #2982 This PR: - adds test 2 for Rococo <> Westend bridge: checks that relayer doesn't submit any extra headers while there are no any messages; - adds test 3 for Rococo <> Westend bridge: checks that relayer doesn't submit any extra headers when there are messages; - fixes most of comments from #2439 (like: log names, ability to run specify test number when calling `run-tests.sh`). Right now of all our tests, only test 2 is working (until BHs will be upgraded to use async backing), so you can test it with `./bridges/zombienet/run-tests.sh --test 2` locally. (cherry picked from commit2e6067d768) * [cumulus] Improved check for sane bridge fees calculations (#3175) - [x] change constants when CI fails (should fail :) ) On the AssetHubRococo: 1701175800126 -> 1700929825257 = 0.15 % decreased. ``` Feb 02 12:59:05.520 ERROR bridges::estimate: `bridging::XcmBridgeHubRouterBaseFee` actual value: 1701175800126 for runtime: statemine-1006000 (statemine-0.tx14.au1) Feb 02 13:02:40.647 ERROR bridges::estimate: `bridging::XcmBridgeHubRouterBaseFee` actual value: 1700929825257 for runtime: statemine-1006000 (statemine-0.tx14.au1) ``` On the AssetHubWestend: 2116038876326 -> 1641718372993 = 22.4 % decreased. ``` Feb 02 12:56:00.880 ERROR bridges::estimate: `bridging::XcmBridgeHubRouterBaseFee` actual value: 2116038876326 for runtime: westmint-1006000 (westmint-0.tx14.au1) Feb 02 13:04:42.515 ERROR bridges::estimate: `bridging::XcmBridgeHubRouterBaseFee` actual value: 1641718372993 for runtime: westmint-1006000 (westmint-0.tx14.au1) ``` (cherry picked from commit74b597fcaf) * Enable async backing on all testnet system chains (#2949) Built on top of https://github.com/paritytech/polkadot-sdk/pull/2826/ which was a trial run. Guide: https://github.com/w3f/polkadot-wiki/blob/master/docs/maintain/maintain-guides-async-backing.md --------- Signed-off-by: georgepisaltu <george.pisaltu@parity.io> Co-authored-by: Branislav Kontur <bkontur@gmail.com> Co-authored-by: Dónal Murray <donal.murray@parity.io> Co-authored-by: Dmitry Sinyavin <dmitry.sinyavin@parity.io> Co-authored-by: s0me0ne-unkn0wn <48632512+s0me0ne-unkn0wn@users.noreply.github.com> Co-authored-by: Svyatoslav Nikolsky <svyatonik@gmail.com> Co-authored-by: Bastian Köcher <info@kchr.de> Co-authored-by: georgepisaltu <52418509+georgepisaltu@users.noreply.github.com> (cherry picked from commit700d5f85b7) * Introduce submit_finality_proof_ex call to bridges GRANDPA pallet (#3225) backport of https://github.com/paritytech/parity-bridges-common/pull/2821 (see detailed description there) (cherry picked from commita462207158) * Bridge zombienet tests refactoring (#3260) Related to https://github.com/paritytech/polkadot-sdk/issues/3242 Reorganizing the bridge zombienet tests in order to: - separate the environment spawning from the actual tests - offer better control over the tests and some possibility to orchestrate them as opposed to running everything from the zndsl file Only rewrote the asset transfer test using this new "framework". The old logic and old tests weren't functionally modified or deleted. The plan is to get feedback on this approach first and if this is agreed upon, migrate the other 2 tests later in separate PRs and also do other improvements later. (cherry picked from commitdfc8e4696c) * Bridges: add test 0002 to CI (#3310) Bridges: add test 0002 to CI (cherry picked from commit1b66bb51b5) * Bridge zombienet tests - move all test scripts to the same folder (#3333) Related to https://github.com/paritytech/polkadot-sdk/issues/3242 (cherry picked from commit5fc7622cb3) * Lift dependencies to the workspace (Part 2/x) (#3366) Lifting some more dependencies to the workspace. Just using the most-often updated ones for now. It can be reproduced locally. ```sh $ zepter transpose dependency lift-to-workspace --ignore-errors syn quote thiserror "regex:^serde.*" $ zepter transpose dependency lift-to-workspace --version-resolver=highest syn quote thiserror "regex:^serde.*" --fix $ taplo format --config .config/taplo.toml ``` --------- Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> (cherry picked from commite89d0fca35) * Add support for BHP local and BHK local (#3443) Related to https://github.com/paritytech/polkadot-sdk/issues/3400 Extracting small parts of https://github.com/paritytech/polkadot-sdk/pull/3429 into separate PR: - Add support for BHP local and BHK local - Increase the timeout for the bridge zomienet tests (cherry picked from commite4b6b8cd79) * Bridge zombienet tests: move all "framework" files under one folder (#3462) Related to https://github.com/paritytech/polkadot-sdk/issues/3400 Moving all bridges testing "framework" files under one folder in order to be able to download the entire folder when we want to add tests in other repos No significant functional changes (cherry picked from commit6fc1d41d44) * Bridge zombienet tests: Check amount received at destination (#3490) Related to https://github.com/paritytech/polkadot-sdk/issues/3475 (cherry picked from commit2cdda0e62d) * FRAME: Create `TransactionExtension` as a replacement for `SignedExtension` (#2280) Closes #2160 First part of [Extrinsic Horizon](https://github.com/paritytech/polkadot-sdk/issues/2415) Introduces a new trait `TransactionExtension` to replace `SignedExtension`. Introduce the idea of transactions which obey the runtime's extensions and have according Extension data (né Extra data) yet do not have hard-coded signatures. Deprecate the terminology of "Unsigned" when used for transactions/extrinsics owing to there now being "proper" unsigned transactions which obey the extension framework and "old-style" unsigned which do not. Instead we have __*General*__ for the former and __*Bare*__ for the latter. (Ultimately, the latter will be phased out as a type of transaction, and Bare will only be used for Inherents.) Types of extrinsic are now therefore: - Bare (no hardcoded signature, no Extra data; used to be known as "Unsigned") - Bare transactions (deprecated): Gossiped, validated with `ValidateUnsigned` (deprecated) and the `_bare_compat` bits of `TransactionExtension` (deprecated). - Inherents: Not gossiped, validated with `ProvideInherent`. - Extended (Extra data): Gossiped, validated via `TransactionExtension`. - Signed transactions (with a hardcoded signature). - General transactions (without a hardcoded signature). `TransactionExtension` differs from `SignedExtension` because: - A signature on the underlying transaction may validly not be present. - It may alter the origin during validation. - `pre_dispatch` is renamed to `prepare` and need not contain the checks present in `validate`. - `validate` and `prepare` is passed an `Origin` rather than a `AccountId`. - `validate` may pass arbitrary information into `prepare` via a new user-specifiable type `Val`. - `AdditionalSigned`/`additional_signed` is renamed to `Implicit`/`implicit`. It is encoded *for the entire transaction* and passed in to each extension as a new argument to `validate`. This facilitates the ability of extensions to acts as underlying crypto. There is a new `DispatchTransaction` trait which contains only default function impls and is impl'ed for any `TransactionExtension` impler. It provides several utility functions which reduce some of the tedium from using `TransactionExtension` (indeed, none of its regular functions should now need to be called directly). Three transaction version discriminator ("versions") are now permissible: - 0b000000100: Bare (used to be called "Unsigned"): contains Signature or Extra (extension data). After bare transactions are no longer supported, this will strictly identify an Inherents only. - 0b100000100: Old-school "Signed" Transaction: contains Signature and Extra (extension data). - 0b010000100: New-school "General" Transaction: contains Extra (extension data), but no Signature. For the New-school General Transaction, it becomes trivial for authors to publish extensions to the mechanism for authorizing an Origin, e.g. through new kinds of key-signing schemes, ZK proofs, pallet state, mutations over pre-authenticated origins or any combination of the above. Wrap your `SignedExtension`s in `AsTransactionExtension`. This should be accompanied by renaming your aggregate type in line with the new terminology. E.g. Before: ```rust /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( /* snip */ MySpecialSignedExtension, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>; ``` After: ```rust /// The extension to the basic transaction logic. pub type TxExtension = ( /* snip */ AsTransactionExtension<MySpecialSignedExtension>, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, TxExtension>; ``` You'll also need to alter any transaction building logic to add a `.into()` to make the conversion happen. E.g. Before: ```rust fn construct_extrinsic( /* snip */ ) -> UncheckedExtrinsic { let extra: SignedExtra = ( /* snip */ MySpecialSignedExtension::new(/* snip */), ); let payload = SignedPayload::new(call.clone(), extra.clone()).unwrap(); let signature = payload.using_encoded(|e| sender.sign(e)); UncheckedExtrinsic::new_signed( /* snip */ Signature::Sr25519(signature), extra, ) } ``` After: ```rust fn construct_extrinsic( /* snip */ ) -> UncheckedExtrinsic { let tx_ext: TxExtension = ( /* snip */ MySpecialSignedExtension::new(/* snip */).into(), ); let payload = SignedPayload::new(call.clone(), tx_ext.clone()).unwrap(); let signature = payload.using_encoded(|e| sender.sign(e)); UncheckedExtrinsic::new_signed( /* snip */ Signature::Sr25519(signature), tx_ext, ) } ``` Most `SignedExtension`s can be trivially converted to become a `TransactionExtension`. There are a few things to know. - Instead of a single trait like `SignedExtension`, you should now implement two traits individually: `TransactionExtensionBase` and `TransactionExtension`. - Weights are now a thing and must be provided via the new function `fn weight`. This trait takes care of anything which is not dependent on types specific to your runtime, most notably `Call`. - `AdditionalSigned`/`additional_signed` is renamed to `Implicit`/`implicit`. - Weight must be returned by implementing the `weight` function. If your extension is associated with a pallet, you'll probably want to do this via the pallet's existing benchmarking infrastructure. Generally: - `pre_dispatch` is now `prepare` and you *should not reexecute the `validate` functionality in there*! - You don't get an account ID any more; you get an origin instead. If you need to presume an account ID, then you can use the trait function `AsSystemOriginSigner::as_system_origin_signer`. - You get an additional ticket, similar to `Pre`, called `Val`. This defines data which is passed from `validate` into `prepare`. This is important since you should not be duplicating logic from `validate` to `prepare`, you need a way of passing your working from the former into the latter. This is it. - This trait takes two type parameters: `Call` and `Context`. `Call` is the runtime call type which used to be an associated type; you can just move it to become a type parameter for your trait impl. `Context` is not currently used and you can safely implement over it as an unbounded type. - There's no `AccountId` associated type any more. Just remove it. Regarding `validate`: - You get three new parameters in `validate`; all can be ignored when migrating from `SignedExtension`. - `validate` returns a tuple on success; the second item in the tuple is the new ticket type `Self::Val` which gets passed in to `prepare`. If you use any information extracted during `validate` (off-chain and on-chain, non-mutating) in `prepare` (on-chain, mutating) then you can pass it through with this. For the tuple's last item, just return the `origin` argument. Regarding `prepare`: - This is renamed from `pre_dispatch`, but there is one change: - FUNCTIONALITY TO VALIDATE THE TRANSACTION NEED NOT BE DUPLICATED FROM `validate`!! - (This is different to `SignedExtension` which was required to run the same checks in `pre_dispatch` as in `validate`.) Regarding `post_dispatch`: - Since there are no unsigned transactions handled by `TransactionExtension`, `Pre` is always defined, so the first parameter is `Self::Pre` rather than `Option<Self::Pre>`. If you make use of `SignedExtension::validate_unsigned` or `SignedExtension::pre_dispatch_unsigned`, then: - Just use the regular versions of these functions instead. - Have your logic execute in the case that the `origin` is `None`. - Ensure your transaction creation logic creates a General Transaction rather than a Bare Transaction; this means having to include all `TransactionExtension`s' data. - `ValidateUnsigned` can still be used (for now) if you need to be able to construct transactions which contain none of the extension data, however these will be phased out in stage 2 of the Transactions Horizon, so you should consider moving to an extension-centric design. - [x] Introduce `CheckSignature` impl of `TransactionExtension` to ensure it's possible to have crypto be done wholly in a `TransactionExtension`. - [x] Deprecate `SignedExtension` and move all uses in codebase to `TransactionExtension`. - [x] `ChargeTransactionPayment` - [x] `DummyExtension` - [x] `ChargeAssetTxPayment` (asset-tx-payment) - [x] `ChargeAssetTxPayment` (asset-conversion-tx-payment) - [x] `CheckWeight` - [x] `CheckTxVersion` - [x] `CheckSpecVersion` - [x] `CheckNonce` - [x] `CheckNonZeroSender` - [x] `CheckMortality` - [x] `CheckGenesis` - [x] `CheckOnlySudoAccount` - [x] `WatchDummy` - [x] `PrevalidateAttests` - [x] `GenericSignedExtension` - [x] `SignedExtension` (chain-polkadot-bulletin) - [x] `RefundSignedExtensionAdapter` - [x] Implement `fn weight` across the board. - [ ] Go through all pre-existing extensions which assume an account signer and explicitly handle the possibility of another kind of origin. - [x] `CheckNonce` should probably succeed in the case of a non-account origin. - [x] `CheckNonZeroSender` should succeed in the case of a non-account origin. - [x] `ChargeTransactionPayment` and family should fail in the case of a non-account origin. - [ ] - [x] Fix any broken tests. --------- Signed-off-by: georgepisaltu <george.pisaltu@parity.io> Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Signed-off-by: Alexandru Gheorghe <alexandru.gheorghe@parity.io> Signed-off-by: Andrei Sandu <andrei-mihail@parity.io> Co-authored-by: Nikhil Gupta <17176722+gupnik@users.noreply.github.com> Co-authored-by: georgepisaltu <52418509+georgepisaltu@users.noreply.github.com> Co-authored-by: Chevdor <chevdor@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: Maciej <maciej.zyszkiewicz@parity.io> Co-authored-by: Javier Viola <javier@parity.io> Co-authored-by: Marcin S. <marcin@realemail.net> Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io> Co-authored-by: Javier Bullrich <javier@bullrich.dev> Co-authored-by: Koute <koute@users.noreply.github.com> Co-authored-by: Adrian Catangiu <adrian@parity.io> Co-authored-by: Vladimir Istyufeev <vladimir@parity.io> Co-authored-by: Ross Bulat <ross@parity.io> Co-authored-by: Gonçalo Pestana <g6pestana@gmail.com> Co-authored-by: Liam Aharon <liam.aharon@hotmail.com> Co-authored-by: Svyatoslav Nikolsky <svyatonik@gmail.com> Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: s0me0ne-unkn0wn <48632512+s0me0ne-unkn0wn@users.noreply.github.com> Co-authored-by: ordian <write@reusable.software> Co-authored-by: Sebastian Kunert <skunert49@gmail.com> Co-authored-by: Aaro Altonen <48052676+altonen@users.noreply.github.com> Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Co-authored-by: Julian Eager <eagr@tutanota.com> Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Co-authored-by: Davide Galassi <davxy@datawok.net> Co-authored-by: Dónal Murray <donal.murray@parity.io> Co-authored-by: yjh <yjh465402634@gmail.com> Co-authored-by: Tom Mi <tommi@niemi.lol> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Will | Paradox | ParaNodes.io <79228812+paradox-tt@users.noreply.github.com> Co-authored-by: Bastian Köcher <info@kchr.de> Co-authored-by: Joshy Orndorff <JoshOrndorff@users.noreply.github.com> Co-authored-by: Joshy Orndorff <git-user-email.h0ly5@simplelogin.com> Co-authored-by: PG Herveou <pgherveou@gmail.com> Co-authored-by: Alexander Theißen <alex.theissen@me.com> Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Co-authored-by: Juan Girini <juangirini@gmail.com> Co-authored-by: bader y <ibnbassem@gmail.com> Co-authored-by: James Wilson <james@jsdw.me> Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: asynchronous rob <rphmeier@gmail.com> Co-authored-by: Parth <desaiparth08@gmail.com> Co-authored-by: Andrew Jones <ascjones@gmail.com> Co-authored-by: Jonathan Udd <jonathan@dwellir.com> Co-authored-by: Serban Iorga <serban@parity.io> Co-authored-by: Egor_P <egor@parity.io> Co-authored-by: Branislav Kontur <bkontur@gmail.com> Co-authored-by: Evgeny Snitko <evgeny@parity.io> Co-authored-by: Just van Stam <vstam1@users.noreply.github.com> Co-authored-by: Francisco Aguirre <franciscoaguirreperez@gmail.com> Co-authored-by: gupnik <nikhilgupta.iitk@gmail.com> Co-authored-by: dzmitry-lahoda <dzmitry@lahoda.pro> Co-authored-by: zhiqiangxu <652732310@qq.com> Co-authored-by: Nazar Mokrynskyi <nazar@mokrynskyi.com> Co-authored-by: Anwesh <anweshknayak@gmail.com> Co-authored-by: cheme <emericchevalier.pro@gmail.com> Co-authored-by: Sam Johnson <sam@durosoft.com> Co-authored-by: kianenigma <kian@parity.io> Co-authored-by: Jegor Sidorenko <5252494+jsidorenko@users.noreply.github.com> Co-authored-by: Muharem <ismailov.m.h@gmail.com> Co-authored-by: joepetrowski <joe@parity.io> Co-authored-by: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com> Co-authored-by: Gabriel Facco de Arruda <arrudagates@gmail.com> Co-authored-by: Squirrel <gilescope@gmail.com> Co-authored-by: Andrei Sandu <54316454+sandreim@users.noreply.github.com> Co-authored-by: georgepisaltu <george.pisaltu@parity.io> Co-authored-by: command-bot <> (cherry picked from commitfd5f9292f5) * Revert "FRAME: Create `TransactionExtension` as a replacement for `SignedExtension` (#2280)" (#3665) This PR reverts #2280 which introduced `TransactionExtension` to replace `SignedExtension`. As a result of the discussion [here](https://github.com/paritytech/polkadot-sdk/pull/3623#issuecomment-1986789700), the changes will be reverted for now with plans to reintroduce the concept in the future. --------- Signed-off-by: georgepisaltu <george.pisaltu@parity.io> (cherry picked from commitbbd51ce867) * Increase timeout for assertions (#3680) Prevents timeouts in ci like https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/5516019 (cherry picked from commitc4c9257386) * Removes `as [disambiguation_path]` from `derive_impl` usage (#3652) Step in https://github.com/paritytech/polkadot-sdk/issues/171 This PR removes `as [disambiguation_path]` syntax from `derive_impl` usage across the polkadot-sdk as introduced in https://github.com/paritytech/polkadot-sdk/pull/3505 (cherry picked from commit7099f6e1b1) * Fix typo (#3691) (cherry picked from commit6b1179f13b) * Bridge zombienet tests: remove unneeded accounts (#3700) Bridge zombienet tests: remove unneeded accounts (cherry picked from commit0c6c837f68) * Fix typos (#3753) (cherry picked from commit7241a8db7b) * Update polkadot-sdk refs * Fix dependency conflicts * Fix build * cargo fmt * Fix spellcheck test --------- Co-authored-by: Svyatoslav Nikolsky <svyatonik@gmail.com> Co-authored-by: Branislav Kontur <bkontur@gmail.com> Co-authored-by: Marcin S <marcin@realemail.net> Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: Gavin Wood <gavin@parity.io> Co-authored-by: georgepisaltu <52418509+georgepisaltu@users.noreply.github.com> Co-authored-by: Javier Viola <363911+pepoviola@users.noreply.github.com> Co-authored-by: gupnik <nikhilgupta.iitk@gmail.com> Co-authored-by: jokess123 <163112061+jokess123@users.noreply.github.com> Co-authored-by: slicejoke <163888128+slicejoke@users.noreply.github.com>
428 lines
14 KiB
Rust
428 lines
14 KiB
Rust
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// This file is part of Parity Bridges Common.
|
|
|
|
// Parity Bridges Common is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// Parity Bridges Common is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
//! A mock runtime for testing different stuff in the crate.
|
|
|
|
#![cfg(test)]
|
|
|
|
use crate::messages::{
|
|
source::{
|
|
FromThisChainMaximalOutboundPayloadSize, FromThisChainMessagePayload,
|
|
TargetHeaderChainAdapter,
|
|
},
|
|
target::{FromBridgedChainMessagePayload, SourceHeaderChainAdapter},
|
|
BridgedChainWithMessages, HashOf, MessageBridge, ThisChainWithMessages,
|
|
};
|
|
|
|
use bp_header_chain::{ChainWithGrandpa, HeaderChain};
|
|
use bp_messages::{
|
|
target_chain::{DispatchMessage, MessageDispatch},
|
|
LaneId, MessageNonce,
|
|
};
|
|
use bp_parachains::SingleParaStoredHeaderDataBuilder;
|
|
use bp_relayers::PayRewardFromAccount;
|
|
use bp_runtime::{
|
|
messages::MessageDispatchResult, Chain, ChainId, Parachain, UnderlyingChainProvider,
|
|
};
|
|
use codec::{Decode, Encode};
|
|
use frame_support::{
|
|
derive_impl, parameter_types,
|
|
weights::{ConstantMultiplier, IdentityFee, RuntimeDbWeight, Weight},
|
|
};
|
|
use pallet_transaction_payment::Multiplier;
|
|
use sp_runtime::{
|
|
testing::H256,
|
|
traits::{BlakeTwo256, ConstU32, ConstU64, ConstU8},
|
|
FixedPointNumber, Perquintill,
|
|
};
|
|
|
|
/// Account identifier at `ThisChain`.
|
|
pub type ThisChainAccountId = u64;
|
|
/// Balance at `ThisChain`.
|
|
pub type ThisChainBalance = u64;
|
|
/// Block number at `ThisChain`.
|
|
pub type ThisChainBlockNumber = u32;
|
|
/// Hash at `ThisChain`.
|
|
pub type ThisChainHash = H256;
|
|
/// Hasher at `ThisChain`.
|
|
pub type ThisChainHasher = BlakeTwo256;
|
|
/// Runtime call at `ThisChain`.
|
|
pub type ThisChainRuntimeCall = RuntimeCall;
|
|
/// Runtime call origin at `ThisChain`.
|
|
pub type ThisChainCallOrigin = RuntimeOrigin;
|
|
/// Header of `ThisChain`.
|
|
pub type ThisChainHeader = sp_runtime::generic::Header<ThisChainBlockNumber, ThisChainHasher>;
|
|
/// Block of `ThisChain`.
|
|
pub type ThisChainBlock = frame_system::mocking::MockBlockU32<TestRuntime>;
|
|
|
|
/// Account identifier at the `BridgedChain`.
|
|
pub type BridgedChainAccountId = u128;
|
|
/// Balance at the `BridgedChain`.
|
|
pub type BridgedChainBalance = u128;
|
|
/// Block number at the `BridgedChain`.
|
|
pub type BridgedChainBlockNumber = u32;
|
|
/// Hash at the `BridgedChain`.
|
|
pub type BridgedChainHash = H256;
|
|
/// Hasher at the `BridgedChain`.
|
|
pub type BridgedChainHasher = BlakeTwo256;
|
|
/// Header of the `BridgedChain`.
|
|
pub type BridgedChainHeader =
|
|
sp_runtime::generic::Header<BridgedChainBlockNumber, BridgedChainHasher>;
|
|
|
|
/// Rewards payment procedure.
|
|
pub type TestPaymentProcedure = PayRewardFromAccount<Balances, ThisChainAccountId>;
|
|
/// Stake that we are using in tests.
|
|
pub type TestStake = ConstU64<5_000>;
|
|
/// Stake and slash mechanism to use in tests.
|
|
pub type TestStakeAndSlash = pallet_bridge_relayers::StakeAndSlashNamed<
|
|
ThisChainAccountId,
|
|
ThisChainBlockNumber,
|
|
Balances,
|
|
ReserveId,
|
|
TestStake,
|
|
ConstU32<8>,
|
|
>;
|
|
|
|
/// Message lane used in tests.
|
|
pub const TEST_LANE_ID: LaneId = LaneId([0, 0, 0, 0]);
|
|
/// Bridged chain id used in tests.
|
|
pub const TEST_BRIDGED_CHAIN_ID: ChainId = *b"brdg";
|
|
/// Maximal extrinsic weight at the `BridgedChain`.
|
|
pub const BRIDGED_CHAIN_MAX_EXTRINSIC_WEIGHT: usize = 2048;
|
|
/// Maximal extrinsic size at the `BridgedChain`.
|
|
pub const BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE: u32 = 1024;
|
|
|
|
frame_support::construct_runtime! {
|
|
pub enum TestRuntime
|
|
{
|
|
System: frame_system::{Pallet, Call, Config<T>, Storage, Event<T>},
|
|
Utility: pallet_utility,
|
|
Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>},
|
|
TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event<T>},
|
|
BridgeRelayers: pallet_bridge_relayers::{Pallet, Call, Storage, Event<T>},
|
|
BridgeGrandpa: pallet_bridge_grandpa::{Pallet, Call, Storage, Event<T>},
|
|
BridgeParachains: pallet_bridge_parachains::{Pallet, Call, Storage, Event<T>},
|
|
BridgeMessages: pallet_bridge_messages::{Pallet, Call, Storage, Event<T>, Config<T>},
|
|
}
|
|
}
|
|
|
|
crate::generate_bridge_reject_obsolete_headers_and_messages! {
|
|
ThisChainRuntimeCall, ThisChainAccountId,
|
|
BridgeGrandpa, BridgeParachains, BridgeMessages
|
|
}
|
|
|
|
parameter_types! {
|
|
pub const ActiveOutboundLanes: &'static [LaneId] = &[TEST_LANE_ID];
|
|
pub const BridgedChainId: ChainId = TEST_BRIDGED_CHAIN_ID;
|
|
pub const BridgedParasPalletName: &'static str = "Paras";
|
|
pub const ExistentialDeposit: ThisChainBalance = 500;
|
|
pub const DbWeight: RuntimeDbWeight = RuntimeDbWeight { read: 1, write: 2 };
|
|
pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25);
|
|
pub const TransactionBaseFee: ThisChainBalance = 0;
|
|
pub const TransactionByteFee: ThisChainBalance = 1;
|
|
pub AdjustmentVariable: Multiplier = Multiplier::saturating_from_rational(3, 100_000);
|
|
pub MinimumMultiplier: Multiplier = Multiplier::saturating_from_rational(1, 1_000_000u128);
|
|
pub MaximumMultiplier: Multiplier = sp_runtime::traits::Bounded::max_value();
|
|
pub const MaxUnrewardedRelayerEntriesAtInboundLane: MessageNonce = 16;
|
|
pub const MaxUnconfirmedMessagesAtInboundLane: MessageNonce = 1_000;
|
|
pub const ReserveId: [u8; 8] = *b"brdgrlrs";
|
|
}
|
|
|
|
#[derive_impl(frame_system::config_preludes::TestDefaultConfig)]
|
|
impl frame_system::Config for TestRuntime {
|
|
type Hash = ThisChainHash;
|
|
type Hashing = ThisChainHasher;
|
|
type AccountId = ThisChainAccountId;
|
|
type Block = ThisChainBlock;
|
|
type AccountData = pallet_balances::AccountData<ThisChainBalance>;
|
|
type BlockHashCount = ConstU32<250>;
|
|
}
|
|
|
|
impl pallet_utility::Config for TestRuntime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type RuntimeCall = RuntimeCall;
|
|
type PalletsOrigin = OriginCaller;
|
|
type WeightInfo = ();
|
|
}
|
|
|
|
#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)]
|
|
impl pallet_balances::Config for TestRuntime {
|
|
type ReserveIdentifier = [u8; 8];
|
|
type AccountStore = System;
|
|
}
|
|
|
|
#[derive_impl(pallet_transaction_payment::config_preludes::TestDefaultConfig)]
|
|
impl pallet_transaction_payment::Config for TestRuntime {
|
|
type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter<Balances, ()>;
|
|
type OperationalFeeMultiplier = ConstU8<5>;
|
|
type WeightToFee = IdentityFee<ThisChainBalance>;
|
|
type LengthToFee = ConstantMultiplier<ThisChainBalance, TransactionByteFee>;
|
|
type FeeMultiplierUpdate = pallet_transaction_payment::TargetedFeeAdjustment<
|
|
TestRuntime,
|
|
TargetBlockFullness,
|
|
AdjustmentVariable,
|
|
MinimumMultiplier,
|
|
MaximumMultiplier,
|
|
>;
|
|
type RuntimeEvent = RuntimeEvent;
|
|
}
|
|
|
|
impl pallet_bridge_grandpa::Config for TestRuntime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type BridgedChain = BridgedUnderlyingChain;
|
|
type MaxFreeMandatoryHeadersPerBlock = ConstU32<4>;
|
|
type HeadersToKeep = ConstU32<8>;
|
|
type WeightInfo = pallet_bridge_grandpa::weights::BridgeWeight<TestRuntime>;
|
|
}
|
|
|
|
impl pallet_bridge_parachains::Config for TestRuntime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type BridgesGrandpaPalletInstance = ();
|
|
type ParasPalletName = BridgedParasPalletName;
|
|
type ParaStoredHeaderDataBuilder =
|
|
SingleParaStoredHeaderDataBuilder<BridgedUnderlyingParachain>;
|
|
type HeadsToKeep = ConstU32<8>;
|
|
type MaxParaHeadDataSize = ConstU32<1024>;
|
|
type WeightInfo = pallet_bridge_parachains::weights::BridgeWeight<TestRuntime>;
|
|
}
|
|
|
|
impl pallet_bridge_messages::Config for TestRuntime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type WeightInfo = pallet_bridge_messages::weights::BridgeWeight<TestRuntime>;
|
|
type ActiveOutboundLanes = ActiveOutboundLanes;
|
|
type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane;
|
|
type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane;
|
|
|
|
type MaximalOutboundPayloadSize = FromThisChainMaximalOutboundPayloadSize<OnThisChainBridge>;
|
|
type OutboundPayload = FromThisChainMessagePayload;
|
|
|
|
type InboundPayload = FromBridgedChainMessagePayload;
|
|
type InboundRelayer = BridgedChainAccountId;
|
|
type DeliveryPayments = ();
|
|
|
|
type TargetHeaderChain = TargetHeaderChainAdapter<OnThisChainBridge>;
|
|
type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter<
|
|
TestRuntime,
|
|
(),
|
|
ConstU64<100_000>,
|
|
>;
|
|
type OnMessagesDelivered = ();
|
|
|
|
type SourceHeaderChain = SourceHeaderChainAdapter<OnThisChainBridge>;
|
|
type MessageDispatch = DummyMessageDispatch;
|
|
type BridgedChainId = BridgedChainId;
|
|
}
|
|
|
|
impl pallet_bridge_relayers::Config for TestRuntime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type Reward = ThisChainBalance;
|
|
type PaymentProcedure = TestPaymentProcedure;
|
|
type StakeAndSlash = TestStakeAndSlash;
|
|
type WeightInfo = ();
|
|
}
|
|
|
|
/// Dummy message dispatcher.
|
|
pub struct DummyMessageDispatch;
|
|
|
|
impl DummyMessageDispatch {
|
|
pub fn deactivate() {
|
|
frame_support::storage::unhashed::put(&b"inactive"[..], &false);
|
|
}
|
|
}
|
|
|
|
impl MessageDispatch for DummyMessageDispatch {
|
|
type DispatchPayload = Vec<u8>;
|
|
type DispatchLevelResult = ();
|
|
|
|
fn is_active() -> bool {
|
|
frame_support::storage::unhashed::take::<bool>(&b"inactive"[..]) != Some(false)
|
|
}
|
|
|
|
fn dispatch_weight(_message: &mut DispatchMessage<Self::DispatchPayload>) -> Weight {
|
|
Weight::zero()
|
|
}
|
|
|
|
fn dispatch(
|
|
_: DispatchMessage<Self::DispatchPayload>,
|
|
) -> MessageDispatchResult<Self::DispatchLevelResult> {
|
|
MessageDispatchResult { unspent_weight: Weight::zero(), dispatch_level_result: () }
|
|
}
|
|
}
|
|
|
|
/// Bridge that is deployed on `ThisChain` and allows sending/receiving messages to/from
|
|
/// `BridgedChain`.
|
|
#[derive(Debug, PartialEq, Eq)]
|
|
pub struct OnThisChainBridge;
|
|
|
|
impl MessageBridge for OnThisChainBridge {
|
|
const BRIDGED_MESSAGES_PALLET_NAME: &'static str = "";
|
|
|
|
type ThisChain = ThisChain;
|
|
type BridgedChain = BridgedChain;
|
|
type BridgedHeaderChain = pallet_bridge_grandpa::GrandpaChainHeaders<TestRuntime, ()>;
|
|
}
|
|
|
|
/// Bridge that is deployed on `BridgedChain` and allows sending/receiving messages to/from
|
|
/// `ThisChain`.
|
|
#[derive(Debug, PartialEq, Eq)]
|
|
pub struct OnBridgedChainBridge;
|
|
|
|
impl MessageBridge for OnBridgedChainBridge {
|
|
const BRIDGED_MESSAGES_PALLET_NAME: &'static str = "";
|
|
|
|
type ThisChain = BridgedChain;
|
|
type BridgedChain = ThisChain;
|
|
type BridgedHeaderChain = ThisHeaderChain;
|
|
}
|
|
|
|
/// Dummy implementation of `HeaderChain` for `ThisChain` at the `BridgedChain`.
|
|
pub struct ThisHeaderChain;
|
|
|
|
impl HeaderChain<ThisUnderlyingChain> for ThisHeaderChain {
|
|
fn finalized_header_state_root(_hash: HashOf<ThisChain>) -> Option<HashOf<ThisChain>> {
|
|
unreachable!()
|
|
}
|
|
}
|
|
|
|
/// Call origin at `BridgedChain`.
|
|
#[derive(Clone, Debug)]
|
|
pub struct BridgedChainOrigin;
|
|
|
|
impl From<BridgedChainOrigin>
|
|
for Result<frame_system::RawOrigin<BridgedChainAccountId>, BridgedChainOrigin>
|
|
{
|
|
fn from(
|
|
_origin: BridgedChainOrigin,
|
|
) -> Result<frame_system::RawOrigin<BridgedChainAccountId>, BridgedChainOrigin> {
|
|
unreachable!()
|
|
}
|
|
}
|
|
|
|
/// Underlying chain of `ThisChain`.
|
|
pub struct ThisUnderlyingChain;
|
|
|
|
impl Chain for ThisUnderlyingChain {
|
|
const ID: ChainId = *b"tuch";
|
|
|
|
type BlockNumber = ThisChainBlockNumber;
|
|
type Hash = ThisChainHash;
|
|
type Hasher = ThisChainHasher;
|
|
type Header = ThisChainHeader;
|
|
type AccountId = ThisChainAccountId;
|
|
type Balance = ThisChainBalance;
|
|
type Nonce = u32;
|
|
type Signature = sp_runtime::MultiSignature;
|
|
|
|
fn max_extrinsic_size() -> u32 {
|
|
BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE
|
|
}
|
|
|
|
fn max_extrinsic_weight() -> Weight {
|
|
Weight::zero()
|
|
}
|
|
}
|
|
|
|
/// The chain where we are in tests.
|
|
pub struct ThisChain;
|
|
|
|
impl UnderlyingChainProvider for ThisChain {
|
|
type Chain = ThisUnderlyingChain;
|
|
}
|
|
|
|
impl ThisChainWithMessages for ThisChain {
|
|
type RuntimeOrigin = ThisChainCallOrigin;
|
|
}
|
|
|
|
impl BridgedChainWithMessages for ThisChain {}
|
|
|
|
/// Underlying chain of `BridgedChain`.
|
|
pub struct BridgedUnderlyingChain;
|
|
/// Some parachain under `BridgedChain` consensus.
|
|
pub struct BridgedUnderlyingParachain;
|
|
/// Runtime call of the `BridgedChain`.
|
|
#[derive(Decode, Encode)]
|
|
pub struct BridgedChainCall;
|
|
|
|
impl Chain for BridgedUnderlyingChain {
|
|
const ID: ChainId = *b"buch";
|
|
|
|
type BlockNumber = BridgedChainBlockNumber;
|
|
type Hash = BridgedChainHash;
|
|
type Hasher = BridgedChainHasher;
|
|
type Header = BridgedChainHeader;
|
|
type AccountId = BridgedChainAccountId;
|
|
type Balance = BridgedChainBalance;
|
|
type Nonce = u32;
|
|
type Signature = sp_runtime::MultiSignature;
|
|
|
|
fn max_extrinsic_size() -> u32 {
|
|
BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE
|
|
}
|
|
fn max_extrinsic_weight() -> Weight {
|
|
Weight::zero()
|
|
}
|
|
}
|
|
|
|
impl ChainWithGrandpa for BridgedUnderlyingChain {
|
|
const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = "";
|
|
const MAX_AUTHORITIES_COUNT: u32 = 16;
|
|
const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8;
|
|
const MAX_MANDATORY_HEADER_SIZE: u32 = 256;
|
|
const AVERAGE_HEADER_SIZE: u32 = 64;
|
|
}
|
|
|
|
impl Chain for BridgedUnderlyingParachain {
|
|
const ID: ChainId = *b"bupc";
|
|
|
|
type BlockNumber = BridgedChainBlockNumber;
|
|
type Hash = BridgedChainHash;
|
|
type Hasher = BridgedChainHasher;
|
|
type Header = BridgedChainHeader;
|
|
type AccountId = BridgedChainAccountId;
|
|
type Balance = BridgedChainBalance;
|
|
type Nonce = u32;
|
|
type Signature = sp_runtime::MultiSignature;
|
|
|
|
fn max_extrinsic_size() -> u32 {
|
|
BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE
|
|
}
|
|
fn max_extrinsic_weight() -> Weight {
|
|
Weight::zero()
|
|
}
|
|
}
|
|
|
|
impl Parachain for BridgedUnderlyingParachain {
|
|
const PARACHAIN_ID: u32 = 42;
|
|
}
|
|
|
|
/// The other, bridged chain, used in tests.
|
|
pub struct BridgedChain;
|
|
|
|
impl UnderlyingChainProvider for BridgedChain {
|
|
type Chain = BridgedUnderlyingChain;
|
|
}
|
|
|
|
impl ThisChainWithMessages for BridgedChain {
|
|
type RuntimeOrigin = BridgedChainOrigin;
|
|
}
|
|
|
|
impl BridgedChainWithMessages for BridgedChain {}
|
|
|
|
/// Run test within test externalities.
|
|
pub fn run_test(test: impl FnOnce()) {
|
|
sp_io::TestExternalities::new(Default::default()).execute_with(test)
|
|
}
|