mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-31 16:51:02 +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 <>
341 lines
13 KiB
Rust
341 lines
13 KiB
Rust
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
use super::{
|
|
AccountId, AllPalletsWithSystem, Balances, ParachainInfo, ParachainSystem, PolkadotXcm,
|
|
Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue,
|
|
};
|
|
use crate::{TransactionByteFee, CENTS};
|
|
use frame_support::{
|
|
parameter_types,
|
|
traits::{ConstU32, Contains, Equals, Everything, Nothing},
|
|
};
|
|
use frame_system::EnsureRoot;
|
|
use pallet_xcm::XcmPassthrough;
|
|
use parachains_common::{
|
|
impls::ToStakingPot,
|
|
xcm_config::{
|
|
AllSiblingSystemParachains, ConcreteAssetFromSystem, RelayOrOtherSystemParachains,
|
|
},
|
|
TREASURY_PALLET_ID,
|
|
};
|
|
use polkadot_parachain_primitives::primitives::Sibling;
|
|
use sp_runtime::traits::AccountIdConversion;
|
|
use xcm::latest::prelude::*;
|
|
#[allow(deprecated)]
|
|
use xcm_builder::CurrencyAdapter;
|
|
use xcm_builder::{
|
|
AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses,
|
|
AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain,
|
|
DenyThenTry, DescribeTerminus, EnsureXcmOrigin, FrameTransactionalProcessor, HashedDescription,
|
|
IsConcrete, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative,
|
|
SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32,
|
|
SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents,
|
|
WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents,
|
|
XcmFeeToAccount,
|
|
};
|
|
use xcm_executor::{traits::WithOriginFilter, XcmExecutor};
|
|
|
|
parameter_types! {
|
|
pub const RootLocation: Location = Location::here();
|
|
pub const RelayLocation: Location = Location::parent();
|
|
pub const RelayNetwork: Option<NetworkId> = Some(NetworkId::Westend);
|
|
pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into();
|
|
pub UniversalLocation: InteriorLocation =
|
|
[GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())].into();
|
|
pub const MaxInstructions: u32 = 100;
|
|
pub const MaxAssetsIntoHolding: u32 = 64;
|
|
pub FellowshipLocation: Location = Location::new(1, Parachain(1001));
|
|
pub const GovernanceLocation: Location = Location::parent();
|
|
/// The asset ID for the asset that we use to pay for message delivery fees. Just WND.
|
|
pub FeeAssetId: AssetId = AssetId(RelayLocation::get());
|
|
/// The base fee for the message delivery fees.
|
|
pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3);
|
|
pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating();
|
|
pub RelayTreasuryLocation: Location =
|
|
(Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into();
|
|
}
|
|
|
|
pub type PriceForParentDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice<
|
|
FeeAssetId,
|
|
BaseDeliveryFee,
|
|
TransactionByteFee,
|
|
ParachainSystem,
|
|
>;
|
|
|
|
pub type PriceForSiblingParachainDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice<
|
|
FeeAssetId,
|
|
BaseDeliveryFee,
|
|
TransactionByteFee,
|
|
XcmpQueue,
|
|
>;
|
|
|
|
/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used
|
|
/// when determining ownership of accounts for asset transacting and when attempting to use XCM
|
|
/// `Transact` in order to determine the dispatch Origin.
|
|
pub type LocationToAccountId = (
|
|
// The parent (Relay-chain) origin converts to the parent `AccountId`.
|
|
ParentIsPreset<AccountId>,
|
|
// Sibling parachain origins convert to AccountId via the `ParaId::into`.
|
|
SiblingParachainConvertsVia<Sibling, AccountId>,
|
|
// Straight up local `AccountId32` origins just alias directly to `AccountId`.
|
|
AccountId32Aliases<RelayNetwork, AccountId>,
|
|
// Here/local root location to `AccountId`.
|
|
HashedDescription<AccountId, DescribeTerminus>,
|
|
);
|
|
|
|
/// Means for transacting the native currency on this chain.
|
|
#[allow(deprecated)]
|
|
pub type CurrencyTransactor = CurrencyAdapter<
|
|
// Use this currency:
|
|
Balances,
|
|
// Use this currency when it is a fungible asset matching the given location or name:
|
|
IsConcrete<RelayLocation>,
|
|
// Do a simple punn to convert an `AccountId32` `Location` into a native chain
|
|
// `AccountId`:
|
|
LocationToAccountId,
|
|
// Our chain's account ID type (we can't get away without mentioning it explicitly):
|
|
AccountId,
|
|
// We don't track any teleports of `Balances`.
|
|
(),
|
|
>;
|
|
|
|
/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance,
|
|
/// ready for dispatching a transaction with XCM's `Transact`. There is an `OriginKind` that can
|
|
/// bias the kind of local `Origin` it will become.
|
|
pub type XcmOriginToTransactDispatchOrigin = (
|
|
// Sovereign account converter; this attempts to derive an `AccountId` from the origin location
|
|
// using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for
|
|
// foreign chains who want to have a local sovereign account on this chain that they control.
|
|
SovereignSignedViaLocation<LocationToAccountId, RuntimeOrigin>,
|
|
// Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when
|
|
// recognized.
|
|
RelayChainAsNative<RelayChainOrigin, RuntimeOrigin>,
|
|
// Native converter for sibling Parachains; will convert to a `SiblingPara` origin when
|
|
// recognized.
|
|
SiblingParachainAsNative<cumulus_pallet_xcm::Origin, RuntimeOrigin>,
|
|
// Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a
|
|
// transaction from the Root origin.
|
|
ParentAsSuperuser<RuntimeOrigin>,
|
|
// Native signed account converter; this just converts an `AccountId32` origin into a normal
|
|
// `RuntimeOrigin::Signed` origin of the same 32-byte value.
|
|
SignedAccountId32AsNative<RelayNetwork, RuntimeOrigin>,
|
|
// XCM origins can be represented natively under the XCM pallet's `Xcm` origin.
|
|
XcmPassthrough<RuntimeOrigin>,
|
|
);
|
|
|
|
pub struct LocalPlurality;
|
|
impl Contains<Location> for LocalPlurality {
|
|
fn contains(location: &Location) -> bool {
|
|
matches!(location.unpack(), (0, [Plurality { .. }]))
|
|
}
|
|
}
|
|
|
|
pub struct ParentOrParentsPlurality;
|
|
impl Contains<Location> for ParentOrParentsPlurality {
|
|
fn contains(location: &Location) -> bool {
|
|
matches!(location.unpack(), (1, []) | (1, [Plurality { .. }]))
|
|
}
|
|
}
|
|
|
|
pub struct ParentOrSiblings;
|
|
impl Contains<Location> for ParentOrSiblings {
|
|
fn contains(location: &Location) -> bool {
|
|
matches!(location.unpack(), (1, []) | (1, [Parachain(_)]))
|
|
}
|
|
}
|
|
|
|
pub struct FellowsPlurality;
|
|
impl Contains<Location> for FellowsPlurality {
|
|
fn contains(location: &Location) -> bool {
|
|
matches!(location.unpack(), (1, [Parachain(1001), Plurality { id: BodyId::Technical, .. }]))
|
|
}
|
|
}
|
|
|
|
/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly
|
|
/// account for proof size weights.
|
|
///
|
|
/// Calls that are allowed through this filter must:
|
|
/// 1. Have a fixed weight;
|
|
/// 2. Cannot lead to another call being made;
|
|
/// 3. Have a defined proof size weight, e.g. no unbounded vecs in call parameters.
|
|
pub struct SafeCallFilter;
|
|
impl Contains<RuntimeCall> for SafeCallFilter {
|
|
fn contains(call: &RuntimeCall) -> bool {
|
|
#[cfg(feature = "runtime-benchmarks")]
|
|
{
|
|
if matches!(call, RuntimeCall::System(frame_system::Call::remark_with_event { .. })) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
matches!(
|
|
call,
|
|
RuntimeCall::PolkadotXcm(
|
|
pallet_xcm::Call::force_xcm_version { .. } |
|
|
pallet_xcm::Call::force_default_xcm_version { .. }
|
|
) | RuntimeCall::System(
|
|
frame_system::Call::set_heap_pages { .. } |
|
|
frame_system::Call::set_code { .. } |
|
|
frame_system::Call::set_code_without_checks { .. } |
|
|
frame_system::Call::authorize_upgrade { .. } |
|
|
frame_system::Call::authorize_upgrade_without_checks { .. } |
|
|
frame_system::Call::kill_prefix { .. },
|
|
) | RuntimeCall::ParachainSystem(..) |
|
|
RuntimeCall::Timestamp(..) |
|
|
RuntimeCall::Balances(..) |
|
|
RuntimeCall::CollatorSelection(
|
|
pallet_collator_selection::Call::set_desired_candidates { .. } |
|
|
pallet_collator_selection::Call::set_candidacy_bond { .. } |
|
|
pallet_collator_selection::Call::register_as_candidate { .. } |
|
|
pallet_collator_selection::Call::leave_intent { .. } |
|
|
pallet_collator_selection::Call::set_invulnerables { .. } |
|
|
pallet_collator_selection::Call::add_invulnerable { .. } |
|
|
pallet_collator_selection::Call::remove_invulnerable { .. },
|
|
) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) |
|
|
RuntimeCall::XcmpQueue(..) |
|
|
RuntimeCall::MessageQueue(..) |
|
|
RuntimeCall::Identity(..) |
|
|
RuntimeCall::IdentityMigrator(..)
|
|
)
|
|
}
|
|
}
|
|
|
|
pub type Barrier = TrailingSetTopicAsId<
|
|
DenyThenTry<
|
|
DenyReserveTransferToRelayChain,
|
|
(
|
|
// Allow local users to buy weight credit.
|
|
TakeWeightCredit,
|
|
// Expected responses are OK.
|
|
AllowKnownQueryResponses<PolkadotXcm>,
|
|
WithComputedOrigin<
|
|
(
|
|
// If the message is one that immediately attemps to pay for execution, then
|
|
// allow it.
|
|
AllowTopLevelPaidExecutionFrom<Everything>,
|
|
// Parent, its pluralities (i.e. governance bodies), and the Fellows plurality
|
|
// get free execution.
|
|
AllowExplicitUnpaidExecutionFrom<(ParentOrParentsPlurality, FellowsPlurality)>,
|
|
// Subscriptions for version tracking are OK.
|
|
AllowSubscriptionsFrom<ParentOrSiblings>,
|
|
),
|
|
UniversalLocation,
|
|
ConstU32<8>,
|
|
>,
|
|
),
|
|
>,
|
|
>;
|
|
|
|
/// Locations that will not be charged fees in the executor, neither for execution nor delivery. We
|
|
/// only waive fees for system functions, which these locations represent.
|
|
pub type WaivedLocations = (
|
|
RelayOrOtherSystemParachains<AllSiblingSystemParachains, Runtime>,
|
|
Equals<RelayTreasuryLocation>,
|
|
Equals<RootLocation>,
|
|
LocalPlurality,
|
|
);
|
|
|
|
pub struct XcmConfig;
|
|
impl xcm_executor::Config for XcmConfig {
|
|
type RuntimeCall = RuntimeCall;
|
|
type XcmSender = XcmRouter;
|
|
type AssetTransactor = CurrencyTransactor;
|
|
type OriginConverter = XcmOriginToTransactDispatchOrigin;
|
|
// People does not recognize a reserve location for any asset. Users must teleport WND
|
|
// where allowed (e.g. with the Relay Chain).
|
|
type IsReserve = ();
|
|
/// Only allow teleportation of WND amongst the system.
|
|
type IsTeleporter = ConcreteAssetFromSystem<RelayLocation>;
|
|
type UniversalLocation = UniversalLocation;
|
|
type Barrier = Barrier;
|
|
type Weigher = WeightInfoBounds<
|
|
crate::weights::xcm::PeopleWestendXcmWeight<RuntimeCall>,
|
|
RuntimeCall,
|
|
MaxInstructions,
|
|
>;
|
|
type Trader =
|
|
UsingComponents<WeightToFee, RelayLocation, AccountId, Balances, ToStakingPot<Runtime>>;
|
|
type ResponseHandler = PolkadotXcm;
|
|
type AssetTrap = PolkadotXcm;
|
|
type AssetClaims = PolkadotXcm;
|
|
type SubscriptionService = PolkadotXcm;
|
|
type PalletInstancesInfo = AllPalletsWithSystem;
|
|
type MaxAssetsIntoHolding = MaxAssetsIntoHolding;
|
|
type AssetLocker = ();
|
|
type AssetExchanger = ();
|
|
type FeeManager = XcmFeeManagerFromComponents<
|
|
WaivedLocations,
|
|
XcmFeeToAccount<Self::AssetTransactor, AccountId, TreasuryAccount>,
|
|
>;
|
|
type MessageExporter = ();
|
|
type UniversalAliases = Nothing;
|
|
type CallDispatcher = WithOriginFilter<SafeCallFilter>;
|
|
type SafeCallFilter = SafeCallFilter;
|
|
type Aliasers = Nothing;
|
|
type TransactionalProcessor = FrameTransactionalProcessor;
|
|
}
|
|
|
|
/// Converts a local signed origin into an XCM location. Forms the basis for local origins
|
|
/// sending/executing XCMs.
|
|
pub type LocalOriginToLocation = SignedToAccountId32<RuntimeOrigin, AccountId, RelayNetwork>;
|
|
|
|
/// The means for routing XCM messages which are not for local execution into the right message
|
|
/// queues.
|
|
pub type XcmRouter = WithUniqueTopic<(
|
|
// Two routers - use UMP to communicate with the relay chain:
|
|
cumulus_primitives_utility::ParentAsUmp<ParachainSystem, PolkadotXcm, ()>,
|
|
// ..and XCMP to communicate with the sibling chains.
|
|
XcmpQueue,
|
|
)>;
|
|
|
|
impl pallet_xcm::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
// We want to disallow users sending (arbitrary) XCMs from this chain.
|
|
type SendXcmOrigin = EnsureXcmOrigin<RuntimeOrigin, ()>;
|
|
type XcmRouter = XcmRouter;
|
|
// We support local origins dispatching XCM executions in principle...
|
|
type ExecuteXcmOrigin = EnsureXcmOrigin<RuntimeOrigin, LocalOriginToLocation>;
|
|
// ... but disallow generic XCM execution. As a result only teleports are allowed.
|
|
type XcmExecuteFilter = Nothing;
|
|
type XcmExecutor = XcmExecutor<XcmConfig>;
|
|
type XcmTeleportFilter = Everything;
|
|
type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location.
|
|
type Weigher = WeightInfoBounds<
|
|
crate::weights::xcm::PeopleWestendXcmWeight<RuntimeCall>,
|
|
RuntimeCall,
|
|
MaxInstructions,
|
|
>;
|
|
type UniversalLocation = UniversalLocation;
|
|
type RuntimeOrigin = RuntimeOrigin;
|
|
type RuntimeCall = RuntimeCall;
|
|
const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100;
|
|
type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion;
|
|
type Currency = Balances;
|
|
type CurrencyMatcher = ();
|
|
type TrustedLockers = ();
|
|
type SovereignAccountOf = LocationToAccountId;
|
|
type MaxLockers = ConstU32<8>;
|
|
type WeightInfo = crate::weights::pallet_xcm::WeightInfo<Runtime>;
|
|
type AdminOrigin = EnsureRoot<AccountId>;
|
|
type MaxRemoteLockConsumers = ConstU32<0>;
|
|
type RemoteLockConsumerIdentifier = ();
|
|
}
|
|
|
|
impl cumulus_pallet_xcm::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type XcmExecutor = XcmExecutor<XcmConfig>;
|
|
}
|