Skip to main content

miden_objects/decoded/
asset.rs

1//! Domain construction for decoded asset messages.
2use 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}