Skip to main content

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