sui_sdk_types/effects/
v1.rs

1use crate::execution_status::ExecutionStatus;
2use crate::object::Owner;
3use crate::object::Version;
4use crate::EpochId;
5use crate::GasCostSummary;
6use crate::ObjectId;
7use crate::ObjectReference;
8use crate::TransactionDigest;
9use crate::TransactionEventsDigest;
10
11/// Version 1 of TransactionEffects
12///
13/// # BCS
14///
15/// The BCS serialized form for this type is defined by the following ABNF:
16///
17/// ```text
18/// effects-v1 = execution-status
19///              u64                            ; epoch
20///              gas-cost-summary
21///              (vector modified-at-version)
22///              (vector object-ref)            ; shared object references
23///              digest                         ; transaction digest
24///              (vector object-ref-with-owner) ; created objects
25///              (vector object-ref-with-owner) ; mutated objects
26///              (vector object-ref-with-owner) ; unwrapped objects
27///              (vector object-ref)            ; deleted objects
28///              (vector object-ref)            ; unwrapped then deleted objects
29///              (vector object-ref)            ; wrapped objects
30///              object-ref-with-owner          ; gas object
31///              (option digest)                ; events digest
32///              (vector digest)                ; list of transaction dependencies
33/// ```
34#[derive(Eq, PartialEq, Clone, Debug)]
35#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
36pub struct TransactionEffectsV1 {
37    /// The status of the execution
38    pub status: ExecutionStatus,
39
40    /// The epoch when this transaction was executed.
41    pub epoch: EpochId,
42
43    /// The gas used by this transaction
44    pub gas_used: GasCostSummary,
45
46    /// The version that every modified (mutated or deleted) object had before it was modified by
47    /// this transaction.
48    #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
49    pub modified_at_versions: Vec<ModifiedAtVersion>,
50
51    /// The object references of the shared objects used in this transaction. Empty if no shared objects were used.
52    #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
53    pub shared_objects: Vec<ObjectReference>,
54
55    /// The transaction digest
56    pub transaction_digest: TransactionDigest,
57
58    /// ObjectReference and owner of new objects created.
59    #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
60    pub created: Vec<ObjectReferenceWithOwner>,
61
62    /// ObjectReference and owner of mutated objects, including gas object.
63    #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
64    pub mutated: Vec<ObjectReferenceWithOwner>,
65
66    /// ObjectReference and owner of objects that are unwrapped in this transaction.
67    /// Unwrapped objects are objects that were wrapped into other objects in the past,
68    /// and just got extracted out.
69    #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
70    pub unwrapped: Vec<ObjectReferenceWithOwner>,
71
72    /// Object Refs of objects now deleted (the new refs).
73    #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
74    pub deleted: Vec<ObjectReference>,
75
76    /// Object refs of objects previously wrapped in other objects but now deleted.
77    #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
78    pub unwrapped_then_deleted: Vec<ObjectReference>,
79
80    /// Object refs of objects now wrapped in other objects.
81    #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
82    pub wrapped: Vec<ObjectReference>,
83
84    /// The updated gas object reference. Have a dedicated field for convenient access.
85    /// It's also included in mutated.
86    pub gas_object: ObjectReferenceWithOwner,
87
88    /// The digest of the events emitted during execution,
89    /// can be None if the transaction does not emit any event.
90    pub events_digest: Option<TransactionEventsDigest>,
91
92    /// The set of transaction digests this transaction depends on.
93    #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
94    pub dependencies: Vec<TransactionDigest>,
95}
96
97/// Indicates that an Object was modified at a specific version
98///
99/// # BCS
100///
101/// The BCS serialized form for this type is defined by the following ABNF:
102///
103/// ```text
104/// modified-at-version = object-id u64
105/// ```
106#[derive(Eq, PartialEq, Clone, Debug)]
107#[cfg_attr(
108    feature = "serde",
109    derive(serde_derive::Serialize, serde_derive::Deserialize)
110)]
111#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
112pub struct ModifiedAtVersion {
113    pub object_id: ObjectId,
114    #[cfg_attr(feature = "serde", serde(with = "crate::_serde::ReadableDisplay"))]
115    pub version: Version,
116}
117
118/// An object reference with owner information
119///
120/// # BCS
121///
122/// The BCS serialized form for this type is defined by the following ABNF:
123///
124/// ```text
125/// object-ref-with-owner = object-ref owner
126/// ```
127#[derive(Eq, PartialEq, Clone, Debug)]
128#[cfg_attr(
129    feature = "serde",
130    derive(serde_derive::Serialize, serde_derive::Deserialize)
131)]
132#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
133pub struct ObjectReferenceWithOwner {
134    pub reference: ObjectReference,
135    pub owner: Owner,
136}
137
138impl TransactionEffectsV1 {
139    /// The status of the execution
140    pub fn status(&self) -> &ExecutionStatus {
141        &self.status
142    }
143
144    /// The epoch when this transaction was executed.
145    pub fn epoch(&self) -> EpochId {
146        self.epoch
147    }
148
149    /// The gas used in this transaction.
150    pub fn gas_summary(&self) -> &GasCostSummary {
151        &self.gas_used
152    }
153}
154
155#[cfg(feature = "serde")]
156#[cfg_attr(doc_cfg, doc(cfg(feature = "serde")))]
157mod serialization {
158    use serde::Deserialize;
159    use serde::Deserializer;
160    use serde::Serialize;
161    use serde::Serializer;
162
163    use super::*;
164
165    #[derive(serde_derive::Serialize)]
166    struct ReadableTransactionEffectsV1Ref<'a> {
167        #[serde(flatten)]
168        status: &'a ExecutionStatus,
169        #[serde(with = "crate::_serde::ReadableDisplay")]
170        epoch: &'a EpochId,
171        gas_used: &'a GasCostSummary,
172        modified_at_versions: &'a Vec<ModifiedAtVersion>,
173        shared_objects: &'a Vec<ObjectReference>,
174        transaction_digest: &'a TransactionDigest,
175        created: &'a Vec<ObjectReferenceWithOwner>,
176        mutated: &'a Vec<ObjectReferenceWithOwner>,
177        unwrapped: &'a Vec<ObjectReferenceWithOwner>,
178        deleted: &'a Vec<ObjectReference>,
179        unwrapped_then_deleted: &'a Vec<ObjectReference>,
180        wrapped: &'a Vec<ObjectReference>,
181        gas_object: &'a ObjectReferenceWithOwner,
182        events_digest: &'a Option<TransactionEventsDigest>,
183        dependencies: &'a Vec<TransactionDigest>,
184    }
185
186    #[derive(serde_derive::Deserialize)]
187    struct ReadableTransactionEffectsV1 {
188        #[serde(flatten)]
189        status: ExecutionStatus,
190        #[serde(with = "crate::_serde::ReadableDisplay")]
191        epoch: EpochId,
192        gas_used: GasCostSummary,
193        modified_at_versions: Vec<ModifiedAtVersion>,
194        shared_objects: Vec<ObjectReference>,
195        transaction_digest: TransactionDigest,
196        created: Vec<ObjectReferenceWithOwner>,
197        mutated: Vec<ObjectReferenceWithOwner>,
198        unwrapped: Vec<ObjectReferenceWithOwner>,
199        deleted: Vec<ObjectReference>,
200        unwrapped_then_deleted: Vec<ObjectReference>,
201        wrapped: Vec<ObjectReference>,
202        gas_object: ObjectReferenceWithOwner,
203        events_digest: Option<TransactionEventsDigest>,
204        dependencies: Vec<TransactionDigest>,
205    }
206
207    #[derive(serde_derive::Serialize)]
208    struct BinaryTransactionEffectsV1Ref<'a> {
209        status: &'a ExecutionStatus,
210        epoch: &'a EpochId,
211        gas_used: &'a GasCostSummary,
212        modified_at_versions: &'a Vec<ModifiedAtVersion>,
213        shared_objects: &'a Vec<ObjectReference>,
214        transaction_digest: &'a TransactionDigest,
215        created: &'a Vec<ObjectReferenceWithOwner>,
216        mutated: &'a Vec<ObjectReferenceWithOwner>,
217        unwrapped: &'a Vec<ObjectReferenceWithOwner>,
218        deleted: &'a Vec<ObjectReference>,
219        unwrapped_then_deleted: &'a Vec<ObjectReference>,
220        wrapped: &'a Vec<ObjectReference>,
221        gas_object: &'a ObjectReferenceWithOwner,
222        events_digest: &'a Option<TransactionEventsDigest>,
223        dependencies: &'a Vec<TransactionDigest>,
224    }
225    #[derive(serde_derive::Deserialize)]
226    struct BinaryTransactionEffectsV1 {
227        status: ExecutionStatus,
228        epoch: EpochId,
229        gas_used: GasCostSummary,
230        modified_at_versions: Vec<ModifiedAtVersion>,
231        shared_objects: Vec<ObjectReference>,
232        transaction_digest: TransactionDigest,
233        created: Vec<ObjectReferenceWithOwner>,
234        mutated: Vec<ObjectReferenceWithOwner>,
235        unwrapped: Vec<ObjectReferenceWithOwner>,
236        deleted: Vec<ObjectReference>,
237        unwrapped_then_deleted: Vec<ObjectReference>,
238        wrapped: Vec<ObjectReference>,
239        gas_object: ObjectReferenceWithOwner,
240        events_digest: Option<TransactionEventsDigest>,
241        dependencies: Vec<TransactionDigest>,
242    }
243
244    impl Serialize for TransactionEffectsV1 {
245        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
246        where
247            S: Serializer,
248        {
249            let Self {
250                status,
251                epoch,
252                gas_used,
253                modified_at_versions,
254                shared_objects,
255                transaction_digest,
256                created,
257                mutated,
258                unwrapped,
259                deleted,
260                unwrapped_then_deleted,
261                wrapped,
262                gas_object,
263                events_digest,
264                dependencies,
265            } = self;
266            if serializer.is_human_readable() {
267                let readable = ReadableTransactionEffectsV1Ref {
268                    status,
269                    epoch,
270                    gas_used,
271                    modified_at_versions,
272                    shared_objects,
273                    transaction_digest,
274                    created,
275                    mutated,
276                    unwrapped,
277                    deleted,
278                    unwrapped_then_deleted,
279                    wrapped,
280                    gas_object,
281                    events_digest,
282                    dependencies,
283                };
284                readable.serialize(serializer)
285            } else {
286                let binary = BinaryTransactionEffectsV1Ref {
287                    status,
288                    epoch,
289                    gas_used,
290                    modified_at_versions,
291                    shared_objects,
292                    transaction_digest,
293                    created,
294                    mutated,
295                    unwrapped,
296                    deleted,
297                    unwrapped_then_deleted,
298                    wrapped,
299                    gas_object,
300                    events_digest,
301                    dependencies,
302                };
303                binary.serialize(serializer)
304            }
305        }
306    }
307
308    impl<'de> Deserialize<'de> for TransactionEffectsV1 {
309        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
310        where
311            D: Deserializer<'de>,
312        {
313            if deserializer.is_human_readable() {
314                let ReadableTransactionEffectsV1 {
315                    status,
316                    epoch,
317                    gas_used,
318                    modified_at_versions,
319                    shared_objects,
320                    transaction_digest,
321                    created,
322                    mutated,
323                    unwrapped,
324                    deleted,
325                    unwrapped_then_deleted,
326                    wrapped,
327                    gas_object,
328                    events_digest,
329                    dependencies,
330                } = Deserialize::deserialize(deserializer)?;
331                Ok(Self {
332                    status,
333                    epoch,
334                    gas_used,
335                    modified_at_versions,
336                    shared_objects,
337                    transaction_digest,
338                    created,
339                    mutated,
340                    unwrapped,
341                    deleted,
342                    unwrapped_then_deleted,
343                    wrapped,
344                    gas_object,
345                    events_digest,
346                    dependencies,
347                })
348            } else {
349                let BinaryTransactionEffectsV1 {
350                    status,
351                    epoch,
352                    gas_used,
353                    modified_at_versions,
354                    shared_objects,
355                    transaction_digest,
356                    created,
357                    mutated,
358                    unwrapped,
359                    deleted,
360                    unwrapped_then_deleted,
361                    wrapped,
362                    gas_object,
363                    events_digest,
364                    dependencies,
365                } = Deserialize::deserialize(deserializer)?;
366                Ok(Self {
367                    status,
368                    epoch,
369                    gas_used,
370                    modified_at_versions,
371                    shared_objects,
372                    transaction_digest,
373                    created,
374                    mutated,
375                    unwrapped,
376                    deleted,
377                    unwrapped_then_deleted,
378                    wrapped,
379                    gas_object,
380                    events_digest,
381                    dependencies,
382                })
383            }
384        }
385    }
386}