Skip to main content

iota_json_rpc_types/
iota_owner.rs

1// Copyright (c) 2026 IOTA Stiftung
2// SPDX-License-Identifier: Apache-2.0
3
4use iota_sdk_types::{ObjectId, Owner};
5use iota_types::base_types::{IotaAddress, SequenceNumber};
6use schemars::JsonSchema;
7use serde::{Deserialize, Serialize};
8use serde_with::{DeserializeAs, SerializeAs, serde_as};
9
10use crate::iota_primitives::{
11    IotaAddress as IotaAddressSchema, SequenceNumberU64 as SequenceNumberU64Schema,
12};
13
14/// Enum of different types of ownership for an object.
15///
16/// # BCS
17///
18/// The BCS serialized form for this type is defined by the following ABNF:
19///
20/// ```text
21/// owner = owner-address / owner-object / owner-shared / owner-immutable
22///
23/// owner-address   = %x00 address
24/// owner-object    = %x01 object-id
25/// owner-shared    = %x02 u64
26/// owner-immutable = %x03
27/// ```
28#[serde_as]
29#[derive(Serialize, Deserialize, JsonSchema)]
30#[serde(rename = "Owner")]
31pub enum OwnerSchema {
32    /// Object is exclusively owned by a single address, and is mutable.
33    #[schemars(with = "IotaAddressSchema")]
34    AddressOwner(#[serde_as(as = "IotaAddressSchema")] IotaAddress),
35    /// Object is exclusively owned by a single object, and is mutable.
36    /// The object ID is converted to IotaAddress as IotaAddress is
37    /// universal.
38    #[schemars(with = "IotaAddressSchema")]
39    ObjectOwner(#[serde_as(as = "IotaAddressSchema")] IotaAddress),
40    /// Object is shared, can be used by any address, and is mutable.
41    Shared {
42        /// The version at which the object became shared
43        #[serde_as(as = "SequenceNumberU64Schema")]
44        #[schemars(with = "SequenceNumberU64Schema")]
45        initial_shared_version: SequenceNumber,
46    },
47    /// Object is immutable, and hence ownership doesn't matter.
48    Immutable,
49}
50
51impl SerializeAs<Owner> for OwnerSchema {
52    fn serialize_as<S>(source: &Owner, serializer: S) -> Result<S::Ok, S::Error>
53    where
54        S: serde::Serializer,
55    {
56        OwnerSchema::from(*source).serialize(serializer)
57    }
58}
59
60impl<'de> DeserializeAs<'de, Owner> for OwnerSchema {
61    fn deserialize_as<D>(deserializer: D) -> Result<Owner, D::Error>
62    where
63        D: serde::Deserializer<'de>,
64    {
65        let iota_owner = OwnerSchema::deserialize(deserializer)?;
66        Ok(Owner::from(iota_owner))
67    }
68}
69
70impl std::fmt::Display for OwnerSchema {
71    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
72        match self {
73            Self::AddressOwner(address) => {
74                write!(f, "Account Address ( {address} )")
75            }
76            Self::ObjectOwner(address) => {
77                write!(f, "Object ID: ( {address} )")
78            }
79            Self::Immutable => {
80                write!(f, "Immutable")
81            }
82            Self::Shared {
83                initial_shared_version,
84            } => {
85                write!(f, "Shared( {initial_shared_version} )")
86            }
87        }
88    }
89}
90
91impl From<Owner> for OwnerSchema {
92    fn from(value: Owner) -> Self {
93        match value {
94            Owner::Address(address) => OwnerSchema::AddressOwner(address),
95            Owner::Object(object_id) => OwnerSchema::ObjectOwner(*object_id.as_address()),
96            Owner::Shared(initial_shared_version) => OwnerSchema::Shared {
97                initial_shared_version,
98            },
99            Owner::Immutable => OwnerSchema::Immutable,
100            _ => unimplemented!("a new Owner enum variant was added and needs to be handled"),
101        }
102    }
103}
104
105impl From<OwnerSchema> for Owner {
106    fn from(value: OwnerSchema) -> Self {
107        match value {
108            OwnerSchema::AddressOwner(address) => Owner::Address(address),
109            OwnerSchema::ObjectOwner(address) => Owner::Object(ObjectId::from(address)),
110            OwnerSchema::Shared {
111                initial_shared_version,
112            } => Owner::Shared(initial_shared_version),
113            OwnerSchema::Immutable => Owner::Immutable,
114        }
115    }
116}