1use super::{
17 governance::TreasuryAccount, AccountId, AllPalletsWithSystem, Assets, Balance, Balances,
18 BaseDeliveryFee, CollatorSelection, DepositPerByte, DepositPerItem, FeeAssetId,
19 FellowshipAdmin, ForeignAssets, GeneralAdmin, ParachainInfo, ParachainSystem, PolkadotXcm,
20 PoolAssets, Runtime, RuntimeCall, RuntimeEvent, RuntimeHoldReason, RuntimeOrigin, StakingAdmin,
21 ToRococoXcmRouter, TransactionByteFee, Treasurer, Uniques, WeightToFee, XcmpQueue,
22};
23use alloc::{collections::BTreeSet, vec, vec::Vec};
24use assets_common::{
25 matching::{FromSiblingParachain, IsForeignConcreteAsset, ParentLocation},
26 TrustBackedAssetsAsLocation,
27};
28use frame_support::{
29 parameter_types,
30 traits::{
31 fungible::HoldConsideration,
32 tokens::imbalance::{ResolveAssetTo, ResolveTo},
33 ConstU32, Contains, Equals, Everything, LinearStoragePrice, PalletInfoAccess,
34 },
35 PalletId,
36};
37use frame_system::EnsureRoot;
38use pallet_xcm::{AuthorizedAliasers, XcmPassthrough};
39use parachains_common::xcm_config::{
40 AllSiblingSystemParachains, ConcreteAssetFromSystem, RelayOrOtherSystemParachains,
41};
42use polkadot_parachain_primitives::primitives::Sibling;
43use polkadot_runtime_common::xcm_sender::ExponentialPrice;
44use snowbridge_outbound_queue_primitives::v2::exporter::PausableExporter;
45use sp_runtime::traits::{AccountIdConversion, TryConvertInto};
46use testnet_parachains_constants::westend::locations::AssetHubParaId;
47use westend_runtime_constants::{
48 system_parachain::COLLECTIVES_ID, xcm::body::FELLOWSHIP_ADMIN_INDEX,
49};
50use xcm::latest::{prelude::*, ROCOCO_GENESIS_HASH, WESTEND_GENESIS_HASH};
51use xcm_builder::{
52 unique_instances::UniqueInstancesAdapter, AccountId32Aliases, AliasChildLocation,
53 AllowExplicitUnpaidExecutionFrom, AllowHrmpNotificationsFromRelayChain,
54 AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom,
55 DenyRecursively, DenyReserveTransferToRelayChain, DenyThenTry, DescribeAllTerminal,
56 DescribeFamily, EnsureXcmOrigin, ExternalConsensusLocationsConverterFor,
57 FrameTransactionalProcessor, FungibleAdapter, FungiblesAdapter, HashedDescription, IsConcrete,
58 LocalMint, MatchInClassInstances, MatchedConvertedConcreteId, MintLocation,
59 NetworkExportTableItem, NoChecking, OriginToPluralityVoice, ParentAsSuperuser, ParentIsPreset,
60 RelayChainAsNative, SendXcmFeeToAccount, SiblingParachainAsNative, SiblingParachainConvertsVia,
61 SignedAccountId32AsNative, SignedToAccountId32, SingleAssetExchangeAdapter,
62 SovereignSignedViaLocation, StartsWith, StartsWithExplicitGlobalConsensus, TakeWeightCredit,
63 TrailingSetTopicAsId, UnpaidRemoteExporter, UsingComponents, WeightInfoBounds,
64 WithComputedOrigin, WithLatestLocationConverter, WithUniqueTopic, XcmFeeManagerFromComponents,
65};
66use xcm_executor::XcmExecutor;
67
68parameter_types! {
69 pub const RootLocation: Location = Location::here();
70 pub const WestendLocation: Location = Location::parent();
71 pub const RelayNetwork: Option<NetworkId> = Some(NetworkId::ByGenesis(WESTEND_GENESIS_HASH));
72 pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into();
73 pub UniversalLocation: InteriorLocation =
74 [GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())].into();
75 pub UniversalLocationNetworkId: NetworkId = UniversalLocation::get().global_consensus().unwrap();
76 pub TrustBackedAssetsPalletLocation: Location =
77 PalletInstance(TrustBackedAssetsPalletIndex::get()).into();
78 pub TrustBackedAssetsPalletIndex: u8 = <Assets as PalletInfoAccess>::index() as u8;
79 pub ForeignAssetsPalletLocation: Location =
80 PalletInstance(<ForeignAssets as PalletInfoAccess>::index() as u8).into();
81 pub PoolAssetsPalletLocation: Location =
82 PalletInstance(<PoolAssets as PalletInfoAccess>::index() as u8).into();
83 pub UniquesPalletLocation: Location =
84 PalletInstance(<Uniques as PalletInfoAccess>::index() as u8).into();
85 pub CheckingAccount: AccountId = PolkadotXcm::check_account();
86 pub StakingPot: AccountId = CollatorSelection::account_id();
87 pub RelayTreasuryLocation: Location = (Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into();
88 pub TeleportTracking: Option<(AccountId, MintLocation)> = Some((CheckingAccount::get(), MintLocation::Local));
90}
91
92pub type LocationToAccountId = (
96 ParentIsPreset<AccountId>,
98 SiblingParachainConvertsVia<Sibling, AccountId>,
100 AccountId32Aliases<RelayNetwork, AccountId>,
102 HashedDescription<AccountId, DescribeFamily<DescribeAllTerminal>>,
104 ExternalConsensusLocationsConverterFor<UniversalLocation, AccountId>,
106);
107
108pub type FungibleTransactor = FungibleAdapter<
110 Balances,
112 IsConcrete<WestendLocation>,
114 LocationToAccountId,
116 AccountId,
118 TeleportTracking,
120>;
121
122pub type TrustBackedAssetsConvertedConcreteId =
124 assets_common::TrustBackedAssetsConvertedConcreteId<TrustBackedAssetsPalletLocation, Balance>;
125
126pub type FungiblesTransactor = FungiblesAdapter<
128 Assets,
130 TrustBackedAssetsConvertedConcreteId,
132 LocationToAccountId,
134 AccountId,
136 LocalMint<parachains_common::impls::NonZeroIssuance<AccountId, Assets>>,
139 CheckingAccount,
141>;
142
143pub type UniquesConvertedConcreteId =
145 assets_common::UniquesConvertedConcreteId<UniquesPalletLocation>;
146
147pub type UniquesTransactor = UniqueInstancesAdapter<
149 AccountId,
150 LocationToAccountId,
151 MatchInClassInstances<UniquesConvertedConcreteId>,
152 pallet_uniques::asset_ops::Item<Uniques>,
153>;
154
155pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConvertedConcreteId<
157 (
158 StartsWith<TrustBackedAssetsPalletLocation>,
160 StartsWithExplicitGlobalConsensus<UniversalLocationNetworkId>,
166 ),
167 Balance,
168 xcm::v5::Location,
169>;
170
171pub type ForeignFungiblesTransactor = FungiblesAdapter<
173 ForeignAssets,
175 ForeignAssetsConvertedConcreteId,
177 LocationToAccountId,
179 AccountId,
181 NoChecking,
183 CheckingAccount,
185>;
186
187pub type PoolAssetsConvertedConcreteId =
189 assets_common::PoolAssetsConvertedConcreteId<PoolAssetsPalletLocation, Balance>;
190
191pub type PoolFungiblesTransactor = FungiblesAdapter<
193 PoolAssets,
195 PoolAssetsConvertedConcreteId,
197 LocationToAccountId,
199 AccountId,
201 LocalMint<parachains_common::impls::NonZeroIssuance<AccountId, PoolAssets>>,
204 CheckingAccount,
206>;
207
208parameter_types! {
209 pub const ERC20TransferGasLimit: Weight = Weight::from_parts(700_000_000, 200_000);
211 pub const ERC20TransferStorageDepositLimit: Balance = 10_200_000_000;
212 pub ERC20TransfersCheckingAccount: AccountId = PalletId(*b"py/revch").into_account_truncating();
213}
214
215pub type ERC20Transactor = assets_common::ERC20Transactor<
217 Runtime,
219 assets_common::ERC20Matcher,
221 LocationToAccountId,
223 ERC20TransferGasLimit,
225 ERC20TransferStorageDepositLimit,
227 AccountId,
229 ERC20TransfersCheckingAccount,
231>;
232
233pub type AssetTransactors = (
235 FungibleTransactor,
236 FungiblesTransactor,
237 ForeignFungiblesTransactor,
238 PoolFungiblesTransactor,
239 UniquesTransactor,
240 ERC20Transactor,
241);
242
243pub type XcmOriginToTransactDispatchOrigin = (
247 SovereignSignedViaLocation<LocationToAccountId, RuntimeOrigin>,
251 RelayChainAsNative<RelayChainOrigin, RuntimeOrigin>,
254 SiblingParachainAsNative<cumulus_pallet_xcm::Origin, RuntimeOrigin>,
257 ParentAsSuperuser<RuntimeOrigin>,
260 SignedAccountId32AsNative<RelayNetwork, RuntimeOrigin>,
263 XcmPassthrough<RuntimeOrigin>,
265);
266
267parameter_types! {
268 pub const MaxInstructions: u32 = 100;
269 pub const MaxAssetsIntoHolding: u32 = 64;
270}
271
272pub struct ParentOrParentsPlurality;
273impl Contains<Location> for ParentOrParentsPlurality {
274 fn contains(location: &Location) -> bool {
275 matches!(location.unpack(), (1, []) | (1, [Plurality { .. }]))
276 }
277}
278
279pub struct FellowshipEntities;
280impl Contains<Location> for FellowshipEntities {
281 fn contains(location: &Location) -> bool {
282 matches!(
283 location.unpack(),
284 (1, [Parachain(COLLECTIVES_ID), Plurality { id: BodyId::Technical, .. }]) |
285 (1, [Parachain(COLLECTIVES_ID), PalletInstance(64)]) |
286 (1, [Parachain(COLLECTIVES_ID), PalletInstance(65)])
287 )
288 }
289}
290
291pub struct LocalPlurality;
292impl Contains<Location> for LocalPlurality {
293 fn contains(loc: &Location) -> bool {
294 matches!(loc.unpack(), (0, [Plurality { .. }]))
295 }
296}
297
298pub struct AmbassadorEntities;
299impl Contains<Location> for AmbassadorEntities {
300 fn contains(location: &Location) -> bool {
301 matches!(location.unpack(), (1, [Parachain(COLLECTIVES_ID), PalletInstance(74)]))
302 }
303}
304
305pub struct SecretaryEntities;
306impl Contains<Location> for SecretaryEntities {
307 fn contains(location: &Location) -> bool {
308 matches!(location.unpack(), (1, [Parachain(COLLECTIVES_ID), PalletInstance(91)]))
309 }
310}
311
312pub type Barrier = TrailingSetTopicAsId<
313 DenyThenTry<
314 DenyRecursively<DenyReserveTransferToRelayChain>,
315 (
316 TakeWeightCredit,
317 AllowKnownQueryResponses<PolkadotXcm>,
319 WithComputedOrigin<
321 (
322 AllowTopLevelPaidExecutionFrom<Everything>,
325 AllowExplicitUnpaidExecutionFrom<(
328 ParentOrParentsPlurality,
329 Equals<RelayTreasuryLocation>,
330 RelayOrOtherSystemParachains<AllSiblingSystemParachains, Runtime>,
331 FellowshipEntities,
332 AmbassadorEntities,
333 SecretaryEntities,
334 )>,
335 AllowSubscriptionsFrom<Everything>,
337 AllowHrmpNotificationsFromRelayChain,
339 ),
340 UniversalLocation,
341 ConstU32<8>,
342 >,
343 ),
344 >,
345>;
346
347pub type WaivedLocations = (
351 Equals<RootLocation>,
352 RelayOrOtherSystemParachains<AllSiblingSystemParachains, Runtime>,
353 Equals<RelayTreasuryLocation>,
354 FellowshipEntities,
355 AmbassadorEntities,
356 LocalPlurality,
357 SecretaryEntities,
358);
359
360pub type TrustedTeleporters = (
365 ConcreteAssetFromSystem<WestendLocation>,
366 IsForeignConcreteAsset<FromSiblingParachain<AssetHubParaId>>,
367);
368
369pub type TrustedAliasers = (AliasChildLocation, AuthorizedAliasers<Runtime>);
374
375pub type PoolAssetsExchanger = SingleAssetExchangeAdapter<
380 crate::AssetConversion,
381 crate::NativeAndNonPoolAssets,
382 (
383 TrustBackedAssetsAsLocation<TrustBackedAssetsPalletLocation, Balance, xcm::v5::Location>,
384 ForeignAssetsConvertedConcreteId,
385 MatchedConvertedConcreteId<
387 xcm::v5::Location,
388 Balance,
389 Equals<ParentLocation>,
390 WithLatestLocationConverter<xcm::v5::Location>,
391 TryConvertInto,
392 >,
393 ),
394 AccountId,
395>;
396
397pub struct XcmConfig;
398impl xcm_executor::Config for XcmConfig {
399 type RuntimeCall = RuntimeCall;
400 type XcmSender = XcmRouter;
401 type XcmEventEmitter = PolkadotXcm;
402 type AssetTransactor = AssetTransactors;
403 type OriginConverter = XcmOriginToTransactDispatchOrigin;
404 type IsReserve = (
409 bridging::to_rococo::RococoAssetFromAssetHubRococo,
410 bridging::to_ethereum::EthereumAssetFromEthereum,
411 );
412 type IsTeleporter = TrustedTeleporters;
413 type UniversalLocation = UniversalLocation;
414 type Barrier = Barrier;
415 type Weigher = WeightInfoBounds<
416 crate::weights::xcm::AssetHubWestendXcmWeight<RuntimeCall>,
417 RuntimeCall,
418 MaxInstructions,
419 >;
420 type Trader = (
421 UsingComponents<
422 WeightToFee,
423 WestendLocation,
424 AccountId,
425 Balances,
426 ResolveTo<StakingPot, Balances>,
427 >,
428 cumulus_primitives_utility::SwapFirstAssetTrader<
429 WestendLocation,
430 crate::AssetConversion,
431 WeightToFee,
432 crate::NativeAndNonPoolAssets,
433 (
434 TrustBackedAssetsAsLocation<
435 TrustBackedAssetsPalletLocation,
436 Balance,
437 xcm::v5::Location,
438 >,
439 ForeignAssetsConvertedConcreteId,
440 ),
441 ResolveAssetTo<StakingPot, crate::NativeAndNonPoolAssets>,
442 AccountId,
443 >,
444 );
445 type ResponseHandler = PolkadotXcm;
446 type AssetTrap = PolkadotXcm;
447 type AssetClaims = PolkadotXcm;
448 type SubscriptionService = PolkadotXcm;
449 type PalletInstancesInfo = AllPalletsWithSystem;
450 type MaxAssetsIntoHolding = MaxAssetsIntoHolding;
451 type AssetLocker = ();
452 type AssetExchanger = PoolAssetsExchanger;
453 type FeeManager = XcmFeeManagerFromComponents<
454 WaivedLocations,
455 SendXcmFeeToAccount<Self::AssetTransactor, TreasuryAccount>,
456 >;
457 type MessageExporter = ();
458 type UniversalAliases =
459 (bridging::to_rococo::UniversalAliases, bridging::to_ethereum::UniversalAliases);
460 type CallDispatcher = RuntimeCall;
461 type SafeCallFilter = Everything;
462 type Aliasers = TrustedAliasers;
463 type TransactionalProcessor = FrameTransactionalProcessor;
464 type HrmpNewChannelOpenRequestHandler = ();
465 type HrmpChannelAcceptedHandler = ();
466 type HrmpChannelClosingHandler = ();
467 type XcmRecorder = PolkadotXcm;
468}
469
470parameter_types! {
471 pub const GeneralAdminBodyId: BodyId = BodyId::Administration;
473 pub const StakingAdminBodyId: BodyId = BodyId::Defense;
475 pub const FellowshipAdminBodyId: BodyId = BodyId::Index(FELLOWSHIP_ADMIN_INDEX);
477 pub const TreasurerBodyId: BodyId = BodyId::Treasury;
479}
480
481pub type GeneralAdminToPlurality =
483 OriginToPluralityVoice<RuntimeOrigin, GeneralAdmin, GeneralAdminBodyId>;
484
485pub type LocalOriginToLocation =
487 (GeneralAdminToPlurality, SignedToAccountId32<RuntimeOrigin, AccountId, RelayNetwork>);
488
489pub type StakingAdminToPlurality =
491 OriginToPluralityVoice<RuntimeOrigin, StakingAdmin, StakingAdminBodyId>;
492
493pub type FellowshipAdminToPlurality =
495 OriginToPluralityVoice<RuntimeOrigin, FellowshipAdmin, FellowshipAdminBodyId>;
496
497pub type TreasurerToPlurality = OriginToPluralityVoice<RuntimeOrigin, Treasurer, TreasurerBodyId>;
499
500pub type LocalPalletOriginToLocation = (
503 GeneralAdminToPlurality,
505 StakingAdminToPlurality,
507 FellowshipAdminToPlurality,
509 TreasurerToPlurality,
511);
512
513pub type PriceForParentDelivery =
514 ExponentialPrice<FeeAssetId, BaseDeliveryFee, TransactionByteFee, ParachainSystem>;
515
516type LocalXcmRouter = (
518 cumulus_primitives_utility::ParentAsUmp<ParachainSystem, PolkadotXcm, PriceForParentDelivery>,
520 XcmpQueue,
522);
523
524pub type XcmRouter = WithUniqueTopic<(
527 LocalXcmRouter,
528 ToRococoXcmRouter,
531 PausableExporter<
534 crate::SnowbridgeSystemFrontend,
535 (
536 UnpaidRemoteExporter<
537 (
538 bridging::to_ethereum::EthereumNetworkExportTableV2,
539 bridging::to_ethereum::EthereumNetworkExportTableV1,
540 ),
541 XcmpQueue,
542 UniversalLocation,
543 >,
544 ),
545 >,
546)>;
547
548parameter_types! {
549 pub Collectives: Location = Location::new(1, [Parachain(COLLECTIVES_ID)]);
550 pub const AuthorizeAliasHoldReason: RuntimeHoldReason = RuntimeHoldReason::PolkadotXcm(pallet_xcm::HoldReason::AuthorizeAlias);
551}
552
553impl pallet_xcm::Config for Runtime {
554 type RuntimeEvent = RuntimeEvent;
555 type SendXcmOrigin = EnsureXcmOrigin<RuntimeOrigin, LocalOriginToLocation>;
556 type XcmRouter = XcmRouter;
557 type ExecuteXcmOrigin = EnsureXcmOrigin<RuntimeOrigin, LocalOriginToLocation>;
558 type XcmExecuteFilter = Everything;
559 type XcmExecutor = XcmExecutor<XcmConfig>;
560 type XcmTeleportFilter = Everything;
561 type XcmReserveTransferFilter = Everything;
562 type Weigher = WeightInfoBounds<
563 crate::weights::xcm::AssetHubWestendXcmWeight<RuntimeCall>,
564 RuntimeCall,
565 MaxInstructions,
566 >;
567 type UniversalLocation = UniversalLocation;
568 type RuntimeOrigin = RuntimeOrigin;
569 type RuntimeCall = RuntimeCall;
570 const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100;
571 type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion;
572 type Currency = Balances;
573 type CurrencyMatcher = ();
574 type TrustedLockers = ();
575 type SovereignAccountOf = LocationToAccountId;
576 type MaxLockers = ConstU32<8>;
577 type WeightInfo = crate::weights::pallet_xcm::WeightInfo<Runtime>;
578 type AdminOrigin = EnsureRoot<AccountId>;
579 type MaxRemoteLockConsumers = ConstU32<0>;
580 type RemoteLockConsumerIdentifier = ();
581 type AuthorizedAliasConsideration = HoldConsideration<
583 AccountId,
584 Balances,
585 AuthorizeAliasHoldReason,
586 LinearStoragePrice<DepositPerItem, DepositPerByte, Balance>,
587 >;
588}
589
590impl cumulus_pallet_xcm::Config for Runtime {
591 type RuntimeEvent = RuntimeEvent;
592 type XcmExecutor = XcmExecutor<XcmConfig>;
593}
594
595pub struct XcmBenchmarkHelper;
597#[cfg(feature = "runtime-benchmarks")]
598impl pallet_assets::BenchmarkHelper<xcm::v5::Location> for XcmBenchmarkHelper {
599 fn create_asset_id_parameter(id: u32) -> xcm::v5::Location {
600 xcm::v5::Location::new(1, [xcm::v5::Junction::Parachain(id)])
601 }
602}
603
604pub mod bridging {
606 use super::*;
607 use assets_common::matching;
608
609 parameter_types! {
610 pub storage XcmBridgeHubRouterBaseFee: Balance =
622 bp_bridge_hub_westend::BridgeHubWestendBaseXcmFeeInWnds::get()
623 .saturating_add(bp_bridge_hub_rococo::BridgeHubRococoBaseDeliveryFeeInRocs::get())
624 .saturating_add(bp_bridge_hub_westend::BridgeHubWestendBaseConfirmationFeeInWnds::get());
625 pub storage XcmBridgeHubRouterByteFee: Balance = TransactionByteFee::get();
628
629 pub SiblingBridgeHubParaId: u32 = bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID;
630 pub SiblingBridgeHub: Location = Location::new(1, [Parachain(SiblingBridgeHubParaId::get())]);
631 pub XcmBridgeHubRouterFeeAssetId: AssetId = WestendLocation::get().into();
634
635 pub BridgeTable: Vec<NetworkExportTableItem> =
636 Vec::new().into_iter()
637 .chain(to_rococo::BridgeTable::get())
638 .collect();
639 }
640
641 pub type NetworkExportTable = xcm_builder::NetworkExportTable<BridgeTable>;
642
643 pub mod to_rococo {
644 use super::*;
645
646 parameter_types! {
647 pub SiblingBridgeHubWithBridgeHubRococoInstance: Location = Location::new(
648 1,
649 [
650 Parachain(SiblingBridgeHubParaId::get()),
651 PalletInstance(bp_bridge_hub_westend::WITH_BRIDGE_WESTEND_TO_ROCOCO_MESSAGES_PALLET_INDEX)
652 ]
653 );
654
655 pub const RococoNetwork: NetworkId = NetworkId::ByGenesis(ROCOCO_GENESIS_HASH);
656 pub RococoEcosystem: Location = Location::new(2, [GlobalConsensus(RococoNetwork::get())]);
657 pub RocLocation: Location = Location::new(2, [GlobalConsensus(RococoNetwork::get())]);
658 pub AssetHubRococo: Location = Location::new(2, [
659 GlobalConsensus(RococoNetwork::get()),
660 Parachain(bp_asset_hub_rococo::ASSET_HUB_ROCOCO_PARACHAIN_ID)
661 ]);
662
663 pub BridgeTable: Vec<NetworkExportTableItem> = vec![
666 NetworkExportTableItem::new(
667 RococoNetwork::get(),
668 Some(vec![
669 AssetHubRococo::get().interior.split_global().expect("invalid configuration for AssetHubRococo").1,
670 ]),
671 SiblingBridgeHub::get(),
672 Some((
674 XcmBridgeHubRouterFeeAssetId::get(),
675 XcmBridgeHubRouterBaseFee::get(),
676 ).into())
677 )
678 ];
679
680 pub UniversalAliases: BTreeSet<(Location, Junction)> = BTreeSet::from_iter(
682 vec![
683 (SiblingBridgeHubWithBridgeHubRococoInstance::get(), GlobalConsensus(RococoNetwork::get()))
684 ]
685 );
686 }
687
688 impl Contains<(Location, Junction)> for UniversalAliases {
689 fn contains(alias: &(Location, Junction)) -> bool {
690 UniversalAliases::get().contains(alias)
691 }
692 }
693
694 pub type RococoAssetFromAssetHubRococo =
696 matching::RemoteAssetFromLocation<StartsWith<RococoEcosystem>, AssetHubRococo>;
697 }
698
699 pub mod to_ethereum {
700 use super::*;
701 use assets_common::matching::FromNetwork;
702 use testnet_parachains_constants::westend::snowbridge::{
703 EthereumNetwork, INBOUND_QUEUE_PALLET_INDEX_V1, INBOUND_QUEUE_PALLET_INDEX_V2,
704 };
705
706 parameter_types! {
707 pub const DefaultBridgeHubEthereumBaseFee: Balance = 3_833_568_200_000;
712 pub const DefaultBridgeHubEthereumBaseFeeV2: Balance = 100_000_000_000;
713 pub storage BridgeHubEthereumBaseFee: Balance = DefaultBridgeHubEthereumBaseFee::get();
714 pub storage BridgeHubEthereumBaseFeeV2: Balance = DefaultBridgeHubEthereumBaseFeeV2::get();
715 pub SiblingBridgeHubWithEthereumInboundQueueV1Instance: Location = Location::new(
716 1,
717 [
718 Parachain(SiblingBridgeHubParaId::get()),
719 PalletInstance(INBOUND_QUEUE_PALLET_INDEX_V1)
720 ]
721 );
722 pub SiblingBridgeHubWithEthereumInboundQueueV2Instance: Location = Location::new(
723 1,
724 [
725 Parachain(SiblingBridgeHubParaId::get()),
726 PalletInstance(INBOUND_QUEUE_PALLET_INDEX_V2)
727 ]
728 );
729
730 pub EthereumBridgeTableV1: vec::Vec<NetworkExportTableItem> = vec![
733 NetworkExportTableItem::new(
734 EthereumNetwork::get(),
735 Some(vec![Junctions::Here]),
736 SiblingBridgeHub::get(),
737 Some((
738 XcmBridgeHubRouterFeeAssetId::get(),
739 BridgeHubEthereumBaseFee::get(),
740 ).into())
741 ),
742 ];
743
744 pub EthereumBridgeTableV2: vec::Vec<NetworkExportTableItem> = vec![
745 NetworkExportTableItem::new(
746 EthereumNetwork::get(),
747 Some(vec![Junctions::Here]),
748 SiblingBridgeHub::get(),
749 Some((
750 XcmBridgeHubRouterFeeAssetId::get(),
751 BridgeHubEthereumBaseFeeV2::get(),
752 ).into())
753 ),
754 ];
755
756 pub UniversalAliases: BTreeSet<(Location, Junction)> = BTreeSet::from_iter(
758 vec![
759 (SiblingBridgeHubWithEthereumInboundQueueV2Instance::get(), GlobalConsensus(EthereumNetwork::get().into())),
760 (SiblingBridgeHubWithEthereumInboundQueueV1Instance::get(), GlobalConsensus(EthereumNetwork::get().into())),
761 ]
762 );
763 }
764
765 pub type EthereumNetworkExportTableV1 =
766 xcm_builder::NetworkExportTable<EthereumBridgeTableV1>;
767
768 pub type EthereumNetworkExportTableV2 =
769 snowbridge_outbound_queue_primitives::v2::XcmFilterExporter<
770 xcm_builder::NetworkExportTable<EthereumBridgeTableV2>,
771 snowbridge_outbound_queue_primitives::v2::XcmForSnowbridgeV2,
772 >;
773
774 pub type EthereumAssetFromEthereum =
775 IsForeignConcreteAsset<FromNetwork<UniversalLocation, EthereumNetwork>>;
776
777 impl Contains<(Location, Junction)> for UniversalAliases {
778 fn contains(alias: &(Location, Junction)) -> bool {
779 UniversalAliases::get().contains(alias)
780 }
781 }
782 }
783
784 #[cfg(feature = "runtime-benchmarks")]
786 pub struct BridgingBenchmarksHelper;
787
788 #[cfg(feature = "runtime-benchmarks")]
789 impl BridgingBenchmarksHelper {
790 pub fn prepare_universal_alias() -> Option<(Location, Junction)> {
791 let alias =
792 to_rococo::UniversalAliases::get().into_iter().find_map(|(location, junction)| {
793 match to_rococo::SiblingBridgeHubWithBridgeHubRococoInstance::get()
794 .eq(&location)
795 {
796 true => Some((location, junction)),
797 false => None,
798 }
799 });
800 Some(alias.expect("we expect here BridgeHubWestend to Rococo mapping at least"))
801 }
802 }
803}