sui_jsonrpc/msgs/
object_changes.rs

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