1use 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 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}