sui_rpc/proto/sui/rpc/v2/
transaction.rs

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