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