diff --git a/contracts/tgrade-valset/src/contract.rs b/contracts/tgrade-valset/src/contract.rs index c7d21720..aa2b5ef8 100644 --- a/contracts/tgrade-valset/src/contract.rs +++ b/contracts/tgrade-valset/src/contract.rs @@ -9,12 +9,11 @@ use cosmwasm_std::{ Order, QueryRequest, Reply, StdError, StdResult, Timestamp, WasmMsg, }; -use cw2::{get_contract_version, set_contract_version}; +use cw2::set_contract_version; use cw_controllers::AdminError; use cw_storage_plus::Bound; use cw_utils::{maybe_addr, parse_reply_instantiate_data}; -use semver::Version; use tg4::{Member, Tg4Contract}; use tg_bindings::{ request_privileges, Ed25519Pubkey, Evidence, EvidenceType, Privilege, PrivilegeChangeMsg, @@ -939,7 +938,8 @@ pub fn migrate( _env: Env, msg: MigrateMsg, ) -> Result<Response, ContractError> { - ensure_from_older_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; + let original_version = + ensure_from_older_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; CONFIG.update::<_, StdError>(deps.storage, |mut cfg| { if let Some(min_points) = msg.min_points { @@ -951,11 +951,7 @@ pub fn migrate( Ok(cfg) })?; - let stored_version = get_contract_version(deps.storage)?; - // Unwrapping as version check before would fail if stored version is invalid - let stored_version: Version = stored_version.version.parse().unwrap(); - - migrate_jailing_period(deps.branch(), &stored_version)?; + migrate_jailing_period(deps.branch(), &original_version)?; Ok(Response::new()) } diff --git a/packages/utils/src/migrate.rs b/packages/utils/src/migrate.rs index 1d2cf6f2..eb3b8f30 100644 --- a/packages/utils/src/migrate.rs +++ b/packages/utils/src/migrate.rs @@ -2,11 +2,14 @@ use cosmwasm_std::{StdError, StdResult, Storage}; use cw2::{get_contract_version, set_contract_version}; use semver::Version; +/// This function not only validates that the right contract and version can be migrated, but also +/// updates the contract version from the original (stored) version to the new version. +/// It returns the original version for the convenience of doing external checks. pub fn ensure_from_older_version( storage: &mut dyn Storage, name: &str, new_version: &str, -) -> StdResult<()> { +) -> StdResult<Version> { let version: Version = new_version.parse().map_err(from_semver)?; let stored = get_contract_version(storage)?; let storage_version: Version = stored.version.parse().map_err(from_semver)?; @@ -28,7 +31,7 @@ pub fn ensure_from_older_version( set_contract_version(storage, name, new_version)?; } - Ok(()) + Ok(storage_version) } fn from_semver(err: semver::Error) -> StdError { @@ -53,7 +56,10 @@ mod tests { let mut storage = MockStorage::new(); set_contract_version(&mut storage, "demo", "0.4.0").unwrap(); // ensure this matches - ensure_from_older_version(&mut storage, "demo", "0.4.2").unwrap(); + let original_version = ensure_from_older_version(&mut storage, "demo", "0.4.2").unwrap(); + + // check the original version is returned + assert_eq!(original_version.to_string(), "0.4.0".to_string()); // check the version is updated let stored = get_contract_version(&storage).unwrap();