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 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
13/// A marker that signifies the object is deleted.
14const OBJECT_DIGEST_DELETED: Digest = Digest::new([99; 32]);
15
16/// A marker that signifies the object is wrapped into another object.
17const OBJECT_DIGEST_WRAPPED: Digest = Digest::new([88; 32]);
18
19/// ObjectChange are derived from the object mutations in the TransactionEffect to provide richer object information.
20#[serde_as]
21#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
22#[serde(rename_all = "camelCase", tag = "type")]
23pub enum ObjectChange {
24    /// Module published
25    #[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    /// Transfer objects to new address / wrap in another object
34    #[serde(rename_all = "camelCase")]
35    Transferred {
36        sender: Address,
37        recipient: Owner,
38        // #[serde_as(as = "SuiStructTag")]
39        #[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    /// Object mutated.
47    #[serde(rename_all = "camelCase")]
48    Mutated {
49        sender: Address,
50        owner: Owner,
51        // #[serde_as(as = "SuiStructTag")]
52        #[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    /// Delete object
62    #[serde(rename_all = "camelCase")]
63    Deleted {
64        sender: Address,
65        // #[serde_as(as = "SuiStructTag")]
66        #[serde_as(as = "DisplayFromStr")]
67        object_type: StructTag,
68        object_id: Address,
69        #[serde_as(as = "BigInt<u64>")]
70        version: Version,
71    },
72    /// Wrapped object
73    #[serde(rename_all = "camelCase")]
74    Wrapped {
75        sender: Address,
76        // #[serde_as(as = "SuiStructTag")]
77        #[serde_as(as = "DisplayFromStr")]
78        object_type: StructTag,
79        object_id: Address,
80        #[serde_as(as = "BigInt<u64>")]
81        version: Version,
82    },
83    /// New object creation
84    #[serde(rename_all = "camelCase")]
85    Created {
86        sender: Address,
87        owner: Owner,
88        // #[serde_as(as = "SuiStructTag")]
89        #[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}