sui_adapter_v2/
type_layout_resolver.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use crate::programmable_transactions::context::load_type_from_struct;
5use crate::programmable_transactions::linkage_view::LinkageView;
6use move_core_types::annotated_value as A;
7use move_core_types::language_storage::StructTag;
8use move_vm_runtime::move_vm::MoveVM;
9use sui_types::base_types::ObjectID;
10use sui_types::error::{SuiErrorKind, SuiResult};
11use sui_types::execution::TypeLayoutStore;
12use sui_types::storage::{BackingPackageStore, PackageObject};
13use sui_types::{error::SuiError, layout_resolver::LayoutResolver};
14
15/// Retrieve a `MoveStructLayout` from a `Type`.
16/// Invocation into the `Session` to leverage the `LinkageView` implementation
17/// common to the runtime.
18pub struct TypeLayoutResolver<'state, 'vm> {
19    vm: &'vm MoveVM,
20    linkage_view: LinkageView<'state>,
21}
22
23/// Implements SuiResolver traits by providing null implementations for module and resource
24/// resolution and delegating backing package resolution to the trait object.
25struct NullSuiResolver<'state>(Box<dyn TypeLayoutStore + 'state>);
26
27impl<'state, 'vm> TypeLayoutResolver<'state, 'vm> {
28    pub fn new(vm: &'vm MoveVM, state_view: Box<dyn TypeLayoutStore + 'state>) -> Self {
29        let linkage_view = LinkageView::new(Box::new(NullSuiResolver(state_view)));
30        Self { vm, linkage_view }
31    }
32}
33
34impl LayoutResolver for TypeLayoutResolver<'_, '_> {
35    fn get_annotated_layout(
36        &mut self,
37        struct_tag: &StructTag,
38    ) -> Result<A::MoveDatatypeLayout, SuiError> {
39        let Ok(ty) = load_type_from_struct(self.vm, &mut self.linkage_view, &[], struct_tag) else {
40            return Err(SuiErrorKind::FailObjectLayout {
41                st: format!("{}", struct_tag),
42            }
43            .into());
44        };
45        let layout = self.vm.get_runtime().type_to_fully_annotated_layout(&ty);
46        let Ok(A::MoveTypeLayout::Struct(layout)) = layout else {
47            return Err(SuiErrorKind::FailObjectLayout {
48                st: format!("{}", struct_tag),
49            }
50            .into());
51        };
52        Ok(A::MoveDatatypeLayout::Struct(layout))
53    }
54}
55
56impl BackingPackageStore for NullSuiResolver<'_> {
57    fn get_package_object(&self, package_id: &ObjectID) -> SuiResult<Option<PackageObject>> {
58        self.0.get_package_object(package_id)
59    }
60}