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