mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-05 20:17:24 +00:00
50eb12cf2f
Moved from: https://github.com/paritytech/polkadot/pull/6951 closes https://github.com/paritytech/polkadot-sdk/issues/490 - [x] update cumulus --- This PR introduces transactional processing of certain xcm instructions. For the list of instructions checkout https://github.com/paritytech/polkadot-sdk/issues/490. The transactional processing is implemented as an xcm-executor config item. The two implementations in this PR are `FrameTransactionalProcessor` and `()`. The `()` implementation does no transactional processing. Each implementation of the `ProcessTransaction` trait has an `IS_TRANSACTIONAL` const that tells the XCVM if transactional processing is actually implemented. If Transactional processing is implemented, changes to touched registers should also be rolled back to prevent inconsistencies. Note for reviewers: Check out the following safety assumption: https://github.com/paritytech/polkadot-sdk/pull/1222/files#diff-4effad7d8c1c9de19fd27e18661cbf2128c8718f3b2420a27d2f816e0749ea53R30 --------- Co-authored-by: Keith Yeung <kungfukeith11@gmail.com> Co-authored-by: Francisco Aguirre <franciscoaguirreperez@gmail.com> Co-authored-by: command-bot <>
155 lines
5.2 KiB
Rust
155 lines
5.2 KiB
Rust
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// This file is part of Polkadot.
|
|
|
|
// Polkadot 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.
|
|
|
|
// Polkadot 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 Polkadot. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
use frame_support::{
|
|
parameter_types,
|
|
traits::{Everything, Nothing},
|
|
weights::Weight,
|
|
};
|
|
use frame_system::EnsureRoot;
|
|
use xcm::latest::prelude::*;
|
|
use xcm_builder::{
|
|
AllowUnpaidExecutionFrom, EnsureXcmOrigin, FixedWeightBounds, FrameTransactionalProcessor,
|
|
SignedAccountId32AsNative, SignedToAccountId32,
|
|
};
|
|
use xcm_executor::{
|
|
traits::{TransactAsset, WeightTrader},
|
|
AssetsInHolding,
|
|
};
|
|
|
|
parameter_types! {
|
|
pub const BaseXcmWeight: xcm::latest::Weight = Weight::from_parts(1_000, 1_000);
|
|
pub const AnyNetwork: Option<NetworkId> = None;
|
|
pub const MaxInstructions: u32 = 100;
|
|
pub const MaxAssetsIntoHolding: u32 = 16;
|
|
pub const UniversalLocation: xcm::latest::InteriorLocation = xcm::latest::Junctions::Here;
|
|
}
|
|
|
|
/// Type to convert an `Origin` type value into a `Location` value which represents an interior
|
|
/// location of this chain.
|
|
pub type LocalOriginToLocation = (
|
|
// And a usual Signed origin to be used in XCM as a corresponding AccountId32
|
|
SignedToAccountId32<crate::RuntimeOrigin, crate::AccountId, AnyNetwork>,
|
|
);
|
|
|
|
pub struct DoNothingRouter;
|
|
impl SendXcm for DoNothingRouter {
|
|
type Ticket = ();
|
|
fn validate(_dest: &mut Option<Location>, _msg: &mut Option<Xcm<()>>) -> SendResult<()> {
|
|
Ok(((), Assets::new()))
|
|
}
|
|
fn deliver(_: ()) -> Result<XcmHash, SendError> {
|
|
Ok([0; 32])
|
|
}
|
|
}
|
|
|
|
pub type Barrier = AllowUnpaidExecutionFrom<Everything>;
|
|
|
|
pub struct DummyAssetTransactor;
|
|
impl TransactAsset for DummyAssetTransactor {
|
|
fn deposit_asset(_what: &Asset, _who: &Location, _context: Option<&XcmContext>) -> XcmResult {
|
|
Ok(())
|
|
}
|
|
|
|
fn withdraw_asset(
|
|
_what: &Asset,
|
|
_who: &Location,
|
|
_maybe_context: Option<&XcmContext>,
|
|
) -> Result<AssetsInHolding, XcmError> {
|
|
let asset: Asset = (Parent, 100_000).into();
|
|
Ok(asset.into())
|
|
}
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct DummyWeightTrader;
|
|
impl WeightTrader for DummyWeightTrader {
|
|
fn new() -> Self {
|
|
DummyWeightTrader
|
|
}
|
|
|
|
fn buy_weight(
|
|
&mut self,
|
|
_weight: Weight,
|
|
_payment: AssetsInHolding,
|
|
_context: &XcmContext,
|
|
) -> Result<AssetsInHolding, XcmError> {
|
|
Ok(AssetsInHolding::default())
|
|
}
|
|
}
|
|
|
|
type OriginConverter = (
|
|
pallet_xcm::XcmPassthrough<super::RuntimeOrigin>,
|
|
SignedAccountId32AsNative<AnyNetwork, super::RuntimeOrigin>,
|
|
);
|
|
|
|
pub struct XcmConfig;
|
|
impl xcm_executor::Config for XcmConfig {
|
|
type RuntimeCall = super::RuntimeCall;
|
|
type XcmSender = DoNothingRouter;
|
|
type AssetTransactor = DummyAssetTransactor;
|
|
type OriginConverter = OriginConverter;
|
|
type IsReserve = ();
|
|
type IsTeleporter = ();
|
|
type UniversalLocation = UniversalLocation;
|
|
type Barrier = Barrier;
|
|
type Weigher = FixedWeightBounds<BaseXcmWeight, super::RuntimeCall, MaxInstructions>;
|
|
type Trader = DummyWeightTrader;
|
|
type ResponseHandler = super::Xcm;
|
|
type AssetTrap = super::Xcm;
|
|
type AssetLocker = ();
|
|
type AssetExchanger = ();
|
|
type AssetClaims = super::Xcm;
|
|
type SubscriptionService = super::Xcm;
|
|
type PalletInstancesInfo = ();
|
|
type MaxAssetsIntoHolding = MaxAssetsIntoHolding;
|
|
type FeeManager = ();
|
|
type MessageExporter = ();
|
|
type UniversalAliases = Nothing;
|
|
type CallDispatcher = super::RuntimeCall;
|
|
type SafeCallFilter = Everything;
|
|
type Aliasers = Nothing;
|
|
type TransactionalProcessor = FrameTransactionalProcessor;
|
|
}
|
|
|
|
impl pallet_xcm::Config for crate::Runtime {
|
|
// The config types here are entirely configurable, since the only one that is sorely needed
|
|
// is `XcmExecutor`, which will be used in unit tests located in xcm-executor.
|
|
type RuntimeEvent = crate::RuntimeEvent;
|
|
type ExecuteXcmOrigin = EnsureXcmOrigin<crate::RuntimeOrigin, LocalOriginToLocation>;
|
|
type UniversalLocation = UniversalLocation;
|
|
type SendXcmOrigin = EnsureXcmOrigin<crate::RuntimeOrigin, LocalOriginToLocation>;
|
|
type Weigher = FixedWeightBounds<BaseXcmWeight, crate::RuntimeCall, MaxInstructions>;
|
|
type XcmRouter = DoNothingRouter;
|
|
type XcmExecuteFilter = Everything;
|
|
type XcmExecutor = xcm_executor::XcmExecutor<XcmConfig>;
|
|
type XcmTeleportFilter = Everything;
|
|
type XcmReserveTransferFilter = Everything;
|
|
type RuntimeOrigin = crate::RuntimeOrigin;
|
|
type RuntimeCall = crate::RuntimeCall;
|
|
const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100;
|
|
type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion;
|
|
type Currency = crate::Balances;
|
|
type CurrencyMatcher = ();
|
|
type TrustedLockers = ();
|
|
type SovereignAccountOf = ();
|
|
type MaxLockers = frame_support::traits::ConstU32<8>;
|
|
type MaxRemoteLockConsumers = frame_support::traits::ConstU32<0>;
|
|
type RemoteLockConsumerIdentifier = ();
|
|
type WeightInfo = pallet_xcm::TestWeightInfo;
|
|
type AdminOrigin = EnsureRoot<crate::AccountId>;
|
|
}
|