diff --git a/polkadot/parachain/src/primitives.rs b/polkadot/parachain/src/primitives.rs index f90dfaa5d651f3df93b8a6c3b42d29dd76c2a010..e3c97620bfd6625c4157a9947465b9bf1e302b26 100644 --- a/polkadot/parachain/src/primitives.rs +++ b/polkadot/parachain/src/primitives.rs @@ -135,6 +135,45 @@ impl sp_std::ops::Add<u32> for Id { } } +#[derive(Clone, Copy, Default, Encode, Decode, Eq, PartialEq, Ord, PartialOrd, RuntimeDebug)] +pub struct Sibling(pub Id); + +impl From<Id> for Sibling { + fn from(i: Id) -> Self { + Self(i) + } +} + +impl From<Sibling> for Id { + fn from(i: Sibling) -> Self { + i.0 + } +} + +impl AsRef<Id> for Sibling { + fn as_ref(&self) -> &Id { + &self.0 + } +} + +impl TypeId for Sibling { + const TYPE_ID: [u8; 4] = *b"sibl"; +} + +impl From<Sibling> for u32 { + fn from(x: Sibling) -> Self { x.0.into() } +} + +impl From<u32> for Sibling { + fn from(x: u32) -> Self { Sibling(x.into()) } +} + +impl IsSystem for Sibling { + fn is_system(&self) -> bool { + IsSystem::is_system(&self.0) + } +} + /// This type can be converted into and possibly from an AccountId (which itself is generic). pub trait AccountIdConversion<AccountId>: Sized { /// Convert into an account ID. This is infallible. diff --git a/polkadot/runtime/parachains/src/origin.rs b/polkadot/runtime/parachains/src/origin.rs index 95204e40a7cc98815466078d8d7bda0ce0117ec8..b8444181de582dc9d0dbfe065c595df47204dc56 100644 --- a/polkadot/runtime/parachains/src/origin.rs +++ b/polkadot/runtime/parachains/src/origin.rs @@ -51,3 +51,9 @@ frame_support::decl_module! { // ideally, though, the `construct_runtime` should support a free-standing origin. pub struct Module<T: Trait> for enum Call where origin: <T as frame_system::Trait>::Origin {} } + +impl From<u32> for Origin { + fn from(id: u32) -> Origin { + Origin::Parachain(id.into()) + } +} diff --git a/polkadot/xcm/xcm-builder/src/currency_adapter.rs b/polkadot/xcm/xcm-builder/src/currency_adapter.rs index d7f6b4d4c274804149326ae56bf06a1a16d69268..09b61ab6bb57b3e15ffa14e4e580e1f34104c144 100644 --- a/polkadot/xcm/xcm-builder/src/currency_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/currency_adapter.rs @@ -36,7 +36,7 @@ impl< fn deposit_asset(what: &MultiAsset, who: &MultiLocation) -> Result { // Check we handle this asset. - let amount = Matcher::matches_fungible(&what).ok_or(())?.saturated_into(); + let amount: u128 = Matcher::matches_fungible(&what).ok_or(())?.saturated_into(); let who = AccountIdConverter::from_location(who).ok_or(())?; let balance_amount = amount.try_into().map_err(|_| ())?; let _imbalance = Currency::deposit_creating(&who, balance_amount); @@ -45,7 +45,7 @@ impl< fn withdraw_asset(what: &MultiAsset, who: &MultiLocation) -> result::Result<MultiAsset, Error> { // Check we handle this asset. - let amount = Matcher::matches_fungible(&what).ok_or(())?.saturated_into(); + let amount: u128 = Matcher::matches_fungible(&what).ok_or(())?.saturated_into(); let who = AccountIdConverter::from_location(who).ok_or(())?; let balance_amount = amount.try_into().map_err(|_| ())?; Currency::withdraw(&who, balance_amount, WithdrawReasons::TRANSFER, AllowDeath).map_err(|_| ())?;