iota_types/stardust/output/
basic.rs1use anyhow::Result;
8use iota_sdk_types::{Address, Identifier, ObjectData, StructTag, TypeTag};
9use serde::{Deserialize, Serialize};
10use serde_with::serde_as;
11
12use super::unlock_conditions::{
13 ExpirationUnlockCondition, StorageDepositReturnUnlockCondition, TimelockUnlockCondition,
14};
15use crate::{balance::Balance, collection_types::Bag, error::IotaError, id::UID, object::Object};
16
17pub const BASIC_OUTPUT_MODULE_NAME: Identifier = Identifier::from_static("basic_output");
18pub const BASIC_OUTPUT_STRUCT_NAME: Identifier = Identifier::from_static("BasicOutput");
19
20#[serde_as]
22#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
23pub struct BasicOutput {
24 pub id: UID,
26
27 pub balance: Balance,
29
30 pub native_tokens: Bag,
34
35 pub storage_deposit_return: Option<StorageDepositReturnUnlockCondition>,
37 pub timelock: Option<TimelockUnlockCondition>,
39 pub expiration: Option<ExpirationUnlockCondition>,
41
42 pub metadata: Option<Vec<u8>>,
46 pub tag: Option<Vec<u8>>,
48 pub sender: Option<Address>,
50}
51
52impl BasicOutput {
53 pub fn tag(type_param: TypeTag) -> StructTag {
55 StructTag::new(
56 Address::STARDUST,
57 BASIC_OUTPUT_MODULE_NAME,
58 BASIC_OUTPUT_STRUCT_NAME,
59 vec![type_param],
60 )
61 }
62
63 pub fn from_bcs_bytes(content: &[u8]) -> Result<Self, IotaError> {
65 bcs::from_bytes(content).map_err(|err| IotaError::ObjectDeserialization {
66 error: format!("Unable to deserialize BasicOutput object: {err:?}"),
67 })
68 }
69
70 pub fn is_basic_output(s: &StructTag) -> bool {
72 s.address() == Address::STARDUST
73 && s.module() == &BASIC_OUTPUT_MODULE_NAME
74 && s.name() == &BASIC_OUTPUT_STRUCT_NAME
75 }
76}
77
78impl TryFrom<&Object> for BasicOutput {
79 type Error = IotaError;
80 fn try_from(object: &Object) -> Result<Self, Self::Error> {
81 match &object.data {
82 ObjectData::Struct(o) => {
83 if BasicOutput::is_basic_output(o.struct_tag()) {
84 return BasicOutput::from_bcs_bytes(o.contents());
85 }
86 }
87 ObjectData::Package(_) => {}
88 }
89
90 Err(IotaError::Type {
91 error: format!("Object type is not a BasicOutput: {object:?}"),
92 })
93 }
94}