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