abstract_add_on/
traits.rs

1use abstract_os::api::ApiRequestMsg;
2use abstract_sdk::{
3    api_request, manager::query_module_address, proxy::send_to_proxy, Dependency, MemoryOperation,
4    OsExecute,
5};
6use cosmwasm_std::{Addr, Deps, Response, StdError, StdResult, Storage};
7
8use crate::{AddOnContract, AddOnError};
9
10impl MemoryOperation for AddOnContract<'_> {
11    fn load_memory(&self, store: &dyn Storage) -> StdResult<abstract_sdk::memory::Memory> {
12        Ok(self.base_state.load(store)?.memory)
13    }
14}
15
16impl OsExecute for AddOnContract<'_> {
17    type Err = AddOnError;
18    fn os_execute(
19        &self,
20        deps: Deps,
21        msgs: Vec<cosmwasm_std::CosmosMsg>,
22    ) -> Result<Response, Self::Err> {
23        let proxy = self.base_state.load(deps.storage)?.proxy_address;
24        Ok(Response::new().add_message(send_to_proxy(msgs, &proxy)?))
25    }
26}
27
28impl Dependency for AddOnContract<'_> {
29    fn dependency_address(&self, deps: Deps, dependency_name: &str) -> StdResult<Addr> {
30        let manager_addr = &self
31            .admin
32            .get(deps)?
33            .ok_or_else(|| StdError::generic_err("No admin on add-on"))?;
34        query_module_address(deps, manager_addr, dependency_name)
35    }
36    fn call_api_dependency<E: serde::Serialize>(
37        &self,
38        deps: Deps,
39        dependency_name: &str,
40        request_msg: &E,
41        funds: Vec<cosmwasm_std::Coin>,
42    ) -> StdResult<cosmwasm_std::CosmosMsg> {
43        let dep_addr = self.dependency_address(deps, dependency_name)?;
44        let proxy_addr = self.state(deps.storage)?.proxy_address;
45        let api_request_msg = ApiRequestMsg {
46            proxy_address: Some(proxy_addr.to_string()),
47            request: request_msg,
48        };
49        api_request(dep_addr, api_request_msg, funds)
50    }
51}