1use super::*;
2use crate::field::FieldMaskTree;
3use crate::merge::Merge;
4use crate::proto::TryFromProtoError;
5use tap::Pipe;
6
7impl From<sui_sdk_types::Transaction> for Transaction {
12 fn from(value: sui_sdk_types::Transaction) -> Self {
13 Self::merge_from(value, &FieldMaskTree::new_wildcard())
14 }
15}
16
17impl Merge<sui_sdk_types::Transaction> for Transaction {
18 fn merge(&mut self, source: sui_sdk_types::Transaction, mask: &FieldMaskTree) {
19 if mask.contains(Self::BCS_FIELD.name) {
20 let mut bcs = Bcs::serialize(&source).unwrap();
21 bcs.name = Some("TransactionData".to_owned());
22 self.bcs = Some(bcs);
23 }
24
25 if mask.contains(Self::DIGEST_FIELD.name) {
26 self.digest = Some(source.digest().to_string());
27 }
28
29 if mask.contains(Self::VERSION_FIELD.name) {
30 self.version = Some(1);
31 }
32
33 if mask.contains(Self::KIND_FIELD.name) {
34 self.kind = Some(source.kind.into());
35 }
36
37 if mask.contains(Self::SENDER_FIELD.name) {
38 self.sender = Some(source.sender.to_string());
39 }
40
41 if mask.contains(Self::GAS_PAYMENT_FIELD.name) {
42 self.gas_payment = Some(source.gas_payment.into());
43 }
44
45 if mask.contains(Self::EXPIRATION_FIELD.name) {
46 self.expiration = Some(source.expiration.into());
47 }
48 }
49}
50
51impl Merge<&Transaction> for Transaction {
52 fn merge(&mut self, source: &Transaction, mask: &FieldMaskTree) {
53 let Transaction {
54 bcs,
55 digest,
56 version,
57 kind,
58 sender,
59 gas_payment,
60 expiration,
61 } = source;
62
63 if mask.contains(Self::BCS_FIELD.name) {
64 self.bcs = bcs.clone();
65 }
66
67 if mask.contains(Self::DIGEST_FIELD.name) {
68 self.digest = digest.clone();
69 }
70
71 if mask.contains(Self::VERSION_FIELD.name) {
72 self.version = *version;
73 }
74
75 if mask.contains(Self::KIND_FIELD.name) {
76 self.kind = kind.clone();
77 }
78
79 if mask.contains(Self::SENDER_FIELD.name) {
80 self.sender = sender.clone();
81 }
82
83 if mask.contains(Self::GAS_PAYMENT_FIELD.name) {
84 self.gas_payment = gas_payment.clone();
85 }
86
87 if mask.contains(Self::EXPIRATION_FIELD.name) {
88 self.expiration = *expiration;
89 }
90 }
91}
92
93impl TryFrom<&Transaction> for sui_sdk_types::Transaction {
94 type Error = TryFromProtoError;
95
96 fn try_from(value: &Transaction) -> Result<Self, Self::Error> {
97 if let Some(bcs) = &value.bcs {
98 return bcs
99 .deserialize()
100 .map_err(|e| TryFromProtoError::invalid(Transaction::BCS_FIELD, e));
101 }
102
103 match value.version {
104 Some(1) => {}
105 v => {
106 return Err(TryFromProtoError::invalid(
107 Transaction::VERSION_FIELD,
108 format!("unknown Transaction version {v:?}"),
109 ));
110 }
111 }
112
113 let kind = value
114 .kind
115 .as_ref()
116 .ok_or_else(|| TryFromProtoError::missing("kind"))?
117 .try_into()?;
118
119 let sender = value
120 .sender
121 .as_ref()
122 .ok_or_else(|| TryFromProtoError::missing("sender"))?
123 .parse()
124 .map_err(|e| TryFromProtoError::invalid(Transaction::SENDER_FIELD, e))?;
125
126 let gas_payment = value
127 .gas_payment
128 .as_ref()
129 .ok_or_else(|| TryFromProtoError::missing("gas_payment"))?
130 .try_into()?;
131
132 let expiration = value
133 .expiration
134 .as_ref()
135 .ok_or_else(|| TryFromProtoError::missing("expiration"))?
136 .try_into()?;
137
138 Ok(Self {
139 kind,
140 sender,
141 gas_payment,
142 expiration,
143 })
144 }
145}
146
147impl From<sui_sdk_types::GasPayment> for GasPayment {
152 fn from(value: sui_sdk_types::GasPayment) -> Self {
153 Self {
154 objects: value.objects.into_iter().map(Into::into).collect(),
155 owner: Some(value.owner.to_string()),
156 price: Some(value.price),
157 budget: Some(value.budget),
158 }
159 }
160}
161
162impl TryFrom<&GasPayment> for sui_sdk_types::GasPayment {
163 type Error = TryFromProtoError;
164
165 fn try_from(value: &GasPayment) -> Result<Self, Self::Error> {
166 let objects = value
167 .objects
168 .iter()
169 .map(TryInto::try_into)
170 .collect::<Result<_, _>>()?;
171
172 let owner = value
173 .owner
174 .as_ref()
175 .ok_or_else(|| TryFromProtoError::missing("owner"))?
176 .parse()
177 .map_err(|e| TryFromProtoError::invalid(GasPayment::OWNER_FIELD, e))?;
178 let price = value
179 .price
180 .ok_or_else(|| TryFromProtoError::missing("price"))?;
181 let budget = value
182 .budget
183 .ok_or_else(|| TryFromProtoError::missing("budget"))?;
184 Ok(Self {
185 objects,
186 owner,
187 price,
188 budget,
189 })
190 }
191}
192
193impl From<sui_sdk_types::TransactionExpiration> for TransactionExpiration {
198 fn from(value: sui_sdk_types::TransactionExpiration) -> Self {
199 use sui_sdk_types::TransactionExpiration::*;
200 use transaction_expiration::TransactionExpirationKind;
201
202 let mut message = Self::default();
203
204 let kind = match value {
205 None => TransactionExpirationKind::None,
206 Epoch(epoch) => {
207 message.epoch = Some(epoch);
208 TransactionExpirationKind::Epoch
209 }
210 _ => TransactionExpirationKind::Unknown,
211 };
212
213 message.set_kind(kind);
214 message
215 }
216}
217
218impl TryFrom<&TransactionExpiration> for sui_sdk_types::TransactionExpiration {
219 type Error = TryFromProtoError;
220
221 fn try_from(value: &TransactionExpiration) -> Result<Self, Self::Error> {
222 use transaction_expiration::TransactionExpirationKind;
223
224 match value.kind() {
225 TransactionExpirationKind::Unknown => {
226 return Err(TryFromProtoError::invalid(
227 TransactionExpiration::KIND_FIELD,
228 "unknown TransactionExpirationKind",
229 ));
230 }
231 TransactionExpirationKind::None => Self::None,
232 TransactionExpirationKind::Epoch => Self::Epoch(value.epoch()),
233 }
234 .pipe(Ok)
235 }
236}
237
238impl From<ProgrammableTransaction> for TransactionKind {
243 fn from(value: ProgrammableTransaction) -> Self {
244 Self::default()
245 .with_programmable_transaction(value)
246 .with_kind(transaction_kind::Kind::ProgrammableTransaction)
247 }
248}
249
250impl From<sui_sdk_types::TransactionKind> for TransactionKind {
251 fn from(value: sui_sdk_types::TransactionKind) -> Self {
252 use sui_sdk_types::TransactionKind as K;
253 use transaction_kind::Kind;
254
255 let message = Self::default();
256
257 match value {
258 K::ProgrammableTransaction(ptb) => message
259 .with_programmable_transaction(ptb)
260 .with_kind(Kind::ProgrammableTransaction),
261 K::ChangeEpoch(change_epoch) => message
265 .with_change_epoch(change_epoch)
266 .with_kind(Kind::ChangeEpoch),
267 K::Genesis(genesis) => message.with_genesis(genesis).with_kind(Kind::Genesis),
268 K::ConsensusCommitPrologue(prologue) => message
269 .with_consensus_commit_prologue(prologue)
270 .with_kind(Kind::ConsensusCommitPrologueV1),
271 K::AuthenticatorStateUpdate(update) => message
272 .with_authenticator_state_update(update)
273 .with_kind(Kind::AuthenticatorStateUpdate),
274 K::EndOfEpoch(transactions) => message
275 .with_end_of_epoch(EndOfEpochTransaction {
276 transactions: transactions.into_iter().map(Into::into).collect(),
277 })
278 .with_kind(Kind::EndOfEpoch),
279 K::RandomnessStateUpdate(update) => message
280 .with_randomness_state_update(update)
281 .with_kind(Kind::RandomnessStateUpdate),
282 K::ConsensusCommitPrologueV2(prologue) => message
283 .with_consensus_commit_prologue(prologue)
284 .with_kind(Kind::ConsensusCommitPrologueV2),
285 K::ConsensusCommitPrologueV3(prologue) => message
286 .with_consensus_commit_prologue(prologue)
287 .with_kind(Kind::ConsensusCommitPrologueV3),
288 K::ConsensusCommitPrologueV4(prologue) => message
289 .with_consensus_commit_prologue(prologue)
290 .with_kind(Kind::ConsensusCommitPrologueV4),
291 _ => message,
292 }
293 }
294}
295
296impl TryFrom<&TransactionKind> for sui_sdk_types::TransactionKind {
297 type Error = TryFromProtoError;
298
299 fn try_from(value: &TransactionKind) -> Result<Self, Self::Error> {
300 use transaction_kind::Kind;
301
302 match value.kind() {
303 Kind::Unknown => {
304 return Err(TryFromProtoError::invalid(
305 "kind",
306 "unknown TransactionKind",
307 ));
308 }
309 Kind::ProgrammableTransaction => {
310 Self::ProgrammableTransaction(value.programmable_transaction().try_into()?)
311 }
312 Kind::ChangeEpoch => Self::ChangeEpoch(value.change_epoch().try_into()?),
313 Kind::Genesis => Self::Genesis(value.genesis().try_into()?),
314 Kind::ConsensusCommitPrologueV1 => {
315 Self::ConsensusCommitPrologue(value.consensus_commit_prologue().try_into()?)
316 }
317 Kind::AuthenticatorStateUpdate => {
318 Self::AuthenticatorStateUpdate(value.authenticator_state_update().try_into()?)
319 }
320 Kind::EndOfEpoch => Self::EndOfEpoch(
321 value
322 .end_of_epoch()
323 .transactions()
324 .iter()
325 .map(TryInto::try_into)
326 .collect::<Result<_, _>>()?,
327 ),
328 Kind::RandomnessStateUpdate => {
329 Self::RandomnessStateUpdate(value.randomness_state_update().try_into()?)
330 }
331 Kind::ConsensusCommitPrologueV2 => {
332 Self::ConsensusCommitPrologueV2(value.consensus_commit_prologue().try_into()?)
333 }
334 Kind::ConsensusCommitPrologueV3 => {
335 Self::ConsensusCommitPrologueV3(value.consensus_commit_prologue().try_into()?)
336 }
337 Kind::ConsensusCommitPrologueV4 => {
338 Self::ConsensusCommitPrologueV4(value.consensus_commit_prologue().try_into()?)
339 }
340 }
341 .pipe(Ok)
342 }
343}
344
345impl From<sui_sdk_types::ConsensusCommitPrologue> for ConsensusCommitPrologue {
350 fn from(value: sui_sdk_types::ConsensusCommitPrologue) -> Self {
351 Self {
352 epoch: Some(value.epoch),
353 round: Some(value.round),
354 commit_timestamp: Some(crate::proto::timestamp_ms_to_proto(
355 value.commit_timestamp_ms,
356 )),
357 consensus_commit_digest: None,
358 sub_dag_index: None,
359 consensus_determined_version_assignments: None,
360 additional_state_digest: None,
361 }
362 }
363}
364
365impl TryFrom<&ConsensusCommitPrologue> for sui_sdk_types::ConsensusCommitPrologue {
366 type Error = TryFromProtoError;
367
368 fn try_from(value: &ConsensusCommitPrologue) -> Result<Self, Self::Error> {
369 let epoch = value
370 .epoch
371 .ok_or_else(|| TryFromProtoError::missing("epoch"))?;
372 let round = value
373 .round
374 .ok_or_else(|| TryFromProtoError::missing("round"))?;
375 let commit_timestamp_ms = value
376 .commit_timestamp
377 .ok_or_else(|| TryFromProtoError::missing("commit_timestamp"))?
378 .pipe(crate::proto::proto_to_timestamp_ms)?;
379
380 Ok(Self {
381 epoch,
382 round,
383 commit_timestamp_ms,
384 })
385 }
386}
387
388impl From<sui_sdk_types::ConsensusCommitPrologueV2> for ConsensusCommitPrologue {
389 fn from(value: sui_sdk_types::ConsensusCommitPrologueV2) -> Self {
390 Self {
391 epoch: Some(value.epoch),
392 round: Some(value.round),
393 commit_timestamp: Some(crate::proto::timestamp_ms_to_proto(
394 value.commit_timestamp_ms,
395 )),
396 consensus_commit_digest: Some(value.consensus_commit_digest.to_string()),
397 sub_dag_index: None,
398 consensus_determined_version_assignments: None,
399 additional_state_digest: None,
400 }
401 }
402}
403
404impl TryFrom<&ConsensusCommitPrologue> for sui_sdk_types::ConsensusCommitPrologueV2 {
405 type Error = TryFromProtoError;
406
407 fn try_from(value: &ConsensusCommitPrologue) -> Result<Self, Self::Error> {
408 let epoch = value
409 .epoch
410 .ok_or_else(|| TryFromProtoError::missing("epoch"))?;
411 let round = value
412 .round
413 .ok_or_else(|| TryFromProtoError::missing("round"))?;
414 let commit_timestamp_ms = value
415 .commit_timestamp
416 .ok_or_else(|| TryFromProtoError::missing("commit_timestamp"))?
417 .pipe(crate::proto::proto_to_timestamp_ms)?;
418
419 let consensus_commit_digest = value
420 .consensus_commit_digest
421 .as_ref()
422 .ok_or_else(|| TryFromProtoError::missing("consensus_commit_digest"))?
423 .parse()
424 .map_err(|e| {
425 TryFromProtoError::invalid(
426 ConsensusCommitPrologue::CONSENSUS_COMMIT_DIGEST_FIELD,
427 e,
428 )
429 })?;
430
431 Ok(Self {
432 epoch,
433 round,
434 commit_timestamp_ms,
435 consensus_commit_digest,
436 })
437 }
438}
439
440impl From<sui_sdk_types::ConsensusCommitPrologueV3> for ConsensusCommitPrologue {
441 fn from(value: sui_sdk_types::ConsensusCommitPrologueV3) -> Self {
442 Self {
443 epoch: Some(value.epoch),
444 round: Some(value.round),
445 commit_timestamp: Some(crate::proto::timestamp_ms_to_proto(
446 value.commit_timestamp_ms,
447 )),
448 consensus_commit_digest: Some(value.consensus_commit_digest.to_string()),
449 sub_dag_index: value.sub_dag_index,
450 consensus_determined_version_assignments: Some(
451 value.consensus_determined_version_assignments.into(),
452 ),
453 additional_state_digest: None,
454 }
455 }
456}
457
458impl TryFrom<&ConsensusCommitPrologue> for sui_sdk_types::ConsensusCommitPrologueV3 {
459 type Error = TryFromProtoError;
460
461 fn try_from(value: &ConsensusCommitPrologue) -> Result<Self, Self::Error> {
462 let epoch = value
463 .epoch
464 .ok_or_else(|| TryFromProtoError::missing("epoch"))?;
465 let round = value
466 .round
467 .ok_or_else(|| TryFromProtoError::missing("round"))?;
468 let commit_timestamp_ms = value
469 .commit_timestamp
470 .ok_or_else(|| TryFromProtoError::missing("commit_timestamp"))?
471 .pipe(crate::proto::proto_to_timestamp_ms)?;
472
473 let consensus_commit_digest = value
474 .consensus_commit_digest
475 .as_ref()
476 .ok_or_else(|| TryFromProtoError::missing("consensus_commit_digest"))?
477 .parse()
478 .map_err(|e| {
479 TryFromProtoError::invalid(
480 ConsensusCommitPrologue::CONSENSUS_COMMIT_DIGEST_FIELD,
481 e,
482 )
483 })?;
484
485 let consensus_determined_version_assignments = value
486 .consensus_determined_version_assignments
487 .as_ref()
488 .ok_or_else(|| TryFromProtoError::missing("consensus_determined_version_assignments"))?
489 .try_into()?;
490
491 Ok(Self {
492 epoch,
493 round,
494 commit_timestamp_ms,
495 sub_dag_index: value.sub_dag_index,
496 consensus_commit_digest,
497 consensus_determined_version_assignments,
498 })
499 }
500}
501
502impl From<sui_sdk_types::ConsensusCommitPrologueV4> for ConsensusCommitPrologue {
503 fn from(
504 sui_sdk_types::ConsensusCommitPrologueV4 {
505 epoch,
506 round,
507 sub_dag_index,
508 commit_timestamp_ms,
509 consensus_commit_digest,
510 consensus_determined_version_assignments,
511 additional_state_digest,
512 }: sui_sdk_types::ConsensusCommitPrologueV4,
513 ) -> Self {
514 Self {
515 epoch: Some(epoch),
516 round: Some(round),
517 commit_timestamp: Some(crate::proto::timestamp_ms_to_proto(commit_timestamp_ms)),
518 consensus_commit_digest: Some(consensus_commit_digest.to_string()),
519 sub_dag_index,
520 consensus_determined_version_assignments: Some(
521 consensus_determined_version_assignments.into(),
522 ),
523 additional_state_digest: Some(additional_state_digest.to_string()),
524 }
525 }
526}
527
528impl TryFrom<&ConsensusCommitPrologue> for sui_sdk_types::ConsensusCommitPrologueV4 {
529 type Error = TryFromProtoError;
530
531 fn try_from(value: &ConsensusCommitPrologue) -> Result<Self, Self::Error> {
532 let epoch = value
533 .epoch
534 .ok_or_else(|| TryFromProtoError::missing("epoch"))?;
535 let round = value
536 .round
537 .ok_or_else(|| TryFromProtoError::missing("round"))?;
538 let commit_timestamp_ms = value
539 .commit_timestamp
540 .ok_or_else(|| TryFromProtoError::missing("commit_timestamp"))?
541 .pipe(crate::proto::proto_to_timestamp_ms)?;
542
543 let consensus_commit_digest = value
544 .consensus_commit_digest
545 .as_ref()
546 .ok_or_else(|| TryFromProtoError::missing("consensus_commit_digest"))?
547 .parse()
548 .map_err(|e| {
549 TryFromProtoError::invalid(
550 ConsensusCommitPrologue::CONSENSUS_COMMIT_DIGEST_FIELD,
551 e,
552 )
553 })?;
554
555 let consensus_determined_version_assignments = value
556 .consensus_determined_version_assignments
557 .as_ref()
558 .ok_or_else(|| TryFromProtoError::missing("consensus_determined_version_assignments"))?
559 .try_into()?;
560
561 let additional_state_digest = value
562 .additional_state_digest
563 .as_ref()
564 .ok_or_else(|| TryFromProtoError::missing("additional_state_digest"))?
565 .parse()
566 .map_err(|e| {
567 TryFromProtoError::invalid(
568 ConsensusCommitPrologue::ADDITIONAL_STATE_DIGEST_FIELD,
569 e,
570 )
571 })?;
572
573 Ok(Self {
574 epoch,
575 round,
576 commit_timestamp_ms,
577 sub_dag_index: value.sub_dag_index,
578 consensus_commit_digest,
579 consensus_determined_version_assignments,
580 additional_state_digest,
581 })
582 }
583}
584
585impl From<sui_sdk_types::ConsensusDeterminedVersionAssignments>
590 for ConsensusDeterminedVersionAssignments
591{
592 fn from(value: sui_sdk_types::ConsensusDeterminedVersionAssignments) -> Self {
593 use sui_sdk_types::ConsensusDeterminedVersionAssignments::*;
594
595 let mut message = Self::default();
596
597 let version = match value {
598 CanceledTransactions {
599 canceled_transactions,
600 } => {
601 message.canceled_transactions =
602 canceled_transactions.into_iter().map(Into::into).collect();
603 1
604 }
605 CanceledTransactionsV2 {
606 canceled_transactions,
607 } => {
608 message.canceled_transactions =
609 canceled_transactions.into_iter().map(Into::into).collect();
610 2
611 }
612 _ => return Self::default(),
613 };
614
615 message.version = Some(version);
616 message
617 }
618}
619
620impl TryFrom<&ConsensusDeterminedVersionAssignments>
621 for sui_sdk_types::ConsensusDeterminedVersionAssignments
622{
623 type Error = TryFromProtoError;
624
625 fn try_from(value: &ConsensusDeterminedVersionAssignments) -> Result<Self, Self::Error> {
626 match value.version() {
627 1 => Self::CanceledTransactions {
628 canceled_transactions: value
629 .canceled_transactions
630 .iter()
631 .map(TryFrom::try_from)
632 .collect::<Result<_, _>>()?,
633 },
634 2 => Self::CanceledTransactionsV2 {
635 canceled_transactions: value
636 .canceled_transactions
637 .iter()
638 .map(TryFrom::try_from)
639 .collect::<Result<_, _>>()?,
640 },
641 _ => {
642 return Err(TryFromProtoError::invalid(
643 ConsensusDeterminedVersionAssignments::VERSION_FIELD,
644 "unknown ConsensusDeterminedVersionAssignments version",
645 ));
646 }
647 }
648 .pipe(Ok)
649 }
650}
651
652impl From<sui_sdk_types::CanceledTransaction> for CanceledTransaction {
657 fn from(value: sui_sdk_types::CanceledTransaction) -> Self {
658 Self {
659 digest: Some(value.digest.to_string()),
660 version_assignments: value
661 .version_assignments
662 .into_iter()
663 .map(Into::into)
664 .collect(),
665 }
666 }
667}
668
669impl TryFrom<&CanceledTransaction> for sui_sdk_types::CanceledTransaction {
670 type Error = TryFromProtoError;
671
672 fn try_from(value: &CanceledTransaction) -> Result<Self, Self::Error> {
673 let digest = value
674 .digest
675 .as_ref()
676 .ok_or_else(|| TryFromProtoError::missing("digest"))?
677 .parse()
678 .map_err(|e| TryFromProtoError::invalid(CanceledTransaction::DIGEST_FIELD, e))?;
679
680 let version_assignments = value
681 .version_assignments
682 .iter()
683 .map(TryInto::try_into)
684 .collect::<Result<_, _>>()?;
685
686 Ok(Self {
687 digest,
688 version_assignments,
689 })
690 }
691}
692
693impl From<sui_sdk_types::CanceledTransactionV2> for CanceledTransaction {
694 fn from(value: sui_sdk_types::CanceledTransactionV2) -> Self {
695 Self {
696 digest: Some(value.digest.to_string()),
697 version_assignments: value
698 .version_assignments
699 .into_iter()
700 .map(Into::into)
701 .collect(),
702 }
703 }
704}
705
706impl TryFrom<&CanceledTransaction> for sui_sdk_types::CanceledTransactionV2 {
707 type Error = TryFromProtoError;
708
709 fn try_from(value: &CanceledTransaction) -> Result<Self, Self::Error> {
710 let digest = value
711 .digest
712 .as_ref()
713 .ok_or_else(|| TryFromProtoError::missing("digest"))?
714 .parse()
715 .map_err(|e| TryFromProtoError::invalid(CanceledTransaction::DIGEST_FIELD, e))?;
716
717 let version_assignments = value
718 .version_assignments
719 .iter()
720 .map(TryInto::try_into)
721 .collect::<Result<_, _>>()?;
722
723 Ok(Self {
724 digest,
725 version_assignments,
726 })
727 }
728}
729
730impl From<sui_sdk_types::VersionAssignment> for VersionAssignment {
735 fn from(value: sui_sdk_types::VersionAssignment) -> Self {
736 Self {
737 object_id: Some(value.object_id.to_string()),
738 start_version: None,
739 version: Some(value.version),
740 }
741 }
742}
743
744impl TryFrom<&VersionAssignment> for sui_sdk_types::VersionAssignment {
745 type Error = TryFromProtoError;
746
747 fn try_from(value: &VersionAssignment) -> Result<Self, Self::Error> {
748 let object_id = value
749 .object_id
750 .as_ref()
751 .ok_or_else(|| TryFromProtoError::missing("object_id"))?
752 .parse()
753 .map_err(|e| TryFromProtoError::invalid(VersionAssignment::OBJECT_ID_FIELD, e))?;
754 let version = value
755 .version
756 .ok_or_else(|| TryFromProtoError::missing("version"))?;
757
758 Ok(Self { object_id, version })
759 }
760}
761
762impl From<sui_sdk_types::VersionAssignmentV2> for VersionAssignment {
763 fn from(value: sui_sdk_types::VersionAssignmentV2) -> Self {
764 Self {
765 object_id: Some(value.object_id.to_string()),
766 start_version: Some(value.start_version),
767 version: Some(value.version),
768 }
769 }
770}
771
772impl TryFrom<&VersionAssignment> for sui_sdk_types::VersionAssignmentV2 {
773 type Error = TryFromProtoError;
774
775 fn try_from(value: &VersionAssignment) -> Result<Self, Self::Error> {
776 let object_id = value
777 .object_id
778 .as_ref()
779 .ok_or_else(|| TryFromProtoError::missing("object_id"))?
780 .parse()
781 .map_err(|e| TryFromProtoError::invalid(VersionAssignment::OBJECT_ID_FIELD, e))?;
782 let start_version = value
783 .start_version
784 .ok_or_else(|| TryFromProtoError::missing(VersionAssignment::START_VERSION_FIELD))?;
785 let version = value
786 .version
787 .ok_or_else(|| TryFromProtoError::missing("version"))?;
788
789 Ok(Self {
790 object_id,
791 start_version,
792 version,
793 })
794 }
795}
796
797impl From<sui_sdk_types::GenesisTransaction> for GenesisTransaction {
802 fn from(value: sui_sdk_types::GenesisTransaction) -> Self {
803 Self {
804 objects: value.objects.into_iter().map(Into::into).collect(),
805 }
806 }
807}
808
809impl TryFrom<&GenesisTransaction> for sui_sdk_types::GenesisTransaction {
810 type Error = TryFromProtoError;
811
812 fn try_from(value: &GenesisTransaction) -> Result<Self, Self::Error> {
813 let objects = value
814 .objects
815 .iter()
816 .map(TryInto::try_into)
817 .collect::<Result<_, _>>()?;
818
819 Ok(Self { objects })
820 }
821}
822
823impl From<sui_sdk_types::RandomnessStateUpdate> for RandomnessStateUpdate {
828 fn from(value: sui_sdk_types::RandomnessStateUpdate) -> Self {
829 Self {
830 epoch: Some(value.epoch),
831 randomness_round: Some(value.randomness_round),
832 random_bytes: Some(value.random_bytes.into()),
833 randomness_object_initial_shared_version: Some(
834 value.randomness_obj_initial_shared_version,
835 ),
836 }
837 }
838}
839
840impl TryFrom<&RandomnessStateUpdate> for sui_sdk_types::RandomnessStateUpdate {
841 type Error = TryFromProtoError;
842
843 fn try_from(
844 RandomnessStateUpdate {
845 epoch,
846 randomness_round,
847 random_bytes,
848 randomness_object_initial_shared_version,
849 }: &RandomnessStateUpdate,
850 ) -> Result<Self, Self::Error> {
851 let epoch = epoch.ok_or_else(|| TryFromProtoError::missing("epoch"))?;
852 let randomness_round =
853 randomness_round.ok_or_else(|| TryFromProtoError::missing("randomness_round"))?;
854 let random_bytes = random_bytes
855 .as_ref()
856 .ok_or_else(|| TryFromProtoError::missing("random_bytes"))?
857 .to_vec();
858 let randomness_obj_initial_shared_version = randomness_object_initial_shared_version
859 .ok_or_else(|| {
860 TryFromProtoError::missing("randomness_object_initial_shared_version")
861 })?;
862 Ok(Self {
863 epoch,
864 randomness_round,
865 random_bytes,
866 randomness_obj_initial_shared_version,
867 })
868 }
869}
870
871impl From<sui_sdk_types::AuthenticatorStateUpdate> for AuthenticatorStateUpdate {
876 fn from(value: sui_sdk_types::AuthenticatorStateUpdate) -> Self {
877 Self {
878 epoch: Some(value.epoch),
879 round: Some(value.round),
880 new_active_jwks: value.new_active_jwks.into_iter().map(Into::into).collect(),
881 authenticator_object_initial_shared_version: Some(
882 value.authenticator_obj_initial_shared_version,
883 ),
884 }
885 }
886}
887
888impl TryFrom<&AuthenticatorStateUpdate> for sui_sdk_types::AuthenticatorStateUpdate {
889 type Error = TryFromProtoError;
890
891 fn try_from(
892 AuthenticatorStateUpdate {
893 epoch,
894 round,
895 new_active_jwks,
896 authenticator_object_initial_shared_version,
897 }: &AuthenticatorStateUpdate,
898 ) -> Result<Self, Self::Error> {
899 let epoch = epoch.ok_or_else(|| TryFromProtoError::missing("epoch"))?;
900 let round = round.ok_or_else(|| TryFromProtoError::missing("round"))?;
901 let authenticator_obj_initial_shared_version = authenticator_object_initial_shared_version
902 .ok_or_else(|| {
903 TryFromProtoError::missing("authenticator_object_initial_shared_version")
904 })?;
905 Ok(Self {
906 epoch,
907 round,
908 new_active_jwks: new_active_jwks
909 .iter()
910 .map(TryInto::try_into)
911 .collect::<Result<_, _>>()?,
912 authenticator_obj_initial_shared_version,
913 })
914 }
915}
916
917impl From<sui_sdk_types::Jwk> for Jwk {
922 fn from(sui_sdk_types::Jwk { kty, e, n, alg }: sui_sdk_types::Jwk) -> Self {
923 Self {
924 kty: Some(kty),
925 e: Some(e),
926 n: Some(n),
927 alg: Some(alg),
928 }
929 }
930}
931
932impl TryFrom<&Jwk> for sui_sdk_types::Jwk {
933 type Error = TryFromProtoError;
934
935 fn try_from(Jwk { kty, e, n, alg }: &Jwk) -> Result<Self, Self::Error> {
936 let kty = kty
937 .as_ref()
938 .ok_or_else(|| TryFromProtoError::missing("kty"))?
939 .into();
940 let e = e
941 .as_ref()
942 .ok_or_else(|| TryFromProtoError::missing("e"))?
943 .into();
944 let n = n
945 .as_ref()
946 .ok_or_else(|| TryFromProtoError::missing("n"))?
947 .into();
948 let alg = alg
949 .as_ref()
950 .ok_or_else(|| TryFromProtoError::missing("alg"))?
951 .into();
952 Ok(Self { kty, e, n, alg })
953 }
954}
955
956impl From<sui_sdk_types::JwkId> for JwkId {
961 fn from(sui_sdk_types::JwkId { iss, kid }: sui_sdk_types::JwkId) -> Self {
962 Self {
963 iss: Some(iss),
964 kid: Some(kid),
965 }
966 }
967}
968
969impl From<&sui_sdk_types::JwkId> for JwkId {
970 fn from(value: &sui_sdk_types::JwkId) -> Self {
971 Self {
972 iss: Some(value.iss.clone()),
973 kid: Some(value.kid.clone()),
974 }
975 }
976}
977
978impl TryFrom<&JwkId> for sui_sdk_types::JwkId {
979 type Error = TryFromProtoError;
980
981 fn try_from(JwkId { iss, kid }: &JwkId) -> Result<Self, Self::Error> {
982 let iss = iss
983 .as_ref()
984 .ok_or_else(|| TryFromProtoError::missing("iss"))?
985 .into();
986 let kid = kid
987 .as_ref()
988 .ok_or_else(|| TryFromProtoError::missing("kid"))?
989 .into();
990 Ok(Self { iss, kid })
991 }
992}
993
994impl From<sui_sdk_types::ActiveJwk> for ActiveJwk {
999 fn from(value: sui_sdk_types::ActiveJwk) -> Self {
1000 Self {
1001 id: Some(value.jwk_id.into()),
1002 jwk: Some(value.jwk.into()),
1003 epoch: Some(value.epoch),
1004 }
1005 }
1006}
1007
1008impl TryFrom<&ActiveJwk> for sui_sdk_types::ActiveJwk {
1009 type Error = TryFromProtoError;
1010
1011 fn try_from(value: &ActiveJwk) -> Result<Self, Self::Error> {
1012 let jwk_id = value
1013 .id
1014 .as_ref()
1015 .ok_or_else(|| TryFromProtoError::missing("id"))?
1016 .try_into()?;
1017
1018 let jwk = value
1019 .jwk
1020 .as_ref()
1021 .ok_or_else(|| TryFromProtoError::missing("jwk"))?
1022 .try_into()?;
1023
1024 let epoch = value
1025 .epoch
1026 .ok_or_else(|| TryFromProtoError::missing("epoch"))?;
1027
1028 Ok(Self { jwk_id, jwk, epoch })
1029 }
1030}
1031
1032impl From<sui_sdk_types::ChangeEpoch> for ChangeEpoch {
1037 fn from(value: sui_sdk_types::ChangeEpoch) -> Self {
1038 Self {
1039 epoch: Some(value.epoch),
1040 protocol_version: Some(value.protocol_version),
1041 storage_charge: Some(value.storage_charge),
1042 computation_charge: Some(value.computation_charge),
1043 storage_rebate: Some(value.storage_rebate),
1044 non_refundable_storage_fee: Some(value.non_refundable_storage_fee),
1045 epoch_start_timestamp: Some(crate::proto::timestamp_ms_to_proto(
1046 value.epoch_start_timestamp_ms,
1047 )),
1048 system_packages: value.system_packages.into_iter().map(Into::into).collect(),
1049 }
1050 }
1051}
1052
1053impl TryFrom<&ChangeEpoch> for sui_sdk_types::ChangeEpoch {
1054 type Error = TryFromProtoError;
1055
1056 fn try_from(
1057 ChangeEpoch {
1058 epoch,
1059 protocol_version,
1060 storage_charge,
1061 computation_charge,
1062 storage_rebate,
1063 non_refundable_storage_fee,
1064 epoch_start_timestamp,
1065 system_packages,
1066 }: &ChangeEpoch,
1067 ) -> Result<Self, Self::Error> {
1068 let epoch = epoch.ok_or_else(|| TryFromProtoError::missing("epoch"))?;
1069 let protocol_version =
1070 protocol_version.ok_or_else(|| TryFromProtoError::missing("protocol_version"))?;
1071 let storage_charge =
1072 storage_charge.ok_or_else(|| TryFromProtoError::missing("storage_charge"))?;
1073 let computation_charge =
1074 computation_charge.ok_or_else(|| TryFromProtoError::missing("computation_charge"))?;
1075 let storage_rebate =
1076 storage_rebate.ok_or_else(|| TryFromProtoError::missing("storage_rebate"))?;
1077 let non_refundable_storage_fee = non_refundable_storage_fee
1078 .ok_or_else(|| TryFromProtoError::missing("non_refundable_storage_fee"))?;
1079 let epoch_start_timestamp_ms = epoch_start_timestamp
1080 .ok_or_else(|| TryFromProtoError::missing("epoch_start_timestamp_ms"))?
1081 .pipe(crate::proto::proto_to_timestamp_ms)?;
1082
1083 Ok(Self {
1084 epoch,
1085 protocol_version,
1086 storage_charge,
1087 computation_charge,
1088 storage_rebate,
1089 non_refundable_storage_fee,
1090 epoch_start_timestamp_ms,
1091 system_packages: system_packages
1092 .iter()
1093 .map(TryInto::try_into)
1094 .collect::<Result<_, _>>()?,
1095 })
1096 }
1097}
1098
1099impl From<sui_sdk_types::SystemPackage> for SystemPackage {
1104 fn from(value: sui_sdk_types::SystemPackage) -> Self {
1105 Self {
1106 version: Some(value.version),
1107 modules: value.modules.into_iter().map(Into::into).collect(),
1108 dependencies: value.dependencies.iter().map(ToString::to_string).collect(),
1109 }
1110 }
1111}
1112
1113impl TryFrom<&SystemPackage> for sui_sdk_types::SystemPackage {
1114 type Error = TryFromProtoError;
1115
1116 fn try_from(value: &SystemPackage) -> Result<Self, Self::Error> {
1117 Ok(Self {
1118 version: value
1119 .version
1120 .ok_or_else(|| TryFromProtoError::missing("version"))?,
1121 modules: value.modules.iter().map(|bytes| bytes.to_vec()).collect(),
1122 dependencies: value
1123 .dependencies
1124 .iter()
1125 .map(|s| s.parse())
1126 .collect::<Result<_, _>>()
1127 .map_err(|e| TryFromProtoError::invalid(SystemPackage::DEPENDENCIES_FIELD, e))?,
1128 })
1129 }
1130}
1131
1132impl From<sui_sdk_types::EndOfEpochTransactionKind> for EndOfEpochTransactionKind {
1137 fn from(value: sui_sdk_types::EndOfEpochTransactionKind) -> Self {
1138 use end_of_epoch_transaction_kind::Kind;
1139 use sui_sdk_types::EndOfEpochTransactionKind as K;
1140
1141 let message = Self::default();
1142
1143 match value {
1144 K::ChangeEpoch(change_epoch) => message
1145 .with_change_epoch(change_epoch)
1146 .with_kind(Kind::ChangeEpoch),
1147 K::AuthenticatorStateCreate => message.with_kind(Kind::AuthenticatorStateCreate),
1148 K::AuthenticatorStateExpire(expire) => message
1149 .with_authenticator_state_expire(expire)
1150 .with_kind(Kind::AuthenticatorStateExpire),
1151 K::RandomnessStateCreate => message.with_kind(Kind::RandomnessStateCreate),
1152 K::DenyListStateCreate => message.with_kind(Kind::DenyListStateCreate),
1153 K::BridgeStateCreate { chain_id } => message
1154 .with_bridge_chain_id(chain_id)
1155 .with_kind(Kind::BridgeStateCreate),
1156 K::BridgeCommitteeInit {
1157 bridge_object_version,
1158 } => message
1159 .with_bridge_object_version(bridge_object_version)
1160 .with_kind(Kind::BridgeCommitteeInit),
1161 K::StoreExecutionTimeObservations(observations) => message
1162 .with_execution_time_observations(observations)
1163 .with_kind(Kind::StoreExecutionTimeObservations),
1164 K::AccumulatorRootCreate => message.with_kind(Kind::AccumulatorRootCreate),
1165 K::CoinRegistryCreate => message.with_kind(Kind::CoinRegistryCreate),
1166 K::DisplayRegistryCreate => message.with_kind(Kind::DisplayRegistryCreate),
1167 _ => message,
1168 }
1169 }
1170}
1171
1172impl TryFrom<&EndOfEpochTransactionKind> for sui_sdk_types::EndOfEpochTransactionKind {
1173 type Error = TryFromProtoError;
1174
1175 fn try_from(value: &EndOfEpochTransactionKind) -> Result<Self, Self::Error> {
1176 use end_of_epoch_transaction_kind::Kind;
1177
1178 match value.kind() {
1179 Kind::Unknown => {
1180 return Err(TryFromProtoError::invalid(
1181 EndOfEpochTransactionKind::KIND_FIELD,
1182 "unknown EndOfEpochTransactionKind",
1183 ));
1184 }
1185 Kind::ChangeEpoch => Self::ChangeEpoch(value.change_epoch().try_into()?),
1186 Kind::AuthenticatorStateCreate => Self::AuthenticatorStateCreate,
1187 Kind::AuthenticatorStateExpire => {
1188 Self::AuthenticatorStateExpire(value.authenticator_state_expire().try_into()?)
1189 }
1190 Kind::RandomnessStateCreate => Self::RandomnessStateCreate,
1191 Kind::DenyListStateCreate => Self::DenyListStateCreate,
1192 Kind::BridgeStateCreate => Self::BridgeStateCreate {
1193 chain_id: value.bridge_chain_id().parse().map_err(|e| {
1194 TryFromProtoError::invalid(EndOfEpochTransactionKind::BRIDGE_CHAIN_ID_FIELD, e)
1195 })?,
1196 },
1197 Kind::BridgeCommitteeInit => Self::BridgeCommitteeInit {
1198 bridge_object_version: value.bridge_object_version(),
1199 },
1200 Kind::StoreExecutionTimeObservations => Self::StoreExecutionTimeObservations(
1201 value.execution_time_observations().try_into()?,
1202 ),
1203 Kind::AccumulatorRootCreate => Self::AccumulatorRootCreate,
1204 Kind::CoinRegistryCreate => Self::CoinRegistryCreate,
1205 Kind::DisplayRegistryCreate => Self::DisplayRegistryCreate,
1206 }
1207 .pipe(Ok)
1208 }
1209}
1210
1211impl From<sui_sdk_types::AuthenticatorStateExpire> for AuthenticatorStateExpire {
1216 fn from(value: sui_sdk_types::AuthenticatorStateExpire) -> Self {
1217 Self {
1218 min_epoch: Some(value.min_epoch),
1219 authenticator_object_initial_shared_version: Some(
1220 value.authenticator_object_initial_shared_version,
1221 ),
1222 }
1223 }
1224}
1225
1226impl TryFrom<&AuthenticatorStateExpire> for sui_sdk_types::AuthenticatorStateExpire {
1227 type Error = TryFromProtoError;
1228
1229 fn try_from(
1230 AuthenticatorStateExpire {
1231 min_epoch,
1232 authenticator_object_initial_shared_version,
1233 }: &AuthenticatorStateExpire,
1234 ) -> Result<Self, Self::Error> {
1235 let min_epoch = min_epoch.ok_or_else(|| TryFromProtoError::missing("min_epoch"))?;
1236 let authenticator_object_initial_shared_version =
1237 authenticator_object_initial_shared_version.ok_or_else(|| {
1238 TryFromProtoError::missing("authenticator_object_initial_shared_version")
1239 })?;
1240 Ok(Self {
1241 min_epoch,
1242 authenticator_object_initial_shared_version,
1243 })
1244 }
1245}
1246
1247impl From<sui_sdk_types::ExecutionTimeObservations> for ExecutionTimeObservations {
1250 fn from(value: sui_sdk_types::ExecutionTimeObservations) -> Self {
1251 match value {
1252 sui_sdk_types::ExecutionTimeObservations::V1(vec) => Self {
1253 version: Some(1),
1254 observations: vec.into_iter().map(Into::into).collect(),
1255 },
1256 _ => Self::default(),
1257 }
1258 }
1259}
1260
1261impl TryFrom<&ExecutionTimeObservations> for sui_sdk_types::ExecutionTimeObservations {
1262 type Error = TryFromProtoError;
1263
1264 fn try_from(value: &ExecutionTimeObservations) -> Result<Self, Self::Error> {
1265 Ok(Self::V1(
1266 value
1267 .observations
1268 .iter()
1269 .map(|observation| observation.try_into())
1270 .collect::<Result<_, _>>()?,
1271 ))
1272 }
1273}
1274
1275impl
1276 From<(
1277 sui_sdk_types::ExecutionTimeObservationKey,
1278 Vec<sui_sdk_types::ValidatorExecutionTimeObservation>,
1279 )> for ExecutionTimeObservation
1280{
1281 fn from(
1282 value: (
1283 sui_sdk_types::ExecutionTimeObservationKey,
1284 Vec<sui_sdk_types::ValidatorExecutionTimeObservation>,
1285 ),
1286 ) -> Self {
1287 use execution_time_observation::ExecutionTimeObservationKind;
1288 use sui_sdk_types::ExecutionTimeObservationKey;
1289
1290 let mut message = Self::default();
1291
1292 let kind = match value.0 {
1293 ExecutionTimeObservationKey::MoveEntryPoint {
1294 package,
1295 module,
1296 function,
1297 type_arguments,
1298 } => {
1299 message.move_entry_point = Some(MoveCall {
1300 package: Some(package.to_string()),
1301 module: Some(module),
1302 function: Some(function),
1303 type_arguments: type_arguments
1304 .into_iter()
1305 .map(|ty| ty.to_string())
1306 .collect(),
1307 arguments: Vec::new(),
1308 });
1309 ExecutionTimeObservationKind::MoveEntryPoint
1310 }
1311 ExecutionTimeObservationKey::TransferObjects => {
1312 ExecutionTimeObservationKind::TransferObjects
1313 }
1314 ExecutionTimeObservationKey::SplitCoins => ExecutionTimeObservationKind::SplitCoins,
1315 ExecutionTimeObservationKey::MergeCoins => ExecutionTimeObservationKind::MergeCoins,
1316 ExecutionTimeObservationKey::Publish => ExecutionTimeObservationKind::Publish,
1317 ExecutionTimeObservationKey::MakeMoveVec => {
1318 ExecutionTimeObservationKind::MakeMoveVector
1319 }
1320 ExecutionTimeObservationKey::Upgrade => ExecutionTimeObservationKind::Upgrade,
1321
1322 _ => ExecutionTimeObservationKind::Unknown,
1323 };
1324
1325 message.validator_observations = value.1.into_iter().map(Into::into).collect();
1326 message.set_kind(kind);
1327 message
1328 }
1329}
1330
1331impl TryFrom<&ExecutionTimeObservation>
1332 for (
1333 sui_sdk_types::ExecutionTimeObservationKey,
1334 Vec<sui_sdk_types::ValidatorExecutionTimeObservation>,
1335 )
1336{
1337 type Error = TryFromProtoError;
1338
1339 fn try_from(value: &ExecutionTimeObservation) -> Result<Self, Self::Error> {
1340 use execution_time_observation::ExecutionTimeObservationKind;
1341 use sui_sdk_types::ExecutionTimeObservationKey;
1342
1343 let key = match value.kind() {
1344 ExecutionTimeObservationKind::Unknown => {
1345 return Err(TryFromProtoError::invalid(
1346 ExecutionTimeObservation::KIND_FIELD,
1347 "unknown ExecutionTimeObservationKind",
1348 ));
1349 }
1350 ExecutionTimeObservationKind::MoveEntryPoint => {
1351 let move_call = value
1352 .move_entry_point
1353 .as_ref()
1354 .ok_or_else(|| TryFromProtoError::missing("move_entry_point"))?;
1355 ExecutionTimeObservationKey::MoveEntryPoint {
1356 package: move_call
1357 .package()
1358 .parse()
1359 .map_err(|e| TryFromProtoError::invalid(MoveCall::PACKAGE_FIELD, e))?,
1360 module: move_call.module().to_owned(),
1361 function: move_call.function().to_owned(),
1362 type_arguments: move_call
1363 .type_arguments
1364 .iter()
1365 .map(|t| {
1366 t.parse().map_err(|e| {
1367 TryFromProtoError::invalid(MoveCall::TYPE_ARGUMENTS_FIELD, e)
1368 })
1369 })
1370 .collect::<Result<_, _>>()?,
1371 }
1372 }
1373 ExecutionTimeObservationKind::TransferObjects => {
1374 ExecutionTimeObservationKey::TransferObjects
1375 }
1376 ExecutionTimeObservationKind::SplitCoins => ExecutionTimeObservationKey::SplitCoins,
1377 ExecutionTimeObservationKind::MergeCoins => ExecutionTimeObservationKey::MergeCoins,
1378 ExecutionTimeObservationKind::Publish => ExecutionTimeObservationKey::Publish,
1379 ExecutionTimeObservationKind::MakeMoveVector => {
1380 ExecutionTimeObservationKey::MakeMoveVec
1381 }
1382 ExecutionTimeObservationKind::Upgrade => ExecutionTimeObservationKey::Upgrade,
1383 };
1384
1385 let observations = value
1386 .validator_observations
1387 .iter()
1388 .map(sui_sdk_types::ValidatorExecutionTimeObservation::try_from)
1389 .collect::<Result<_, _>>()?;
1390
1391 Ok((key, observations))
1392 }
1393}
1394
1395impl From<sui_sdk_types::ValidatorExecutionTimeObservation> for ValidatorExecutionTimeObservation {
1398 fn from(value: sui_sdk_types::ValidatorExecutionTimeObservation) -> Self {
1399 Self {
1400 validator: Some(value.validator.as_bytes().to_vec().into()),
1401 duration: Some(prost_types::Duration {
1402 seconds: value.duration.as_secs() as i64,
1403 nanos: value.duration.subsec_nanos() as i32,
1404 }),
1405 }
1406 }
1407}
1408
1409impl TryFrom<&ValidatorExecutionTimeObservation>
1410 for sui_sdk_types::ValidatorExecutionTimeObservation
1411{
1412 type Error = TryFromProtoError;
1413
1414 fn try_from(value: &ValidatorExecutionTimeObservation) -> Result<Self, Self::Error> {
1415 Ok(Self {
1416 validator: value
1417 .validator
1418 .as_ref()
1419 .ok_or_else(|| TryFromProtoError::missing("validator"))?
1420 .as_ref()
1421 .pipe(sui_sdk_types::Bls12381PublicKey::from_bytes)
1422 .map_err(|e| {
1423 TryFromProtoError::invalid(
1424 ValidatorExecutionTimeObservation::VALIDATOR_FIELD,
1425 e,
1426 )
1427 })?,
1428 duration: value
1429 .duration
1430 .ok_or_else(|| TryFromProtoError::missing("duration"))?
1431 .try_into()
1432 .map_err(|e| {
1433 TryFromProtoError::invalid(ValidatorExecutionTimeObservation::DURATION_FIELD, e)
1434 })?,
1435 })
1436 }
1437}
1438
1439impl From<sui_sdk_types::ProgrammableTransaction> for ProgrammableTransaction {
1444 fn from(value: sui_sdk_types::ProgrammableTransaction) -> Self {
1445 Self {
1446 inputs: value.inputs.into_iter().map(Into::into).collect(),
1447 commands: value.commands.into_iter().map(Into::into).collect(),
1448 }
1449 }
1450}
1451
1452impl TryFrom<&ProgrammableTransaction> for sui_sdk_types::ProgrammableTransaction {
1453 type Error = TryFromProtoError;
1454
1455 fn try_from(value: &ProgrammableTransaction) -> Result<Self, Self::Error> {
1456 Ok(Self {
1457 inputs: value
1458 .inputs
1459 .iter()
1460 .map(TryInto::try_into)
1461 .collect::<Result<_, _>>()?,
1462 commands: value
1463 .commands
1464 .iter()
1465 .map(TryInto::try_into)
1466 .collect::<Result<_, _>>()?,
1467 })
1468 }
1469}
1470
1471impl From<sui_sdk_types::Input> for Input {
1476 fn from(value: sui_sdk_types::Input) -> Self {
1477 use input::InputKind;
1478 use sui_sdk_types::Input::*;
1479
1480 let mut message = Self::default();
1481
1482 let kind = match value {
1483 Pure { value } => {
1484 message.pure = Some(value.into());
1485 InputKind::Pure
1486 }
1487 ImmutableOrOwned(reference) => {
1488 message.object_id = Some(reference.object_id().to_string());
1489 message.version = Some(reference.version());
1490 message.digest = Some(reference.digest().to_string());
1491 InputKind::ImmutableOrOwned
1492 }
1493 Shared {
1494 object_id,
1495 initial_shared_version,
1496 mutable,
1497 } => {
1498 message.object_id = Some(object_id.to_string());
1499 message.version = Some(initial_shared_version);
1500 message.mutable = Some(mutable);
1501 InputKind::Shared
1502 }
1503 Receiving(reference) => {
1504 message.object_id = Some(reference.object_id().to_string());
1505 message.version = Some(reference.version());
1506 message.digest = Some(reference.digest().to_string());
1507 InputKind::Receiving
1508 }
1509 _ => InputKind::Unknown,
1510 };
1511
1512 message.set_kind(kind);
1513 message
1514 }
1515}
1516
1517impl TryFrom<&Input> for sui_sdk_types::Input {
1518 type Error = TryFromProtoError;
1519
1520 fn try_from(value: &Input) -> Result<Self, Self::Error> {
1521 use input::InputKind;
1522
1523 match value.kind() {
1524 InputKind::Unknown => {
1525 return Err(TryFromProtoError::invalid(
1526 Input::KIND_FIELD,
1527 "unknown InputKind",
1528 ));
1529 }
1530
1531 InputKind::Pure => Self::Pure {
1532 value: value
1533 .pure
1534 .as_ref()
1535 .ok_or_else(|| TryFromProtoError::missing("pure"))?
1536 .to_vec(),
1537 },
1538 InputKind::ImmutableOrOwned => {
1539 let object_id = value
1540 .object_id
1541 .as_ref()
1542 .ok_or_else(|| TryFromProtoError::missing("object_id"))?
1543 .parse()
1544 .map_err(|e| TryFromProtoError::invalid(Input::OBJECT_ID_FIELD, e))?;
1545 let version = value
1546 .version
1547 .ok_or_else(|| TryFromProtoError::missing("version"))?;
1548 let digest = value
1549 .digest
1550 .as_ref()
1551 .ok_or_else(|| TryFromProtoError::missing("digest"))?
1552 .parse()
1553 .map_err(|e| TryFromProtoError::invalid(Input::DIGEST_FIELD, e))?;
1554 let reference = sui_sdk_types::ObjectReference::new(object_id, version, digest);
1555 Self::ImmutableOrOwned(reference)
1556 }
1557 InputKind::Shared => {
1558 let object_id = value
1559 .object_id
1560 .as_ref()
1561 .ok_or_else(|| TryFromProtoError::missing("object_id"))?
1562 .parse()
1563 .map_err(|e| TryFromProtoError::invalid(Input::OBJECT_ID_FIELD, e))?;
1564 let initial_shared_version = value
1565 .version
1566 .ok_or_else(|| TryFromProtoError::missing("version"))?;
1567 let mutable = value
1568 .mutable
1569 .ok_or_else(|| TryFromProtoError::missing("mutable"))?;
1570 Self::Shared {
1571 object_id,
1572 initial_shared_version,
1573 mutable,
1574 }
1575 }
1576 InputKind::Receiving => {
1577 let object_id = value
1578 .object_id
1579 .as_ref()
1580 .ok_or_else(|| TryFromProtoError::missing("object_id"))?
1581 .parse()
1582 .map_err(|e| TryFromProtoError::invalid(Input::OBJECT_ID_FIELD, e))?;
1583 let version = value
1584 .version
1585 .ok_or_else(|| TryFromProtoError::missing("version"))?;
1586 let digest = value
1587 .digest
1588 .as_ref()
1589 .ok_or_else(|| TryFromProtoError::missing("digest"))?
1590 .parse()
1591 .map_err(|e| TryFromProtoError::invalid(Input::DIGEST_FIELD, e))?;
1592 let reference = sui_sdk_types::ObjectReference::new(object_id, version, digest);
1593 Self::Receiving(reference)
1594 }
1595 }
1596 .pipe(Ok)
1597 }
1598}
1599
1600impl Argument {
1605 pub fn gas() -> Self {
1606 Self {
1607 kind: Some(argument::ArgumentKind::Gas.into()),
1608 input: None,
1609 result: None,
1610 subresult: None,
1611 }
1612 }
1613
1614 pub fn new_input(input: u16) -> Self {
1615 Self {
1616 kind: Some(argument::ArgumentKind::Input.into()),
1617 input: Some(input.into()),
1618 result: None,
1619 subresult: None,
1620 }
1621 }
1622
1623 pub fn new_result(command: u16) -> Self {
1624 Self {
1625 kind: Some(argument::ArgumentKind::Result.into()),
1626 input: None,
1627 result: Some(command.into()),
1628 subresult: None,
1629 }
1630 }
1631
1632 pub fn nested_result(command: u16, subresult: u16) -> Self {
1633 Self {
1634 kind: Some(argument::ArgumentKind::Result.into()),
1635 input: None,
1636 result: Some(command.into()),
1637 subresult: Some(subresult.into()),
1638 }
1639 }
1640}
1641
1642impl From<sui_sdk_types::Argument> for Argument {
1643 fn from(value: sui_sdk_types::Argument) -> Self {
1644 use argument::ArgumentKind;
1645 use sui_sdk_types::Argument::*;
1646
1647 let mut message = Self::default();
1648
1649 let kind = match value {
1650 Gas => ArgumentKind::Gas,
1651 Input(input) => {
1652 message.input = Some(input.into());
1653 ArgumentKind::Input
1654 }
1655 Result(result) => {
1656 message.result = Some(result.into());
1657 ArgumentKind::Result
1658 }
1659 NestedResult(result, subresult) => {
1660 message.result = Some(result.into());
1661 message.subresult = Some(subresult.into());
1662 ArgumentKind::Result
1663 }
1664 };
1665
1666 message.set_kind(kind);
1667 message
1668 }
1669}
1670
1671impl TryFrom<&Argument> for sui_sdk_types::Argument {
1672 type Error = TryFromProtoError;
1673
1674 fn try_from(value: &Argument) -> Result<Self, Self::Error> {
1675 use argument::ArgumentKind;
1676
1677 match value.kind() {
1678 ArgumentKind::Unknown => {
1679 return Err(TryFromProtoError::invalid(
1680 Argument::KIND_FIELD,
1681 "unknown ArgumentKind",
1682 ));
1683 }
1684 ArgumentKind::Gas => Self::Gas,
1685 ArgumentKind::Input => {
1686 let input = value
1687 .input
1688 .ok_or_else(|| TryFromProtoError::missing("input"))?
1689 .try_into()
1690 .map_err(|e| TryFromProtoError::invalid(Argument::INPUT_FIELD, e))?;
1691 Self::Input(input)
1692 }
1693 ArgumentKind::Result => {
1694 let result = value
1695 .result
1696 .ok_or_else(|| TryFromProtoError::missing("result"))?
1697 .try_into()
1698 .map_err(|e| TryFromProtoError::invalid(Argument::RESULT_FIELD, e))?;
1699
1700 if let Some(subresult) = value.subresult {
1701 Self::NestedResult(
1702 result,
1703 subresult.try_into().map_err(|e| {
1704 TryFromProtoError::invalid(Argument::SUBRESULT_FIELD, e)
1705 })?,
1706 )
1707 } else {
1708 Self::Result(result)
1709 }
1710 }
1711 }
1712 .pipe(Ok)
1713 }
1714}
1715
1716impl From<command::Command> for Command {
1721 fn from(value: command::Command) -> Self {
1722 Self {
1723 command: Some(value),
1724 }
1725 }
1726}
1727
1728impl From<MoveCall> for command::Command {
1729 fn from(value: MoveCall) -> Self {
1730 Self::MoveCall(value)
1731 }
1732}
1733
1734impl From<MoveCall> for Command {
1735 fn from(value: MoveCall) -> Self {
1736 command::Command::from(value).into()
1737 }
1738}
1739
1740impl From<TransferObjects> for command::Command {
1741 fn from(value: TransferObjects) -> Self {
1742 Self::TransferObjects(value)
1743 }
1744}
1745
1746impl From<TransferObjects> for Command {
1747 fn from(value: TransferObjects) -> Self {
1748 command::Command::from(value).into()
1749 }
1750}
1751
1752impl From<sui_sdk_types::Command> for Command {
1753 fn from(value: sui_sdk_types::Command) -> Self {
1754 use command::Command;
1755 use sui_sdk_types::Command::*;
1756
1757 let command = match value {
1758 MoveCall(move_call) => Command::MoveCall(move_call.into()),
1759 TransferObjects(transfer_objects) => Command::TransferObjects(transfer_objects.into()),
1760 SplitCoins(split_coins) => Command::SplitCoins(split_coins.into()),
1761 MergeCoins(merge_coins) => Command::MergeCoins(merge_coins.into()),
1762 Publish(publish) => Command::Publish(publish.into()),
1763 MakeMoveVector(make_move_vector) => Command::MakeMoveVector(make_move_vector.into()),
1764 Upgrade(upgrade) => Command::Upgrade(upgrade.into()),
1765
1766 _ => return Self::default(),
1768 };
1769
1770 Self {
1771 command: Some(command),
1772 }
1773 }
1774}
1775
1776impl TryFrom<&Command> for sui_sdk_types::Command {
1777 type Error = TryFromProtoError;
1778
1779 fn try_from(value: &Command) -> Result<Self, Self::Error> {
1780 use command::Command;
1781
1782 match value
1783 .command
1784 .as_ref()
1785 .ok_or_else(|| TryFromProtoError::missing("command"))?
1786 {
1787 Command::MoveCall(move_call) => Self::MoveCall(move_call.try_into()?),
1788 Command::TransferObjects(transfer_objects) => {
1789 Self::TransferObjects(transfer_objects.try_into()?)
1790 }
1791 Command::SplitCoins(split_coins) => Self::SplitCoins(split_coins.try_into()?),
1792 Command::MergeCoins(merge_coins) => Self::MergeCoins(merge_coins.try_into()?),
1793 Command::Publish(publish) => Self::Publish(publish.try_into()?),
1794 Command::MakeMoveVector(make_move_vector) => {
1795 Self::MakeMoveVector(make_move_vector.try_into()?)
1796 }
1797 Command::Upgrade(upgrade) => Self::Upgrade(upgrade.try_into()?),
1798 }
1799 .pipe(Ok)
1800 }
1801}
1802
1803impl From<sui_sdk_types::MoveCall> for MoveCall {
1808 fn from(value: sui_sdk_types::MoveCall) -> Self {
1809 Self {
1810 package: Some(value.package.to_string()),
1811 module: Some(value.module.to_string()),
1812 function: Some(value.function.to_string()),
1813 type_arguments: value
1814 .type_arguments
1815 .iter()
1816 .map(ToString::to_string)
1817 .collect(),
1818 arguments: value.arguments.into_iter().map(Into::into).collect(),
1819 }
1820 }
1821}
1822
1823impl TryFrom<&MoveCall> for sui_sdk_types::MoveCall {
1824 type Error = TryFromProtoError;
1825
1826 fn try_from(value: &MoveCall) -> Result<Self, Self::Error> {
1827 let package = value
1828 .package
1829 .as_ref()
1830 .ok_or_else(|| TryFromProtoError::missing("package"))?
1831 .parse()
1832 .map_err(|e| TryFromProtoError::invalid(MoveCall::PACKAGE_FIELD, e))?;
1833
1834 let module = value
1835 .module
1836 .as_ref()
1837 .ok_or_else(|| TryFromProtoError::missing("module"))?
1838 .parse()
1839 .map_err(|e| TryFromProtoError::invalid(MoveCall::MODULE_FIELD, e))?;
1840
1841 let function = value
1842 .function
1843 .as_ref()
1844 .ok_or_else(|| TryFromProtoError::missing("function"))?
1845 .parse()
1846 .map_err(|e| TryFromProtoError::invalid(MoveCall::FUNCTION_FIELD, e))?;
1847
1848 let type_arguments = value
1849 .type_arguments
1850 .iter()
1851 .map(|t| {
1852 t.parse()
1853 .map_err(|e| TryFromProtoError::invalid(MoveCall::TYPE_ARGUMENTS_FIELD, e))
1854 })
1855 .collect::<Result<_, _>>()?;
1856 let arguments = value
1857 .arguments
1858 .iter()
1859 .map(TryInto::try_into)
1860 .collect::<Result<_, _>>()?;
1861
1862 Ok(Self {
1863 package,
1864 module,
1865 function,
1866 type_arguments,
1867 arguments,
1868 })
1869 }
1870}
1871
1872impl From<sui_sdk_types::TransferObjects> for TransferObjects {
1877 fn from(value: sui_sdk_types::TransferObjects) -> Self {
1878 Self {
1879 objects: value.objects.into_iter().map(Into::into).collect(),
1880 address: Some(value.address.into()),
1881 }
1882 }
1883}
1884
1885impl TryFrom<&TransferObjects> for sui_sdk_types::TransferObjects {
1886 type Error = TryFromProtoError;
1887
1888 fn try_from(value: &TransferObjects) -> Result<Self, Self::Error> {
1889 let objects = value
1890 .objects
1891 .iter()
1892 .map(TryInto::try_into)
1893 .collect::<Result<_, _>>()?;
1894
1895 let address = value
1896 .address
1897 .as_ref()
1898 .ok_or_else(|| TryFromProtoError::missing("address"))?
1899 .try_into()?;
1900
1901 Ok(Self { objects, address })
1902 }
1903}
1904
1905impl From<sui_sdk_types::SplitCoins> for SplitCoins {
1910 fn from(value: sui_sdk_types::SplitCoins) -> Self {
1911 Self {
1912 coin: Some(value.coin.into()),
1913 amounts: value.amounts.into_iter().map(Into::into).collect(),
1914 }
1915 }
1916}
1917
1918impl TryFrom<&SplitCoins> for sui_sdk_types::SplitCoins {
1919 type Error = TryFromProtoError;
1920
1921 fn try_from(value: &SplitCoins) -> Result<Self, Self::Error> {
1922 let coin = value
1923 .coin
1924 .as_ref()
1925 .ok_or_else(|| TryFromProtoError::missing("coin"))?
1926 .try_into()?;
1927
1928 let amounts = value
1929 .amounts
1930 .iter()
1931 .map(TryInto::try_into)
1932 .collect::<Result<_, _>>()?;
1933
1934 Ok(Self { coin, amounts })
1935 }
1936}
1937
1938impl From<sui_sdk_types::MergeCoins> for MergeCoins {
1943 fn from(value: sui_sdk_types::MergeCoins) -> Self {
1944 Self {
1945 coin: Some(value.coin.into()),
1946 coins_to_merge: value.coins_to_merge.into_iter().map(Into::into).collect(),
1947 }
1948 }
1949}
1950
1951impl TryFrom<&MergeCoins> for sui_sdk_types::MergeCoins {
1952 type Error = TryFromProtoError;
1953
1954 fn try_from(value: &MergeCoins) -> Result<Self, Self::Error> {
1955 let coin = value
1956 .coin
1957 .as_ref()
1958 .ok_or_else(|| TryFromProtoError::missing("coin"))?
1959 .try_into()?;
1960
1961 let coins_to_merge = value
1962 .coins_to_merge
1963 .iter()
1964 .map(TryInto::try_into)
1965 .collect::<Result<_, _>>()?;
1966
1967 Ok(Self {
1968 coin,
1969 coins_to_merge,
1970 })
1971 }
1972}
1973
1974impl From<sui_sdk_types::Publish> for Publish {
1979 fn from(value: sui_sdk_types::Publish) -> Self {
1980 Self {
1981 modules: value.modules.into_iter().map(Into::into).collect(),
1982 dependencies: value.dependencies.iter().map(ToString::to_string).collect(),
1983 }
1984 }
1985}
1986
1987impl TryFrom<&Publish> for sui_sdk_types::Publish {
1988 type Error = TryFromProtoError;
1989
1990 fn try_from(value: &Publish) -> Result<Self, Self::Error> {
1991 let modules = value.modules.iter().map(|bytes| bytes.to_vec()).collect();
1992
1993 let dependencies = value
1994 .dependencies
1995 .iter()
1996 .map(|s| s.parse())
1997 .collect::<Result<_, _>>()
1998 .map_err(|e| TryFromProtoError::invalid(Publish::DEPENDENCIES_FIELD, e))?;
1999
2000 Ok(Self {
2001 modules,
2002 dependencies,
2003 })
2004 }
2005}
2006
2007impl From<sui_sdk_types::MakeMoveVector> for MakeMoveVector {
2012 fn from(value: sui_sdk_types::MakeMoveVector) -> Self {
2013 Self {
2014 element_type: value.type_.map(|t| t.to_string()),
2015 elements: value.elements.into_iter().map(Into::into).collect(),
2016 }
2017 }
2018}
2019
2020impl TryFrom<&MakeMoveVector> for sui_sdk_types::MakeMoveVector {
2021 type Error = TryFromProtoError;
2022
2023 fn try_from(value: &MakeMoveVector) -> Result<Self, Self::Error> {
2024 let element_type = value
2025 .element_type
2026 .as_ref()
2027 .map(|t| {
2028 t.parse()
2029 .map_err(|e| TryFromProtoError::invalid(MakeMoveVector::ELEMENT_TYPE_FIELD, e))
2030 })
2031 .transpose()?;
2032
2033 let elements = value
2034 .elements
2035 .iter()
2036 .map(TryInto::try_into)
2037 .collect::<Result<_, _>>()?;
2038
2039 Ok(Self {
2040 type_: element_type,
2041 elements,
2042 })
2043 }
2044}
2045
2046impl From<sui_sdk_types::Upgrade> for Upgrade {
2051 fn from(value: sui_sdk_types::Upgrade) -> Self {
2052 Self {
2053 modules: value.modules.into_iter().map(Into::into).collect(),
2054 dependencies: value.dependencies.iter().map(ToString::to_string).collect(),
2055 package: Some(value.package.to_string()),
2056 ticket: Some(value.ticket.into()),
2057 }
2058 }
2059}
2060
2061impl TryFrom<&Upgrade> for sui_sdk_types::Upgrade {
2062 type Error = TryFromProtoError;
2063
2064 fn try_from(value: &Upgrade) -> Result<Self, Self::Error> {
2065 let modules = value.modules.iter().map(|bytes| bytes.to_vec()).collect();
2066
2067 let dependencies = value
2068 .dependencies
2069 .iter()
2070 .map(|s| s.parse())
2071 .collect::<Result<_, _>>()
2072 .map_err(|e| TryFromProtoError::invalid(Upgrade::DEPENDENCIES_FIELD, e))?;
2073
2074 let package = value
2075 .package
2076 .as_ref()
2077 .ok_or_else(|| TryFromProtoError::missing("package"))?
2078 .parse()
2079 .map_err(|e| TryFromProtoError::invalid(Upgrade::PACKAGE_FIELD, e))?;
2080
2081 let ticket = value
2082 .ticket
2083 .as_ref()
2084 .ok_or_else(|| TryFromProtoError::missing("ticket"))?
2085 .try_into()?;
2086
2087 Ok(Self {
2088 modules,
2089 dependencies,
2090 package,
2091 ticket,
2092 })
2093 }
2094}