From b4bf99fbc0aa5802746457c97da3f3481ea8ca21 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 21 Jul 2022 23:20:20 +0200 Subject: [PATCH 1/3] Make ensure_from_older_version return original version for convenience --- packages/utils/src/migrate.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/utils/src/migrate.rs b/packages/utils/src/migrate.rs index 1d2cf6f2..9e89bc3e 100644 --- a/packages/utils/src/migrate.rs +++ b/packages/utils/src/migrate.rs @@ -6,7 +6,7 @@ pub fn ensure_from_older_version( storage: &mut dyn Storage, name: &str, new_version: &str, -) -> StdResult<()> { +) -> StdResult { 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 +28,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 +53,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(); From db62dc69388feed3db4a7cb273272c8ec4ead773 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 21 Jul 2022 23:34:10 +0200 Subject: [PATCH 2/3] Use returned original version --- contracts/tgrade-valset/src/contract.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) 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 { - 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()) } From f493859bdba3de668c846ba2ca2c1ee7b9eccda5 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Tue, 26 Jul 2022 12:39:33 +0200 Subject: [PATCH 3/3] Add ensure_from_older_version docstring --- packages/utils/src/migrate.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/utils/src/migrate.rs b/packages/utils/src/migrate.rs index 9e89bc3e..eb3b8f30 100644 --- a/packages/utils/src/migrate.rs +++ b/packages/utils/src/migrate.rs @@ -2,6 +2,9 @@ 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,