iota_types/timelock/
timelocked_staked_iota.rs1use iota_sdk_types::{ObjectData, ObjectId};
5use serde::{Deserialize, Serialize};
6
7use crate::{
8 committee::EpochId, error::IotaError, governance::StakedIota, id::UID, object::Object,
9};
10
11#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
14pub struct TimelockedStakedIota {
15 id: UID,
16 staked_iota: StakedIota,
18 expiration_timestamp_ms: u64,
20 label: Option<String>,
22}
23
24impl TimelockedStakedIota {
25 pub fn id(&self) -> ObjectId {
27 self.id.id.bytes
28 }
29
30 pub fn pool_id(&self) -> ObjectId {
32 self.staked_iota.pool_id()
33 }
34
35 pub fn activation_epoch(&self) -> EpochId {
37 self.staked_iota.activation_epoch()
38 }
39
40 pub fn request_epoch(&self) -> EpochId {
42 self.staked_iota.activation_epoch().saturating_sub(1)
44 }
45
46 pub fn principal(&self) -> u64 {
48 self.staked_iota.principal()
49 }
50
51 pub fn expiration_timestamp_ms(&self) -> u64 {
53 self.expiration_timestamp_ms
54 }
55
56 pub fn label(&self) -> &Option<String> {
58 &self.label
59 }
60}
61
62impl TryFrom<&Object> for TimelockedStakedIota {
63 type Error = IotaError;
64 fn try_from(object: &Object) -> Result<Self, Self::Error> {
65 match &object.data {
66 ObjectData::Struct(o) => {
67 if o.struct_tag().is_timelocked_staked_iota() {
68 return bcs::from_bytes(o.contents()).map_err(|err| IotaError::Type {
69 error: format!(
70 "Unable to deserialize TimelockedStakedIota object: {err:?}"
71 ),
72 });
73 }
74 }
75 ObjectData::Package(_) => {}
76 }
77
78 Err(IotaError::Type {
79 error: format!("Object type is not a TimelockedStakedIota: {object:?}"),
80 })
81 }
82}