croncat_agents/
external.rs

1use crate::error::ContractError;
2use cosmwasm_std::{
3    to_binary, Addr, CosmosMsg, Deps, Empty, QuerierWrapper, StdError, StdResult, Uint128, WasmMsg,
4};
5use croncat_sdk_agents::types::Config;
6use croncat_sdk_core::internal_messages::agents::AgentWithdrawOnRemovalArgs;
7use croncat_sdk_factory::state::CONTRACT_ADDRS;
8use croncat_sdk_manager::msg::ManagerQueryMsg;
9use croncat_sdk_manager::types::Config as ManagerConfig;
10use croncat_sdk_tasks::msg::TasksQueryMsg;
11use croncat_sdk_tasks::types::SlotTasksTotalResponse;
12pub mod croncat_tasks_contract {
13    use super::*;
14
15    pub(crate) fn assert_caller_is_tasks_contract(
16        deps_queries: &QuerierWrapper<Empty>,
17        config: &Config,
18        sender: &Addr,
19    ) -> StdResult<()> {
20        let addr = query_tasks_addr(deps_queries, config)?;
21        if addr != *sender {
22            return Err(cosmwasm_std::StdError::GenericErr {
23                msg: ContractError::Unauthorized {}.to_string(),
24            });
25        }
26        Ok(())
27    }
28
29    pub(crate) fn query_tasks_addr(
30        deps_queries: &QuerierWrapper<Empty>,
31        config: &Config,
32    ) -> StdResult<Addr> {
33        let (agents_name, version) = &config.croncat_tasks_key;
34        CONTRACT_ADDRS
35            .query(
36                deps_queries,
37                config.croncat_factory_addr.clone(),
38                (agents_name, version),
39            )?
40            .ok_or_else(|| StdError::generic_err(ContractError::InvalidVersionKey {}.to_string()))
41    }
42
43    pub fn query_tasks_slots(deps: Deps, config: &Config) -> StdResult<(u64, u64)> {
44        let croncat_tasks_addr = query_tasks_addr(&deps.querier, config)?;
45        // Get the denom from the manager contract
46        let response: SlotTasksTotalResponse = deps.querier.query_wasm_smart(
47            croncat_tasks_addr,
48            &TasksQueryMsg::SlotTasksTotal { offset: None },
49        )?;
50
51        Ok((response.block_tasks, response.cron_tasks))
52    }
53}
54
55pub mod croncat_manager_contract {
56
57    use super::*;
58
59    pub fn query_manager_config(deps: &Deps, config: &Config) -> StdResult<ManagerConfig> {
60        let manager_addr = query_manager_addr(&deps.querier, config)?;
61        // Get the denom from the manager contract
62        let manager_config: ManagerConfig = deps
63            .querier
64            .query_wasm_smart(manager_addr, &ManagerQueryMsg::Config {})?;
65
66        Ok(manager_config)
67    }
68
69    pub(crate) fn query_manager_addr(
70        deps_queries: &QuerierWrapper<Empty>,
71        config: &Config,
72    ) -> StdResult<Addr> {
73        let (manager_name, version) = &config.croncat_manager_key;
74        CONTRACT_ADDRS
75            .query(
76                deps_queries,
77                config.croncat_factory_addr.clone(),
78                (manager_name, version),
79            )?
80            .ok_or(cosmwasm_std::StdError::GenericErr {
81                msg: ContractError::InvalidVersionKey {}.to_string(),
82            })
83    }
84
85    pub fn create_withdraw_rewards_submsg(
86        querier: &QuerierWrapper<Empty>,
87        config: &Config,
88        agent_id: &str,
89        payable_account_id: String,
90    ) -> StdResult<CosmosMsg> {
91        let addr = query_manager_addr(querier, config)?;
92        let args = AgentWithdrawOnRemovalArgs {
93            agent_id: agent_id.to_owned(),
94            payable_account_id,
95        };
96        let execute = CosmosMsg::Wasm(WasmMsg::Execute {
97            contract_addr: addr.into(),
98            msg: to_binary(&croncat_sdk_manager::msg::ManagerExecuteMsg::AgentWithdraw(
99                Some(args),
100            ))?,
101            funds: vec![],
102        });
103
104        Ok(execute)
105    }
106    pub fn query_agent_rewards(
107        querier: &QuerierWrapper<Empty>,
108        config: &Config,
109        agent_id: &str,
110    ) -> StdResult<Uint128> {
111        let addr = query_manager_addr(querier, config)?;
112        // Get the denom from the manager contract
113        let response: Uint128 = querier.query_wasm_smart(
114            addr,
115            &ManagerQueryMsg::AgentRewards {
116                agent_id: agent_id.to_owned(),
117            },
118        )?;
119
120        Ok(response)
121    }
122    pub(crate) fn assert_caller_is_manager_contract(
123        deps_queries: &QuerierWrapper<Empty>,
124        config: &Config,
125        sender: &Addr,
126    ) -> StdResult<()> {
127        let addr = query_manager_addr(deps_queries, config)?;
128        if addr != *sender {
129            return Err(cosmwasm_std::StdError::GenericErr {
130                msg: ContractError::Unauthorized {}.to_string(),
131            });
132        }
133        Ok(())
134    }
135}