sui_types/
address_alias.rs1use move_core_types::identifier::Identifier;
5use move_core_types::language_storage::{StructTag, TypeTag};
6use mysten_common::debug_fatal;
7use serde::{Deserialize, Serialize};
8
9use crate::base_types::{ObjectID, SequenceNumber, SuiAddress};
10use crate::collection_types::VecSet;
11use crate::error::{SuiErrorKind, SuiResult};
12use crate::object::Owner;
13use crate::storage::ObjectStore;
14use crate::{SUI_ADDRESS_ALIAS_STATE_OBJECT_ID, derived_object};
15use crate::{SUI_FRAMEWORK_ADDRESS, id::UID};
16
17#[derive(Debug, Serialize, Deserialize)]
19pub struct AddressAliases {
20 pub id: UID,
21 pub aliases: VecSet<SuiAddress>,
22}
23
24pub fn get_address_alias_state_obj_initial_shared_version(
25 object_store: &dyn ObjectStore,
26) -> SuiResult<Option<SequenceNumber>> {
27 Ok(object_store
28 .get_object(&SUI_ADDRESS_ALIAS_STATE_OBJECT_ID)
29 .map(|obj| match obj.owner {
30 Owner::Shared {
31 initial_shared_version,
32 } => initial_shared_version,
33 _ => unreachable!("Address alias state object must be shared"),
34 }))
35}
36
37pub fn address_aliases_object_id(address: SuiAddress) -> Result<ObjectID, bcs::Error> {
39 let alias_key_type = TypeTag::Struct(Box::new(StructTag {
40 address: SUI_FRAMEWORK_ADDRESS,
41 module: Identifier::new("address_alias").unwrap(),
42 name: Identifier::new("AliasKey").unwrap(),
43 type_params: vec![],
44 }));
45
46 let key_bytes = bcs::to_bytes(&address).unwrap();
47 derived_object::derive_object_id(
48 SuiAddress::from(SUI_ADDRESS_ALIAS_STATE_OBJECT_ID),
49 &alias_key_type,
50 &key_bytes,
51 )
52}
53
54pub fn get_address_aliases_from_store(
55 object_store: &dyn ObjectStore,
56 address: SuiAddress,
57) -> SuiResult<Option<(AddressAliases, SequenceNumber)>> {
58 let Ok(address_aliases_id) = address_aliases_object_id(address) else {
59 debug_fatal!("failed to compute derived object id for alias state");
60 return Err(SuiErrorKind::Unknown(
61 "failed to compute derived object id for alias state".to_string(),
62 )
63 .into());
64 };
65 let address_aliases = object_store.get_object(&address_aliases_id);
66
67 Ok(address_aliases.map(|obj| {
68 let move_obj = obj
69 .data
70 .try_as_move()
71 .expect("AddressAliases object must be a MoveObject");
72 let address_aliases: AddressAliases =
73 bcs::from_bytes(move_obj.contents()).expect("failed to parse AddressAliases object");
74 (address_aliases, obj.version())
75 }))
76}