andromeda_std/ado_contract/
app.rs

1use cosmwasm_schema::cw_serde;
2use cosmwasm_std::{ensure, Addr, DepsMut, MessageInfo, Response, Storage};
3
4use crate::ado_contract::ADOContract;
5use crate::amp::addresses::AndrAddr;
6use crate::error::ContractError;
7
8#[cw_serde]
9enum AppQueryMsg {
10    ComponentExists { name: String },
11    GetAddress { name: String },
12}
13
14impl<'a> ADOContract<'a> {
15    #[inline]
16    pub fn get_app_contract(&self, storage: &dyn Storage) -> Result<Option<Addr>, ContractError> {
17        Ok(self.app_contract.may_load(storage)?)
18    }
19
20    pub fn execute_update_app_contract(
21        &self,
22        deps: DepsMut,
23        info: MessageInfo,
24        address: String,
25        addresses: Option<Vec<AndrAddr>>,
26    ) -> Result<Response, ContractError> {
27        ensure!(
28            self.is_contract_owner(deps.storage, info.sender.as_str())?,
29            ContractError::Unauthorized {}
30        );
31        self.app_contract
32            .save(deps.storage, &deps.api.addr_validate(&address)?)?;
33        self.validate_andr_addresses(&deps.as_ref(), addresses.unwrap_or_default())?;
34        #[cfg(feature = "modules")]
35        {
36            let modules = self.load_modules(deps.storage)?;
37            for module in modules {
38                self.validate_module_address(&deps.as_ref(), &module)?;
39            }
40        }
41        Ok(Response::new()
42            .add_attribute("action", "update_app_contract")
43            .add_attribute("address", address))
44    }
45}