iota_types/stardust/output/
basic.rs1use anyhow::Result;
8use iota_sdk_move_types::{
9 iota_framework::{bag::Bag, object::UID},
10 stardust::{
11 expiration_unlock_condition::ExpirationUnlockCondition,
12 storage_deposit_return_unlock_condition::StorageDepositReturnUnlockCondition,
13 timelock_unlock_condition::TimelockUnlockCondition,
14 },
15};
16use iota_sdk_types::{Address, Identifier, StructTag};
17use serde::{Deserialize, Serialize};
18use serde_with::serde_as;
19
20use crate::{balance::Balance, error::IotaError, object::Object};
21
22pub const BASIC_OUTPUT_MODULE_NAME: Identifier = Identifier::from_static("basic_output");
23pub const BASIC_OUTPUT_STRUCT_NAME: Identifier = Identifier::from_static("BasicOutput");
24
25#[serde_as]
27#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
28pub struct BasicOutput {
29 pub id: UID,
31
32 pub balance: Balance,
34
35 pub native_tokens: Bag,
39
40 pub storage_deposit_return: Option<StorageDepositReturnUnlockCondition>,
42 pub timelock: Option<TimelockUnlockCondition>,
44 pub expiration: Option<ExpirationUnlockCondition>,
46
47 pub metadata: Option<Vec<u8>>,
51 pub tag: Option<Vec<u8>>,
53 pub sender: Option<Address>,
55}
56
57impl BasicOutput {
58 pub fn from_bcs_bytes(content: &[u8]) -> Result<Self, IotaError> {
60 bcs::from_bytes(content).map_err(|err| IotaError::ObjectDeserialization {
61 error: format!("Unable to deserialize BasicOutput object: {err:?}"),
62 })
63 }
64
65 pub fn is_basic_output(s: &StructTag) -> bool {
67 s.address() == Address::STARDUST
68 && s.module() == &BASIC_OUTPUT_MODULE_NAME
69 && s.name() == &BASIC_OUTPUT_STRUCT_NAME
70 }
71}
72
73impl TryFrom<&Object> for BasicOutput {
74 type Error = IotaError;
75 fn try_from(object: &Object) -> Result<Self, Self::Error> {
76 if let Some(o) = object.data.as_opt_struct() {
77 if BasicOutput::is_basic_output(o.struct_tag()) {
78 return BasicOutput::from_bcs_bytes(o.contents());
79 }
80 }
81
82 Err(IotaError::Type {
83 error: format!("Object type is not a BasicOutput: {object:?}"),
84 })
85 }
86}