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