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#[derive(Eq, PartialEq, Clone, Debug)]
35#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
36pub struct TransactionEffectsV1 {
37 pub status: ExecutionStatus,
39
40 pub epoch: EpochId,
42
43 pub gas_used: GasCostSummary,
45
46 #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
49 pub modified_at_versions: Vec<ModifiedAtVersion>,
50
51 #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
53 pub shared_objects: Vec<ObjectReference>,
54
55 pub transaction_digest: TransactionDigest,
57
58 #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
60 pub created: Vec<ObjectReferenceWithOwner>,
61
62 #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
64 pub mutated: Vec<ObjectReferenceWithOwner>,
65
66 #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
70 pub unwrapped: Vec<ObjectReferenceWithOwner>,
71
72 #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
74 pub deleted: Vec<ObjectReference>,
75
76 #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
78 pub unwrapped_then_deleted: Vec<ObjectReference>,
79
80 #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
82 pub wrapped: Vec<ObjectReference>,
83
84 pub gas_object: ObjectReferenceWithOwner,
87
88 pub events_digest: Option<TransactionEventsDigest>,
91
92 #[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
94 pub dependencies: Vec<TransactionDigest>,
95}
96
97#[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#[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 pub fn status(&self) -> &ExecutionStatus {
141 &self.status
142 }
143
144 pub fn epoch(&self) -> EpochId {
146 self.epoch
147 }
148
149 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}