abstract_app/endpoints/
migrate.rs

1use abstract_std::{
2    app::MigrateMsg,
3    objects::module_version::{assert_contract_upgrade, set_module_data},
4};
5use cosmwasm_std::Response;
6use cw2::set_contract_version;
7use schemars::JsonSchema;
8use serde::Serialize;
9
10use crate::{state::ContractError, AppContract, Handler, MigrateEndpoint};
11
12impl<
13        Error: ContractError,
14        CustomInitMsg,
15        CustomExecMsg,
16        CustomQueryMsg,
17        CustomMigrateMsg: Serialize + JsonSchema,
18        SudoMsg,
19    > MigrateEndpoint
20    for AppContract<Error, CustomInitMsg, CustomExecMsg, CustomQueryMsg, CustomMigrateMsg, SudoMsg>
21{
22    type MigrateMsg = MigrateMsg<CustomMigrateMsg>;
23
24    fn migrate(
25        self,
26        deps: cosmwasm_std::DepsMut,
27        env: cosmwasm_std::Env,
28        msg: Self::MigrateMsg,
29    ) -> Result<cosmwasm_std::Response, Self::Error> {
30        let (name, version_string, metadata) = self.info();
31        let to_version = version_string.parse().unwrap();
32        assert_contract_upgrade(deps.storage, name, to_version)?;
33        set_module_data(
34            deps.storage,
35            name,
36            version_string,
37            self.dependencies(),
38            metadata,
39        )?;
40        set_contract_version(deps.storage, name, version_string)?;
41        if let Some(migrate_fn) = self.maybe_migrate_handler() {
42            return migrate_fn(deps, env, self, msg.module);
43        }
44        Ok(Response::default())
45    }
46}