1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use abstract_os::{
    objects::common_namespace::ADMIN_NAMESPACE, proxy::state::OS_ID, version_control::Core,
};
use cosmwasm_std::{Addr, Deps, StdError, StdResult};
use cw_storage_plus::Item;

const MANAGER: Item<'_, Option<Addr>> = Item::new(ADMIN_NAMESPACE);

pub trait Identification: Sized {
    fn proxy_address(&self, deps: Deps) -> StdResult<Addr>;
    fn manager_address(&self, deps: Deps) -> StdResult<Addr> {
        let maybe_proxy_manager = MANAGER.query(&deps.querier, self.proxy_address(deps)?)?;
        maybe_proxy_manager.ok_or_else(|| StdError::generic_err("proxy admin must be manager."))
    }
    fn os_core(&self, deps: Deps) -> StdResult<Core> {
        Ok(Core {
            manager: self.manager_address(deps)?,
            proxy: self.proxy_address(deps)?,
        })
    }
    fn os_id(&self, deps: Deps) -> StdResult<u32> {
        OS_ID.query(&deps.querier, self.proxy_address(deps)?)
    }
}