miden_objects/decoded/
asset.rs1use miden_protobuf::unwrap_infallible;
3pub use proto::asset::DecodedAssetClass as AssetClass;
4
5use crate::decoded::VerificationError;
6use crate::{Verify, proto};
7
8#[cfg(test)]
9mod tests;
10
11impl Verify for AssetClass {
12 type Verified = miden_protocol::asset::AssetClass;
13 type Error = core::convert::Infallible;
14 fn verify(self) -> Result<Self::Verified, Self::Error> {
15 Ok(Self::Verified::new(self.suffix, self.prefix))
16 }
17}
18
19pub use proto::asset::DecodedAssetId as AssetId;
20
21impl Verify for AssetId {
22 type Verified = miden_protocol::asset::AssetId;
23 type Error = VerificationError;
24 fn verify(self) -> Result<Self::Verified, Self::Error> {
25 use miden_protocol::asset::AssetComposition;
26 use proto::asset::asset_id::DecodedComposition;
27
28 match self.version {
29 proto::asset::AssetVersion::V1 => {},
30 proto::asset::AssetVersion::Unspecified => {
31 return Err(AssetIdError::UnspecifiedVersion.into());
32 },
33 }
34 let faucet_id = self.faucet_id.verify()?;
35 match self.composition {
36 DecodedComposition::Fungible(()) => Ok(Self::Verified::new_fungible(faucet_id)),
37 DecodedComposition::NonFungible(asset_class) => Ok(Self::Verified::new(
38 unwrap_infallible(asset_class.verify()),
39 faucet_id,
40 AssetComposition::None,
41 )?),
42 DecodedComposition::Custom(asset_class) => Ok(Self::Verified::new(
43 unwrap_infallible(asset_class.verify()),
44 faucet_id,
45 AssetComposition::Custom,
46 )?),
47 }
48 }
49}
50#[derive(Debug, thiserror::Error)]
51pub enum AssetIdError {
52 #[error("asset id version is unspecified")]
53 UnspecifiedVersion,
54}
55
56pub use proto::asset::DecodedAsset as Asset;
57
58impl Verify for Asset {
59 type Verified = miden_protocol::asset::Asset;
60 type Error = VerificationError;
61 fn verify(self) -> Result<Self::Verified, Self::Error> {
62 Ok(Self::Verified::new(self.asset_id.verify()?, self.value)?)
63 }
64}
65
66pub use proto::asset::DecodedAssetVault as AssetVault;
67
68impl Verify for AssetVault {
69 type Verified = miden_protocol::asset::AssetVault;
70 type Error = VerificationError;
71 fn verify(self) -> Result<Self::Verified, Self::Error> {
72 let assets = self.assets.verify()?;
73 if let Some(asset) = assets.iter().find(|asset| asset.to_value_word().is_empty()) {
76 return Err(AssetVaultEntryError::EmptyValue(asset.id()).into());
77 }
78 Ok(Self::Verified::new(&assets)?)
79 }
80}
81
82#[derive(Debug, thiserror::Error)]
84pub enum AssetVaultEntryError {
85 #[error("asset {0} has an empty value word")]
86 EmptyValue(miden_protocol::asset::AssetId),
87}