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::{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 get_address_aliases_from_store(
38 object_store: &dyn ObjectStore,
39 address: SuiAddress,
40) -> SuiResult<Option<(AddressAliases, SequenceNumber)>> {
41 let alias_key_type = TypeTag::Struct(Box::new(StructTag {
42 address: SUI_FRAMEWORK_ADDRESS,
43 module: Identifier::new("address_alias").unwrap(),
44 name: Identifier::new("AliasKey").unwrap(),
45 type_params: vec![],
46 }));
47
48 let key_bytes = bcs::to_bytes(&address).unwrap();
49 let Ok(address_aliases_id) = derived_object::derive_object_id(
50 SuiAddress::from(SUI_ADDRESS_ALIAS_STATE_OBJECT_ID),
51 &alias_key_type,
52 &key_bytes,
53 ) else {
54 debug_fatal!("failed to compute derived object id for alias state");
55 return Err(SuiErrorKind::Unknown(
56 "failed to compute derived object id for alias state".to_string(),
57 )
58 .into());
59 };
60 let address_aliases = object_store.get_object(&address_aliases_id);
61
62 Ok(address_aliases.map(|obj| {
63 let move_obj = obj
64 .data
65 .try_as_move()
66 .expect("AddressAliases object must be a MoveObject");
67 let address_aliases: AddressAliases =
68 bcs::from_bytes(move_obj.contents()).expect("failed to parse AddressAliases object");
69 (address_aliases, obj.version())
70 }))
71}