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();