1use 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#[serde_as]
16#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, PartialEq, Eq)]
17#[serde(rename_all = "camelCase", tag = "type")]
18pub enum ObjectChange {
19 #[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 #[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 #[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 #[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 #[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 #[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}