1use std::fmt::Display;
5
6use serde::{Deserialize, Serialize};
7use serde_with::{DisplayFromStr, serde_as};
8use sui_sdk_types::{Address, Digest, StructTag, Version};
9
10use crate::msgs::Owner;
11use crate::serde::BigInt;
12
13const OBJECT_DIGEST_DELETED: Digest = Digest::new([99; 32]);
15
16const OBJECT_DIGEST_WRAPPED: Digest = Digest::new([88; 32]);
18
19#[serde_as]
21#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
22#[serde(rename_all = "camelCase", tag = "type")]
23pub enum ObjectChange {
24 #[serde(rename_all = "camelCase")]
26 Published {
27 package_id: Address,
28 #[serde_as(as = "BigInt<u64>")]
29 version: Version,
30 digest: Digest,
31 modules: Vec<String>,
32 },
33 #[serde(rename_all = "camelCase")]
35 Transferred {
36 sender: Address,
37 recipient: Owner,
38 #[serde_as(as = "DisplayFromStr")]
40 object_type: StructTag,
41 object_id: Address,
42 #[serde_as(as = "BigInt<u64>")]
43 version: Version,
44 digest: Digest,
45 },
46 #[serde(rename_all = "camelCase")]
48 Mutated {
49 sender: Address,
50 owner: Owner,
51 #[serde_as(as = "DisplayFromStr")]
53 object_type: StructTag,
54 object_id: Address,
55 #[serde_as(as = "BigInt<u64>")]
56 version: Version,
57 #[serde_as(as = "BigInt<u64>")]
58 previous_version: Version,
59 digest: Digest,
60 },
61 #[serde(rename_all = "camelCase")]
63 Deleted {
64 sender: Address,
65 #[serde_as(as = "DisplayFromStr")]
67 object_type: StructTag,
68 object_id: Address,
69 #[serde_as(as = "BigInt<u64>")]
70 version: Version,
71 },
72 #[serde(rename_all = "camelCase")]
74 Wrapped {
75 sender: Address,
76 #[serde_as(as = "DisplayFromStr")]
78 object_type: StructTag,
79 object_id: Address,
80 #[serde_as(as = "BigInt<u64>")]
81 version: Version,
82 },
83 #[serde(rename_all = "camelCase")]
85 Created {
86 sender: Address,
87 owner: Owner,
88 #[serde_as(as = "DisplayFromStr")]
90 object_type: StructTag,
91 object_id: Address,
92 #[serde_as(as = "BigInt<u64>")]
93 version: Version,
94 digest: Digest,
95 },
96}
97
98impl ObjectChange {
99 pub fn object_id(&self) -> Address {
100 match self {
101 ObjectChange::Published { package_id, .. } => *package_id,
102 ObjectChange::Transferred { object_id, .. }
103 | ObjectChange::Mutated { object_id, .. }
104 | ObjectChange::Deleted { object_id, .. }
105 | ObjectChange::Wrapped { object_id, .. }
106 | ObjectChange::Created { object_id, .. } => *object_id,
107 }
108 }
109
110 pub fn object_ref(&self) -> (Address, Version, Digest) {
111 match self {
112 ObjectChange::Published {
113 package_id,
114 version,
115 digest,
116 ..
117 } => (*package_id, *version, *digest),
118 ObjectChange::Transferred {
119 object_id,
120 version,
121 digest,
122 ..
123 }
124 | ObjectChange::Mutated {
125 object_id,
126 version,
127 digest,
128 ..
129 }
130 | ObjectChange::Created {
131 object_id,
132 version,
133 digest,
134 ..
135 } => (*object_id, *version, *digest),
136 ObjectChange::Deleted {
137 object_id, version, ..
138 } => (*object_id, *version, OBJECT_DIGEST_DELETED),
139 ObjectChange::Wrapped {
140 object_id, version, ..
141 } => (*object_id, *version, OBJECT_DIGEST_WRAPPED),
142 }
143 }
144}
145
146impl Display for ObjectChange {
147 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
148 match self {
149 ObjectChange::Published {
150 package_id,
151 version,
152 digest,
153 modules,
154 } => {
155 write!(
156 f,
157 " ┌──\n │ PackageID: {} \n │ Version: {} \n │ Digest: {}\n │ Modules: {}\n └──",
158 package_id,
159 version,
160 digest,
161 modules.join(", ")
162 )
163 }
164 ObjectChange::Transferred {
165 sender,
166 recipient,
167 object_type,
168 object_id,
169 version,
170 digest,
171 } => {
172 write!(
173 f,
174 " ┌──\n │ Address: {}\n │ Sender: {} \n │ Recipient: {:?}\n │ ObjectType: {} \n │ Version: {}\n │ Digest: {}\n └──",
175 object_id, sender, recipient, object_type, version, digest
176 )
177 }
178 ObjectChange::Mutated {
179 sender,
180 owner,
181 object_type,
182 object_id,
183 version,
184 previous_version: _,
185 digest,
186 } => {
187 write!(
188 f,
189 " ┌──\n │ Address: {}\n │ Sender: {} \n │ Owner: {:?}\n │ ObjectType: {} \n │ Version: {}\n │ Digest: {}\n └──",
190 object_id, sender, owner, object_type, version, digest
191 )
192 }
193 ObjectChange::Deleted {
194 sender,
195 object_type,
196 object_id,
197 version,
198 } => {
199 write!(
200 f,
201 " ┌──\n │ Address: {}\n │ Sender: {} \n │ ObjectType: {} \n │ Version: {}\n └──",
202 object_id, sender, object_type, version
203 )
204 }
205 ObjectChange::Wrapped {
206 sender,
207 object_type,
208 object_id,
209 version,
210 } => {
211 write!(
212 f,
213 " ┌──\n │ Address: {}\n │ Sender: {} \n │ ObjectType: {} \n │ Version: {}\n └──",
214 object_id, sender, object_type, version
215 )
216 }
217 ObjectChange::Created {
218 sender,
219 owner,
220 object_type,
221 object_id,
222 version,
223 digest,
224 } => {
225 write!(
226 f,
227 " ┌──\n │ Address: {}\n │ Sender: {} \n │ Owner: {:?}\n │ ObjectType: {} \n │ Version: {}\n │ Digest: {}\n └──",
228 object_id, sender, owner, object_type, version, digest
229 )
230 }
231 }
232 }
233}