iota_json_rpc_types/
object_changes.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5use std::fmt::{Display, Formatter, Result};
6
7use iota_types::{
8    base_types::{IotaAddress, ObjectDigest, ObjectID, ObjectRef, SequenceNumber},
9    iota_serde::{IotaStructTag, SequenceNumber as AsSequenceNumber},
10    object::Owner,
11};
12use move_core_types::language_storage::StructTag;
13use schemars::JsonSchema;
14use serde::{Deserialize, Serialize};
15use serde_with::serde_as;
16
17/// ObjectChange are derived from the object mutations in the TransactionEffect
18/// to provide richer object information.
19#[serde_as]
20#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, PartialEq, Eq)]
21#[serde(rename_all = "camelCase", tag = "type")]
22pub enum ObjectChange {
23    /// Module published
24    #[serde(rename_all = "camelCase")]
25    Published {
26        package_id: ObjectID,
27        #[schemars(with = "AsSequenceNumber")]
28        #[serde_as(as = "AsSequenceNumber")]
29        version: SequenceNumber,
30        digest: ObjectDigest,
31        modules: Vec<String>,
32    },
33    /// Transfer objects to new address / wrap in another object
34    #[serde(rename_all = "camelCase")]
35    Transferred {
36        sender: IotaAddress,
37        recipient: Owner,
38        #[schemars(with = "String")]
39        #[serde_as(as = "IotaStructTag")]
40        object_type: StructTag,
41        object_id: ObjectID,
42        #[schemars(with = "AsSequenceNumber")]
43        #[serde_as(as = "AsSequenceNumber")]
44        version: SequenceNumber,
45        digest: ObjectDigest,
46    },
47    /// Object mutated.
48    #[serde(rename_all = "camelCase")]
49    Mutated {
50        sender: IotaAddress,
51        owner: Owner,
52        #[schemars(with = "String")]
53        #[serde_as(as = "IotaStructTag")]
54        object_type: StructTag,
55        object_id: ObjectID,
56        #[schemars(with = "AsSequenceNumber")]
57        #[serde_as(as = "AsSequenceNumber")]
58        version: SequenceNumber,
59        #[schemars(with = "AsSequenceNumber")]
60        #[serde_as(as = "AsSequenceNumber")]
61        previous_version: SequenceNumber,
62        digest: ObjectDigest,
63    },
64    /// Delete object
65    #[serde(rename_all = "camelCase")]
66    Deleted {
67        sender: IotaAddress,
68        #[schemars(with = "String")]
69        #[serde_as(as = "IotaStructTag")]
70        object_type: StructTag,
71        object_id: ObjectID,
72        #[schemars(with = "AsSequenceNumber")]
73        #[serde_as(as = "AsSequenceNumber")]
74        version: SequenceNumber,
75    },
76    /// Wrapped object
77    #[serde(rename_all = "camelCase")]
78    Wrapped {
79        sender: IotaAddress,
80        #[schemars(with = "String")]
81        #[serde_as(as = "IotaStructTag")]
82        object_type: StructTag,
83        object_id: ObjectID,
84        #[schemars(with = "AsSequenceNumber")]
85        #[serde_as(as = "AsSequenceNumber")]
86        version: SequenceNumber,
87    },
88    /// New object creation
89    #[serde(rename_all = "camelCase")]
90    Created {
91        sender: IotaAddress,
92        owner: Owner,
93        #[schemars(with = "String")]
94        #[serde_as(as = "IotaStructTag")]
95        object_type: StructTag,
96        object_id: ObjectID,
97        #[schemars(with = "AsSequenceNumber")]
98        #[serde_as(as = "AsSequenceNumber")]
99        version: SequenceNumber,
100        digest: ObjectDigest,
101    },
102}
103
104impl ObjectChange {
105    pub fn object_id(&self) -> ObjectID {
106        match self {
107            ObjectChange::Published { package_id, .. } => *package_id,
108            ObjectChange::Transferred { object_id, .. }
109            | ObjectChange::Mutated { object_id, .. }
110            | ObjectChange::Deleted { object_id, .. }
111            | ObjectChange::Wrapped { object_id, .. }
112            | ObjectChange::Created { object_id, .. } => *object_id,
113        }
114    }
115
116    pub fn object_ref(&self) -> ObjectRef {
117        match self {
118            ObjectChange::Published {
119                package_id,
120                version,
121                digest,
122                ..
123            } => (*package_id, *version, *digest),
124            ObjectChange::Transferred {
125                object_id,
126                version,
127                digest,
128                ..
129            }
130            | ObjectChange::Mutated {
131                object_id,
132                version,
133                digest,
134                ..
135            }
136            | ObjectChange::Created {
137                object_id,
138                version,
139                digest,
140                ..
141            } => (*object_id, *version, *digest),
142            ObjectChange::Deleted {
143                object_id, version, ..
144            } => (*object_id, *version, ObjectDigest::OBJECT_DIGEST_DELETED),
145            ObjectChange::Wrapped {
146                object_id, version, ..
147            } => (*object_id, *version, ObjectDigest::OBJECT_DIGEST_WRAPPED),
148        }
149    }
150
151    pub fn mask_for_test(&mut self, new_version: SequenceNumber, new_digest: ObjectDigest) {
152        match self {
153            ObjectChange::Published {
154                version, digest, ..
155            }
156            | ObjectChange::Transferred {
157                version, digest, ..
158            }
159            | ObjectChange::Mutated {
160                version, digest, ..
161            }
162            | ObjectChange::Created {
163                version, digest, ..
164            } => {
165                *version = new_version;
166                *digest = new_digest
167            }
168            ObjectChange::Deleted { version, .. } | ObjectChange::Wrapped { version, .. } => {
169                *version = new_version
170            }
171        }
172    }
173}
174
175impl Display for ObjectChange {
176    fn fmt(&self, f: &mut Formatter) -> Result {
177        match self {
178            ObjectChange::Published {
179                package_id,
180                version,
181                digest,
182                modules,
183            } => {
184                write!(
185                    f,
186                    " ┌──\n │ PackageID: {} \n │ Version: {} \n │ Digest: {}\n │ Modules: {}\n └──",
187                    package_id,
188                    u64::from(*version),
189                    digest,
190                    modules.join(", ")
191                )
192            }
193            ObjectChange::Transferred {
194                sender,
195                recipient,
196                object_type,
197                object_id,
198                version,
199                digest,
200            } => {
201                write!(
202                    f,
203                    " ┌──\n │ ObjectID: {}\n │ Sender: {} \n │ Recipient: {}\n │ ObjectType: {} \n │ Version: {}\n │ Digest: {}\n └──",
204                    object_id,
205                    sender,
206                    recipient,
207                    object_type,
208                    u64::from(*version),
209                    digest
210                )
211            }
212            ObjectChange::Mutated {
213                sender,
214                owner,
215                object_type,
216                object_id,
217                version,
218                previous_version: _,
219                digest,
220            } => {
221                write!(
222                    f,
223                    " ┌──\n │ ObjectID: {}\n │ Sender: {} \n │ Owner: {}\n │ ObjectType: {} \n │ Version: {}\n │ Digest: {}\n └──",
224                    object_id,
225                    sender,
226                    owner,
227                    object_type,
228                    u64::from(*version),
229                    digest
230                )
231            }
232            ObjectChange::Deleted {
233                sender,
234                object_type,
235                object_id,
236                version,
237            } => {
238                write!(
239                    f,
240                    " ┌──\n │ ObjectID: {}\n │ Sender: {} \n │ ObjectType: {} \n │ Version: {}\n └──",
241                    object_id,
242                    sender,
243                    object_type,
244                    u64::from(*version)
245                )
246            }
247            ObjectChange::Wrapped {
248                sender,
249                object_type,
250                object_id,
251                version,
252            } => {
253                write!(
254                    f,
255                    " ┌──\n │ ObjectID: {}\n │ Sender: {} \n │ ObjectType: {} \n │ Version: {}\n └──",
256                    object_id,
257                    sender,
258                    object_type,
259                    u64::from(*version)
260                )
261            }
262            ObjectChange::Created {
263                sender,
264                owner,
265                object_type,
266                object_id,
267                version,
268                digest,
269            } => {
270                write!(
271                    f,
272                    " ┌──\n │ ObjectID: {}\n │ Sender: {} \n │ Owner: {}\n │ ObjectType: {} \n │ Version: {}\n │ Digest: {}\n └──",
273                    object_id,
274                    sender,
275                    owner,
276                    object_type,
277                    u64::from(*version),
278                    digest
279                )
280            }
281        }
282    }
283}