1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
use cosmwasm_std::{Addr, Attribute, DepsMut, MessageInfo, Response, StdError, StdResult};
use cw_storage_plus::Item;
use komple_framework_types::shared::PARENT_ADDR_NAMESPACE;
use thiserror::Error;

use crate::{
    check_admin_privileges,
    response::{EventHelper, ResponseHelper},
    storage::StorageHelper,
    UtilError,
};

pub fn execute_lock_execute(
    deps: DepsMut,
    info: MessageInfo,
    module: &str,
    module_addr: &Addr,
    execute_lock_state: Item<bool>,
) -> Result<Response, SharedError> {
    if let Some(hub_addr) =
        StorageHelper::query_storage::<Addr>(&deps.querier, module_addr, PARENT_ADDR_NAMESPACE)?
    {
        if hub_addr != info.sender {
            return Err(SharedError::Unauthorized {});
        };

        execute_lock_state.save(deps.storage, &true)?;

        Ok(ResponseHelper::new_module(module, "lock_execute"))
    } else {
        return Err(SharedError::Unauthorized {});
    }
}

pub fn execute_update_operators(
    deps: DepsMut,
    info: MessageInfo,
    module: &str,
    module_addr: &Addr,
    admin: &Addr,
    operators_state: Item<Vec<Addr>>,
    mut addrs: Vec<String>,
) -> Result<Response, SharedError> {
    let parent_addr =
        StorageHelper::query_storage::<Addr>(&deps.querier, module_addr, PARENT_ADDR_NAMESPACE)?;
    let operators = operators_state.may_load(deps.storage)?;

    check_admin_privileges(&info.sender, module_addr, &admin, parent_addr, operators)?;

    addrs.sort_unstable();
    addrs.dedup();

    let mut event_attributes: Vec<Attribute> = vec![];

    let addrs = addrs
        .iter()
        .map(|addr| -> StdResult<Addr> {
            let addr = deps.api.addr_validate(addr)?;
            event_attributes.push(Attribute {
                key: "addrs".to_string(),
                value: addr.to_string(),
            });
            Ok(addr)
        })
        .collect::<StdResult<Vec<Addr>>>()?;

    operators_state.save(deps.storage, &addrs)?;

    Ok(
        ResponseHelper::new_module(module, "update_operators").add_event(
            EventHelper::new(format!("{}_update_operators", module))
                .add_attributes(event_attributes)
                .get(),
        ),
    )
}

#[derive(Error, Debug, PartialEq)]
pub enum SharedError {
    #[error("{0}")]
    Std(#[from] StdError),

    #[error("Unauthorized")]
    Unauthorized {},

    #[error("{0}")]
    UtilError(#[from] UtilError),
}