sui_adapter_latest/data_store/
cached_package_store.rs1use crate::data_store::{PackageStore, transaction_package_store::TransactionPackageStore};
5use move_core_types::{identifier::IdentStr, resolver::IntraPackageName};
6use move_vm_runtime::{
7 cache::move_cache::ResolvedPackageResult, runtime::MoveRuntime,
8 validation::verification::ast::Package as VerifiedPackage,
9};
10use std::{rc::Rc, sync::Arc};
11use sui_types::{
12 base_types::ObjectID,
13 error::{ExecutionError, SuiErrorKind, SuiResult},
14 execution_status::ExecutionErrorKind,
15 move_package::MovePackage,
16};
17
18pub struct CachedPackageStore<'state, 'runtime> {
24 runtime: &'runtime MoveRuntime,
26
27 pub package_store: TransactionPackageStore<'state>,
30}
31
32impl<'state, 'runtime> CachedPackageStore<'state, 'runtime> {
33 pub fn new(
34 runtime: &'runtime MoveRuntime,
35 package_store: TransactionPackageStore<'state>,
36 ) -> Self {
37 Self {
38 runtime,
39 package_store,
40 }
41 }
42
43 pub fn get_package(&self, object_id: &ObjectID) -> SuiResult<Option<Arc<VerifiedPackage>>> {
51 self.fetch_package(object_id)
52 }
53
54 pub fn get_move_package(&self, object_id: &ObjectID) -> SuiResult<Option<Rc<MovePackage>>> {
55 self.package_store.fetch_move_package(**object_id)
56 }
57
58 fn fetch_package(&self, id: &ObjectID) -> SuiResult<Option<Arc<VerifiedPackage>>> {
62 if let Some((_move_pkg, verified_pkg)) = self.package_store.fetch_new_package(id) {
66 return Ok(Some(verified_pkg));
67 }
68
69 match self
71 .runtime
72 .resolve_and_cache_package(&self.package_store, (*id).into())
73 .map_err(|e| {
74 SuiErrorKind::ExecutionError(
75 ExecutionError::new_with_source(
76 ExecutionErrorKind::VMVerificationOrDeserializationError,
77 e.to_string(),
78 )
79 .to_string(),
80 )
81 })? {
82 ResolvedPackageResult::Found(pkg) => Ok(Some(pkg.verified.clone())),
83 ResolvedPackageResult::NotFound => Ok(None),
84 }
85 }
86}
87
88impl PackageStore for CachedPackageStore<'_, '_> {
89 fn get_package(&self, id: &ObjectID) -> SuiResult<Option<Arc<VerifiedPackage>>> {
90 self.get_package(id)
91 }
92
93 fn resolve_type_to_defining_id(
94 &self,
95 module_address: ObjectID,
96 module_name: &IdentStr,
97 type_name: &IdentStr,
98 ) -> SuiResult<Option<ObjectID>> {
99 let Some(pkg) = self.get_package(&module_address)? else {
100 return Ok(None);
101 };
102
103 Ok(pkg
104 .type_origin_table()
105 .get(&IntraPackageName {
106 module_name: module_name.to_owned(),
107 type_name: type_name.to_owned(),
108 })
109 .map(|id| ObjectID::from(*id)))
110 }
111}