abstract_std/
native_addrs.rs

1use cosmwasm_std::{
2    instantiate2_address, Addr, CanonicalAddr, Deps, Env, QuerierWrapper, StdResult,
3};
4
5use crate::AbstractResult;
6
7pub use cw_blob::CHECKSUM as BLOB_CHECKSUM;
8
9// Salts for deployments
10pub const ANS_HOST_SALT: &[u8] = b"ans";
11pub const REGISTRY_SALT: &[u8] = b"reg";
12pub const MODULE_FACTORY_SALT: &[u8] = b"mf";
13
14pub fn ans_address(deps: Deps, abstract_code_id: u64) -> AbstractResult<CanonicalAddr> {
15    contract_canon_address(deps, abstract_code_id, ANS_HOST_SALT)
16}
17
18pub fn registry_address(deps: Deps, abstract_code_id: u64) -> AbstractResult<CanonicalAddr> {
19    contract_canon_address(deps, abstract_code_id, REGISTRY_SALT)
20}
21
22pub fn module_factory_address(deps: Deps, abstract_code_id: u64) -> AbstractResult<CanonicalAddr> {
23    contract_canon_address(deps, abstract_code_id, MODULE_FACTORY_SALT)
24}
25
26/// Address of the abstract admin
27pub fn creator_address(
28    querier: &QuerierWrapper,
29    abstract_code_id: u64,
30) -> cosmwasm_std::StdResult<Addr> {
31    let code_info = querier.query_wasm_code_info(abstract_code_id)?;
32    Ok(code_info.creator)
33}
34
35pub fn abstract_code_id(
36    querier: &QuerierWrapper,
37    abstract_address: impl Into<String>,
38) -> StdResult<u64> {
39    querier
40        .query_wasm_contract_info(abstract_address)
41        .map(|contract_info| contract_info.code_id)
42}
43
44pub fn creator_canon_address(deps: Deps, abstract_code_id: u64) -> StdResult<CanonicalAddr> {
45    creator_address(&deps.querier, abstract_code_id).and_then(|creator_addr| {
46        deps.api
47            .addr_canonicalize(creator_addr.as_str())
48            .map(Into::into)
49    })
50}
51
52pub fn contract_canon_address(
53    deps: Deps,
54    abstract_code_id: u64,
55    salt: &[u8],
56) -> AbstractResult<CanonicalAddr> {
57    let creator_canon = creator_canon_address(deps, abstract_code_id)?;
58    let canon_addr = instantiate2_address(&BLOB_CHECKSUM, &creator_canon, salt)?;
59    Ok(canon_addr)
60}
61
62/// Hrp from the address of contract
63pub fn hrp_from_env(env: &Env) -> &str {
64    hrp_from_address(&env.contract.address)
65}
66
67/// Hrp from the address
68/// Any address validated on this chain can be used
69// https://en.bitcoin.it/wiki/BIP_0173#Specification
70pub fn hrp_from_address(addr: &Addr) -> &str {
71    addr.as_str()
72        .split_once("1")
73        .expect("Contract address is not bech32")
74        .0
75}