komple_framework_utils/
shared.rs

1use cosmwasm_std::{Addr, Attribute, DepsMut, MessageInfo, Response, StdError, StdResult};
2use cw_storage_plus::Item;
3use komple_framework_types::shared::PARENT_ADDR_NAMESPACE;
4use thiserror::Error;
5
6use crate::{
7    check_admin_privileges,
8    response::{EventHelper, ResponseHelper},
9    storage::StorageHelper,
10    UtilError,
11};
12
13pub fn execute_lock_execute(
14    deps: DepsMut,
15    info: MessageInfo,
16    module: &str,
17    module_addr: &Addr,
18    execute_lock_state: Item<bool>,
19) -> Result<Response, SharedError> {
20    if let Some(hub_addr) =
21        StorageHelper::query_storage::<Addr>(&deps.querier, module_addr, PARENT_ADDR_NAMESPACE)?
22    {
23        if hub_addr != info.sender {
24            return Err(SharedError::Unauthorized {});
25        };
26
27        execute_lock_state.save(deps.storage, &true)?;
28
29        Ok(ResponseHelper::new_module(module, "lock_execute"))
30    } else {
31        return Err(SharedError::Unauthorized {});
32    }
33}
34
35pub fn execute_update_operators(
36    deps: DepsMut,
37    info: MessageInfo,
38    module: &str,
39    module_addr: &Addr,
40    admin: &Addr,
41    operators_state: Item<Vec<Addr>>,
42    mut addrs: Vec<String>,
43) -> Result<Response, SharedError> {
44    let parent_addr =
45        StorageHelper::query_storage::<Addr>(&deps.querier, module_addr, PARENT_ADDR_NAMESPACE)?;
46    let operators = operators_state.may_load(deps.storage)?;
47
48    check_admin_privileges(&info.sender, module_addr, &admin, parent_addr, operators)?;
49
50    addrs.sort_unstable();
51    addrs.dedup();
52
53    let mut event_attributes: Vec<Attribute> = vec![];
54
55    let addrs = addrs
56        .iter()
57        .map(|addr| -> StdResult<Addr> {
58            let addr = deps.api.addr_validate(addr)?;
59            event_attributes.push(Attribute {
60                key: "addrs".to_string(),
61                value: addr.to_string(),
62            });
63            Ok(addr)
64        })
65        .collect::<StdResult<Vec<Addr>>>()?;
66
67    operators_state.save(deps.storage, &addrs)?;
68
69    Ok(
70        ResponseHelper::new_module(module, "update_operators").add_event(
71            EventHelper::new(format!("{}_update_operators", module))
72                .add_attributes(event_attributes)
73                .get(),
74        ),
75    )
76}
77
78#[derive(Error, Debug, PartialEq)]
79pub enum SharedError {
80    #[error("{0}")]
81    Std(#[from] StdError),
82
83    #[error("Unauthorized")]
84    Unauthorized {},
85
86    #[error("{0}")]
87    UtilError(#[from] UtilError),
88}