abstract_add_on/
traits.rs1use 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}