1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
use abstract_os::objects::module_version::{get_module_data, set_module_data};
use abstract_sdk::{
    base::{Handler, MigrateEndpoint},
    os::ibc_host::MigrateMsg,
};
use cosmwasm_std::{Response, StdError};

use cw2::set_contract_version;
use schemars::JsonSchema;
use semver::Version;
use serde::Serialize;

use crate::{Host, HostError};

impl<
        Error: From<cosmwasm_std::StdError> + From<HostError>,
        CustomExecMsg,
        CustomInitMsg,
        CustomQueryMsg,
        CustomMigrateMsg: Serialize + JsonSchema,
        ReceiveMsg,
    > MigrateEndpoint
    for Host<Error, CustomExecMsg, CustomInitMsg, CustomQueryMsg, CustomMigrateMsg, ReceiveMsg>
{
    type MigrateMsg = MigrateMsg<CustomMigrateMsg>;

    fn migrate(
        self,
        deps: cosmwasm_std::DepsMut,
        env: cosmwasm_std::Env,
        msg: Self::MigrateMsg,
    ) -> Result<cosmwasm_std::Response, Self::Error> {
        let (name, version_string, metadata) = self.info();
        let version: Version =
            Version::parse(version_string).map_err(|e| StdError::generic_err(e.to_string()))?;
        let storage_version: Version = get_module_data(deps.storage)?.version.parse().unwrap();
        if storage_version < version {
            set_module_data(
                deps.storage,
                name,
                version_string,
                self.dependencies(),
                metadata,
            )?;
            set_contract_version(deps.storage, name, version_string)?;
        }

        if let Some(migrate_fn) = self.maybe_migrate_handler() {
            return migrate_fn(deps, env, self, msg.app);
        }
        Ok(Response::default())
    }
}