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 _ => message,
1167 }
1168 }
1169}
1170
1171impl TryFrom<&EndOfEpochTransactionKind> for sui_sdk_types::EndOfEpochTransactionKind {
1172 type Error = TryFromProtoError;
1173
1174 fn try_from(value: &EndOfEpochTransactionKind) -> Result<Self, Self::Error> {
1175 use end_of_epoch_transaction_kind::Kind;
1176
1177 match value.kind() {
1178 Kind::Unknown => {
1179 return Err(TryFromProtoError::invalid(
1180 EndOfEpochTransactionKind::KIND_FIELD,
1181 "unknown EndOfEpochTransactionKind",
1182 ))
1183 }
1184 Kind::ChangeEpoch => Self::ChangeEpoch(value.change_epoch().try_into()?),
1185 Kind::AuthenticatorStateCreate => Self::AuthenticatorStateCreate,
1186 Kind::AuthenticatorStateExpire => {
1187 Self::AuthenticatorStateExpire(value.authenticator_state_expire().try_into()?)
1188 }
1189 Kind::RandomnessStateCreate => Self::RandomnessStateCreate,
1190 Kind::DenyListStateCreate => Self::DenyListStateCreate,
1191 Kind::BridgeStateCreate => Self::BridgeStateCreate {
1192 chain_id: value.bridge_chain_id().parse().map_err(|e| {
1193 TryFromProtoError::invalid(EndOfEpochTransactionKind::BRIDGE_CHAIN_ID_FIELD, e)
1194 })?,
1195 },
1196 Kind::BridgeCommitteeInit => Self::BridgeCommitteeInit {
1197 bridge_object_version: value.bridge_object_version(),
1198 },
1199 Kind::StoreExecutionTimeObservations => Self::StoreExecutionTimeObservations(
1200 value.execution_time_observations().try_into()?,
1201 ),
1202 Kind::AccumulatorRootCreate => Self::AccumulatorRootCreate,
1203 Kind::CoinRegistryCreate => Self::CoinRegistryCreate,
1204 }
1205 .pipe(Ok)
1206 }
1207}
1208
1209impl From<sui_sdk_types::AuthenticatorStateExpire> for AuthenticatorStateExpire {
1214 fn from(value: sui_sdk_types::AuthenticatorStateExpire) -> Self {
1215 Self {
1216 min_epoch: Some(value.min_epoch),
1217 authenticator_object_initial_shared_version: Some(
1218 value.authenticator_object_initial_shared_version,
1219 ),
1220 }
1221 }
1222}
1223
1224impl TryFrom<&AuthenticatorStateExpire> for sui_sdk_types::AuthenticatorStateExpire {
1225 type Error = TryFromProtoError;
1226
1227 fn try_from(
1228 AuthenticatorStateExpire {
1229 min_epoch,
1230 authenticator_object_initial_shared_version,
1231 }: &AuthenticatorStateExpire,
1232 ) -> Result<Self, Self::Error> {
1233 let min_epoch = min_epoch.ok_or_else(|| TryFromProtoError::missing("min_epoch"))?;
1234 let authenticator_object_initial_shared_version =
1235 authenticator_object_initial_shared_version.ok_or_else(|| {
1236 TryFromProtoError::missing("authenticator_object_initial_shared_version")
1237 })?;
1238 Ok(Self {
1239 min_epoch,
1240 authenticator_object_initial_shared_version,
1241 })
1242 }
1243}
1244
1245impl From<sui_sdk_types::ExecutionTimeObservations> for ExecutionTimeObservations {
1248 fn from(value: sui_sdk_types::ExecutionTimeObservations) -> Self {
1249 match value {
1250 sui_sdk_types::ExecutionTimeObservations::V1(vec) => Self {
1251 version: Some(1),
1252 observations: vec.into_iter().map(Into::into).collect(),
1253 },
1254 _ => Self::default(),
1255 }
1256 }
1257}
1258
1259impl TryFrom<&ExecutionTimeObservations> for sui_sdk_types::ExecutionTimeObservations {
1260 type Error = TryFromProtoError;
1261
1262 fn try_from(value: &ExecutionTimeObservations) -> Result<Self, Self::Error> {
1263 Ok(Self::V1(
1264 value
1265 .observations
1266 .iter()
1267 .map(|observation| observation.try_into())
1268 .collect::<Result<_, _>>()?,
1269 ))
1270 }
1271}
1272
1273impl
1274 From<(
1275 sui_sdk_types::ExecutionTimeObservationKey,
1276 Vec<sui_sdk_types::ValidatorExecutionTimeObservation>,
1277 )> for ExecutionTimeObservation
1278{
1279 fn from(
1280 value: (
1281 sui_sdk_types::ExecutionTimeObservationKey,
1282 Vec<sui_sdk_types::ValidatorExecutionTimeObservation>,
1283 ),
1284 ) -> Self {
1285 use execution_time_observation::ExecutionTimeObservationKind;
1286 use sui_sdk_types::ExecutionTimeObservationKey;
1287
1288 let mut message = Self::default();
1289
1290 let kind = match value.0 {
1291 ExecutionTimeObservationKey::MoveEntryPoint {
1292 package,
1293 module,
1294 function,
1295 type_arguments,
1296 } => {
1297 message.move_entry_point = Some(MoveCall {
1298 package: Some(package.to_string()),
1299 module: Some(module),
1300 function: Some(function),
1301 type_arguments: type_arguments
1302 .into_iter()
1303 .map(|ty| ty.to_string())
1304 .collect(),
1305 arguments: Vec::new(),
1306 });
1307 ExecutionTimeObservationKind::MoveEntryPoint
1308 }
1309 ExecutionTimeObservationKey::TransferObjects => {
1310 ExecutionTimeObservationKind::TransferObjects
1311 }
1312 ExecutionTimeObservationKey::SplitCoins => ExecutionTimeObservationKind::SplitCoins,
1313 ExecutionTimeObservationKey::MergeCoins => ExecutionTimeObservationKind::MergeCoins,
1314 ExecutionTimeObservationKey::Publish => ExecutionTimeObservationKind::Publish,
1315 ExecutionTimeObservationKey::MakeMoveVec => {
1316 ExecutionTimeObservationKind::MakeMoveVector
1317 }
1318 ExecutionTimeObservationKey::Upgrade => ExecutionTimeObservationKind::Upgrade,
1319
1320 _ => ExecutionTimeObservationKind::Unknown,
1321 };
1322
1323 message.validator_observations = value.1.into_iter().map(Into::into).collect();
1324 message.set_kind(kind);
1325 message
1326 }
1327}
1328
1329impl TryFrom<&ExecutionTimeObservation>
1330 for (
1331 sui_sdk_types::ExecutionTimeObservationKey,
1332 Vec<sui_sdk_types::ValidatorExecutionTimeObservation>,
1333 )
1334{
1335 type Error = TryFromProtoError;
1336
1337 fn try_from(value: &ExecutionTimeObservation) -> Result<Self, Self::Error> {
1338 use execution_time_observation::ExecutionTimeObservationKind;
1339 use sui_sdk_types::ExecutionTimeObservationKey;
1340
1341 let key = match value.kind() {
1342 ExecutionTimeObservationKind::Unknown => {
1343 return Err(TryFromProtoError::invalid(
1344 ExecutionTimeObservation::KIND_FIELD,
1345 "unknown ExecutionTimeObservationKind",
1346 ))
1347 }
1348 ExecutionTimeObservationKind::MoveEntryPoint => {
1349 let move_call = value
1350 .move_entry_point
1351 .as_ref()
1352 .ok_or_else(|| TryFromProtoError::missing("move_entry_point"))?;
1353 ExecutionTimeObservationKey::MoveEntryPoint {
1354 package: move_call
1355 .package()
1356 .parse()
1357 .map_err(|e| TryFromProtoError::invalid(MoveCall::PACKAGE_FIELD, e))?,
1358 module: move_call.module().to_owned(),
1359 function: move_call.function().to_owned(),
1360 type_arguments: move_call
1361 .type_arguments
1362 .iter()
1363 .map(|t| {
1364 t.parse().map_err(|e| {
1365 TryFromProtoError::invalid(MoveCall::TYPE_ARGUMENTS_FIELD, e)
1366 })
1367 })
1368 .collect::<Result<_, _>>()?,
1369 }
1370 }
1371 ExecutionTimeObservationKind::TransferObjects => {
1372 ExecutionTimeObservationKey::TransferObjects
1373 }
1374 ExecutionTimeObservationKind::SplitCoins => ExecutionTimeObservationKey::SplitCoins,
1375 ExecutionTimeObservationKind::MergeCoins => ExecutionTimeObservationKey::MergeCoins,
1376 ExecutionTimeObservationKind::Publish => ExecutionTimeObservationKey::Publish,
1377 ExecutionTimeObservationKind::MakeMoveVector => {
1378 ExecutionTimeObservationKey::MakeMoveVec
1379 }
1380 ExecutionTimeObservationKind::Upgrade => ExecutionTimeObservationKey::Upgrade,
1381 };
1382
1383 let observations = value
1384 .validator_observations
1385 .iter()
1386 .map(sui_sdk_types::ValidatorExecutionTimeObservation::try_from)
1387 .collect::<Result<_, _>>()?;
1388
1389 Ok((key, observations))
1390 }
1391}
1392
1393impl From<sui_sdk_types::ValidatorExecutionTimeObservation> for ValidatorExecutionTimeObservation {
1396 fn from(value: sui_sdk_types::ValidatorExecutionTimeObservation) -> Self {
1397 Self {
1398 validator: Some(value.validator.as_bytes().to_vec().into()),
1399 duration: Some(prost_types::Duration {
1400 seconds: value.duration.as_secs() as i64,
1401 nanos: value.duration.subsec_nanos() as i32,
1402 }),
1403 }
1404 }
1405}
1406
1407impl TryFrom<&ValidatorExecutionTimeObservation>
1408 for sui_sdk_types::ValidatorExecutionTimeObservation
1409{
1410 type Error = TryFromProtoError;
1411
1412 fn try_from(value: &ValidatorExecutionTimeObservation) -> Result<Self, Self::Error> {
1413 Ok(Self {
1414 validator: value
1415 .validator
1416 .as_ref()
1417 .ok_or_else(|| TryFromProtoError::missing("validator"))?
1418 .as_ref()
1419 .pipe(sui_sdk_types::Bls12381PublicKey::from_bytes)
1420 .map_err(|e| {
1421 TryFromProtoError::invalid(
1422 ValidatorExecutionTimeObservation::VALIDATOR_FIELD,
1423 e,
1424 )
1425 })?,
1426 duration: value
1427 .duration
1428 .ok_or_else(|| TryFromProtoError::missing("duration"))?
1429 .try_into()
1430 .map_err(|e| {
1431 TryFromProtoError::invalid(ValidatorExecutionTimeObservation::DURATION_FIELD, e)
1432 })?,
1433 })
1434 }
1435}
1436
1437impl From<sui_sdk_types::ProgrammableTransaction> for ProgrammableTransaction {
1442 fn from(value: sui_sdk_types::ProgrammableTransaction) -> Self {
1443 Self {
1444 inputs: value.inputs.into_iter().map(Into::into).collect(),
1445 commands: value.commands.into_iter().map(Into::into).collect(),
1446 }
1447 }
1448}
1449
1450impl TryFrom<&ProgrammableTransaction> for sui_sdk_types::ProgrammableTransaction {
1451 type Error = TryFromProtoError;
1452
1453 fn try_from(value: &ProgrammableTransaction) -> Result<Self, Self::Error> {
1454 Ok(Self {
1455 inputs: value
1456 .inputs
1457 .iter()
1458 .map(TryInto::try_into)
1459 .collect::<Result<_, _>>()?,
1460 commands: value
1461 .commands
1462 .iter()
1463 .map(TryInto::try_into)
1464 .collect::<Result<_, _>>()?,
1465 })
1466 }
1467}
1468
1469impl From<sui_sdk_types::Input> for Input {
1474 fn from(value: sui_sdk_types::Input) -> Self {
1475 use input::InputKind;
1476 use sui_sdk_types::Input::*;
1477
1478 let mut message = Self::default();
1479
1480 let kind = match value {
1481 Pure { value } => {
1482 message.pure = Some(value.into());
1483 InputKind::Pure
1484 }
1485 ImmutableOrOwned(reference) => {
1486 message.object_id = Some(reference.object_id().to_string());
1487 message.version = Some(reference.version());
1488 message.digest = Some(reference.digest().to_string());
1489 InputKind::ImmutableOrOwned
1490 }
1491 Shared {
1492 object_id,
1493 initial_shared_version,
1494 mutable,
1495 } => {
1496 message.object_id = Some(object_id.to_string());
1497 message.version = Some(initial_shared_version);
1498 message.mutable = Some(mutable);
1499 InputKind::Shared
1500 }
1501 Receiving(reference) => {
1502 message.object_id = Some(reference.object_id().to_string());
1503 message.version = Some(reference.version());
1504 message.digest = Some(reference.digest().to_string());
1505 InputKind::Receiving
1506 }
1507 _ => InputKind::Unknown,
1508 };
1509
1510 message.set_kind(kind);
1511 message
1512 }
1513}
1514
1515impl TryFrom<&Input> for sui_sdk_types::Input {
1516 type Error = TryFromProtoError;
1517
1518 fn try_from(value: &Input) -> Result<Self, Self::Error> {
1519 use input::InputKind;
1520
1521 match value.kind() {
1522 InputKind::Unknown => {
1523 return Err(TryFromProtoError::invalid(
1524 Input::KIND_FIELD,
1525 "unknown InputKind",
1526 ))
1527 }
1528
1529 InputKind::Pure => Self::Pure {
1530 value: value
1531 .pure
1532 .as_ref()
1533 .ok_or_else(|| TryFromProtoError::missing("pure"))?
1534 .to_vec(),
1535 },
1536 InputKind::ImmutableOrOwned => {
1537 let object_id = value
1538 .object_id
1539 .as_ref()
1540 .ok_or_else(|| TryFromProtoError::missing("object_id"))?
1541 .parse()
1542 .map_err(|e| TryFromProtoError::invalid(Input::OBJECT_ID_FIELD, e))?;
1543 let version = value
1544 .version
1545 .ok_or_else(|| TryFromProtoError::missing("version"))?;
1546 let digest = value
1547 .digest
1548 .as_ref()
1549 .ok_or_else(|| TryFromProtoError::missing("digest"))?
1550 .parse()
1551 .map_err(|e| TryFromProtoError::invalid(Input::DIGEST_FIELD, e))?;
1552 let reference = sui_sdk_types::ObjectReference::new(object_id, version, digest);
1553 Self::ImmutableOrOwned(reference)
1554 }
1555 InputKind::Shared => {
1556 let object_id = value
1557 .object_id
1558 .as_ref()
1559 .ok_or_else(|| TryFromProtoError::missing("object_id"))?
1560 .parse()
1561 .map_err(|e| TryFromProtoError::invalid(Input::OBJECT_ID_FIELD, e))?;
1562 let initial_shared_version = value
1563 .version
1564 .ok_or_else(|| TryFromProtoError::missing("version"))?;
1565 let mutable = value
1566 .mutable
1567 .ok_or_else(|| TryFromProtoError::missing("mutable"))?;
1568 Self::Shared {
1569 object_id,
1570 initial_shared_version,
1571 mutable,
1572 }
1573 }
1574 InputKind::Receiving => {
1575 let object_id = value
1576 .object_id
1577 .as_ref()
1578 .ok_or_else(|| TryFromProtoError::missing("object_id"))?
1579 .parse()
1580 .map_err(|e| TryFromProtoError::invalid(Input::OBJECT_ID_FIELD, e))?;
1581 let version = value
1582 .version
1583 .ok_or_else(|| TryFromProtoError::missing("version"))?;
1584 let digest = value
1585 .digest
1586 .as_ref()
1587 .ok_or_else(|| TryFromProtoError::missing("digest"))?
1588 .parse()
1589 .map_err(|e| TryFromProtoError::invalid(Input::DIGEST_FIELD, e))?;
1590 let reference = sui_sdk_types::ObjectReference::new(object_id, version, digest);
1591 Self::Receiving(reference)
1592 }
1593 }
1594 .pipe(Ok)
1595 }
1596}
1597
1598impl Argument {
1603 pub fn gas() -> Self {
1604 Self {
1605 kind: Some(argument::ArgumentKind::Gas.into()),
1606 input: None,
1607 result: None,
1608 subresult: None,
1609 }
1610 }
1611
1612 pub fn new_input(input: u16) -> Self {
1613 Self {
1614 kind: Some(argument::ArgumentKind::Input.into()),
1615 input: Some(input.into()),
1616 result: None,
1617 subresult: None,
1618 }
1619 }
1620
1621 pub fn new_result(command: u16) -> Self {
1622 Self {
1623 kind: Some(argument::ArgumentKind::Result.into()),
1624 input: None,
1625 result: Some(command.into()),
1626 subresult: None,
1627 }
1628 }
1629
1630 pub fn nested_result(command: u16, subresult: u16) -> Self {
1631 Self {
1632 kind: Some(argument::ArgumentKind::Result.into()),
1633 input: None,
1634 result: Some(command.into()),
1635 subresult: Some(subresult.into()),
1636 }
1637 }
1638}
1639
1640impl From<sui_sdk_types::Argument> for Argument {
1641 fn from(value: sui_sdk_types::Argument) -> Self {
1642 use argument::ArgumentKind;
1643 use sui_sdk_types::Argument::*;
1644
1645 let mut message = Self::default();
1646
1647 let kind = match value {
1648 Gas => ArgumentKind::Gas,
1649 Input(input) => {
1650 message.input = Some(input.into());
1651 ArgumentKind::Input
1652 }
1653 Result(result) => {
1654 message.result = Some(result.into());
1655 ArgumentKind::Result
1656 }
1657 NestedResult(result, subresult) => {
1658 message.result = Some(result.into());
1659 message.subresult = Some(subresult.into());
1660 ArgumentKind::Result
1661 }
1662 };
1663
1664 message.set_kind(kind);
1665 message
1666 }
1667}
1668
1669impl TryFrom<&Argument> for sui_sdk_types::Argument {
1670 type Error = TryFromProtoError;
1671
1672 fn try_from(value: &Argument) -> Result<Self, Self::Error> {
1673 use argument::ArgumentKind;
1674
1675 match value.kind() {
1676 ArgumentKind::Unknown => {
1677 return Err(TryFromProtoError::invalid(
1678 Argument::KIND_FIELD,
1679 "unknown ArgumentKind",
1680 ))
1681 }
1682 ArgumentKind::Gas => Self::Gas,
1683 ArgumentKind::Input => {
1684 let input = value
1685 .input
1686 .ok_or_else(|| TryFromProtoError::missing("input"))?
1687 .try_into()
1688 .map_err(|e| TryFromProtoError::invalid(Argument::INPUT_FIELD, e))?;
1689 Self::Input(input)
1690 }
1691 ArgumentKind::Result => {
1692 let result = value
1693 .result
1694 .ok_or_else(|| TryFromProtoError::missing("result"))?
1695 .try_into()
1696 .map_err(|e| TryFromProtoError::invalid(Argument::RESULT_FIELD, e))?;
1697
1698 if let Some(subresult) = value.subresult {
1699 Self::NestedResult(
1700 result,
1701 subresult.try_into().map_err(|e| {
1702 TryFromProtoError::invalid(Argument::SUBRESULT_FIELD, e)
1703 })?,
1704 )
1705 } else {
1706 Self::Result(result)
1707 }
1708 }
1709 }
1710 .pipe(Ok)
1711 }
1712}
1713
1714impl From<command::Command> for Command {
1719 fn from(value: command::Command) -> Self {
1720 Self {
1721 command: Some(value),
1722 }
1723 }
1724}
1725
1726impl From<MoveCall> for command::Command {
1727 fn from(value: MoveCall) -> Self {
1728 Self::MoveCall(value)
1729 }
1730}
1731
1732impl From<MoveCall> for Command {
1733 fn from(value: MoveCall) -> Self {
1734 command::Command::from(value).into()
1735 }
1736}
1737
1738impl From<TransferObjects> for command::Command {
1739 fn from(value: TransferObjects) -> Self {
1740 Self::TransferObjects(value)
1741 }
1742}
1743
1744impl From<TransferObjects> for Command {
1745 fn from(value: TransferObjects) -> Self {
1746 command::Command::from(value).into()
1747 }
1748}
1749
1750impl From<sui_sdk_types::Command> for Command {
1751 fn from(value: sui_sdk_types::Command) -> Self {
1752 use command::Command;
1753 use sui_sdk_types::Command::*;
1754
1755 let command = match value {
1756 MoveCall(move_call) => Command::MoveCall(move_call.into()),
1757 TransferObjects(transfer_objects) => Command::TransferObjects(transfer_objects.into()),
1758 SplitCoins(split_coins) => Command::SplitCoins(split_coins.into()),
1759 MergeCoins(merge_coins) => Command::MergeCoins(merge_coins.into()),
1760 Publish(publish) => Command::Publish(publish.into()),
1761 MakeMoveVector(make_move_vector) => Command::MakeMoveVector(make_move_vector.into()),
1762 Upgrade(upgrade) => Command::Upgrade(upgrade.into()),
1763
1764 _ => return Self::default(),
1766 };
1767
1768 Self {
1769 command: Some(command),
1770 }
1771 }
1772}
1773
1774impl TryFrom<&Command> for sui_sdk_types::Command {
1775 type Error = TryFromProtoError;
1776
1777 fn try_from(value: &Command) -> Result<Self, Self::Error> {
1778 use command::Command;
1779
1780 match value
1781 .command
1782 .as_ref()
1783 .ok_or_else(|| TryFromProtoError::missing("command"))?
1784 {
1785 Command::MoveCall(move_call) => Self::MoveCall(move_call.try_into()?),
1786 Command::TransferObjects(transfer_objects) => {
1787 Self::TransferObjects(transfer_objects.try_into()?)
1788 }
1789 Command::SplitCoins(split_coins) => Self::SplitCoins(split_coins.try_into()?),
1790 Command::MergeCoins(merge_coins) => Self::MergeCoins(merge_coins.try_into()?),
1791 Command::Publish(publish) => Self::Publish(publish.try_into()?),
1792 Command::MakeMoveVector(make_move_vector) => {
1793 Self::MakeMoveVector(make_move_vector.try_into()?)
1794 }
1795 Command::Upgrade(upgrade) => Self::Upgrade(upgrade.try_into()?),
1796 }
1797 .pipe(Ok)
1798 }
1799}
1800
1801impl From<sui_sdk_types::MoveCall> for MoveCall {
1806 fn from(value: sui_sdk_types::MoveCall) -> Self {
1807 Self {
1808 package: Some(value.package.to_string()),
1809 module: Some(value.module.to_string()),
1810 function: Some(value.function.to_string()),
1811 type_arguments: value
1812 .type_arguments
1813 .iter()
1814 .map(ToString::to_string)
1815 .collect(),
1816 arguments: value.arguments.into_iter().map(Into::into).collect(),
1817 }
1818 }
1819}
1820
1821impl TryFrom<&MoveCall> for sui_sdk_types::MoveCall {
1822 type Error = TryFromProtoError;
1823
1824 fn try_from(value: &MoveCall) -> Result<Self, Self::Error> {
1825 let package = value
1826 .package
1827 .as_ref()
1828 .ok_or_else(|| TryFromProtoError::missing("package"))?
1829 .parse()
1830 .map_err(|e| TryFromProtoError::invalid(MoveCall::PACKAGE_FIELD, e))?;
1831
1832 let module = value
1833 .module
1834 .as_ref()
1835 .ok_or_else(|| TryFromProtoError::missing("module"))?
1836 .parse()
1837 .map_err(|e| TryFromProtoError::invalid(MoveCall::MODULE_FIELD, e))?;
1838
1839 let function = value
1840 .function
1841 .as_ref()
1842 .ok_or_else(|| TryFromProtoError::missing("function"))?
1843 .parse()
1844 .map_err(|e| TryFromProtoError::invalid(MoveCall::FUNCTION_FIELD, e))?;
1845
1846 let type_arguments = value
1847 .type_arguments
1848 .iter()
1849 .map(|t| {
1850 t.parse()
1851 .map_err(|e| TryFromProtoError::invalid(MoveCall::TYPE_ARGUMENTS_FIELD, e))
1852 })
1853 .collect::<Result<_, _>>()?;
1854 let arguments = value
1855 .arguments
1856 .iter()
1857 .map(TryInto::try_into)
1858 .collect::<Result<_, _>>()?;
1859
1860 Ok(Self {
1861 package,
1862 module,
1863 function,
1864 type_arguments,
1865 arguments,
1866 })
1867 }
1868}
1869
1870impl From<sui_sdk_types::TransferObjects> for TransferObjects {
1875 fn from(value: sui_sdk_types::TransferObjects) -> Self {
1876 Self {
1877 objects: value.objects.into_iter().map(Into::into).collect(),
1878 address: Some(value.address.into()),
1879 }
1880 }
1881}
1882
1883impl TryFrom<&TransferObjects> for sui_sdk_types::TransferObjects {
1884 type Error = TryFromProtoError;
1885
1886 fn try_from(value: &TransferObjects) -> Result<Self, Self::Error> {
1887 let objects = value
1888 .objects
1889 .iter()
1890 .map(TryInto::try_into)
1891 .collect::<Result<_, _>>()?;
1892
1893 let address = value
1894 .address
1895 .as_ref()
1896 .ok_or_else(|| TryFromProtoError::missing("address"))?
1897 .try_into()?;
1898
1899 Ok(Self { objects, address })
1900 }
1901}
1902
1903impl From<sui_sdk_types::SplitCoins> for SplitCoins {
1908 fn from(value: sui_sdk_types::SplitCoins) -> Self {
1909 Self {
1910 coin: Some(value.coin.into()),
1911 amounts: value.amounts.into_iter().map(Into::into).collect(),
1912 }
1913 }
1914}
1915
1916impl TryFrom<&SplitCoins> for sui_sdk_types::SplitCoins {
1917 type Error = TryFromProtoError;
1918
1919 fn try_from(value: &SplitCoins) -> Result<Self, Self::Error> {
1920 let coin = value
1921 .coin
1922 .as_ref()
1923 .ok_or_else(|| TryFromProtoError::missing("coin"))?
1924 .try_into()?;
1925
1926 let amounts = value
1927 .amounts
1928 .iter()
1929 .map(TryInto::try_into)
1930 .collect::<Result<_, _>>()?;
1931
1932 Ok(Self { coin, amounts })
1933 }
1934}
1935
1936impl From<sui_sdk_types::MergeCoins> for MergeCoins {
1941 fn from(value: sui_sdk_types::MergeCoins) -> Self {
1942 Self {
1943 coin: Some(value.coin.into()),
1944 coins_to_merge: value.coins_to_merge.into_iter().map(Into::into).collect(),
1945 }
1946 }
1947}
1948
1949impl TryFrom<&MergeCoins> for sui_sdk_types::MergeCoins {
1950 type Error = TryFromProtoError;
1951
1952 fn try_from(value: &MergeCoins) -> Result<Self, Self::Error> {
1953 let coin = value
1954 .coin
1955 .as_ref()
1956 .ok_or_else(|| TryFromProtoError::missing("coin"))?
1957 .try_into()?;
1958
1959 let coins_to_merge = value
1960 .coins_to_merge
1961 .iter()
1962 .map(TryInto::try_into)
1963 .collect::<Result<_, _>>()?;
1964
1965 Ok(Self {
1966 coin,
1967 coins_to_merge,
1968 })
1969 }
1970}
1971
1972impl From<sui_sdk_types::Publish> for Publish {
1977 fn from(value: sui_sdk_types::Publish) -> Self {
1978 Self {
1979 modules: value.modules.into_iter().map(Into::into).collect(),
1980 dependencies: value.dependencies.iter().map(ToString::to_string).collect(),
1981 }
1982 }
1983}
1984
1985impl TryFrom<&Publish> for sui_sdk_types::Publish {
1986 type Error = TryFromProtoError;
1987
1988 fn try_from(value: &Publish) -> Result<Self, Self::Error> {
1989 let modules = value.modules.iter().map(|bytes| bytes.to_vec()).collect();
1990
1991 let dependencies = value
1992 .dependencies
1993 .iter()
1994 .map(|s| s.parse())
1995 .collect::<Result<_, _>>()
1996 .map_err(|e| TryFromProtoError::invalid(Publish::DEPENDENCIES_FIELD, e))?;
1997
1998 Ok(Self {
1999 modules,
2000 dependencies,
2001 })
2002 }
2003}
2004
2005impl From<sui_sdk_types::MakeMoveVector> for MakeMoveVector {
2010 fn from(value: sui_sdk_types::MakeMoveVector) -> Self {
2011 Self {
2012 element_type: value.type_.map(|t| t.to_string()),
2013 elements: value.elements.into_iter().map(Into::into).collect(),
2014 }
2015 }
2016}
2017
2018impl TryFrom<&MakeMoveVector> for sui_sdk_types::MakeMoveVector {
2019 type Error = TryFromProtoError;
2020
2021 fn try_from(value: &MakeMoveVector) -> Result<Self, Self::Error> {
2022 let element_type = value
2023 .element_type
2024 .as_ref()
2025 .map(|t| {
2026 t.parse()
2027 .map_err(|e| TryFromProtoError::invalid(MakeMoveVector::ELEMENT_TYPE_FIELD, e))
2028 })
2029 .transpose()?;
2030
2031 let elements = value
2032 .elements
2033 .iter()
2034 .map(TryInto::try_into)
2035 .collect::<Result<_, _>>()?;
2036
2037 Ok(Self {
2038 type_: element_type,
2039 elements,
2040 })
2041 }
2042}
2043
2044impl From<sui_sdk_types::Upgrade> for Upgrade {
2049 fn from(value: sui_sdk_types::Upgrade) -> Self {
2050 Self {
2051 modules: value.modules.into_iter().map(Into::into).collect(),
2052 dependencies: value.dependencies.iter().map(ToString::to_string).collect(),
2053 package: Some(value.package.to_string()),
2054 ticket: Some(value.ticket.into()),
2055 }
2056 }
2057}
2058
2059impl TryFrom<&Upgrade> for sui_sdk_types::Upgrade {
2060 type Error = TryFromProtoError;
2061
2062 fn try_from(value: &Upgrade) -> Result<Self, Self::Error> {
2063 let modules = value.modules.iter().map(|bytes| bytes.to_vec()).collect();
2064
2065 let dependencies = value
2066 .dependencies
2067 .iter()
2068 .map(|s| s.parse())
2069 .collect::<Result<_, _>>()
2070 .map_err(|e| TryFromProtoError::invalid(Upgrade::DEPENDENCIES_FIELD, e))?;
2071
2072 let package = value
2073 .package
2074 .as_ref()
2075 .ok_or_else(|| TryFromProtoError::missing("package"))?
2076 .parse()
2077 .map_err(|e| TryFromProtoError::invalid(Upgrade::PACKAGE_FIELD, e))?;
2078
2079 let ticket = value
2080 .ticket
2081 .as_ref()
2082 .ok_or_else(|| TryFromProtoError::missing("ticket"))?
2083 .try_into()?;
2084
2085 Ok(Self {
2086 modules,
2087 dependencies,
2088 package,
2089 ticket,
2090 })
2091 }
2092}