sui_types/
display_registry.rs1use 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
40pub 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}