sui_json_rpc_types/
object_changes.rs

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