Skip to main content

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::{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// 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
37/// Derive the ObjectID at which to find the AddressAliases object for the given address.
38pub 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}