cosmwasm-contract-migratable-std 0.1.0

A collection of standardized messages, state structs, and helper functions a contract can use to implement contract migration.
Documentation
#[cfg(test)]
mod tests {
    use cosmwasm_std::{Addr, Api, ContractInfo, StdError, StdResult, Storage};
    use cosmwasm_std::testing::{mock_dependencies, mock_info};
    use secret_toolkit::serialization::{Bincode2, Serde};

    use crate::execute::register_to_notify_on_migration_complete;
    use crate::state::NOTIFY_ON_MIGRATION_COMPLETE_KEY;

    #[test]
    fn register_on_migration_complete_notify_receiver_fails_with_for_non_admin() {
        let mut deps = mock_dependencies();
        let non_admin_info = mock_info("non_admin", &[]);
        let admin = deps.api.addr_canonicalize("admin").unwrap();
        let receiver_address = "addr".to_string();
        let receiver_code_hash = "code_hash".to_string();
        let res = register_to_notify_on_migration_complete(
            deps.as_mut(),
            non_admin_info,
            admin,
            receiver_address,
            receiver_code_hash,
        );
        assert!(res.is_err(), "execute didn't fail");
        assert_eq!(
            res.err().unwrap(),
            StdError::generic_err("This is an admin command and can only be run from the admin address")
        );
    }

    #[test]
    fn register_on_migration_complete_notify_receiver_saves_contract() -> StdResult<()> {
        let mut deps = mock_dependencies();
        let admin_info = mock_info("admin", &[]);
        let admin = deps.api.addr_canonicalize("admin")?;
        let receiver = ContractInfo {
            address: Addr::unchecked("addr"),
            code_hash: "code_hash".to_string(),
        };
        register_to_notify_on_migration_complete(
            deps.as_mut(),
            admin_info,
            admin,
            receiver.address.to_string(),
            receiver.code_hash.to_string(),
        )?;
        let saved_contract: Vec<ContractInfo> = Bincode2::deserialize(
            &deps.storage.get(NOTIFY_ON_MIGRATION_COMPLETE_KEY).unwrap()
        )?;
        assert_eq!(vec![receiver], saved_contract);
        Ok(())
    }
}