sui_types/
address_alias.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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// Rust version of the Move sui::authenticator_state::AddressAliases type
18#[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}