abstract_app/endpoints/
instantiate.rs1use abstract_std::{
2 app::{AppState, BaseInstantiateMsg, InstantiateMsg},
3 objects::module_version::set_module_data,
4};
5use cosmwasm_std::{DepsMut, Env, MessageInfo, Response};
6use cw2::set_contract_version;
7use schemars::JsonSchema;
8use serde::{de::DeserializeOwned, Serialize};
9
10use crate::{
11 state::{AppContract, ContractError},
12 Handler, InstantiateEndpoint,
13};
14
15impl<
16 Error: ContractError,
17 CustomInitMsg: Serialize + DeserializeOwned + JsonSchema,
18 CustomExecMsg,
19 CustomQueryMsg,
20 CustomMigrateMsg,
21 SudoMsg,
22 > InstantiateEndpoint
23 for AppContract<Error, CustomInitMsg, CustomExecMsg, CustomQueryMsg, CustomMigrateMsg, SudoMsg>
24{
25 type InstantiateMsg = InstantiateMsg<Self::CustomInitMsg>;
26 fn instantiate(
27 self,
28 mut deps: DepsMut,
29 env: Env,
30 info: MessageInfo,
31 msg: Self::InstantiateMsg,
32 ) -> Result<Response, Error> {
33 let BaseInstantiateMsg { account } = msg.base;
34
35 let module_msg = msg.module;
36
37 let state = AppState {
39 account: account.clone(),
40 };
41 let (name, version, metadata) = self.info();
42 set_module_data(deps.storage, name, version, self.dependencies(), metadata)?;
43 set_contract_version(deps.storage, name, version)?;
44 self.base_state.save(deps.storage, &state)?;
45 self.admin.set(deps.branch(), Some(account.into_addr()))?;
46
47 let Some(handler) = self.maybe_instantiate_handler() else {
48 return Ok(Response::new());
49 };
50 handler(deps, env, info, self, module_msg)
51 }
52}
53
54#[cfg(test)]
55mod test {
56 #![allow(clippy::needless_borrows_for_generic_args)]
57 use super::InstantiateMsg as SuperInstantiateMsg;
58 use crate::mock::*;
59 use abstract_sdk::base::InstantiateEndpoint;
60 use abstract_std::app::BaseInstantiateMsg;
61 use abstract_testing::prelude::*;
62
63 #[coverage_helper::test]
64 fn test_instantiate() {
65 let mut deps = mock_dependencies();
66 let abstr = AbstractMockAddrs::new(deps.api);
67
68 let info = message_info(&abstr.module_factory, &[]);
69 let env = mock_env_validated(deps.api);
70
71 deps.querier = app_base_mock_querier(deps.api).build();
72
73 let msg = SuperInstantiateMsg {
74 base: BaseInstantiateMsg {
75 account: abstr.account,
76 },
77 module: MockInitMsg {},
78 };
79
80 let res = MOCK_APP_WITH_DEP
81 .instantiate(deps.as_mut(), env, info, msg)
82 .unwrap();
83 assert!(res.messages.is_empty());
84 }
85}