sui_adapter_latest/
type_layout_resolver.rs1use crate::data_store::cached_package_store::CachedPackageStore;
5use crate::data_store::transaction_package_store::TransactionPackageStore;
6use crate::static_programmable_transactions::linkage::resolved_linkage::ExecutableLinkage;
7use move_core_types::annotated_value as A;
8use move_core_types::language_storage::StructTag;
9use move_vm_runtime::runtime::MoveRuntime;
10use sui_types::TypeTag;
11use sui_types::base_types::ObjectID;
12use sui_types::error::{SuiErrorKind, SuiResult};
13use sui_types::execution::TypeLayoutStore;
14use sui_types::storage::{BackingPackageStore, PackageObject};
15use sui_types::{error::SuiError, layout_resolver::LayoutResolver};
16
17pub struct TypeLayoutResolver<'state, 'runtime> {
19 vm: &'runtime MoveRuntime,
20 state_view: Box<dyn TypeLayoutStore + 'state>,
21}
22
23struct NullSuiResolver<'a, 'state>(&'a (dyn TypeLayoutStore + 'state));
26
27impl<'state, 'runtime> TypeLayoutResolver<'state, 'runtime> {
28 pub fn new(vm: &'runtime MoveRuntime, state_view: Box<dyn TypeLayoutStore + 'state>) -> Self {
29 Self { vm, state_view }
30 }
31}
32
33impl LayoutResolver for TypeLayoutResolver<'_, '_> {
34 fn get_annotated_layout(
35 &mut self,
36 struct_tag: &StructTag,
37 ) -> Result<A::MoveDatatypeLayout, SuiError> {
38 let ids = struct_tag.all_addresses().into_iter().map(ObjectID::from);
39 let null_resolver = NullSuiResolver(&self.state_view);
40 let resolver =
41 CachedPackageStore::new(self.vm, TransactionPackageStore::new(&null_resolver));
42 let tag_linkage = ExecutableLinkage::type_linkage(ids, &resolver)?;
43 let link_context = tag_linkage.linkage_context()?;
44 let data_store = TransactionPackageStore::new(&null_resolver);
45 let Ok(vm) = self.vm.make_vm(data_store, link_context) else {
46 return Err(SuiErrorKind::FailObjectLayout {
47 st: format!("{}", struct_tag),
48 }
49 .into());
50 };
51
52 let type_tag = TypeTag::Struct(Box::new(struct_tag.clone()));
53 match vm.annotated_type_layout(&type_tag) {
54 Ok(A::MoveTypeLayout::Struct(s)) => Ok(A::MoveDatatypeLayout::Struct(s)),
55 Ok(A::MoveTypeLayout::Enum(e)) => Ok(A::MoveDatatypeLayout::Enum(e)),
56 _ => Err(SuiErrorKind::FailObjectLayout {
57 st: format!("{}", struct_tag),
58 }
59 .into()),
60 }
61 }
62}
63
64impl BackingPackageStore for NullSuiResolver<'_, '_> {
65 fn get_package_object(&self, package_id: &ObjectID) -> SuiResult<Option<PackageObject>> {
66 self.0.get_package_object(package_id)
67 }
68}