difftreelog
test(xcm) add transact barrier test
in: master
6 files changed
runtime/common/mod.rsdiffbeforeafterboth1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617pub mod config;18pub mod construct_runtime;19pub mod dispatch;20pub mod ethereum;21pub mod instance;22pub mod runtime_apis;23pub mod scheduler;24pub mod sponsoring;25pub mod weights;2627use sp_core::H160;28use frame_support::traits::{Currency, OnUnbalanced, Imbalance};29use sp_runtime::{30 generic,31 traits::{BlakeTwo256, BlockNumberProvider},32 impl_opaque_keys,33};34use sp_std::vec::Vec;3536#[cfg(feature = "std")]37use sp_version::NativeVersion;3839use crate::{40 Runtime, Call, Balances, Treasury, Aura, Signature, AllPalletsReversedWithSystemFirst,41 InherentDataExt,42};43use up_common::types::{AccountId, BlockNumber};4445#[macro_export]46macro_rules! unsupported {47 () => {48 pallet_common::unsupported!($crate::Runtime)49 };50}5152/// The address format for describing accounts.53pub type Address = sp_runtime::MultiAddress<AccountId, ()>;54/// Block header type as expected by this runtime.55pub type Header = generic::Header<BlockNumber, BlakeTwo256>;56/// Block type as expected by this runtime.57pub type Block = generic::Block<Header, UncheckedExtrinsic>;58/// A Block signed with a Justification59pub type SignedBlock = generic::SignedBlock<Block>;60/// BlockId type as expected by this runtime.61pub type BlockId = generic::BlockId<Block>;6263impl_opaque_keys! {64 pub struct SessionKeys {65 pub aura: Aura,66 }67}6869/// The version information used to identify this runtime when compiled natively.70#[cfg(feature = "std")]71pub fn native_version() -> NativeVersion {72 NativeVersion {73 runtime_version: crate::VERSION,74 can_author_with: Default::default(),75 }76}7778pub type ChargeTransactionPayment = pallet_charge_transaction::ChargeTransactionPayment<Runtime>;7980pub type SignedExtra = (81 frame_system::CheckSpecVersion<Runtime>,82 // system::CheckTxVersion<Runtime>,83 frame_system::CheckGenesis<Runtime>,84 frame_system::CheckEra<Runtime>,85 frame_system::CheckNonce<Runtime>,86 frame_system::CheckWeight<Runtime>,87 ChargeTransactionPayment,88 //pallet_contract_helpers::ContractHelpersExtension<Runtime>,89 pallet_ethereum::FakeTransactionFinalizer<Runtime>,90);9192/// Unchecked extrinsic type as expected by this runtime.93pub type UncheckedExtrinsic =94 fp_self_contained::UncheckedExtrinsic<Address, Call, Signature, SignedExtra>;9596/// Extrinsic type that has already been checked.97pub type CheckedExtrinsic = fp_self_contained::CheckedExtrinsic<AccountId, Call, SignedExtra, H160>;9899/// Executive: handles dispatch to the various modules.100pub type Executive = frame_executive::Executive<101 Runtime,102 Block,103 frame_system::ChainContext<Runtime>,104 Runtime,105 AllPalletsReversedWithSystemFirst,106>;107108type NegativeImbalance = <Balances as Currency<AccountId>>::NegativeImbalance;109110pub struct DealWithFees;111impl OnUnbalanced<NegativeImbalance> for DealWithFees {112 fn on_unbalanceds<B>(mut fees_then_tips: impl Iterator<Item = NegativeImbalance>) {113 if let Some(fees) = fees_then_tips.next() {114 // for fees, 100% to treasury115 let mut split = fees.ration(100, 0);116 if let Some(tips) = fees_then_tips.next() {117 // for tips, if any, 100% to treasury118 tips.ration_merge_into(100, 0, &mut split);119 }120 Treasury::on_unbalanced(split.0);121 // Author::on_unbalanced(split.1);122 }123 }124}125126pub struct RelayChainBlockNumberProvider<T>(sp_std::marker::PhantomData<T>);127128impl<T: cumulus_pallet_parachain_system::Config> BlockNumberProvider129 for RelayChainBlockNumberProvider<T>130{131 type BlockNumber = BlockNumber;132133 fn current_block_number() -> Self::BlockNumber {134 cumulus_pallet_parachain_system::Pallet::<T>::validation_data()135 .map(|d| d.relay_parent_number)136 .unwrap_or_default()137 }138}139140pub(crate) struct CheckInherents;141142impl cumulus_pallet_parachain_system::CheckInherents<Block> for CheckInherents {143 fn check_inherents(144 block: &Block,145 relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof,146 ) -> sp_inherents::CheckInherentsResult {147 let relay_chain_slot = relay_state_proof148 .read_slot()149 .expect("Could not read the relay chain slot from the proof");150151 let inherent_data =152 cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration(153 relay_chain_slot,154 sp_std::time::Duration::from_secs(6),155 )156 .create_inherent_data()157 .expect("Could not create the timestamp inherent data");158159 inherent_data.check_extrinsics(block)160 }161}162163#[derive(codec::Encode, codec::Decode)]164pub enum XCMPMessage<XAccountId, XBalance> {165 /// Transfer tokens to the given account from the Parachain account.166 TransferToken(XAccountId, XBalance),167}1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617pub mod config;18pub mod construct_runtime;19pub mod dispatch;20pub mod ethereum;21pub mod instance;22pub mod runtime_apis;23pub mod scheduler;24pub mod sponsoring;25pub mod weights;2627#[cfg(test)]28mod tests;2930use sp_core::H160;31use frame_support::traits::{Currency, OnUnbalanced, Imbalance};32use sp_runtime::{33 generic,34 traits::{BlakeTwo256, BlockNumberProvider},35 impl_opaque_keys,36};37use sp_std::vec::Vec;3839#[cfg(feature = "std")]40use sp_version::NativeVersion;4142use crate::{43 Runtime, Call, Balances, Treasury, Aura, Signature, AllPalletsReversedWithSystemFirst,44 InherentDataExt,45};46use up_common::types::{AccountId, BlockNumber};4748#[macro_export]49macro_rules! unsupported {50 () => {51 pallet_common::unsupported!($crate::Runtime)52 };53}5455/// The address format for describing accounts.56pub type Address = sp_runtime::MultiAddress<AccountId, ()>;57/// Block header type as expected by this runtime.58pub type Header = generic::Header<BlockNumber, BlakeTwo256>;59/// Block type as expected by this runtime.60pub type Block = generic::Block<Header, UncheckedExtrinsic>;61/// A Block signed with a Justification62pub type SignedBlock = generic::SignedBlock<Block>;63/// BlockId type as expected by this runtime.64pub type BlockId = generic::BlockId<Block>;6566impl_opaque_keys! {67 pub struct SessionKeys {68 pub aura: Aura,69 }70}7172/// The version information used to identify this runtime when compiled natively.73#[cfg(feature = "std")]74pub fn native_version() -> NativeVersion {75 NativeVersion {76 runtime_version: crate::VERSION,77 can_author_with: Default::default(),78 }79}8081pub type ChargeTransactionPayment = pallet_charge_transaction::ChargeTransactionPayment<Runtime>;8283pub type SignedExtra = (84 frame_system::CheckSpecVersion<Runtime>,85 // system::CheckTxVersion<Runtime>,86 frame_system::CheckGenesis<Runtime>,87 frame_system::CheckEra<Runtime>,88 frame_system::CheckNonce<Runtime>,89 frame_system::CheckWeight<Runtime>,90 ChargeTransactionPayment,91 //pallet_contract_helpers::ContractHelpersExtension<Runtime>,92 pallet_ethereum::FakeTransactionFinalizer<Runtime>,93);9495/// Unchecked extrinsic type as expected by this runtime.96pub type UncheckedExtrinsic =97 fp_self_contained::UncheckedExtrinsic<Address, Call, Signature, SignedExtra>;9899/// Extrinsic type that has already been checked.100pub type CheckedExtrinsic = fp_self_contained::CheckedExtrinsic<AccountId, Call, SignedExtra, H160>;101102/// Executive: handles dispatch to the various modules.103pub type Executive = frame_executive::Executive<104 Runtime,105 Block,106 frame_system::ChainContext<Runtime>,107 Runtime,108 AllPalletsReversedWithSystemFirst,109>;110111type NegativeImbalance = <Balances as Currency<AccountId>>::NegativeImbalance;112113pub struct DealWithFees;114impl OnUnbalanced<NegativeImbalance> for DealWithFees {115 fn on_unbalanceds<B>(mut fees_then_tips: impl Iterator<Item = NegativeImbalance>) {116 if let Some(fees) = fees_then_tips.next() {117 // for fees, 100% to treasury118 let mut split = fees.ration(100, 0);119 if let Some(tips) = fees_then_tips.next() {120 // for tips, if any, 100% to treasury121 tips.ration_merge_into(100, 0, &mut split);122 }123 Treasury::on_unbalanced(split.0);124 // Author::on_unbalanced(split.1);125 }126 }127}128129pub struct RelayChainBlockNumberProvider<T>(sp_std::marker::PhantomData<T>);130131impl<T: cumulus_pallet_parachain_system::Config> BlockNumberProvider132 for RelayChainBlockNumberProvider<T>133{134 type BlockNumber = BlockNumber;135136 fn current_block_number() -> Self::BlockNumber {137 cumulus_pallet_parachain_system::Pallet::<T>::validation_data()138 .map(|d| d.relay_parent_number)139 .unwrap_or_default()140 }141}142143pub(crate) struct CheckInherents;144145impl cumulus_pallet_parachain_system::CheckInherents<Block> for CheckInherents {146 fn check_inherents(147 block: &Block,148 relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof,149 ) -> sp_inherents::CheckInherentsResult {150 let relay_chain_slot = relay_state_proof151 .read_slot()152 .expect("Could not read the relay chain slot from the proof");153154 let inherent_data =155 cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration(156 relay_chain_slot,157 sp_std::time::Duration::from_secs(6),158 )159 .create_inherent_data()160 .expect("Could not create the timestamp inherent data");161162 inherent_data.check_extrinsics(block)163 }164}165166#[derive(codec::Encode, codec::Decode)]167pub enum XCMPMessage<XAccountId, XBalance> {168 /// Transfer tokens to the given account from the Parachain account.169 TransferToken(XAccountId, XBalance),170}runtime/common/tests/mod.rsdiffbeforeafterboth--- /dev/null
+++ b/runtime/common/tests/mod.rs
@@ -0,0 +1,17 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network 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.
+
+// Unique Network 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 Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+mod xcm;
runtime/common/tests/xcm.rsdiffbeforeafterboth--- /dev/null
+++ b/runtime/common/tests/xcm.rs
@@ -0,0 +1,86 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network 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.
+
+// Unique Network 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 Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+use xcm_executor::traits::ShouldExecute;
+use xcm::latest::prelude::*;
+use logtest::Logger;
+use crate::{
+ Call,
+ xcm_config::Barrier,
+};
+
+fn catch_xcm_barrier_log(logger: &mut Logger, expected_msg: &str) {
+ for record in logger {
+ if record.target() == "xcm::barrier"
+ && record.args() == expected_msg {
+ return;
+ }
+ }
+
+ panic!("the expected XCM barrier log `{}` is not found", expected_msg);
+}
+
+#[test]
+fn xcm_barrier_does_not_allow_transact() {
+ // We have a `AllowTopLevelPaidExecutionFrom` barrier,
+ // so an XCM program should start from one of the following commands:
+ // * `WithdrawAsset`
+ // * `ReceiveTeleportedAsset`
+ // * `ReserveAssetDeposited`
+ // * `ClaimAsset`
+ // We use the `WithdrawAsset` in this test
+
+ let location = MultiLocation {
+ parents: 0,
+ interior: Junctions::Here,
+ };
+
+ // let id = AssetId::Concrete(location.clone());
+ // let fun = Fungibility::Fungible(42);
+ // let multiasset = MultiAsset {
+ // id,
+ // fun,
+ // };
+ // let withdraw_inst = WithdrawAsset(multiasset.into());
+
+ // We will never decode this "call",
+ // so it is irrelevant what we are passing to the `transact` cmd.
+ let fake_encoded_call = vec![0u8];
+
+ let transact_inst = Transact {
+ origin_type: OriginKind::Superuser,
+ require_weight_at_most: 0,
+ call: fake_encoded_call.into(),
+ };
+
+ let mut xcm_program = Xcm::<Call>(vec![transact_inst]);
+
+ let mut logger = Logger::start();
+
+ let max_weight = 100_000;
+ let mut weight_credit = 0;
+
+ let result = Barrier::should_execute(
+ &location,
+ &mut xcm_program,
+ max_weight,
+ &mut weight_credit
+ );
+
+ assert!(result.is_err(), "the barrier should disallow the XCM transact cmd");
+
+ catch_xcm_barrier_log(&mut logger, "transact XCM rejected");
+}
runtime/opal/Cargo.tomldiffbeforeafterboth--- a/runtime/opal/Cargo.toml
+++ b/runtime/opal/Cargo.toml
@@ -463,6 +463,12 @@
pallet-foreing-assets = { default-features = false, path = "../../pallets/foreing-assets" }
################################################################################
+# Dev Dependencies
+
+[dev-dependencies.logtest]
+version = "2.0.0"
+
+################################################################################
# Build Dependencies
[build-dependencies.substrate-wasm-builder]
runtime/quartz/Cargo.tomldiffbeforeafterboth--- a/runtime/quartz/Cargo.toml
+++ b/runtime/quartz/Cargo.toml
@@ -471,6 +471,12 @@
pallet-foreing-assets = { default-features = false, path = "../../pallets/foreing-assets" }
################################################################################
+# Dev Dependencies
+
+[dev-dependencies.logtest]
+version = "2.0.0"
+
+################################################################################
# Build Dependencies
[build-dependencies.substrate-wasm-builder]
runtime/unique/Cargo.tomldiffbeforeafterboth--- a/runtime/unique/Cargo.toml
+++ b/runtime/unique/Cargo.toml
@@ -463,6 +463,12 @@
pallet-foreing-assets = { default-features = false, path = "../../pallets/foreing-assets" }
################################################################################
+# Dev Dependencies
+
+[dev-dependencies.logtest]
+version = "2.0.0"
+
+################################################################################
# Build Dependencies
[build-dependencies.substrate-wasm-builder]