abstract_app/endpoints/
instantiate.rs

1use 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        // Base state
38        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}