iota_types/
iota_sdk_types_conversions.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5//! Module for conversions between iota-core types and iota-sdk types
6//!
7//! For now this module makes heavy use of the `bcs_convert_impl` macro to
8//! implement the `From` trait for converting between core and external sdk
9//! types, relying on the fact that the BCS format of these types are strictly
10//! identical. As time goes on we'll slowly hand implement these impls
11//! directly to avoid going through the BCS machinery.
12
13use fastcrypto::traits::ToFromBytes;
14use iota_sdk2::types::{
15    object::{MovePackage, MoveStruct},
16    transaction::{ChangeEpoch, ChangeEpochV2},
17    *,
18};
19use move_core_types::language_storage::ModuleId;
20use tap::Pipe;
21
22use crate::transaction::TransactionDataAPI as _;
23
24#[derive(Debug)]
25pub struct SdkTypeConversionError(pub String);
26
27impl std::fmt::Display for SdkTypeConversionError {
28    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
29        f.write_str(&self.0)
30    }
31}
32
33impl std::error::Error for SdkTypeConversionError {}
34
35impl From<TypeParseError> for SdkTypeConversionError {
36    fn from(value: TypeParseError) -> Self {
37        Self(value.to_string())
38    }
39}
40
41impl From<anyhow::Error> for SdkTypeConversionError {
42    fn from(value: anyhow::Error) -> Self {
43        Self(value.to_string())
44    }
45}
46
47impl From<bcs::Error> for SdkTypeConversionError {
48    fn from(value: bcs::Error) -> Self {
49        Self(value.to_string())
50    }
51}
52
53impl TryFrom<crate::object::Object> for Object {
54    type Error = SdkTypeConversionError;
55
56    fn try_from(value: crate::object::Object) -> Result<Self, Self::Error> {
57        Self {
58            data: value.data.clone().try_into()?,
59            owner: value.owner.into(),
60            previous_transaction: value.previous_transaction.into(),
61            storage_rebate: value.storage_rebate,
62        }
63        .pipe(Ok)
64    }
65}
66
67impl TryFrom<Object> for crate::object::Object {
68    type Error = SdkTypeConversionError;
69
70    fn try_from(value: Object) -> Result<Self, Self::Error> {
71        Self::new_from_genesis(
72            value.data.try_into()?,
73            value.owner.into(),
74            value.previous_transaction.into(),
75        )
76        .pipe(Ok)
77    }
78}
79
80impl TryFrom<crate::object::Data> for ObjectData {
81    type Error = SdkTypeConversionError;
82
83    fn try_from(value: crate::object::Data) -> Result<Self, Self::Error> {
84        match value {
85            crate::object::Data::Move(move_object) => Self::Struct(move_object_to_sdk(move_object)),
86            crate::object::Data::Package(move_package) => {
87                Self::Package(move_package_to_sdk(move_package))
88            }
89        }
90        .pipe(Ok)
91    }
92}
93
94impl TryFrom<ObjectData> for crate::object::Data {
95    type Error = SdkTypeConversionError;
96
97    fn try_from(value: ObjectData) -> Result<Self, Self::Error> {
98        match value {
99            ObjectData::Struct(move_object) => Self::Move(sdk_object_to_move(move_object)?),
100            ObjectData::Package(move_package) => Self::Package(sdk_package_to_move(move_package)),
101        }
102        .pipe(Ok)
103    }
104}
105
106fn move_type_tag_to_sdk(tt: move_core_types::language_storage::TypeTag) -> TypeTag {
107    use move_core_types::language_storage::TypeTag as MoveTypeTag;
108    match tt {
109        MoveTypeTag::Bool => TypeTag::Bool,
110        MoveTypeTag::U8 => TypeTag::U8,
111        MoveTypeTag::U64 => TypeTag::U64,
112        MoveTypeTag::U128 => TypeTag::U128,
113        MoveTypeTag::Address => TypeTag::Address,
114        MoveTypeTag::Signer => TypeTag::Signer,
115        MoveTypeTag::Vector(type_tag) => TypeTag::Vector(Box::new(move_type_tag_to_sdk(*type_tag))),
116        MoveTypeTag::Struct(struct_tag) => {
117            TypeTag::Struct(Box::new(move_struct_tag_to_sdk(*struct_tag)))
118        }
119        MoveTypeTag::U16 => TypeTag::U16,
120        MoveTypeTag::U32 => TypeTag::U32,
121        MoveTypeTag::U256 => TypeTag::U256,
122    }
123}
124
125fn move_struct_tag_to_sdk(st: move_core_types::language_storage::StructTag) -> StructTag {
126    StructTag {
127        address: Address::new(st.address.into_bytes()),
128        module: Identifier::new(st.module.as_str()).expect("module identifier conversion failed"),
129        name: Identifier::new(st.name.as_str()).expect("struct name identifier conversion failed"),
130        type_params: st
131            .type_params
132            .into_iter()
133            .map(move_type_tag_to_sdk)
134            .collect(),
135    }
136}
137
138fn move_package_to_sdk(package: crate::move_package::MovePackage) -> MovePackage {
139    MovePackage {
140        id: package.id().into(),
141        version: package.version().value(),
142        modules: package
143            .module_map
144            .into_iter()
145            .map(|(name, bytes)| {
146                (
147                    Identifier::new(name).expect("package name identifier conversion failed"),
148                    bytes,
149                )
150            })
151            .collect(),
152        type_origin_table: package
153            .type_origin_table
154            .into_iter()
155            .map(move_type_origin_to_sdk)
156            .collect(),
157        linkage_table: package
158            .linkage_table
159            .into_iter()
160            .map(|(id, info)| (id.into(), move_upgrade_info_to_sdk(info)))
161            .collect(),
162    }
163}
164
165fn sdk_package_to_move(package: MovePackage) -> crate::move_package::MovePackage {
166    crate::move_package::MovePackage {
167        id: package.id.into(),
168        version: package.version.into(),
169        module_map: package
170            .modules
171            .into_iter()
172            .map(|(name, bytes)| (name.to_string(), bytes))
173            .collect(),
174        type_origin_table: package
175            .type_origin_table
176            .into_iter()
177            .map(sdk_type_origin_to_move)
178            .collect(),
179        linkage_table: package
180            .linkage_table
181            .into_iter()
182            .map(|(id, info)| (id.into(), sdk_upgrade_info_to_move(info)))
183            .collect(),
184    }
185}
186
187fn move_object_to_sdk(obj: crate::object::MoveObject) -> MoveStruct {
188    MoveStruct {
189        type_: move_object_type_to_sdk(obj.type_),
190        version: obj.version.value(),
191        contents: obj.contents,
192    }
193}
194
195fn sdk_object_to_move(
196    obj: MoveStruct,
197) -> Result<crate::object::MoveObject, SdkTypeConversionError> {
198    crate::object::MoveObject {
199        type_: sdk_object_type_to_move(obj.type_)?,
200        version: obj.version.into(),
201        contents: obj.contents,
202    }
203    .pipe(Ok)
204}
205
206fn move_object_type_to_sdk(type_: crate::base_types::MoveObjectType) -> StructTag {
207    move_struct_tag_to_sdk(move_core_types::language_storage::StructTag {
208        address: type_.address(),
209        module: type_.module().to_owned(),
210        name: type_.name().to_owned(),
211        type_params: type_.type_params(),
212    })
213}
214
215fn sdk_object_type_to_move(
216    type_: StructTag,
217) -> Result<crate::base_types::MoveObjectType, SdkTypeConversionError> {
218    crate::base_types::MoveObjectType::from(move_core_types::language_storage::StructTag {
219        address: move_core_types::account_address::AccountAddress::new(type_.address.into_inner()),
220        module: crate::Identifier::new(type_.module.as_str())?,
221        name: crate::Identifier::new(type_.name.as_str())?,
222        type_params: type_
223            .type_params
224            .into_iter()
225            .map(type_tag_sdk_to_core)
226            .collect::<Result<_, _>>()?,
227    })
228    .pipe(Ok)
229}
230
231fn move_type_origin_to_sdk(origin: crate::move_package::TypeOrigin) -> TypeOrigin {
232    TypeOrigin {
233        module_name: Identifier::new(&origin.module_name)
234            .expect("module identifier conversion failed"),
235        struct_name: Identifier::new(&origin.datatype_name)
236            .expect("struct identifier conversion failed"),
237        package: origin.package.into(),
238    }
239}
240
241fn sdk_type_origin_to_move(origin: TypeOrigin) -> crate::move_package::TypeOrigin {
242    crate::move_package::TypeOrigin {
243        module_name: origin.module_name.to_string(),
244        datatype_name: origin.struct_name.to_string(),
245        package: origin.package.into(),
246    }
247}
248
249fn move_upgrade_info_to_sdk(info: crate::move_package::UpgradeInfo) -> UpgradeInfo {
250    UpgradeInfo {
251        upgraded_id: info.upgraded_id.into(),
252        upgraded_version: info.upgraded_version.value(),
253    }
254}
255
256fn sdk_upgrade_info_to_move(info: UpgradeInfo) -> crate::move_package::UpgradeInfo {
257    crate::move_package::UpgradeInfo {
258        upgraded_id: info.upgraded_id.into(),
259        upgraded_version: info.upgraded_version.into(),
260    }
261}
262
263impl TryFrom<crate::transaction::TransactionData> for Transaction {
264    type Error = SdkTypeConversionError;
265
266    fn try_from(value: crate::transaction::TransactionData) -> Result<Self, Self::Error> {
267        Self {
268            sender: Address::new(value.sender().to_inner()),
269            gas_payment: GasPayment {
270                objects: value
271                    .gas()
272                    .iter()
273                    .map(|(id, seq, digest)| {
274                        ObjectReference::new((*id).into(), seq.value(), (*digest).into())
275                    })
276                    .collect(),
277                owner: Address::new(value.gas_data().owner.to_inner()),
278                price: value.gas_data().price,
279                budget: value.gas_data().budget,
280            },
281            expiration: match value.expiration() {
282                crate::transaction::TransactionExpiration::None => TransactionExpiration::None,
283                crate::transaction::TransactionExpiration::Epoch(e) => {
284                    TransactionExpiration::Epoch(*e)
285                }
286            },
287            kind: value.into_kind().try_into()?,
288        }
289        .pipe(Ok)
290    }
291}
292
293impl TryFrom<Transaction> for crate::transaction::TransactionData {
294    type Error = SdkTypeConversionError;
295
296    fn try_from(value: Transaction) -> Result<Self, Self::Error> {
297        Self::new_with_gas_data(
298            value.kind.try_into()?,
299            value.sender.into(),
300            crate::transaction::GasData {
301                payment: value
302                    .gas_payment
303                    .objects
304                    .into_iter()
305                    .map(ObjectReference::into_parts)
306                    .map(|(id, seq, digest)| (id.into(), seq.into(), digest.into()))
307                    .collect(),
308                owner: value.gas_payment.owner.into(),
309                price: value.gas_payment.price,
310                budget: value.gas_payment.budget,
311            },
312        )
313        .pipe(Ok)
314    }
315}
316
317impl TryFrom<crate::transaction::TransactionKind> for TransactionKind {
318    type Error = SdkTypeConversionError;
319
320    fn try_from(value: crate::transaction::TransactionKind) -> Result<Self, Self::Error> {
321        use crate::transaction::TransactionKind as InternalTxnKind;
322
323        match value {
324            InternalTxnKind::ProgrammableTransaction(programmable_transaction) => {
325                TransactionKind::ProgrammableTransaction(ProgrammableTransaction {
326                    inputs: programmable_transaction
327                        .inputs
328                        .into_iter()
329                        .map(Into::into)
330                        .collect(),
331                    commands: programmable_transaction
332                        .commands
333                        .into_iter()
334                        .map(TryInto::try_into)
335                        .collect::<Result<_, _>>()?,
336                })
337            }
338            InternalTxnKind::Genesis(genesis_transaction) => {
339                TransactionKind::Genesis(GenesisTransaction {
340                    objects: genesis_transaction
341                        .objects
342                        .into_iter()
343                        .map(|obj| match obj {
344                            crate::transaction::GenesisObject::RawObject { data, owner } => {
345                                match data.try_into() {
346                                    Ok(data) => Ok(GenesisObject {
347                                        data,
348                                        owner: owner.into(),
349                                    }),
350                                    Err(e) => Err(e),
351                                }
352                            }
353                        })
354                        .collect::<Result<_,_>>()?,
355                    events: genesis_transaction
356                        .events
357                        .into_iter()
358                        .map(|event| {
359                            let module = Identifier::new(event.transaction_module.as_str());
360                            let type_ = struct_tag_core_to_sdk(event.type_);
361
362                            match (module, type_) {
363                                (Ok(module), Ok(type_)) => Ok(Event {
364                                    package_id: event.package_id.into(),
365                                    module,
366                                    sender: event.sender.into(),
367                                    type_,
368                                    contents: event.contents,
369                                }),
370                                _ => Err(SdkTypeConversionError(
371                                    "invalid transaction module or struct tag".to_string(),
372                                )),
373                            }
374                        })
375                        .collect::<Result<_,_>>()?,
376                })
377            }
378            InternalTxnKind::ConsensusCommitPrologueV1(consensus_commit_prologue_v1) => {
379                let consensus_determined_version_assignments = match consensus_commit_prologue_v1.consensus_determined_version_assignments {
380                    crate::messages_consensus::ConsensusDeterminedVersionAssignments::CancelledTransactions(vec) =>
381                        ConsensusDeterminedVersionAssignments::CancelledTransactions {
382                            cancelled_transactions: vec.into_iter().map(|value| CancelledTransaction {
383                                digest: value.0.into(),
384                                version_assignments:
385                                    value
386                                        .1
387                                        .into_iter()
388                                        .map(|value| VersionAssignment { object_id: value.0.into(), version: value.1.value() })
389                                        .collect(),
390                            }).collect()
391                        },
392                };
393                TransactionKind::ConsensusCommitPrologueV1(ConsensusCommitPrologueV1 {
394                    epoch: consensus_commit_prologue_v1.epoch,
395                    round: consensus_commit_prologue_v1.round,
396                    sub_dag_index: consensus_commit_prologue_v1.sub_dag_index,
397                    commit_timestamp_ms: consensus_commit_prologue_v1.commit_timestamp_ms,
398                    consensus_commit_digest: consensus_commit_prologue_v1
399                        .consensus_commit_digest
400                        .into(),
401                    consensus_determined_version_assignments,
402                })
403            }
404            InternalTxnKind::AuthenticatorStateUpdateV1(authenticator_state_update_v1) => {
405                TransactionKind::AuthenticatorStateUpdateV1(AuthenticatorStateUpdateV1 {
406                    epoch: authenticator_state_update_v1.epoch,
407                    round: authenticator_state_update_v1.round,
408                    new_active_jwks: authenticator_state_update_v1
409                        .new_active_jwks
410                        .into_iter()
411                        .map(|jwk| ActiveJwk {
412                            jwk_id: JwkId {
413                                iss: jwk.jwk_id.iss,
414                                kid: jwk.jwk_id.kid,
415                            },
416                            jwk: Jwk {
417                                kty: jwk.jwk.kty,
418                                e: jwk.jwk.e,
419                                n: jwk.jwk.n,
420                                alg: jwk.jwk.alg,
421                            },
422                            epoch: jwk.epoch,
423                        })
424                        .collect(),
425                    authenticator_obj_initial_shared_version: authenticator_state_update_v1
426                        .authenticator_obj_initial_shared_version
427                        .value(),
428                })
429            }
430            InternalTxnKind::EndOfEpochTransaction(vec) => {
431                TransactionKind::EndOfEpoch(vec.into_iter().map(Into::into).collect())
432            }
433            InternalTxnKind::RandomnessStateUpdate(randomness_state_update) => {
434                TransactionKind::RandomnessStateUpdate(RandomnessStateUpdate {
435                    epoch: randomness_state_update.epoch,
436                    randomness_round: randomness_state_update.randomness_round.0,
437                    random_bytes: randomness_state_update.random_bytes,
438                    randomness_obj_initial_shared_version: randomness_state_update
439                        .randomness_obj_initial_shared_version
440                        .value(),
441                })
442            }
443        }
444        .pipe(Ok)
445    }
446}
447
448impl TryFrom<TransactionKind> for crate::transaction::TransactionKind {
449    type Error = SdkTypeConversionError;
450
451    fn try_from(value: TransactionKind) -> Result<Self, Self::Error> {
452        match value {
453            TransactionKind::ProgrammableTransaction(programmable_transaction) => {
454                Self::ProgrammableTransaction(crate::transaction::ProgrammableTransaction {
455                    inputs: programmable_transaction
456                        .inputs
457                        .into_iter()
458                        .map(Into::into)
459                        .collect(),
460                    commands: programmable_transaction
461                        .commands
462                        .into_iter()
463                        .map(TryInto::try_into)
464                        .collect::<Result<_,_>>()?,
465                })
466            }
467            TransactionKind::Genesis(genesis_transaction) => {
468                Self::Genesis(crate::transaction::GenesisTransaction {
469                    objects: genesis_transaction
470                        .objects
471                        .into_iter()
472                        .map(|obj| {
473                            match obj.data.try_into() {
474                                Ok(data) => Ok(crate::transaction::GenesisObject::RawObject {
475                                    data,
476                                    owner: obj.owner.into(),
477                                }),
478                                Err(e) => Err(e),
479                            }
480                        })
481                        .collect::<Result<_,_>>()?,
482                    events: genesis_transaction
483                        .events
484                        .into_iter()
485                        .map(|event| {
486                            let transaction_module = crate::Identifier::new(event.module.as_str());
487                            let type_ = struct_tag_sdk_to_core(event.type_);
488
489                            match (transaction_module, type_) {
490                                (Ok(transaction_module), Ok(type_)) => Ok(crate::event::Event {
491                                    package_id: event.package_id.into(),
492                                    transaction_module,
493                                    sender: event.sender.into(),
494                                    type_,
495                                    contents: event.contents,
496                                }),
497                                _ => Err(SdkTypeConversionError(
498                                    "invalid transaction module or struct tag".to_string(),
499                                )),
500                            }
501                        })
502                        .collect::<Result<_,_>>()?,
503                })
504            }
505            TransactionKind::ConsensusCommitPrologueV1(consensus_commit_prologue_v1) => {
506                let consensus_determined_version_assignments = match consensus_commit_prologue_v1.consensus_determined_version_assignments {
507                    ConsensusDeterminedVersionAssignments::CancelledTransactions{ cancelled_transactions } =>
508                    crate::messages_consensus::ConsensusDeterminedVersionAssignments::CancelledTransactions(
509                        cancelled_transactions.into_iter().map(|value|
510                            (
511                                value.digest.into(),
512                                value
513                                    .version_assignments
514                                    .into_iter()
515                                    .map(|value| (value.object_id.into(), value.version.into()))
516                                    .collect()
517                            )
518                        ).collect()
519                    ),
520                };
521                Self::ConsensusCommitPrologueV1(
522                    crate::messages_consensus::ConsensusCommitPrologueV1 {
523                        epoch: consensus_commit_prologue_v1.epoch,
524                        round: consensus_commit_prologue_v1.round,
525                        sub_dag_index: consensus_commit_prologue_v1.sub_dag_index,
526                        commit_timestamp_ms: consensus_commit_prologue_v1.commit_timestamp_ms,
527                        consensus_commit_digest: consensus_commit_prologue_v1
528                            .consensus_commit_digest
529                            .into(),
530                        consensus_determined_version_assignments,
531                    },
532                )
533            }
534            TransactionKind::AuthenticatorStateUpdateV1(authenticator_state_update_v1) => {
535                Self::AuthenticatorStateUpdateV1(crate::transaction::AuthenticatorStateUpdateV1 {
536                    epoch: authenticator_state_update_v1.epoch,
537                    round: authenticator_state_update_v1.round,
538                    new_active_jwks: authenticator_state_update_v1
539                        .new_active_jwks
540                        .into_iter()
541                        .map(|jwk| crate::authenticator_state::ActiveJwk {
542                            jwk_id: crate::authenticator_state::JwkId {
543                                iss: jwk.jwk_id.iss,
544                                kid: jwk.jwk_id.kid,
545                            },
546                            jwk: crate::authenticator_state::JWK {
547                                kty: jwk.jwk.kty,
548                                e: jwk.jwk.e,
549                                n: jwk.jwk.n,
550                                alg: jwk.jwk.alg,
551                            },
552                            epoch: jwk.epoch,
553                        })
554                        .collect(),
555                    authenticator_obj_initial_shared_version: authenticator_state_update_v1
556                        .authenticator_obj_initial_shared_version
557                        .into(),
558                })
559            }
560            TransactionKind::EndOfEpoch(vec) => {
561                Self::EndOfEpochTransaction(vec.into_iter().map(Into::into).collect())
562            }
563            TransactionKind::RandomnessStateUpdate(randomness_state_update) => {
564                Self::RandomnessStateUpdate(crate::transaction::RandomnessStateUpdate {
565                    epoch: randomness_state_update.epoch,
566                    randomness_round: crate::crypto::RandomnessRound(
567                        randomness_state_update.randomness_round,
568                    ),
569                    random_bytes: randomness_state_update.random_bytes,
570                    randomness_obj_initial_shared_version: randomness_state_update
571                        .randomness_obj_initial_shared_version
572                        .into(),
573                })
574            }
575        }
576        .pipe(Ok)
577    }
578}
579
580impl From<crate::transaction::EndOfEpochTransactionKind> for EndOfEpochTransactionKind {
581    fn from(value: crate::transaction::EndOfEpochTransactionKind) -> Self {
582        match value {
583            crate::transaction::EndOfEpochTransactionKind::ChangeEpoch(change_epoch) => {
584                EndOfEpochTransactionKind::ChangeEpoch(ChangeEpoch {
585                    epoch: change_epoch.epoch,
586                    protocol_version: change_epoch.protocol_version.as_u64(),
587                    storage_charge: change_epoch.storage_charge,
588                    computation_charge: change_epoch.computation_charge,
589                    storage_rebate: change_epoch.storage_rebate,
590                    non_refundable_storage_fee: change_epoch.non_refundable_storage_fee,
591                    epoch_start_timestamp_ms: change_epoch.epoch_start_timestamp_ms,
592                    system_packages: change_epoch
593                        .system_packages
594                        .into_iter()
595                        .map(|(version, modules, dependencies)| SystemPackage {
596                            version: version.value(),
597                            modules,
598                            dependencies: dependencies.into_iter().map(Into::into).collect(),
599                        })
600                        .collect(),
601                })
602            }
603            crate::transaction::EndOfEpochTransactionKind::ChangeEpochV2(change_epoch_v2) => {
604                EndOfEpochTransactionKind::ChangeEpochV2(ChangeEpochV2 {
605                    epoch: change_epoch_v2.epoch,
606                    protocol_version: change_epoch_v2.protocol_version.as_u64(),
607                    storage_charge: change_epoch_v2.storage_charge,
608                    computation_charge: change_epoch_v2.computation_charge,
609                    computation_charge_burned: change_epoch_v2.computation_charge_burned,
610                    storage_rebate: change_epoch_v2.storage_rebate,
611                    non_refundable_storage_fee: change_epoch_v2.non_refundable_storage_fee,
612                    epoch_start_timestamp_ms: change_epoch_v2.epoch_start_timestamp_ms,
613                    system_packages: change_epoch_v2
614                        .system_packages
615                        .into_iter()
616                        .map(|(version, modules, dependencies)| SystemPackage {
617                            version: version.value(),
618                            modules,
619                            dependencies: dependencies.into_iter().map(Into::into).collect(),
620                        })
621                        .collect(),
622                })
623            }
624            crate::transaction::EndOfEpochTransactionKind::AuthenticatorStateCreate => {
625                EndOfEpochTransactionKind::AuthenticatorStateCreate
626            }
627            crate::transaction::EndOfEpochTransactionKind::AuthenticatorStateExpire(
628                authenticator_state_expire,
629            ) => EndOfEpochTransactionKind::AuthenticatorStateExpire(AuthenticatorStateExpire {
630                min_epoch: authenticator_state_expire.min_epoch,
631                authenticator_obj_initial_shared_version: authenticator_state_expire
632                    .authenticator_obj_initial_shared_version
633                    .value(),
634            }),
635        }
636    }
637}
638
639impl From<EndOfEpochTransactionKind> for crate::transaction::EndOfEpochTransactionKind {
640    fn from(value: EndOfEpochTransactionKind) -> Self {
641        match value {
642            EndOfEpochTransactionKind::ChangeEpoch(change_epoch) => {
643                Self::ChangeEpoch(crate::transaction::ChangeEpoch {
644                    epoch: change_epoch.epoch,
645                    protocol_version: change_epoch.protocol_version.into(),
646                    storage_charge: change_epoch.storage_charge,
647                    computation_charge: change_epoch.computation_charge,
648                    storage_rebate: change_epoch.storage_rebate,
649                    non_refundable_storage_fee: change_epoch.non_refundable_storage_fee,
650                    epoch_start_timestamp_ms: change_epoch.epoch_start_timestamp_ms,
651                    system_packages: change_epoch
652                        .system_packages
653                        .into_iter()
654                        .map(|package| {
655                            (
656                                package.version.into(),
657                                package.modules,
658                                package.dependencies.into_iter().map(Into::into).collect(),
659                            )
660                        })
661                        .collect(),
662                })
663            }
664            EndOfEpochTransactionKind::ChangeEpochV2(change_epoch_v2) => {
665                Self::ChangeEpochV2(crate::transaction::ChangeEpochV2 {
666                    epoch: change_epoch_v2.epoch,
667                    protocol_version: change_epoch_v2.protocol_version.into(),
668                    storage_charge: change_epoch_v2.storage_charge,
669                    computation_charge: change_epoch_v2.computation_charge,
670                    computation_charge_burned: change_epoch_v2.computation_charge_burned,
671                    storage_rebate: change_epoch_v2.storage_rebate,
672                    non_refundable_storage_fee: change_epoch_v2.non_refundable_storage_fee,
673                    epoch_start_timestamp_ms: change_epoch_v2.epoch_start_timestamp_ms,
674                    system_packages: change_epoch_v2
675                        .system_packages
676                        .into_iter()
677                        .map(|package| {
678                            (
679                                package.version.into(),
680                                package.modules,
681                                package.dependencies.into_iter().map(Into::into).collect(),
682                            )
683                        })
684                        .collect(),
685                })
686            }
687            EndOfEpochTransactionKind::AuthenticatorStateCreate => Self::AuthenticatorStateCreate,
688            EndOfEpochTransactionKind::AuthenticatorStateExpire(authenticator_state_expire) => {
689                Self::AuthenticatorStateExpire(crate::transaction::AuthenticatorStateExpire {
690                    min_epoch: authenticator_state_expire.min_epoch,
691                    authenticator_obj_initial_shared_version: authenticator_state_expire
692                        .authenticator_obj_initial_shared_version
693                        .into(),
694                })
695            }
696            // TODO: change accordingly once https://github.com/iotaledger/iota/pull/8127 is merged to develop
697            EndOfEpochTransactionKind::ChangeEpochV3(_) => unimplemented!(),
698        }
699    }
700}
701
702impl From<crate::transaction::CallArg> for InputArgument {
703    fn from(value: crate::transaction::CallArg) -> Self {
704        match value {
705            crate::transaction::CallArg::Pure(vec) => Self::Pure { value: vec },
706            crate::transaction::CallArg::Object(object_arg) => match object_arg {
707                crate::transaction::ObjectArg::ImmOrOwnedObject(obj_ref) => {
708                    Self::ImmutableOrOwned(core_obj_ref_to_sdk(obj_ref))
709                }
710                crate::transaction::ObjectArg::SharedObject {
711                    id,
712                    initial_shared_version,
713                    mutable,
714                } => Self::Shared {
715                    object_id: id.into(),
716                    initial_shared_version: initial_shared_version.value(),
717                    mutable,
718                },
719                crate::transaction::ObjectArg::Receiving(obj_ref) => {
720                    Self::Receiving(core_obj_ref_to_sdk(obj_ref))
721                }
722            },
723        }
724    }
725}
726
727impl From<InputArgument> for crate::transaction::CallArg {
728    fn from(value: InputArgument) -> Self {
729        use crate::transaction::ObjectArg;
730        match value {
731            InputArgument::Pure { value } => Self::Pure(value),
732            InputArgument::ImmutableOrOwned(object_reference) => Self::Object(
733                ObjectArg::ImmOrOwnedObject(sdk_obj_ref_to_core(object_reference)),
734            ),
735            InputArgument::Shared {
736                object_id,
737                initial_shared_version,
738                mutable,
739            } => Self::Object(ObjectArg::SharedObject {
740                id: object_id.into(),
741                initial_shared_version: initial_shared_version.into(),
742                mutable,
743            }),
744            InputArgument::Receiving(object_reference) => {
745                Self::Object(ObjectArg::Receiving(sdk_obj_ref_to_core(object_reference)))
746            }
747        }
748    }
749}
750
751fn core_obj_ref_to_sdk(obj_ref: crate::base_types::ObjectRef) -> ObjectReference {
752    ObjectReference::new(obj_ref.0.into(), obj_ref.1.value(), obj_ref.2.into())
753}
754
755fn sdk_obj_ref_to_core(obj_ref: ObjectReference) -> crate::base_types::ObjectRef {
756    let (id, seq, digest) = obj_ref.into_parts();
757    (id.into(), seq.into(), digest.into())
758}
759
760impl TryFrom<crate::effects::TransactionEffects> for TransactionEffects {
761    type Error = SdkTypeConversionError;
762
763    fn try_from(value: crate::effects::TransactionEffects) -> Result<Self, Self::Error> {
764        match value {
765            crate::effects::TransactionEffects::V1(effects) => {
766                Self::V1(Box::new(TransactionEffectsV1 {
767                    epoch: effects.executed_epoch,
768                    gas_used: GasCostSummary::new(
769                        effects.gas_used.computation_cost,
770                        effects.gas_used.computation_cost_burned,
771                        effects.gas_used.storage_cost,
772                        effects.gas_used.storage_rebate,
773                        effects.gas_used.non_refundable_storage_fee,
774                    ),
775                    gas_object_index: effects.gas_object_index,
776                    transaction_digest: effects.transaction_digest.into(),
777                    events_digest: effects.events_digest.map(Into::into),
778                    dependencies: effects.dependencies.into_iter().map(Into::into).collect(),
779                    lamport_version: effects.lamport_version.value(),
780                    changed_objects: effects
781                        .changed_objects
782                        .into_iter()
783                        .map(|(id, change)| ChangedObject {
784                            object_id: id.into(),
785                            change: EffectsObjectChange {
786                                input_state: match change.input_state {
787                                    crate::effects::ObjectIn::NotExist => ObjectIn::NotExist,
788                                    crate::effects::ObjectIn::Exist(((version, digest), owner)) => {
789                                        ObjectIn::Exist {
790                                            version: version.value(),
791                                            digest: digest.into(),
792                                            owner: owner.into(),
793                                        }
794                                    }
795                                },
796                                output_state: match change.output_state {
797                                    crate::effects::ObjectOut::NotExist => ObjectOut::NotExist,
798                                    crate::effects::ObjectOut::ObjectWrite((digest, owner)) => {
799                                        ObjectOut::ObjectWrite {
800                                            digest: digest.into(),
801                                            owner: owner.into(),
802                                        }
803                                    }
804                                    crate::effects::ObjectOut::PackageWrite((seq, digest)) => {
805                                        ObjectOut::PackageWrite {
806                                            version: seq.value(),
807                                            digest: digest.into(),
808                                        }
809                                    }
810                                },
811                                id_operation: match change.id_operation {
812                                    crate::effects::IDOperation::None => IdOperation::None,
813                                    crate::effects::IDOperation::Created => IdOperation::Created,
814                                    crate::effects::IDOperation::Deleted => IdOperation::Deleted,
815                                },
816                            },
817                        })
818                        .collect(),
819                    unchanged_shared_objects: effects
820                        .unchanged_shared_objects
821                        .into_iter()
822                        .map(|(id, kind)| UnchangedSharedObject {
823                            object_id: id.into(),
824                            kind: match kind {
825                                crate::effects::UnchangedSharedKind::ReadOnlyRoot((
826                                    version,
827                                    digest,
828                                )) => UnchangedSharedKind::ReadOnlyRoot {
829                                    version: version.value(),
830                                    digest: digest.into(),
831                                },
832                                crate::effects::UnchangedSharedKind::MutateDeleted(
833                                    sequence_number,
834                                ) => UnchangedSharedKind::MutateDeleted {
835                                    version: sequence_number.value(),
836                                },
837                                crate::effects::UnchangedSharedKind::ReadDeleted(
838                                    sequence_number,
839                                ) => UnchangedSharedKind::ReadDeleted {
840                                    version: sequence_number.value(),
841                                },
842                                crate::effects::UnchangedSharedKind::Cancelled(sequence_number) => {
843                                    UnchangedSharedKind::Cancelled {
844                                        version: sequence_number.value(),
845                                    }
846                                }
847                                crate::effects::UnchangedSharedKind::PerEpochConfig => {
848                                    UnchangedSharedKind::PerEpochConfig
849                                }
850                            },
851                        })
852                        .collect(),
853                    auxiliary_data_digest: effects.aux_data_digest.map(Into::into),
854                    status: effects.status.into(),
855                }))
856                .pipe(Ok)
857            }
858        }
859    }
860}
861
862impl TryFrom<TransactionEffects> for crate::effects::TransactionEffects {
863    type Error = SdkTypeConversionError;
864
865    fn try_from(value: TransactionEffects) -> Result<Self, Self::Error> {
866        match value {
867            TransactionEffects::V1(transaction_effects_v1) => {
868                let effects: crate::effects::TransactionEffects =
869                    crate::effects::effects_v1::TransactionEffectsV1 {
870                        status: transaction_effects_v1.status.into(),
871                        executed_epoch: transaction_effects_v1.epoch,
872                        gas_used: crate::gas::GasCostSummary::new(
873                            transaction_effects_v1.gas_used.computation_cost,
874                            transaction_effects_v1.gas_used.computation_cost_burned,
875                            transaction_effects_v1.gas_used.storage_cost,
876                            transaction_effects_v1.gas_used.storage_rebate,
877                            transaction_effects_v1.gas_used.non_refundable_storage_fee,
878                        ),
879                        transaction_digest: transaction_effects_v1.transaction_digest.into(),
880                        gas_object_index: transaction_effects_v1.gas_object_index,
881                        events_digest: transaction_effects_v1.events_digest.map(Into::into),
882                        dependencies: transaction_effects_v1
883                            .dependencies
884                            .into_iter()
885                            .map(Into::into)
886                            .collect(),
887                        lamport_version: transaction_effects_v1.lamport_version.into(),
888                        changed_objects: transaction_effects_v1
889                            .changed_objects
890                            .into_iter()
891                            .map(|obj| {
892                                (
893                                    obj.object_id.into(),
894                                    crate::effects::EffectsObjectChange {
895                                        input_state: match obj.change.input_state {
896                                            ObjectIn::NotExist => {
897                                                crate::effects::ObjectIn::NotExist
898                                            }
899                                            ObjectIn::Exist {
900                                                version,
901                                                digest,
902                                                owner,
903                                            } => crate::effects::ObjectIn::Exist((
904                                                (version.into(), digest.into()),
905                                                owner.into(),
906                                            )),
907                                        },
908                                        output_state: match obj.change.output_state {
909                                            ObjectOut::NotExist => {
910                                                crate::effects::ObjectOut::NotExist
911                                            }
912                                            ObjectOut::ObjectWrite { digest, owner } => {
913                                                crate::effects::ObjectOut::ObjectWrite((
914                                                    digest.into(),
915                                                    owner.into(),
916                                                ))
917                                            }
918                                            ObjectOut::PackageWrite { version, digest } => {
919                                                crate::effects::ObjectOut::PackageWrite((
920                                                    version.into(),
921                                                    digest.into(),
922                                                ))
923                                            }
924                                        },
925                                        id_operation: match obj.change.id_operation {
926                                            IdOperation::None => crate::effects::IDOperation::None,
927                                            IdOperation::Created => {
928                                                crate::effects::IDOperation::Created
929                                            }
930                                            IdOperation::Deleted => {
931                                                crate::effects::IDOperation::Deleted
932                                            }
933                                        },
934                                    },
935                                )
936                            })
937                            .collect(),
938                        unchanged_shared_objects: transaction_effects_v1
939                            .unchanged_shared_objects
940                            .into_iter()
941                            .map(|obj| {
942                                (
943                                    obj.object_id.into(),
944                                    match obj.kind {
945                                        UnchangedSharedKind::ReadOnlyRoot { version, digest } => {
946                                            crate::effects::UnchangedSharedKind::ReadOnlyRoot((
947                                                version.into(),
948                                                digest.into(),
949                                            ))
950                                        }
951                                        UnchangedSharedKind::MutateDeleted { version } => {
952                                            crate::effects::UnchangedSharedKind::MutateDeleted(
953                                                version.into(),
954                                            )
955                                        }
956                                        UnchangedSharedKind::ReadDeleted { version } => {
957                                            crate::effects::UnchangedSharedKind::ReadDeleted(
958                                                version.into(),
959                                            )
960                                        }
961                                        UnchangedSharedKind::Cancelled { version } => {
962                                            crate::effects::UnchangedSharedKind::Cancelled(
963                                                version.into(),
964                                            )
965                                        }
966                                        UnchangedSharedKind::PerEpochConfig => {
967                                            crate::effects::UnchangedSharedKind::PerEpochConfig
968                                        }
969                                    },
970                                )
971                            })
972                            .collect(),
973                        aux_data_digest: transaction_effects_v1
974                            .auxiliary_data_digest
975                            .map(Into::into),
976                    }
977                    .into();
978
979                Ok(effects)
980            }
981        }
982    }
983}
984
985macro_rules! impl_convert_digest {
986    ($name:ident) => {
987        impl From<crate::digests::$name> for $name {
988            fn from(value: crate::digests::$name) -> Self {
989                Self::new(value.into_inner())
990            }
991        }
992
993        impl From<$name> for crate::digests::$name {
994            fn from(value: $name) -> Self {
995                Self::new(value.into_inner())
996            }
997        }
998    };
999}
1000
1001impl_convert_digest!(Digest);
1002impl_convert_digest!(ObjectDigest);
1003impl_convert_digest!(CheckpointDigest);
1004impl_convert_digest!(TransactionDigest);
1005impl_convert_digest!(TransactionEffectsDigest);
1006impl_convert_digest!(TransactionEventsDigest);
1007impl_convert_digest!(CheckpointContentsDigest);
1008impl_convert_digest!(ConsensusCommitDigest);
1009
1010impl From<crate::digests::EffectsAuxDataDigest> for EffectsAuxiliaryDataDigest {
1011    fn from(value: crate::digests::EffectsAuxDataDigest) -> Self {
1012        Self::new(value.into_inner())
1013    }
1014}
1015
1016impl From<EffectsAuxiliaryDataDigest> for crate::digests::EffectsAuxDataDigest {
1017    fn from(value: EffectsAuxiliaryDataDigest) -> Self {
1018        Self::new(value.into_inner())
1019    }
1020}
1021
1022impl From<crate::execution_status::ExecutionStatus> for ExecutionStatus {
1023    fn from(value: crate::execution_status::ExecutionStatus) -> Self {
1024        match value {
1025            crate::execution_status::ExecutionStatus::Success => Self::Success,
1026            crate::execution_status::ExecutionStatus::Failure { error, command } => Self::Failure {
1027                error: error.into(),
1028                command: command.map(|v| v as u64),
1029            },
1030        }
1031    }
1032}
1033
1034impl From<ExecutionStatus> for crate::execution_status::ExecutionStatus {
1035    fn from(value: ExecutionStatus) -> Self {
1036        match value {
1037            ExecutionStatus::Success => Self::Success,
1038            ExecutionStatus::Failure { error, command } => Self::Failure {
1039                error: error.into(),
1040                command: command.map(|v| v as usize),
1041            },
1042        }
1043    }
1044}
1045
1046impl From<crate::execution_status::ExecutionFailureStatus> for ExecutionError {
1047    fn from(value: crate::execution_status::ExecutionFailureStatus) -> Self {
1048        use crate::execution_status::ExecutionFailureStatus;
1049        match value {
1050            ExecutionFailureStatus::InsufficientGas => Self::InsufficientGas,
1051            ExecutionFailureStatus::InvalidGasObject => Self::InvalidGasObject,
1052            ExecutionFailureStatus::InvariantViolation => Self::InvariantViolation,
1053            ExecutionFailureStatus::FeatureNotYetSupported => Self::FeatureNotYetSupported,
1054            ExecutionFailureStatus::MoveObjectTooBig {
1055                object_size,
1056                max_object_size,
1057            } => Self::ObjectTooBig {
1058                object_size,
1059                max_object_size,
1060            },
1061            ExecutionFailureStatus::MovePackageTooBig {
1062                object_size,
1063                max_object_size,
1064            } => Self::PackageTooBig {
1065                object_size,
1066                max_object_size,
1067            },
1068            ExecutionFailureStatus::CircularObjectOwnership { object } => {
1069                Self::CircularObjectOwnership {
1070                    object: object.into(),
1071                }
1072            }
1073            ExecutionFailureStatus::InsufficientCoinBalance => Self::InsufficientCoinBalance,
1074            ExecutionFailureStatus::CoinBalanceOverflow => Self::CoinBalanceOverflow,
1075            ExecutionFailureStatus::PublishErrorNonZeroAddress => Self::PublishErrorNonZeroAddress,
1076            ExecutionFailureStatus::IotaMoveVerificationError => Self::IotaMoveVerificationError,
1077            ExecutionFailureStatus::MovePrimitiveRuntimeError(move_location_opt) => {
1078                Self::MovePrimitiveRuntimeError {
1079                    location: move_location_opt.0.map(Into::into),
1080                }
1081            }
1082            ExecutionFailureStatus::MoveAbort(move_location, code) => Self::MoveAbort {
1083                location: move_location.into(),
1084                code,
1085            },
1086            ExecutionFailureStatus::VMVerificationOrDeserializationError => {
1087                Self::VmVerificationOrDeserializationError
1088            }
1089            ExecutionFailureStatus::VMInvariantViolation => Self::VmInvariantViolation,
1090            ExecutionFailureStatus::FunctionNotFound => Self::FunctionNotFound,
1091            ExecutionFailureStatus::ArityMismatch => Self::ArityMismatch,
1092            ExecutionFailureStatus::TypeArityMismatch => Self::TypeArityMismatch,
1093            ExecutionFailureStatus::NonEntryFunctionInvoked => Self::NonEntryFunctionInvoked,
1094            ExecutionFailureStatus::CommandArgumentError { arg_idx, kind } => {
1095                use crate::execution_status::CommandArgumentError as InternalCmdArgErr;
1096                Self::CommandArgumentError {
1097                    argument: arg_idx,
1098                    kind: match kind {
1099                        InternalCmdArgErr::TypeMismatch => CommandArgumentError::TypeMismatch,
1100                        InternalCmdArgErr::InvalidBCSBytes => CommandArgumentError::InvalidBcsBytes,
1101                        InternalCmdArgErr::InvalidUsageOfPureArg => {
1102                            CommandArgumentError::InvalidUsageOfPureArgument
1103                        }
1104                        InternalCmdArgErr::InvalidArgumentToPrivateEntryFunction => {
1105                            CommandArgumentError::InvalidArgumentToPrivateEntryFunction
1106                        }
1107                        InternalCmdArgErr::IndexOutOfBounds { idx } => {
1108                            CommandArgumentError::IndexOutOfBounds { index: idx }
1109                        }
1110                        InternalCmdArgErr::SecondaryIndexOutOfBounds {
1111                            result_idx,
1112                            secondary_idx,
1113                        } => CommandArgumentError::SecondaryIndexOutOfBounds {
1114                            result: result_idx,
1115                            subresult: secondary_idx,
1116                        },
1117                        InternalCmdArgErr::InvalidResultArity { result_idx } => {
1118                            CommandArgumentError::InvalidResultArity { result: result_idx }
1119                        }
1120                        InternalCmdArgErr::InvalidGasCoinUsage => {
1121                            CommandArgumentError::InvalidGasCoinUsage
1122                        }
1123                        InternalCmdArgErr::InvalidValueUsage => {
1124                            CommandArgumentError::InvalidValueUsage
1125                        }
1126                        InternalCmdArgErr::InvalidObjectByValue => {
1127                            CommandArgumentError::InvalidObjectByValue
1128                        }
1129                        InternalCmdArgErr::InvalidObjectByMutRef => {
1130                            CommandArgumentError::InvalidObjectByMutRef
1131                        }
1132                        InternalCmdArgErr::SharedObjectOperationNotAllowed => {
1133                            CommandArgumentError::SharedObjectOperationNotAllowed
1134                        }
1135                        InternalCmdArgErr::InvalidArgumentArity => {
1136                            CommandArgumentError::InvalidArgumentArity
1137                        }
1138                    },
1139                }
1140            }
1141            ExecutionFailureStatus::TypeArgumentError { argument_idx, kind } => {
1142                use crate::execution_status::TypeArgumentError as InternalTypeArgErr;
1143                Self::TypeArgumentError {
1144                    type_argument: argument_idx,
1145                    kind: match kind {
1146                        InternalTypeArgErr::TypeNotFound => TypeArgumentError::TypeNotFound,
1147                        InternalTypeArgErr::ConstraintNotSatisfied => {
1148                            TypeArgumentError::ConstraintNotSatisfied
1149                        }
1150                    },
1151                }
1152            }
1153            ExecutionFailureStatus::UnusedValueWithoutDrop {
1154                result_idx,
1155                secondary_idx,
1156            } => Self::UnusedValueWithoutDrop {
1157                result: result_idx,
1158                subresult: secondary_idx,
1159            },
1160            ExecutionFailureStatus::InvalidPublicFunctionReturnType { idx } => {
1161                Self::InvalidPublicFunctionReturnType { index: idx }
1162            }
1163            ExecutionFailureStatus::InvalidTransferObject => Self::InvalidTransferObject,
1164            ExecutionFailureStatus::EffectsTooLarge {
1165                current_size,
1166                max_size,
1167            } => Self::EffectsTooLarge {
1168                current_size,
1169                max_size,
1170            },
1171            ExecutionFailureStatus::PublishUpgradeMissingDependency => {
1172                Self::PublishUpgradeMissingDependency
1173            }
1174            ExecutionFailureStatus::PublishUpgradeDependencyDowngrade => {
1175                Self::PublishUpgradeDependencyDowngrade
1176            }
1177            ExecutionFailureStatus::PackageUpgradeError { upgrade_error } => {
1178                use crate::execution_status::PackageUpgradeError as InternalPkgUpgradeErr;
1179                Self::PackageUpgradeError {
1180                    kind: match upgrade_error {
1181                        InternalPkgUpgradeErr::UnableToFetchPackage { package_id } => {
1182                            PackageUpgradeError::UnableToFetchPackage {
1183                                package_id: package_id.into(),
1184                            }
1185                        }
1186                        InternalPkgUpgradeErr::NotAPackage { object_id } => {
1187                            PackageUpgradeError::NotAPackage {
1188                                object_id: object_id.into(),
1189                            }
1190                        }
1191                        InternalPkgUpgradeErr::IncompatibleUpgrade => {
1192                            PackageUpgradeError::IncompatibleUpgrade
1193                        }
1194                        InternalPkgUpgradeErr::DigestDoesNotMatch { digest } => {
1195                            PackageUpgradeError::DigestDoesNotMatch {
1196                                digest: Digest::from_bytes(digest).expect("invalid digest bytes"),
1197                            }
1198                        }
1199                        InternalPkgUpgradeErr::UnknownUpgradePolicy { policy } => {
1200                            PackageUpgradeError::UnknownUpgradePolicy { policy }
1201                        }
1202                        InternalPkgUpgradeErr::PackageIDDoesNotMatch {
1203                            package_id,
1204                            ticket_id,
1205                        } => PackageUpgradeError::PackageIdDoesNotMatch {
1206                            package_id: package_id.into(),
1207                            ticket_id: ticket_id.into(),
1208                        },
1209                    },
1210                }
1211            }
1212            ExecutionFailureStatus::WrittenObjectsTooLarge {
1213                current_size,
1214                max_size,
1215            } => Self::WrittenObjectsTooLarge {
1216                object_size: current_size,
1217                max_object_size: max_size,
1218            },
1219            ExecutionFailureStatus::CertificateDenied => Self::CertificateDenied,
1220            ExecutionFailureStatus::IotaMoveVerificationTimeout => {
1221                Self::IotaMoveVerificationTimeout
1222            }
1223            ExecutionFailureStatus::SharedObjectOperationNotAllowed => {
1224                Self::SharedObjectOperationNotAllowed
1225            }
1226            ExecutionFailureStatus::InputObjectDeleted => Self::InputObjectDeleted,
1227            ExecutionFailureStatus::ExecutionCancelledDueToSharedObjectCongestion {
1228                congested_objects,
1229            } => Self::ExecutionCancelledDueToSharedObjectCongestion {
1230                congested_objects: congested_objects.0.into_iter().map(Into::into).collect(),
1231            },
1232            ExecutionFailureStatus::AddressDeniedForCoin { address, coin_type } => {
1233                Self::AddressDeniedForCoin {
1234                    address: address.into(),
1235                    coin_type,
1236                }
1237            }
1238            ExecutionFailureStatus::CoinTypeGlobalPause { coin_type } => {
1239                Self::CoinTypeGlobalPause { coin_type }
1240            }
1241            ExecutionFailureStatus::ExecutionCancelledDueToRandomnessUnavailable => {
1242                Self::ExecutionCancelledDueToRandomnessUnavailable
1243            }
1244            ExecutionFailureStatus::ExecutionCancelledDueToSharedObjectCongestionV2 {
1245                congested_objects,
1246                suggested_gas_price,
1247            } => Self::ExecutionCancelledDueToSharedObjectCongestionV2 {
1248                congested_objects: congested_objects.0.into_iter().map(Into::into).collect(),
1249                suggested_gas_price,
1250            },
1251            ExecutionFailureStatus::InvalidLinkage => Self::InvalidLinkage,
1252        }
1253    }
1254}
1255
1256impl From<ExecutionError> for crate::execution_status::ExecutionFailureStatus {
1257    fn from(value: ExecutionError) -> Self {
1258        match value {
1259            ExecutionError::InsufficientGas => Self::InsufficientGas,
1260            ExecutionError::InvalidGasObject => Self::InvalidGasObject,
1261            ExecutionError::InvariantViolation => Self::InvariantViolation,
1262            ExecutionError::FeatureNotYetSupported => Self::FeatureNotYetSupported,
1263            ExecutionError::ObjectTooBig {
1264                object_size,
1265                max_object_size,
1266            } => Self::MoveObjectTooBig {
1267                object_size,
1268                max_object_size,
1269            },
1270            ExecutionError::PackageTooBig {
1271                object_size,
1272                max_object_size,
1273            } => Self::MovePackageTooBig {
1274                object_size,
1275                max_object_size,
1276            },
1277            ExecutionError::CircularObjectOwnership { object } => Self::CircularObjectOwnership {
1278                object: object.into(),
1279            },
1280            ExecutionError::InsufficientCoinBalance => Self::InsufficientCoinBalance,
1281            ExecutionError::CoinBalanceOverflow => Self::CoinBalanceOverflow,
1282            ExecutionError::PublishErrorNonZeroAddress => Self::PublishErrorNonZeroAddress,
1283            ExecutionError::IotaMoveVerificationError => Self::IotaMoveVerificationError,
1284            ExecutionError::MovePrimitiveRuntimeError { location } => {
1285                Self::MovePrimitiveRuntimeError(crate::execution_status::MoveLocationOpt(
1286                    location.map(Into::into),
1287                ))
1288            }
1289            ExecutionError::MoveAbort { location, code } => Self::MoveAbort(location.into(), code),
1290            ExecutionError::VmVerificationOrDeserializationError => {
1291                Self::VMVerificationOrDeserializationError
1292            }
1293            ExecutionError::VmInvariantViolation => Self::VMInvariantViolation,
1294            ExecutionError::FunctionNotFound => Self::FunctionNotFound,
1295            ExecutionError::ArityMismatch => Self::ArityMismatch,
1296            ExecutionError::TypeArityMismatch => Self::TypeArityMismatch,
1297            ExecutionError::NonEntryFunctionInvoked => Self::NonEntryFunctionInvoked,
1298            ExecutionError::CommandArgumentError { argument, kind } => {
1299                use crate::execution_status::CommandArgumentError as InternalCmdArgErr;
1300                Self::CommandArgumentError {
1301                    arg_idx: argument,
1302                    kind: match kind {
1303                        CommandArgumentError::TypeMismatch => InternalCmdArgErr::TypeMismatch,
1304                        CommandArgumentError::InvalidBcsBytes => InternalCmdArgErr::InvalidBCSBytes,
1305                        CommandArgumentError::InvalidUsageOfPureArgument => {
1306                            InternalCmdArgErr::InvalidUsageOfPureArg
1307                        }
1308                        CommandArgumentError::InvalidArgumentToPrivateEntryFunction => {
1309                            InternalCmdArgErr::InvalidArgumentToPrivateEntryFunction
1310                        }
1311                        CommandArgumentError::IndexOutOfBounds { index } => {
1312                            InternalCmdArgErr::IndexOutOfBounds { idx: index }
1313                        }
1314                        CommandArgumentError::SecondaryIndexOutOfBounds { result, subresult } => {
1315                            InternalCmdArgErr::SecondaryIndexOutOfBounds {
1316                                result_idx: result,
1317                                secondary_idx: subresult,
1318                            }
1319                        }
1320                        CommandArgumentError::InvalidResultArity { result } => {
1321                            InternalCmdArgErr::InvalidResultArity { result_idx: result }
1322                        }
1323                        CommandArgumentError::InvalidGasCoinUsage => {
1324                            InternalCmdArgErr::InvalidGasCoinUsage
1325                        }
1326                        CommandArgumentError::InvalidValueUsage => {
1327                            InternalCmdArgErr::InvalidValueUsage
1328                        }
1329                        CommandArgumentError::InvalidObjectByValue => {
1330                            InternalCmdArgErr::InvalidObjectByValue
1331                        }
1332                        CommandArgumentError::InvalidObjectByMutRef => {
1333                            InternalCmdArgErr::InvalidObjectByMutRef
1334                        }
1335                        CommandArgumentError::SharedObjectOperationNotAllowed => {
1336                            InternalCmdArgErr::SharedObjectOperationNotAllowed
1337                        }
1338                        CommandArgumentError::InvalidArgumentArity => {
1339                            InternalCmdArgErr::InvalidArgumentArity
1340                        }
1341                    },
1342                }
1343            }
1344            ExecutionError::TypeArgumentError {
1345                type_argument,
1346                kind,
1347            } => {
1348                use crate::execution_status::TypeArgumentError as InternalTypeArgErr;
1349                Self::TypeArgumentError {
1350                    argument_idx: type_argument,
1351                    kind: match kind {
1352                        TypeArgumentError::TypeNotFound => InternalTypeArgErr::TypeNotFound,
1353                        TypeArgumentError::ConstraintNotSatisfied => {
1354                            InternalTypeArgErr::ConstraintNotSatisfied
1355                        }
1356                    },
1357                }
1358            }
1359            ExecutionError::UnusedValueWithoutDrop { result, subresult } => {
1360                Self::UnusedValueWithoutDrop {
1361                    result_idx: result,
1362                    secondary_idx: subresult,
1363                }
1364            }
1365            ExecutionError::InvalidPublicFunctionReturnType { index } => {
1366                Self::InvalidPublicFunctionReturnType { idx: index }
1367            }
1368            ExecutionError::InvalidTransferObject => Self::InvalidTransferObject,
1369            ExecutionError::EffectsTooLarge {
1370                current_size,
1371                max_size,
1372            } => Self::EffectsTooLarge {
1373                current_size,
1374                max_size,
1375            },
1376            ExecutionError::PublishUpgradeMissingDependency => {
1377                Self::PublishUpgradeMissingDependency
1378            }
1379            ExecutionError::PublishUpgradeDependencyDowngrade => {
1380                Self::PublishUpgradeDependencyDowngrade
1381            }
1382            ExecutionError::PackageUpgradeError { kind } => {
1383                use crate::execution_status::PackageUpgradeError as InternalPkgUpgradeErr;
1384                Self::PackageUpgradeError {
1385                    upgrade_error: match kind {
1386                        PackageUpgradeError::UnableToFetchPackage { package_id } => {
1387                            InternalPkgUpgradeErr::UnableToFetchPackage {
1388                                package_id: package_id.into(),
1389                            }
1390                        }
1391                        PackageUpgradeError::NotAPackage { object_id } => {
1392                            InternalPkgUpgradeErr::NotAPackage {
1393                                object_id: object_id.into(),
1394                            }
1395                        }
1396                        PackageUpgradeError::IncompatibleUpgrade => {
1397                            InternalPkgUpgradeErr::IncompatibleUpgrade
1398                        }
1399                        PackageUpgradeError::DigestDoesNotMatch { digest } => {
1400                            InternalPkgUpgradeErr::DigestDoesNotMatch {
1401                                digest: digest.as_bytes().to_vec(),
1402                            }
1403                        }
1404                        PackageUpgradeError::UnknownUpgradePolicy { policy } => {
1405                            InternalPkgUpgradeErr::UnknownUpgradePolicy { policy }
1406                        }
1407                        PackageUpgradeError::PackageIdDoesNotMatch {
1408                            package_id,
1409                            ticket_id,
1410                        } => InternalPkgUpgradeErr::PackageIDDoesNotMatch {
1411                            package_id: package_id.into(),
1412                            ticket_id: ticket_id.into(),
1413                        },
1414                    },
1415                }
1416            }
1417            ExecutionError::WrittenObjectsTooLarge {
1418                object_size,
1419                max_object_size,
1420            } => Self::WrittenObjectsTooLarge {
1421                current_size: object_size,
1422                max_size: max_object_size,
1423            },
1424            ExecutionError::CertificateDenied => Self::CertificateDenied,
1425            ExecutionError::IotaMoveVerificationTimeout => Self::IotaMoveVerificationTimeout,
1426            ExecutionError::SharedObjectOperationNotAllowed => {
1427                Self::SharedObjectOperationNotAllowed
1428            }
1429            ExecutionError::InputObjectDeleted => Self::InputObjectDeleted,
1430            ExecutionError::ExecutionCancelledDueToSharedObjectCongestion { congested_objects } => {
1431                Self::ExecutionCancelledDueToSharedObjectCongestion {
1432                    congested_objects: crate::execution_status::CongestedObjects(
1433                        congested_objects.into_iter().map(Into::into).collect(),
1434                    ),
1435                }
1436            }
1437            ExecutionError::AddressDeniedForCoin { address, coin_type } => {
1438                Self::AddressDeniedForCoin {
1439                    address: address.into(),
1440                    coin_type,
1441                }
1442            }
1443            ExecutionError::CoinTypeGlobalPause { coin_type } => {
1444                Self::CoinTypeGlobalPause { coin_type }
1445            }
1446            ExecutionError::ExecutionCancelledDueToRandomnessUnavailable => {
1447                Self::ExecutionCancelledDueToRandomnessUnavailable
1448            }
1449            ExecutionError::ExecutionCancelledDueToSharedObjectCongestionV2 {
1450                congested_objects,
1451                suggested_gas_price,
1452            } => Self::ExecutionCancelledDueToSharedObjectCongestionV2 {
1453                congested_objects: crate::execution_status::CongestedObjects(
1454                    congested_objects.into_iter().map(Into::into).collect(),
1455                ),
1456                suggested_gas_price,
1457            },
1458            ExecutionError::InvalidLinkage => Self::InvalidLinkage,
1459        }
1460    }
1461}
1462
1463impl From<crate::execution_status::MoveLocation> for MoveLocation {
1464    fn from(value: crate::execution_status::MoveLocation) -> Self {
1465        Self {
1466            package: ObjectId::new(value.module.address().into_bytes()),
1467            module: Identifier::new(value.module.name().as_str()).expect("invalid module name"),
1468            function: value.function,
1469            instruction: value.instruction,
1470            function_name: value
1471                .function_name
1472                .map(|name| Identifier::new(name).expect("invalid function name")),
1473        }
1474    }
1475}
1476
1477impl From<MoveLocation> for crate::execution_status::MoveLocation {
1478    fn from(value: MoveLocation) -> Self {
1479        Self {
1480            module: ModuleId::new(
1481                move_core_types::account_address::AccountAddress::new(value.package.into_inner()),
1482                crate::Identifier::new(value.module.as_str()).expect("invalid module name"),
1483            ),
1484            function: value.function,
1485            instruction: value.instruction,
1486            function_name: value.function_name.map(|name| name.to_string()),
1487        }
1488    }
1489}
1490
1491impl TryFrom<crate::messages_checkpoint::CheckpointContents> for CheckpointContents {
1492    type Error = SdkTypeConversionError;
1493
1494    fn try_from(
1495        value: crate::messages_checkpoint::CheckpointContents,
1496    ) -> Result<Self, Self::Error> {
1497        Self(
1498            value
1499                .into_iter_with_signatures()
1500                .map(|(digests, signatures)| {
1501                    let signatures_result = signatures
1502                        .into_iter()
1503                        .map(TryInto::try_into)
1504                        .collect::<Result<Vec<UserSignature>, _>>();
1505
1506                    match signatures_result {
1507                        Ok(signatures) => Ok(CheckpointTransactionInfo {
1508                            transaction: digests.transaction.into(),
1509                            effects: digests.effects.into(),
1510                            signatures,
1511                        }),
1512                        Err(e) => Err(SdkTypeConversionError::from(e)),
1513                    }
1514                })
1515                .collect::<Result<Vec<_>, _>>()?,
1516        )
1517        .pipe(Ok)
1518    }
1519}
1520
1521impl TryFrom<CheckpointContents> for crate::messages_checkpoint::CheckpointContents {
1522    type Error = SdkTypeConversionError;
1523
1524    fn try_from(value: CheckpointContents) -> Result<Self, Self::Error> {
1525        let (transactions, user_signatures) = value.0.into_iter().fold(
1526            (Vec::new(), Vec::new()),
1527            |(mut transactions, mut user_signatures), info| {
1528                transactions.push(crate::base_types::ExecutionDigests {
1529                    transaction: info.transaction.into(),
1530                    effects: info.effects.into(),
1531                });
1532                user_signatures.push(
1533                    info.signatures
1534                        .into_iter()
1535                        .map(TryInto::try_into)
1536                        .collect::<Result<_, _>>(),
1537                );
1538                (transactions, user_signatures)
1539            },
1540        );
1541        crate::messages_checkpoint::CheckpointContents::new_with_digests_and_signatures(
1542            transactions,
1543            user_signatures.into_iter().collect::<Result<Vec<_>, _>>()?,
1544        )
1545        .pipe(Ok)
1546    }
1547}
1548
1549impl TryFrom<crate::full_checkpoint_content::CheckpointData> for CheckpointData {
1550    type Error = SdkTypeConversionError;
1551
1552    fn try_from(
1553        value: crate::full_checkpoint_content::CheckpointData,
1554    ) -> Result<Self, Self::Error> {
1555        Self {
1556            checkpoint_summary: value.checkpoint_summary.try_into()?,
1557            checkpoint_contents: value.checkpoint_contents.try_into()?,
1558            transactions: value
1559                .transactions
1560                .into_iter()
1561                .map(TryInto::try_into)
1562                .collect::<Result<_, _>>()?,
1563        }
1564        .pipe(Ok)
1565    }
1566}
1567
1568impl TryFrom<CheckpointData> for crate::full_checkpoint_content::CheckpointData {
1569    type Error = SdkTypeConversionError;
1570
1571    fn try_from(value: CheckpointData) -> Result<Self, Self::Error> {
1572        Self {
1573            checkpoint_summary: value.checkpoint_summary.try_into()?,
1574            checkpoint_contents: value.checkpoint_contents.try_into()?,
1575            transactions: value
1576                .transactions
1577                .into_iter()
1578                .map(TryInto::try_into)
1579                .collect::<Result<_, _>>()?,
1580        }
1581        .pipe(Ok)
1582    }
1583}
1584
1585impl TryFrom<crate::full_checkpoint_content::CheckpointTransaction> for CheckpointTransaction {
1586    type Error = SdkTypeConversionError;
1587
1588    fn try_from(
1589        value: crate::full_checkpoint_content::CheckpointTransaction,
1590    ) -> Result<Self, Self::Error> {
1591        let input_objects = value
1592            .input_objects
1593            .into_iter()
1594            .map(TryInto::try_into)
1595            .collect::<Result<_, _>>();
1596        let output_objects = value
1597            .output_objects
1598            .into_iter()
1599            .map(TryInto::try_into)
1600            .collect::<Result<_, _>>();
1601        match (input_objects, output_objects) {
1602            (Ok(input_objects), Ok(output_objects)) => Ok(Self {
1603                transaction: value.transaction.try_into()?,
1604                effects: value.effects.try_into()?,
1605                events: value.events.map(TryInto::try_into).transpose()?,
1606                input_objects,
1607                output_objects,
1608            }),
1609            (Err(e), _) | (_, Err(e)) => Err(e),
1610        }
1611    }
1612}
1613
1614impl TryFrom<CheckpointTransaction> for crate::full_checkpoint_content::CheckpointTransaction {
1615    type Error = SdkTypeConversionError;
1616
1617    fn try_from(value: CheckpointTransaction) -> Result<Self, Self::Error> {
1618        let input_objects = value
1619            .input_objects
1620            .into_iter()
1621            .map(TryInto::try_into)
1622            .collect::<Result<_, _>>();
1623        let output_objects = value
1624            .output_objects
1625            .into_iter()
1626            .map(TryInto::try_into)
1627            .collect::<Result<_, _>>();
1628
1629        match (input_objects, output_objects) {
1630            (Ok(input_objects), Ok(output_objects)) => Ok(Self {
1631                transaction: value.transaction.try_into()?,
1632                effects: value.effects.try_into()?,
1633                events: value.events.map(TryInto::try_into).transpose()?,
1634                input_objects,
1635                output_objects,
1636            }),
1637            (Err(e), _) | (_, Err(e)) => Err(e),
1638        }
1639    }
1640}
1641
1642impl TryFrom<crate::signature::GenericSignature> for UserSignature {
1643    type Error = bcs::Error;
1644
1645    fn try_from(value: crate::signature::GenericSignature) -> Result<Self, Self::Error> {
1646        bcs::from_bytes(&bcs::to_bytes(&value)?)
1647    }
1648}
1649
1650impl TryFrom<UserSignature> for crate::signature::GenericSignature {
1651    type Error = bcs::Error;
1652
1653    fn try_from(value: UserSignature) -> Result<Self, Self::Error> {
1654        bcs::from_bytes(&bcs::to_bytes(&value)?)
1655    }
1656}
1657
1658impl TryFrom<crate::effects::TransactionEvents> for TransactionEvents {
1659    type Error = SdkTypeConversionError;
1660
1661    fn try_from(value: crate::effects::TransactionEvents) -> Result<Self, Self::Error> {
1662        Self(
1663            value
1664                .data
1665                .into_iter()
1666                .map(TryInto::try_into)
1667                .collect::<Result<Vec<_>, _>>()?,
1668        )
1669        .pipe(Ok)
1670    }
1671}
1672
1673impl TryFrom<TransactionEvents> for crate::effects::TransactionEvents {
1674    type Error = SdkTypeConversionError;
1675
1676    fn try_from(value: TransactionEvents) -> Result<Self, Self::Error> {
1677        Self {
1678            data: value
1679                .0
1680                .into_iter()
1681                .map(TryInto::try_into)
1682                .collect::<Result<_, _>>()?,
1683        }
1684        .pipe(Ok)
1685    }
1686}
1687
1688impl TryFrom<crate::event::Event> for Event {
1689    type Error = SdkTypeConversionError;
1690
1691    fn try_from(value: crate::event::Event) -> Result<Self, Self::Error> {
1692        Self {
1693            package_id: value.package_id.into(),
1694            module: Identifier::new(value.transaction_module.as_str())?,
1695            sender: value.sender.into(),
1696            type_: struct_tag_core_to_sdk(value.type_)?,
1697            contents: value.contents,
1698        }
1699        .pipe(Ok)
1700    }
1701}
1702
1703impl TryFrom<Event> for crate::event::Event {
1704    type Error = SdkTypeConversionError;
1705
1706    fn try_from(value: Event) -> Result<Self, Self::Error> {
1707        Self {
1708            package_id: value.package_id.into(),
1709            transaction_module: crate::Identifier::new(value.module.as_str())?,
1710            sender: value.sender.into(),
1711            type_: struct_tag_sdk_to_core(value.type_)?,
1712            contents: value.contents,
1713        }
1714        .pipe(Ok)
1715    }
1716}
1717
1718impl TryFrom<crate::transaction::Command> for Command {
1719    type Error = SdkTypeConversionError;
1720
1721    fn try_from(value: crate::transaction::Command) -> Result<Self, Self::Error> {
1722        use crate::transaction::Command as InternalCmd;
1723        match value {
1724            InternalCmd::MoveCall(programmable_move_call) => Self::MoveCall(MoveCall {
1725                package: programmable_move_call.package.into(),
1726                module: Identifier::new(programmable_move_call.module.as_str())?,
1727                function: Identifier::new(programmable_move_call.function.as_str())?,
1728                type_arguments: programmable_move_call
1729                    .type_arguments
1730                    .into_iter()
1731                    .map(|type_input| {
1732                        type_input
1733                            .into_type_tag()
1734                            .map_err(|err| err.into())
1735                            .and_then(type_tag_core_to_sdk)
1736                    })
1737                    .collect::<Result<_, _>>()?,
1738                arguments: programmable_move_call
1739                    .arguments
1740                    .into_iter()
1741                    .map(Into::into)
1742                    .collect(),
1743            }),
1744            InternalCmd::TransferObjects(objects, address) => {
1745                Self::TransferObjects(TransferObjects {
1746                    objects: objects.into_iter().map(Into::into).collect(),
1747                    address: address.into(),
1748                })
1749            }
1750            InternalCmd::SplitCoins(coin, amounts) => Self::SplitCoins(SplitCoins {
1751                coin: coin.into(),
1752                amounts: amounts.into_iter().map(Into::into).collect(),
1753            }),
1754            InternalCmd::MergeCoins(argument, coins_to_merge) => Self::MergeCoins(MergeCoins {
1755                coin: argument.into(),
1756                coins_to_merge: coins_to_merge.into_iter().map(Into::into).collect(),
1757            }),
1758            InternalCmd::Publish(modules, dependencies) => Self::Publish(Publish {
1759                modules,
1760                dependencies: dependencies.into_iter().map(Into::into).collect(),
1761            }),
1762            InternalCmd::MakeMoveVec(type_tag, elements) => Self::MakeMoveVector(MakeMoveVector {
1763                type_: type_tag
1764                    .map(|type_input| {
1765                        type_input
1766                            .into_type_tag()
1767                            .map_err(|err| err.into())
1768                            .and_then(type_tag_core_to_sdk)
1769                    })
1770                    .transpose()?,
1771                elements: elements.into_iter().map(Into::into).collect(),
1772            }),
1773            InternalCmd::Upgrade(modules, dependencies, package, ticket) => {
1774                Self::Upgrade(Upgrade {
1775                    modules,
1776                    dependencies: dependencies.into_iter().map(Into::into).collect(),
1777                    package: package.into(),
1778                    ticket: ticket.into(),
1779                })
1780            }
1781        }
1782        .pipe(Ok)
1783    }
1784}
1785
1786impl TryFrom<Command> for crate::transaction::Command {
1787    type Error = SdkTypeConversionError;
1788
1789    fn try_from(value: Command) -> Result<Self, Self::Error> {
1790        match value {
1791            Command::MoveCall(move_call) => Self::move_call(
1792                move_call.package.into(),
1793                crate::Identifier::new(move_call.module.as_str())
1794                    .expect("invalid move call module identifier"),
1795                crate::Identifier::new(move_call.function.as_str())
1796                    .expect("invalid move call function identifier"),
1797                move_call
1798                    .type_arguments
1799                    .into_iter()
1800                    .map(type_tag_sdk_to_core)
1801                    .collect::<Result<_, _>>()?,
1802                move_call.arguments.into_iter().map(Into::into).collect(),
1803            ),
1804            Command::TransferObjects(transfer_objects) => Self::TransferObjects(
1805                transfer_objects
1806                    .objects
1807                    .into_iter()
1808                    .map(Into::into)
1809                    .collect(),
1810                transfer_objects.address.into(),
1811            ),
1812            Command::SplitCoins(split_coins) => Self::SplitCoins(
1813                split_coins.coin.into(),
1814                split_coins.amounts.into_iter().map(Into::into).collect(),
1815            ),
1816            Command::MergeCoins(merge_coins) => Self::MergeCoins(
1817                merge_coins.coin.into(),
1818                merge_coins
1819                    .coins_to_merge
1820                    .into_iter()
1821                    .map(Into::into)
1822                    .collect(),
1823            ),
1824            Command::Publish(publish) => Self::Publish(
1825                publish.modules,
1826                publish.dependencies.into_iter().map(Into::into).collect(),
1827            ),
1828            Command::MakeMoveVector(make_move_vector) => Self::make_move_vec(
1829                make_move_vector
1830                    .type_
1831                    .map(type_tag_sdk_to_core)
1832                    .transpose()?,
1833                make_move_vector
1834                    .elements
1835                    .into_iter()
1836                    .map(Into::into)
1837                    .collect(),
1838            ),
1839            Command::Upgrade(upgrade) => Self::Upgrade(
1840                upgrade.modules,
1841                upgrade.dependencies.into_iter().map(Into::into).collect(),
1842                upgrade.package.into(),
1843                upgrade.ticket.into(),
1844            ),
1845        }
1846        .pipe(Ok)
1847    }
1848}
1849
1850impl From<crate::transaction::Argument> for Argument {
1851    fn from(value: crate::transaction::Argument) -> Self {
1852        match value {
1853            crate::transaction::Argument::GasCoin => Self::Gas,
1854            crate::transaction::Argument::Input(idx) => Self::Input(idx),
1855            crate::transaction::Argument::Result(idx) => Self::Result(idx),
1856            crate::transaction::Argument::NestedResult(idx1, idx2) => {
1857                Self::NestedResult(idx1, idx2)
1858            }
1859        }
1860    }
1861}
1862
1863impl From<Argument> for crate::transaction::Argument {
1864    fn from(value: Argument) -> Self {
1865        match value {
1866            Argument::Gas => Self::GasCoin,
1867            Argument::Input(idx) => Self::Input(idx),
1868            Argument::Result(idx) => Self::Result(idx),
1869            Argument::NestedResult(idx1, idx2) => Self::NestedResult(idx1, idx2),
1870        }
1871    }
1872}
1873
1874impl From<crate::gas::GasCostSummary> for GasCostSummary {
1875    fn from(value: crate::gas::GasCostSummary) -> Self {
1876        Self::new(
1877            value.computation_cost,
1878            value.computation_cost_burned,
1879            value.storage_cost,
1880            value.storage_rebate,
1881            value.non_refundable_storage_fee,
1882        )
1883    }
1884}
1885
1886impl From<GasCostSummary> for crate::gas::GasCostSummary {
1887    fn from(value: GasCostSummary) -> Self {
1888        Self::new(
1889            value.computation_cost,
1890            value.computation_cost_burned,
1891            value.storage_cost,
1892            value.storage_rebate,
1893            value.non_refundable_storage_fee,
1894        )
1895    }
1896}
1897
1898impl From<crate::messages_checkpoint::EndOfEpochData> for EndOfEpochData {
1899    fn from(value: crate::messages_checkpoint::EndOfEpochData) -> Self {
1900        Self {
1901            next_epoch_committee: value
1902                .next_epoch_committee
1903                .into_iter()
1904                .map(|(public_key, stake)| ValidatorCommitteeMember {
1905                    public_key: Bls12381PublicKey::new(public_key.0),
1906                    stake,
1907                })
1908                .collect(),
1909            next_epoch_protocol_version: value.next_epoch_protocol_version.as_u64(),
1910            epoch_commitments: value
1911                .epoch_commitments
1912                .into_iter()
1913                .map(Into::into)
1914                .collect(),
1915            epoch_supply_change: value.epoch_supply_change,
1916        }
1917    }
1918}
1919
1920impl From<EndOfEpochData> for crate::messages_checkpoint::EndOfEpochData {
1921    fn from(value: EndOfEpochData) -> Self {
1922        Self {
1923            next_epoch_committee: value
1924                .next_epoch_committee
1925                .into_iter()
1926                .map(|v| (v.public_key.into(), v.stake))
1927                .collect(),
1928            next_epoch_protocol_version: value.next_epoch_protocol_version.into(),
1929            epoch_commitments: value
1930                .epoch_commitments
1931                .into_iter()
1932                .map(Into::into)
1933                .collect(),
1934            epoch_supply_change: value.epoch_supply_change,
1935        }
1936    }
1937}
1938
1939impl From<crate::messages_checkpoint::CheckpointCommitment> for CheckpointCommitment {
1940    fn from(value: crate::messages_checkpoint::CheckpointCommitment) -> Self {
1941        let crate::messages_checkpoint::CheckpointCommitment::ECMHLiveObjectSetDigest(digest) =
1942            value;
1943        Self::EcmhLiveObjectSet {
1944            digest: Digest::new(digest.digest.into_inner()),
1945        }
1946    }
1947}
1948
1949impl From<CheckpointCommitment> for crate::messages_checkpoint::CheckpointCommitment {
1950    fn from(value: CheckpointCommitment) -> Self {
1951        let CheckpointCommitment::EcmhLiveObjectSet { digest } = value;
1952        Self::ECMHLiveObjectSetDigest(crate::messages_checkpoint::ECMHLiveObjectSetDigest {
1953            digest: crate::digests::Digest::new(digest.into_inner()),
1954        })
1955    }
1956}
1957
1958impl TryFrom<crate::messages_checkpoint::CheckpointSummary> for CheckpointSummary {
1959    type Error = SdkTypeConversionError;
1960
1961    fn try_from(value: crate::messages_checkpoint::CheckpointSummary) -> Result<Self, Self::Error> {
1962        Self {
1963            epoch: value.epoch,
1964            sequence_number: value.sequence_number,
1965            network_total_transactions: value.network_total_transactions,
1966            content_digest: value.content_digest.into(),
1967            previous_digest: value.previous_digest.map(Into::into),
1968            epoch_rolling_gas_cost_summary: value.epoch_rolling_gas_cost_summary.into(),
1969            timestamp_ms: value.timestamp_ms,
1970            checkpoint_commitments: value
1971                .checkpoint_commitments
1972                .into_iter()
1973                .map(Into::into)
1974                .collect(),
1975            end_of_epoch_data: value.end_of_epoch_data.map(Into::into),
1976            version_specific_data: value.version_specific_data,
1977        }
1978        .pipe(Ok)
1979    }
1980}
1981
1982impl TryFrom<CheckpointSummary> for crate::messages_checkpoint::CheckpointSummary {
1983    type Error = SdkTypeConversionError;
1984
1985    fn try_from(value: CheckpointSummary) -> Result<Self, Self::Error> {
1986        Self {
1987            epoch: value.epoch,
1988            sequence_number: value.sequence_number,
1989            network_total_transactions: value.network_total_transactions,
1990            content_digest: value.content_digest.into(),
1991            previous_digest: value.previous_digest.map(Into::into),
1992            epoch_rolling_gas_cost_summary: value.epoch_rolling_gas_cost_summary.into(),
1993            timestamp_ms: value.timestamp_ms,
1994            checkpoint_commitments: value
1995                .checkpoint_commitments
1996                .into_iter()
1997                .map(Into::into)
1998                .collect(),
1999            end_of_epoch_data: value.end_of_epoch_data.map(Into::into),
2000            version_specific_data: value.version_specific_data,
2001        }
2002        .pipe(Ok)
2003    }
2004}
2005
2006impl TryFrom<crate::messages_checkpoint::CertifiedCheckpointSummary> for SignedCheckpointSummary {
2007    type Error = SdkTypeConversionError;
2008
2009    fn try_from(
2010        value: crate::messages_checkpoint::CertifiedCheckpointSummary,
2011    ) -> Result<Self, Self::Error> {
2012        let (data, sig) = value.into_data_and_sig();
2013        Self {
2014            checkpoint: data.try_into()?,
2015            signature: sig.into(),
2016        }
2017        .pipe(Ok)
2018    }
2019}
2020
2021impl TryFrom<SignedCheckpointSummary> for crate::messages_checkpoint::CertifiedCheckpointSummary {
2022    type Error = SdkTypeConversionError;
2023
2024    fn try_from(value: SignedCheckpointSummary) -> Result<Self, Self::Error> {
2025        Self::new_from_data_and_sig(
2026            crate::messages_checkpoint::CheckpointSummary::try_from(value.checkpoint)?,
2027            crate::crypto::AuthorityQuorumSignInfo::<true>::from(value.signature),
2028        )
2029        .pipe(Ok)
2030    }
2031}
2032
2033impl<const T: bool> From<crate::crypto::AuthorityQuorumSignInfo<T>>
2034    for ValidatorAggregatedSignature
2035{
2036    fn from(value: crate::crypto::AuthorityQuorumSignInfo<T>) -> Self {
2037        let crate::crypto::AuthorityQuorumSignInfo {
2038            epoch,
2039            signature,
2040            signers_map,
2041        } = value;
2042
2043        Self {
2044            epoch,
2045            signature: Bls12381Signature::from_bytes(signature.as_ref()).unwrap(),
2046            bitmap: signers_map,
2047        }
2048    }
2049}
2050
2051impl<const T: bool> From<ValidatorAggregatedSignature>
2052    for crate::crypto::AuthorityQuorumSignInfo<T>
2053{
2054    fn from(value: ValidatorAggregatedSignature) -> Self {
2055        let ValidatorAggregatedSignature {
2056            epoch,
2057            signature,
2058            bitmap,
2059        } = value;
2060
2061        Self {
2062            epoch,
2063            signature: crate::crypto::AggregateAuthoritySignature::from_bytes(signature.as_bytes())
2064                .unwrap(),
2065            signers_map: bitmap,
2066        }
2067    }
2068}
2069
2070impl From<crate::object::Owner> for Owner {
2071    fn from(value: crate::object::Owner) -> Self {
2072        match value {
2073            crate::object::Owner::AddressOwner(address) => Self::Address(address.into()),
2074            crate::object::Owner::ObjectOwner(object_id) => Self::Object(object_id.into()),
2075            crate::object::Owner::Shared {
2076                initial_shared_version,
2077            } => Self::Shared(initial_shared_version.value()),
2078            crate::object::Owner::Immutable => Self::Immutable,
2079        }
2080    }
2081}
2082
2083impl From<Owner> for crate::object::Owner {
2084    fn from(value: Owner) -> Self {
2085        match value {
2086            Owner::Address(address) => crate::object::Owner::AddressOwner(address.into()),
2087            Owner::Object(object_id) => crate::object::Owner::ObjectOwner(object_id.into()),
2088            Owner::Shared(initial_shared_version) => crate::object::Owner::Shared {
2089                initial_shared_version: initial_shared_version.into(),
2090            },
2091            Owner::Immutable => crate::object::Owner::Immutable,
2092        }
2093    }
2094}
2095
2096impl From<crate::base_types::IotaAddress> for Address {
2097    fn from(value: crate::base_types::IotaAddress) -> Self {
2098        Self::new(value.to_inner())
2099    }
2100}
2101
2102impl From<Address> for crate::base_types::IotaAddress {
2103    fn from(value: Address) -> Self {
2104        crate::base_types::ObjectID::new(value.into_inner()).into()
2105    }
2106}
2107
2108impl From<crate::base_types::ObjectID> for ObjectId {
2109    fn from(value: crate::base_types::ObjectID) -> Self {
2110        Self::new(value.into_bytes())
2111    }
2112}
2113
2114impl From<ObjectId> for crate::base_types::ObjectID {
2115    fn from(value: ObjectId) -> Self {
2116        Self::new(value.into_inner())
2117    }
2118}
2119
2120impl From<crate::base_types::IotaAddress> for ObjectId {
2121    fn from(value: crate::base_types::IotaAddress) -> Self {
2122        Self::new(value.to_inner())
2123    }
2124}
2125
2126impl From<ObjectId> for crate::base_types::IotaAddress {
2127    fn from(value: ObjectId) -> Self {
2128        crate::base_types::ObjectID::new(value.into_inner()).into()
2129    }
2130}
2131
2132impl TryFrom<crate::transaction::SenderSignedData> for SignedTransaction {
2133    type Error = SdkTypeConversionError;
2134
2135    fn try_from(value: crate::transaction::SenderSignedData) -> Result<Self, Self::Error> {
2136        let crate::transaction::SenderSignedTransaction {
2137            intent_message,
2138            tx_signatures,
2139        } = value.into_inner();
2140
2141        Self {
2142            transaction: intent_message.value.try_into()?,
2143            signatures: tx_signatures
2144                .into_iter()
2145                .map(TryInto::try_into)
2146                .collect::<Result<_, _>>()?,
2147        }
2148        .pipe(Ok)
2149    }
2150}
2151
2152impl TryFrom<SignedTransaction> for crate::transaction::SenderSignedData {
2153    type Error = SdkTypeConversionError;
2154
2155    fn try_from(value: SignedTransaction) -> Result<Self, Self::Error> {
2156        let SignedTransaction {
2157            transaction,
2158            signatures,
2159        } = value;
2160
2161        Self::new(
2162            transaction.try_into()?,
2163            signatures
2164                .into_iter()
2165                .map(TryInto::try_into)
2166                .collect::<Result<_, _>>()?,
2167        )
2168        .pipe(Ok)
2169    }
2170}
2171
2172impl TryFrom<crate::transaction::Transaction> for SignedTransaction {
2173    type Error = SdkTypeConversionError;
2174
2175    fn try_from(value: crate::transaction::Transaction) -> Result<Self, Self::Error> {
2176        value.into_data().try_into()
2177    }
2178}
2179
2180impl TryFrom<SignedTransaction> for crate::transaction::Transaction {
2181    type Error = SdkTypeConversionError;
2182
2183    fn try_from(value: SignedTransaction) -> Result<Self, Self::Error> {
2184        Ok(Self::new(value.try_into()?))
2185    }
2186}
2187
2188pub fn type_tag_core_to_sdk(
2189    value: move_core_types::language_storage::TypeTag,
2190) -> Result<TypeTag, SdkTypeConversionError> {
2191    match value {
2192        move_core_types::language_storage::TypeTag::Bool => TypeTag::Bool,
2193        move_core_types::language_storage::TypeTag::U8 => TypeTag::U8,
2194        move_core_types::language_storage::TypeTag::U64 => TypeTag::U64,
2195        move_core_types::language_storage::TypeTag::U128 => TypeTag::U128,
2196        move_core_types::language_storage::TypeTag::Address => TypeTag::Address,
2197        move_core_types::language_storage::TypeTag::Signer => TypeTag::Signer,
2198        move_core_types::language_storage::TypeTag::Vector(type_tag) => {
2199            TypeTag::Vector(Box::new(type_tag_core_to_sdk(*type_tag)?))
2200        }
2201        move_core_types::language_storage::TypeTag::Struct(struct_tag) => {
2202            TypeTag::Struct(Box::new(struct_tag_core_to_sdk(*struct_tag)?))
2203        }
2204        move_core_types::language_storage::TypeTag::U16 => TypeTag::U16,
2205        move_core_types::language_storage::TypeTag::U32 => TypeTag::U32,
2206        move_core_types::language_storage::TypeTag::U256 => TypeTag::U256,
2207    }
2208    .pipe(Ok)
2209}
2210
2211pub fn type_tag_sdk_to_core(
2212    value: TypeTag,
2213) -> Result<move_core_types::language_storage::TypeTag, SdkTypeConversionError> {
2214    match value {
2215        TypeTag::Bool => move_core_types::language_storage::TypeTag::Bool,
2216        TypeTag::U8 => move_core_types::language_storage::TypeTag::U8,
2217        TypeTag::U64 => move_core_types::language_storage::TypeTag::U64,
2218        TypeTag::U128 => move_core_types::language_storage::TypeTag::U128,
2219        TypeTag::Address => move_core_types::language_storage::TypeTag::Address,
2220        TypeTag::Signer => move_core_types::language_storage::TypeTag::Signer,
2221        TypeTag::Vector(type_tag) => move_core_types::language_storage::TypeTag::Vector(Box::new(
2222            type_tag_sdk_to_core(*type_tag)?,
2223        )),
2224        TypeTag::Struct(struct_tag) => move_core_types::language_storage::TypeTag::Struct(
2225            Box::new(struct_tag_sdk_to_core(*struct_tag)?),
2226        ),
2227        TypeTag::U16 => move_core_types::language_storage::TypeTag::U16,
2228        TypeTag::U32 => move_core_types::language_storage::TypeTag::U32,
2229        TypeTag::U256 => move_core_types::language_storage::TypeTag::U256,
2230    }
2231    .pipe(Ok)
2232}
2233
2234pub fn struct_tag_core_to_sdk(
2235    value: move_core_types::language_storage::StructTag,
2236) -> Result<StructTag, SdkTypeConversionError> {
2237    let move_core_types::language_storage::StructTag {
2238        address,
2239        module,
2240        name,
2241        type_params,
2242    } = value;
2243
2244    let address = Address::new(address.into_bytes());
2245    let module = Identifier::new(module.as_str())?;
2246    let name = Identifier::new(name.as_str())?;
2247    let type_params = type_params
2248        .into_iter()
2249        .map(type_tag_core_to_sdk)
2250        .collect::<Result<_, _>>()?;
2251    StructTag {
2252        address,
2253        module,
2254        name,
2255        type_params,
2256    }
2257    .pipe(Ok)
2258}
2259
2260pub fn struct_tag_sdk_to_core(
2261    value: StructTag,
2262) -> Result<move_core_types::language_storage::StructTag, SdkTypeConversionError> {
2263    let StructTag {
2264        address,
2265        module,
2266        name,
2267        type_params,
2268    } = value;
2269
2270    let address = move_core_types::account_address::AccountAddress::new(address.into_inner());
2271    let module = move_core_types::identifier::Identifier::new(module.into_inner())?;
2272    let name = move_core_types::identifier::Identifier::new(name.into_inner())?;
2273    let type_params = type_params
2274        .into_iter()
2275        .map(type_tag_sdk_to_core)
2276        .collect::<Result<_, _>>()?;
2277    move_core_types::language_storage::StructTag {
2278        address,
2279        module,
2280        name,
2281        type_params,
2282    }
2283    .pipe(Ok)
2284}
2285
2286impl From<crate::committee::Committee> for ValidatorCommittee {
2287    fn from(value: crate::committee::Committee) -> Self {
2288        Self {
2289            epoch: value.epoch(),
2290            members: value
2291                .voting_rights
2292                .into_iter()
2293                .map(|(name, stake)| ValidatorCommitteeMember {
2294                    public_key: name.into(),
2295                    stake,
2296                })
2297                .collect(),
2298        }
2299    }
2300}
2301
2302impl From<ValidatorCommittee> for crate::committee::Committee {
2303    fn from(value: ValidatorCommittee) -> Self {
2304        let ValidatorCommittee { epoch, members } = value;
2305
2306        Self::new(
2307            epoch,
2308            members
2309                .into_iter()
2310                .map(|member| (member.public_key.into(), member.stake))
2311                .collect(),
2312        )
2313    }
2314}
2315
2316impl From<crate::crypto::AuthorityPublicKeyBytes> for Bls12381PublicKey {
2317    fn from(value: crate::crypto::AuthorityPublicKeyBytes) -> Self {
2318        Self::new(value.0)
2319    }
2320}
2321
2322impl From<Bls12381PublicKey> for crate::crypto::AuthorityPublicKeyBytes {
2323    fn from(value: Bls12381PublicKey) -> Self {
2324        Self::new(value.into_inner())
2325    }
2326}
2327
2328impl From<UnchangedSharedKind> for crate::effects::UnchangedSharedKind {
2329    fn from(value: UnchangedSharedKind) -> Self {
2330        match value {
2331            UnchangedSharedKind::ReadOnlyRoot { version, digest } => {
2332                Self::ReadOnlyRoot((version.into(), digest.into()))
2333            }
2334            UnchangedSharedKind::MutateDeleted { version } => Self::MutateDeleted(version.into()),
2335            UnchangedSharedKind::ReadDeleted { version } => Self::ReadDeleted(version.into()),
2336            UnchangedSharedKind::Cancelled { version } => Self::Cancelled(version.into()),
2337            UnchangedSharedKind::PerEpochConfig => Self::PerEpochConfig,
2338        }
2339    }
2340}
2341
2342impl From<crate::effects::UnchangedSharedKind> for UnchangedSharedKind {
2343    fn from(value: crate::effects::UnchangedSharedKind) -> Self {
2344        match value {
2345            crate::effects::UnchangedSharedKind::ReadOnlyRoot((version, digest)) => {
2346                Self::ReadOnlyRoot {
2347                    version: version.into(),
2348                    digest: digest.into(),
2349                }
2350            }
2351            crate::effects::UnchangedSharedKind::MutateDeleted(version) => Self::MutateDeleted {
2352                version: version.into(),
2353            },
2354            crate::effects::UnchangedSharedKind::ReadDeleted(version) => Self::ReadDeleted {
2355                version: version.into(),
2356            },
2357            crate::effects::UnchangedSharedKind::Cancelled(version) => Self::Cancelled {
2358                version: version.into(),
2359            },
2360            crate::effects::UnchangedSharedKind::PerEpochConfig => Self::PerEpochConfig,
2361        }
2362    }
2363}
2364
2365impl From<crate::transaction::TransactionExpiration> for TransactionExpiration {
2366    fn from(value: crate::transaction::TransactionExpiration) -> Self {
2367        match value {
2368            crate::transaction::TransactionExpiration::None => Self::None,
2369            crate::transaction::TransactionExpiration::Epoch(epoch) => Self::Epoch(epoch),
2370        }
2371    }
2372}
2373
2374impl From<TransactionExpiration> for crate::transaction::TransactionExpiration {
2375    fn from(value: TransactionExpiration) -> Self {
2376        match value {
2377            TransactionExpiration::None => Self::None,
2378            TransactionExpiration::Epoch(epoch) => Self::Epoch(epoch),
2379        }
2380    }
2381}