sui_types/
display_registry.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use move_core_types::ident_str;
5use move_core_types::identifier::IdentStr;
6use move_core_types::language_storage::StructTag;
7use move_core_types::language_storage::TypeTag;
8use serde::Deserialize;
9use serde::Serialize;
10
11use crate::SUI_DISPLAY_REGISTRY_OBJECT_ID;
12use crate::SUI_FRAMEWORK_ADDRESS;
13use crate::base_types::ObjectID;
14use crate::base_types::SequenceNumber;
15use crate::collection_types::VecMap;
16use crate::derived_object::derive_object_id;
17use crate::error::SuiResult;
18use crate::object::Owner;
19use crate::storage::ObjectStore;
20
21pub const DISPLAY_REGISTRY_MODULE_NAME: &IdentStr = ident_str!("display_registry");
22pub const DISPLAY_KEY_STRUCT_NAME: &IdentStr = ident_str!("DisplayKey");
23
24#[derive(Serialize, Deserialize)]
25pub struct Display {
26    pub id: ObjectID,
27    pub fields: VecMap<String, String>,
28    pub cap_id: Option<ObjectID>,
29}
30
31impl Display {
32    pub fn fields(&self) -> impl Iterator<Item = (&str, &str)> {
33        self.fields
34            .contents
35            .iter()
36            .map(|e| (e.key.as_str(), e.value.as_str()))
37    }
38}
39
40/// Derive the ObjectID at which to find the Display object for the given type.
41pub fn display_object_id(type_: TypeTag) -> Result<ObjectID, bcs::Error> {
42    derive_object_id(
43        SUI_DISPLAY_REGISTRY_OBJECT_ID,
44        &display_key(type_).into(),
45        &[0x00],
46    )
47}
48
49pub fn get_display_registry_obj_initial_shared_version(
50    object_store: &dyn ObjectStore,
51) -> SuiResult<Option<SequenceNumber>> {
52    Ok(object_store
53        .get_object(&SUI_DISPLAY_REGISTRY_OBJECT_ID)
54        .map(|obj| match obj.owner {
55            Owner::Shared {
56                initial_shared_version,
57            } => initial_shared_version,
58            _ => unreachable!("DisplayRegistry object must be shared"),
59        }))
60}
61
62fn display_key(type_: TypeTag) -> StructTag {
63    StructTag {
64        address: SUI_FRAMEWORK_ADDRESS,
65        module: DISPLAY_REGISTRY_MODULE_NAME.to_owned(),
66        name: DISPLAY_KEY_STRUCT_NAME.to_owned(),
67        type_params: vec![type_],
68    }
69}