Skip to content

Commit

Permalink
Merge pull request #164 from confio/fix/older-version-migration
Browse files Browse the repository at this point in the history
Older version migration helper
  • Loading branch information
maurolacy authored Jul 26, 2022
2 parents 9dbd508 + f493859 commit 35997ce
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 11 deletions.
12 changes: 4 additions & 8 deletions contracts/tgrade-valset/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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 {
Expand All @@ -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())
}
Expand Down
12 changes: 9 additions & 3 deletions packages/utils/src/migrate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)?;
Expand All @@ -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 {
Expand All @@ -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();
Expand Down

0 comments on commit 35997ce

Please sign in to comment.