pub enum Asset {
Fungible(FungibleAsset),
NonFungible(NonFungibleAsset),
}Expand description
A fungible or a non-fungible asset.
All assets are encoded as the vault key of the asset and its value, each represented as one word (4 elements). This makes it is easy to determine the type of an asset both inside and outside Miden VM. Specifically:
The vault key of an asset contains the AccountId of the faucet that issues the asset. It can
be used to distinguish assets based on the encoded AccountId::account_type. In the vault
keys of assets, the account type bits at index 4 and 5 determine whether the asset is fungible
or non-fungible.
This property guarantees that there can never be a collision between a fungible and a non-fungible asset.
The methodology for constructing fungible and non-fungible assets is described below.
§Fungible assets
- A fungible asset’s value layout is:
[amount, 0, 0, 0]. - A fungible asset’s vault key layout is:
[0, 0, faucet_id_suffix, faucet_id_prefix].
The most significant elements of a fungible asset’s key are set to the prefix
(faucet_id_prefix) and suffix (faucet_id_suffix) of the ID of the faucet which issues the
asset. The asset ID limbs are set to zero, which means two instances of the same fungible asset
have the same asset key and will be merged together when stored in the same account’s vault.
The least significant element of the value is set to the amount of the asset and the remaining
felts are zero. This amount cannot be greater than FungibleAsset::MAX_AMOUNT and thus fits
into a felt.
It is impossible to find a collision between two fungible assets issued by different faucets as the faucet ID is included in the description of the asset and this is guaranteed to be different for each faucet as per the faucet creation logic.
§Non-fungible assets
- A non-fungible asset’s data layout is:
[hash0, hash1, hash2, hash3]. - A non-fungible asset’s vault key layout is:
[hash0, hash1, faucet_id_suffix, faucet_id_prefix].
The 4 elements of non-fungible assets are computed by hashing the asset data. This compresses an
asset of an arbitrary length to 4 field elements: [hash0, hash1, hash2, hash3].
It is impossible to find a collision between two non-fungible assets issued by different faucets as the faucet ID is included in the description of the non-fungible asset and this is guaranteed to be different as per the faucet creation logic.
The most significant elements of a non-fungible asset’s key are set to the prefix
(faucet_id_prefix) and suffix (faucet_id_suffix) of the ID of the faucet which issues the
asset. The asset ID limbs are set to hashes from the asset’s value. This means the collision
resistance of non-fungible assets issued by the same faucet is ~2^64, due to the 128-bit asset
ID that is unique per non-fungible asset. In other words, two non-fungible assets issued by the
same faucet are very unlikely to have the same asset key and thus should not collide when stored
in the same account’s vault.
Variants§
Fungible(FungibleAsset)
NonFungible(NonFungibleAsset)
Implementations§
Source§impl Asset
impl Asset
Sourcepub fn from_key_value(
key: AssetVaultKey,
value: Word,
) -> Result<Self, AssetError>
pub fn from_key_value( key: AssetVaultKey, value: Word, ) -> Result<Self, AssetError>
Sourcepub fn from_key_value_words(key: Word, value: Word) -> Result<Self, AssetError>
pub fn from_key_value_words(key: Word, value: Word) -> Result<Self, AssetError>
Creates an asset from the provided key and value.
Prefer Self::from_key_value for more type safety.
§Errors
Returns an error if:
- The provided key does not contain a valid faucet ID.
Self::from_key_valuefails.
Sourcepub fn is_same(&self, other: &Self) -> bool
pub fn is_same(&self, other: &Self) -> bool
Returns true if this asset is the same as the specified asset.
Two assets are defined to be the same if:
- For fungible assets, if they were issued by the same faucet.
- For non-fungible assets, if the assets are identical.
Sourcepub fn is_fungible(&self) -> bool
pub fn is_fungible(&self) -> bool
Returns true if this asset is a fungible asset.
Sourcepub fn is_non_fungible(&self) -> bool
pub fn is_non_fungible(&self) -> bool
Returns true if this asset is a non fungible asset.
Sourcepub fn vault_key(&self) -> AssetVaultKey
pub fn vault_key(&self) -> AssetVaultKey
Returns the key which is used to store this asset in the account vault.
Sourcepub fn to_key_word(&self) -> Word
pub fn to_key_word(&self) -> Word
Returns the asset’s key encoded to a Word.
Sourcepub fn to_value_word(&self) -> Word
pub fn to_value_word(&self) -> Word
Returns the asset’s value encoded to a Word.
Sourcepub fn as_elements(&self) -> [Felt; 8]
pub fn as_elements(&self) -> [Felt; 8]
Returns the asset encoded as elements.
The first four elements contain the asset key and the last four elements contain the asset value.
Sourcepub fn unwrap_fungible(&self) -> FungibleAsset
pub fn unwrap_fungible(&self) -> FungibleAsset
Sourcepub fn unwrap_non_fungible(&self) -> NonFungibleAsset
pub fn unwrap_non_fungible(&self) -> NonFungibleAsset
Trait Implementations§
Source§impl Deserializable for Asset
impl Deserializable for Asset
Source§fn read_from<R: ByteReader>(
source: &mut R,
) -> Result<Self, DeserializationError>
fn read_from<R: ByteReader>( source: &mut R, ) -> Result<Self, DeserializationError>
source, attempts to deserialize these bytes
into Self, and returns the result. Read moreSource§fn min_serialized_size() -> usize
fn min_serialized_size() -> usize
Source§fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError>
fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError>
Source§fn read_from_bytes_with_budget(
bytes: &[u8],
budget: usize,
) -> Result<Self, DeserializationError>
fn read_from_bytes_with_budget( bytes: &[u8], budget: usize, ) -> Result<Self, DeserializationError>
Self from bytes with a byte budget limit. Read moreSource§impl From<Asset> for AssetVaultKey
impl From<Asset> for AssetVaultKey
Source§impl From<FungibleAsset> for Asset
impl From<FungibleAsset> for Asset
Source§fn from(asset: FungibleAsset) -> Self
fn from(asset: FungibleAsset) -> Self
Source§impl From<NonFungibleAsset> for Asset
impl From<NonFungibleAsset> for Asset
Source§fn from(asset: NonFungibleAsset) -> Self
fn from(asset: NonFungibleAsset) -> Self
Source§impl Serializable for Asset
impl Serializable for Asset
Source§fn write_into<W: ByteWriter>(&self, target: &mut W)
fn write_into<W: ByteWriter>(&self, target: &mut W)
self into bytes and writes these bytes into the target.Source§fn get_size_hint(&self) -> usize
fn get_size_hint(&self) -> usize
impl Copy for Asset
impl Eq for Asset
impl StructuralPartialEq for Asset
Auto Trait Implementations§
impl Freeze for Asset
impl RefUnwindSafe for Asset
impl Send for Asset
impl Sync for Asset
impl Unpin for Asset
impl UnsafeUnpin for Asset
impl UnwindSafe for Asset
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more