Enum xcm::v0::MultiAsset
source · pub enum MultiAsset {
None,
All,
AllFungible,
AllNonFungible,
AllAbstractFungible {
id: Vec<u8>,
},
AllAbstractNonFungible {
class: Vec<u8>,
},
AllConcreteFungible {
id: MultiLocation,
},
AllConcreteNonFungible {
class: MultiLocation,
},
AbstractFungible {
id: Vec<u8>,
amount: u128,
},
AbstractNonFungible {
class: Vec<u8>,
instance: AssetInstance,
},
ConcreteFungible {
id: MultiLocation,
amount: u128,
},
ConcreteNonFungible {
class: MultiLocation,
instance: AssetInstance,
},
}
Expand description
A single general identifier for an asset.
Represents both fungible and non-fungible assets. May only be used to represent a single asset class.
Wildcards may or may not be allowed by the interpreting context.
Assets classes may be identified in one of two ways: either an abstract identifier or a concrete identifier. Implementations may support only one of these. A single asset may be referenced from multiple asset identifiers, though will tend to have only a single preferred identifier.
Abstract identifiers
Abstract identifiers are absolute identifiers that represent a notional asset which can exist within multiple consensus systems. These tend to be simpler to deal with since their broad meaning is unchanged regardless stay of the consensus system in which it is interpreted.
However, in the attempt to provide uniformity across consensus systems, they may conflate different instantiations of some notional asset (e.g. the reserve asset and a local reserve-backed derivative of it) under the same name, leading to confusion. It also implies that one notional asset is accounted for locally in only one way. This may not be the case, e.g. where there are multiple bridge instances each providing a bridged “BTC” token yet none being fungible between the others.
Since they are meant to be absolute and universal, a global registry is needed to ensure that name collisions do not occur.
An abstract identifier is represented as a simple variable-size byte string. As of writing, no global registry exists and no proposals have been put forth for asset labeling.
Concrete identifiers
Concrete identifiers are relative identifiers that specifically identify a single asset through its location in a
consensus system relative to the context interpreting. Use of a MultiLocation
ensures that similar but non
fungible variants of the same underlying asset can be properly distinguished, and obviates the need for any kind of
central registry.
The limitation is that the asset identifier cannot be trivially copied between consensus systems and must instead be “re-anchored” whenever being moved to a new consensus system, using the two systems’ relative paths.
Throughout XCM, messages are authored such that when interpreted from the receiver’s point of view they will have the desired meaning/effect. This means that relative paths should always by constructed to be read from the point of view of the receiving system, which may be have a completely different meaning in the authoring system.
Concrete identifiers are the preferred way of identifying an asset since they are entirely unambiguous.
A concrete identifier is represented by a MultiLocation
. If a system has an unambiguous primary asset (such as
Bitcoin with BTC or Ethereum with ETH), then it will conventionally be identified as the chain itself. Alternative
and more specific ways of referring to an asset within a system include:
<chain>/PalletInstance(<id>)
for a Frame chain with a single-asset pallet instance (such as an instance of the Balances pallet).<chain>/PalletInstance(<id>)/GeneralIndex(<index>)
for a Frame chain with an indexed multi-asset pallet instance (such as an instance of the Assets pallet).<chain>/AccountId32
for an ERC-20-style single-asset smart-contract on a Frame-based contracts chain.<chain>/AccountKey20
for an ERC-20-style single-asset smart-contract on an Ethereum-like chain.
Variants§
None
No assets. Rarely used.
All
All assets. Typically used for the subset of assets to be used for an Order
, and in that context means
“all assets currently in holding”.
AllFungible
All fungible assets. Typically used for the subset of assets to be used for an Order
, and in that context
means “all fungible assets currently in holding”.
AllNonFungible
All non-fungible assets. Typically used for the subset of assets to be used for an Order
, and in that
context means “all non-fungible assets currently in holding”.
AllAbstractFungible
All fungible assets of a given abstract asset id
entifier.
AllAbstractNonFungible
All non-fungible assets of a given abstract asset class
.
AllConcreteFungible
Fields
id: MultiLocation
All fungible assets of a given concrete asset id
entifier.
AllConcreteNonFungible
Fields
class: MultiLocation
All non-fungible assets of a given concrete asset class
.
AbstractFungible
Some specific amount
of the fungible asset identified by an abstract id
.
AbstractNonFungible
Some specific instance
of the non-fungible asset whose class
is identified abstractly.
ConcreteFungible
Some specific amount
of the fungible asset identified by an concrete id
.
ConcreteNonFungible
Some specific instance
of the non-fungible asset whose class
is identified concretely.
Implementations§
source§impl MultiAsset
impl MultiAsset
sourcepub fn is_wildcard(&self) -> bool
pub fn is_wildcard(&self) -> bool
Returns true
if the MultiAsset
is a wildcard and can refer to classes of assets, instead of just one.
Typically can also be inferred by the name starting with All
.
sourcepub fn contains(&self, inner: &MultiAsset) -> bool
pub fn contains(&self, inner: &MultiAsset) -> bool
Returns true if self
is a super-set of the given inner
.
Typically, any wildcard is never contained in anything else, and a wildcard can contain any other non-wildcard. For more details, see the implementation and tests.
pub fn reanchor(&mut self, prepend: &MultiLocation) -> Result<(), ()>
Trait Implementations§
source§impl Clone for MultiAsset
impl Clone for MultiAsset
source§fn clone(&self) -> MultiAsset
fn clone(&self) -> MultiAsset
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for MultiAsset
impl Debug for MultiAsset
source§impl Decode for MultiAsset
impl Decode for MultiAsset
source§impl Encode for MultiAsset
impl Encode for MultiAsset
source§fn encode_to<__CodecOutputEdqy: Output + ?Sized>(
&self,
__codec_dest_edqy: &mut __CodecOutputEdqy
)
fn encode_to<__CodecOutputEdqy: Output + ?Sized>(
&self,
__codec_dest_edqy: &mut __CodecOutputEdqy
)
source§fn size_hint(&self) -> usize
fn size_hint(&self) -> usize
source§fn using_encoded<R, F>(&self, f: F) -> Rwhere
F: FnOnce(&[u8]) -> R,
fn using_encoded<R, F>(&self, f: F) -> Rwhere
F: FnOnce(&[u8]) -> R,
source§fn encoded_size(&self) -> usize
fn encoded_size(&self) -> usize
source§impl From<MultiAsset> for VersionedMultiAsset
impl From<MultiAsset> for VersionedMultiAsset
source§fn from(x: MultiAsset) -> Self
fn from(x: MultiAsset) -> Self
source§impl Ord for MultiAsset
impl Ord for MultiAsset
source§fn cmp(&self, other: &MultiAsset) -> Ordering
fn cmp(&self, other: &MultiAsset) -> Ordering
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
source§impl PartialEq<MultiAsset> for MultiAsset
impl PartialEq<MultiAsset> for MultiAsset
source§fn eq(&self, other: &MultiAsset) -> bool
fn eq(&self, other: &MultiAsset) -> bool
source§impl PartialOrd<MultiAsset> for MultiAsset
impl PartialOrd<MultiAsset> for MultiAsset
source§fn partial_cmp(&self, other: &MultiAsset) -> Option<Ordering>
fn partial_cmp(&self, other: &MultiAsset) -> Option<Ordering>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self
and other
) and is used by the <=
operator. Read moresource§impl TryFrom<MultiAsset> for MultiAsset
impl TryFrom<MultiAsset> for MultiAsset
source§fn try_from(m: MultiAsset) -> Result<MultiAsset, ()>
fn try_from(m: MultiAsset) -> Result<MultiAsset, ()>
source§impl TryFrom<MultiAsset> for MultiAsset
impl TryFrom<MultiAsset> for MultiAsset
source§fn try_from(old: MultiAsset) -> Result<MultiAsset, ()>
fn try_from(old: MultiAsset) -> Result<MultiAsset, ()>
source§impl TryFrom<MultiAsset> for Option<MultiAsset>
impl TryFrom<MultiAsset> for Option<MultiAsset>
source§impl TryFrom<MultiAsset> for WildMultiAsset
impl TryFrom<MultiAsset> for WildMultiAsset
source§fn try_from(old: MultiAsset) -> Result<WildMultiAsset, ()>
fn try_from(old: MultiAsset) -> Result<WildMultiAsset, ()>
source§impl TryFrom<VersionedMultiAsset> for MultiAsset
impl TryFrom<VersionedMultiAsset> for MultiAsset
source§impl TryFrom<WildMultiAsset> for MultiAsset
impl TryFrom<WildMultiAsset> for MultiAsset
source§fn try_from(m: WildMultiAsset) -> Result<MultiAsset, ()>
fn try_from(m: WildMultiAsset) -> Result<MultiAsset, ()>
source§impl TypeInfo for MultiAsset
impl TypeInfo for MultiAsset
impl EncodeLike<MultiAsset> for MultiAsset
impl Eq for MultiAsset
impl StructuralEq for MultiAsset
impl StructuralPartialEq for MultiAsset
Auto Trait Implementations§
impl RefUnwindSafe for MultiAsset
impl Send for MultiAsset
impl Sync for MultiAsset
impl Unpin for MultiAsset
impl UnwindSafe for MultiAsset
Blanket Implementations§
source§impl<T> CheckedConversion for T
impl<T> CheckedConversion for T
source§impl<T> DecodeLimit for Twhere
T: Decode,
impl<T> DecodeLimit for Twhere
T: Decode,
source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
source§fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
. Read moresource§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
. Read moresource§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s. Read moresource§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s. Read moresource§impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.source§impl<T> FmtForward for T
impl<T> FmtForward for T
source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T, Outer> IsWrappedBy<Outer> for Twhere
Outer: AsRef<T> + AsMut<T> + From<T>,
T: From<Outer>,
impl<T, Outer> IsWrappedBy<Outer> for Twhere
Outer: AsRef<T> + AsMut<T> + From<T>,
T: From<Outer>,
source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
self
, then passes self.as_ref()
into the pipe function.source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
source§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<T> SaturatedConversion for T
impl<T> SaturatedConversion for T
source§fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
source§fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
T
. Read moresource§impl<T> Tap for T
impl<T> Tap for T
source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
Borrow<B>
of a value. Read moresource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
BorrowMut<B>
of a value. Read moresource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
AsRef<R>
view of a value. Read moresource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
AsMut<R>
view of a value. Read moresource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
Deref::Target
of a value. Read moresource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
Deref::Target
of a value. Read moresource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds. Read moresource§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
.tap_borrow()
only in debug builds, and is erased in release
builds. Read moresource§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
.tap_borrow_mut()
only in debug builds, and is erased in release
builds. Read moresource§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
.tap_ref()
only in debug builds, and is erased in release
builds. Read moresource§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
.tap_ref_mut()
only in debug builds, and is erased in release
builds. Read moresource§impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
source§fn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from
.source§impl<T, S> UniqueSaturatedInto<T> for Swhere
T: Bounded,
S: TryInto<T>,
impl<T, S> UniqueSaturatedInto<T> for Swhere
T: Bounded,
S: TryInto<T>,
source§fn unique_saturated_into(self) -> T
fn unique_saturated_into(self) -> T
T
.