diff --git a/Cargo.lock b/Cargo.lock index 895e3e83..dd5496cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2147,7 +2147,7 @@ dependencies = [ [[package]] name = "mars-credit-manager" -version = "2.2.0" +version = "2.2.1" dependencies = [ "anyhow", "cosmwasm-schema", @@ -2465,7 +2465,7 @@ dependencies = [ [[package]] name = "mars-red-bank" -version = "2.1.0" +version = "2.1.1" dependencies = [ "anyhow", "cosmwasm-schema", diff --git a/contracts/credit-manager/Cargo.toml b/contracts/credit-manager/Cargo.toml index e7dd9efc..669e484d 100644 --- a/contracts/credit-manager/Cargo.toml +++ b/contracts/credit-manager/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mars-credit-manager" -version = "2.2.0" +version = "2.2.1" authors = { workspace = true } license = { workspace = true } edition = { workspace = true } diff --git a/contracts/credit-manager/src/contract.rs b/contracts/credit-manager/src/contract.rs index e74d395d..c7a75c8d 100644 --- a/contracts/credit-manager/src/contract.rs +++ b/contracts/credit-manager/src/contract.rs @@ -1,10 +1,10 @@ use cosmwasm_std::{ - entry_point, to_json_binary, Binary, Deps, DepsMut, Empty, Env, MessageInfo, Reply, Response, + entry_point, to_json_binary, Binary, Deps, DepsMut, Env, MessageInfo, Reply, Response, }; use cw2::set_contract_version; use mars_types::{ adapters::vault::VAULT_REQUEST_REPLY_ID, - credit_manager::{ExecuteMsg, InstantiateMsg, QueryMsg}, + credit_manager::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}, }; use crate::{ @@ -138,6 +138,10 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> ContractResult { } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result { - migrations::v2_2_0::migrate(deps) +pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result { + match msg { + MigrateMsg::V2_0_3ToV2_1_0 {} => migrations::v2_1_0::migrate(deps), + MigrateMsg::V2_1_0ToV2_2_0 {} => migrations::v2_2_0::migrate(deps), + MigrateMsg::V2_2_0ToV2_2_1 {} => migrations::v2_2_1::migrate(deps), + } } diff --git a/contracts/credit-manager/src/migrations/mod.rs b/contracts/credit-manager/src/migrations/mod.rs index 569d5a2f..09b7091a 100644 --- a/contracts/credit-manager/src/migrations/mod.rs +++ b/contracts/credit-manager/src/migrations/mod.rs @@ -1,2 +1,3 @@ pub mod v2_1_0; pub mod v2_2_0; +pub mod v2_2_1; diff --git a/contracts/credit-manager/src/migrations/v2_2_0.rs b/contracts/credit-manager/src/migrations/v2_2_0.rs index 7b2206cd..8e6c7ffb 100644 --- a/contracts/credit-manager/src/migrations/v2_2_0.rs +++ b/contracts/credit-manager/src/migrations/v2_2_0.rs @@ -1,43 +1,22 @@ use cosmwasm_std::{Decimal, DepsMut, Response}; -use cw2::{assert_contract_version, get_contract_version, set_contract_version, VersionError}; +use cw2::{assert_contract_version, set_contract_version}; -use crate::{ - contract::{CONTRACT_NAME, CONTRACT_VERSION}, - error::ContractError, - state::SWAP_FEE, -}; +use crate::{contract::CONTRACT_NAME, error::ContractError, state::SWAP_FEE}; const FROM_VERSION: &str = "2.1.0"; +const TO_VERSION: &str = "2.2.0"; pub fn migrate(deps: DepsMut) -> Result { - let contract = format!("crates.io:{CONTRACT_NAME}"); - let version = get_contract_version(deps.storage)?; - let from_version = version.version; - - if version.contract != contract { - return Err(ContractError::Version(VersionError::WrongContract { - expected: contract, - found: version.contract, - })); - } - - if from_version != FROM_VERSION { - return Err(ContractError::Version(VersionError::WrongVersion { - expected: FROM_VERSION.to_string(), - found: from_version, - })); - } - - assert_contract_version(deps.storage, &contract, FROM_VERSION)?; + assert_contract_version(deps.storage, &format!("crates.io:{CONTRACT_NAME}"), FROM_VERSION)?; if SWAP_FEE.may_load(deps.storage)?.is_none() { SWAP_FEE.save(deps.storage, &Decimal::zero())?; } - set_contract_version(deps.storage, format!("crates.io:{CONTRACT_NAME}"), CONTRACT_VERSION)?; + set_contract_version(deps.storage, format!("crates.io:{CONTRACT_NAME}"), TO_VERSION)?; Ok(Response::new() .add_attribute("action", "migrate") - .add_attribute("from_version", from_version) - .add_attribute("to_version", CONTRACT_VERSION)) + .add_attribute("from_version", FROM_VERSION) + .add_attribute("to_version", TO_VERSION)) } diff --git a/contracts/credit-manager/src/migrations/v2_2_1.rs b/contracts/credit-manager/src/migrations/v2_2_1.rs new file mode 100644 index 00000000..7338f552 --- /dev/null +++ b/contracts/credit-manager/src/migrations/v2_2_1.rs @@ -0,0 +1,19 @@ +use cosmwasm_std::{DepsMut, Response}; +use cw2::{assert_contract_version, set_contract_version}; + +use crate::{contract::CONTRACT_NAME, error::ContractError}; + +const FROM_VERSION: &str = "2.2.0"; +const TO_VERSION: &str = "2.2.1"; + +pub fn migrate(deps: DepsMut) -> Result { + // make sure we're migrating the correct contract and from the correct version + assert_contract_version(deps.storage, &format!("crates.io:{CONTRACT_NAME}"), FROM_VERSION)?; + + set_contract_version(deps.storage, format!("crates.io:{CONTRACT_NAME}"), TO_VERSION)?; + + Ok(Response::new() + .add_attribute("action", "migrate") + .add_attribute("from_version", FROM_VERSION) + .add_attribute("to_version", TO_VERSION)) +} diff --git a/contracts/credit-manager/src/swap.rs b/contracts/credit-manager/src/swap.rs index 4a4c315a..9a5a8436 100644 --- a/contracts/credit-manager/src/swap.rs +++ b/contracts/credit-manager/src/swap.rs @@ -65,5 +65,7 @@ pub fn swap_exact_in( .add_attribute("action", "swapper") .add_attribute("account_id", account_id) .add_attribute("coin_in", coin_in_to_trade.to_string()) - .add_attribute("denom_out", denom_out)) + .add_attribute("denom_out", denom_out) + .add_attribute("rewards_collector", rewards_collector_account) + .add_attribute("rewards_collector_fee", rc_coin.to_string())) } diff --git a/contracts/credit-manager/tests/tests/mod.rs b/contracts/credit-manager/tests/tests/mod.rs index defcc461..1de36ee9 100644 --- a/contracts/credit-manager/tests/tests/mod.rs +++ b/contracts/credit-manager/tests/tests/mod.rs @@ -24,7 +24,7 @@ mod test_liquidate_lend; mod test_liquidate_staked_astro_lp; mod test_liquidate_vault; mod test_liquidation_pricing; -mod test_migration_v2_2_0; +mod test_migration_v2_2_1; mod test_no_health_check; mod test_reclaim; mod test_reentrancy_guard; diff --git a/contracts/credit-manager/tests/tests/test_migration_v2_2_0.rs b/contracts/credit-manager/tests/tests/test_migration_v2_2_0.rs deleted file mode 100644 index 21742f2a..00000000 --- a/contracts/credit-manager/tests/tests/test_migration_v2_2_0.rs +++ /dev/null @@ -1,69 +0,0 @@ -use cosmwasm_std::{attr, testing::mock_env, Decimal, Empty, Event}; -use cw2::{ContractVersion, VersionError}; -use mars_credit_manager::{contract::migrate, error::ContractError, state::SWAP_FEE}; -use mars_testing::mock_dependencies; - -#[test] -fn wrong_contract_name() { - let mut deps = mock_dependencies(&[]); - cw2::set_contract_version(deps.as_mut().storage, "contract_xyz", "2.1.0").unwrap(); - - let err = migrate(deps.as_mut(), mock_env(), Empty {}).unwrap_err(); - - match err { - ContractError::Version(VersionError::WrongContract { - expected, - found, - }) => { - assert_eq!(expected, "crates.io:mars-credit-manager".to_string()); - assert_eq!(found, "contract_xyz".to_string()); - } - other => panic!("unexpected error: {other:?}"), - } -} - -#[test] -fn wrong_contract_version() { - let mut deps = mock_dependencies(&[]); - cw2::set_contract_version(deps.as_mut().storage, "crates.io:mars-credit-manager", "4.1.0") - .unwrap(); - - let err = migrate(deps.as_mut(), mock_env(), Empty {}).unwrap_err(); - - match err { - ContractError::Version(VersionError::WrongVersion { - found, - .. - }) => { - assert_eq!(found, "4.1.0".to_string()); - } - other => panic!("unexpected error: {other:?}"), - } -} - -#[test] -fn successful_migration_from_2_1_0() { - let mut deps = mock_dependencies(&[]); - cw2::set_contract_version(deps.as_mut().storage, "crates.io:mars-credit-manager", "2.1.0") - .unwrap(); - - let res = migrate(deps.as_mut(), mock_env(), Empty {}).unwrap(); - - assert_eq!(res.messages, vec![]); - assert_eq!(res.events, vec![] as Vec); - assert!(res.data.is_none()); - assert_eq!( - res.attributes, - vec![attr("action", "migrate"), attr("from_version", "2.1.0"), attr("to_version", "2.2.0")] - ); - - let new_contract_version = ContractVersion { - contract: "crates.io:mars-credit-manager".to_string(), - version: "2.2.0".to_string(), - }; - assert_eq!(cw2::get_contract_version(deps.as_ref().storage).unwrap(), new_contract_version); - - // Ensure swap fee exists post-migration (zero by default if absent) - let swap_fee = SWAP_FEE.may_load(deps.as_ref().storage).unwrap().unwrap_or_else(Decimal::zero); - assert!(swap_fee <= Decimal::one()); -} diff --git a/contracts/credit-manager/tests/tests/test_migration_v2_2_1.rs b/contracts/credit-manager/tests/tests/test_migration_v2_2_1.rs new file mode 100644 index 00000000..7b8284a3 --- /dev/null +++ b/contracts/credit-manager/tests/tests/test_migration_v2_2_1.rs @@ -0,0 +1,119 @@ +use cosmwasm_std::{attr, testing::mock_env, Decimal, Event}; +use cw2::{ContractVersion, VersionError}; +use mars_credit_manager::{contract::migrate, error::ContractError, state::SWAP_FEE}; +use mars_testing::mock_dependencies; +use mars_types::credit_manager::MigrateMsg; + +const CONTRACT_NAME: &str = "crates.io:mars-credit-manager"; + +#[test] +fn v2_1_0_to_v2_2_0_wrong_contract_name() { + let mut deps = mock_dependencies(&[]); + cw2::set_contract_version(deps.as_mut().storage, "contract_xyz", "2.1.0").unwrap(); + + let err = migrate(deps.as_mut(), mock_env(), MigrateMsg::V2_1_0ToV2_2_0 {}).unwrap_err(); + + assert_eq!( + err, + ContractError::Version(VersionError::WrongContract { + expected: CONTRACT_NAME.to_string(), + found: "contract_xyz".to_string() + }) + ); +} + +#[test] +fn v2_1_0_to_v2_2_0_wrong_contract_version() { + let mut deps = mock_dependencies(&[]); + cw2::set_contract_version(deps.as_mut().storage, CONTRACT_NAME, "2.0.3").unwrap(); + + let err = migrate(deps.as_mut(), mock_env(), MigrateMsg::V2_1_0ToV2_2_0 {}).unwrap_err(); + + assert_eq!( + err, + ContractError::Version(VersionError::WrongVersion { + expected: "2.1.0".to_string(), + found: "2.0.3".to_string() + }) + ); +} + +#[test] +fn v2_1_0_to_v2_2_0_successful_migration() { + let mut deps = mock_dependencies(&[]); + cw2::set_contract_version(deps.as_mut().storage, CONTRACT_NAME, "2.1.0").unwrap(); + + let res = migrate(deps.as_mut(), mock_env(), MigrateMsg::V2_1_0ToV2_2_0 {}).unwrap(); + + assert_eq!(res.messages, vec![]); + assert_eq!(res.events, vec![] as Vec); + assert!(res.data.is_none()); + assert_eq!( + res.attributes, + vec![attr("action", "migrate"), attr("from_version", "2.1.0"), attr("to_version", "2.2.0")] + ); + + let new_contract_version = ContractVersion { + contract: CONTRACT_NAME.to_string(), + version: "2.2.0".to_string(), + }; + assert_eq!(cw2::get_contract_version(deps.as_ref().storage).unwrap(), new_contract_version); + + // Ensure swap fee exists post-migration (zero by default if absent) + let swap_fee = SWAP_FEE.may_load(deps.as_ref().storage).unwrap().unwrap_or_else(Decimal::zero); + assert!(swap_fee <= Decimal::one()); +} + +#[test] +fn v2_2_0_to_v2_2_1_wrong_contract_name() { + let mut deps = mock_dependencies(&[]); + cw2::set_contract_version(deps.as_mut().storage, "contract_xyz", "2.2.0").unwrap(); + + let err = migrate(deps.as_mut(), mock_env(), MigrateMsg::V2_2_0ToV2_2_1 {}).unwrap_err(); + + assert_eq!( + err, + ContractError::Version(VersionError::WrongContract { + expected: CONTRACT_NAME.to_string(), + found: "contract_xyz".to_string() + }) + ); +} + +#[test] +fn v2_2_0_to_v2_2_1_wrong_contract_version() { + let mut deps = mock_dependencies(&[]); + cw2::set_contract_version(deps.as_mut().storage, CONTRACT_NAME, "2.1.0").unwrap(); + + let err = migrate(deps.as_mut(), mock_env(), MigrateMsg::V2_2_0ToV2_2_1 {}).unwrap_err(); + + assert_eq!( + err, + ContractError::Version(VersionError::WrongVersion { + expected: "2.2.0".to_string(), + found: "2.1.0".to_string() + }) + ); +} + +#[test] +fn v2_2_0_to_v2_2_1_successful_migration() { + let mut deps = mock_dependencies(&[]); + cw2::set_contract_version(deps.as_mut().storage, CONTRACT_NAME, "2.2.0").unwrap(); + + let res = migrate(deps.as_mut(), mock_env(), MigrateMsg::V2_2_0ToV2_2_1 {}).unwrap(); + + assert_eq!(res.messages, vec![]); + assert_eq!(res.events, vec![] as Vec); + assert!(res.data.is_none()); + assert_eq!( + res.attributes, + vec![attr("action", "migrate"), attr("from_version", "2.2.0"), attr("to_version", "2.2.1")] + ); + + let new_contract_version = ContractVersion { + contract: CONTRACT_NAME.to_string(), + version: "2.2.1".to_string(), + }; + assert_eq!(cw2::get_contract_version(deps.as_ref().storage).unwrap(), new_contract_version); +} diff --git a/contracts/red-bank/Cargo.toml b/contracts/red-bank/Cargo.toml index a7081144..5923a206 100644 --- a/contracts/red-bank/Cargo.toml +++ b/contracts/red-bank/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "mars-red-bank" description = "A smart contract that manages asset deposit, borrowing, and liquidations" -version = { workspace = true } +version = "2.1.1" authors = { workspace = true } edition = { workspace = true } license = { workspace = true } diff --git a/contracts/red-bank/src/contract.rs b/contracts/red-bank/src/contract.rs index d8e52a56..d9ff7b44 100644 --- a/contracts/red-bank/src/contract.rs +++ b/contracts/red-bank/src/contract.rs @@ -1,7 +1,7 @@ use cosmwasm_std::{ - entry_point, to_json_binary, Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, + entry_point, to_json_binary, Binary, Deps, DepsMut, Env, MessageInfo, Response, }; -use mars_types::red_bank::{ExecuteMsg, InstantiateMsg, QueryMsg}; +use mars_types::red_bank::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; use crate::{ asset, borrow, collateral, config, deposit, error::ContractError, instantiate, liquidate, @@ -244,6 +244,9 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result Result { - migrations::v2_1_0::migrate(deps) +pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result { + match msg { + MigrateMsg::V2_0_1ToV2_1_0 {} => migrations::v2_1_0::migrate(deps), + MigrateMsg::V2_1_0ToV2_1_1 {} => migrations::v2_1_1::migrate(deps), + } } diff --git a/contracts/red-bank/src/interest_rates.rs b/contracts/red-bank/src/interest_rates.rs index 1a0b39b3..a63a7e6d 100644 --- a/contracts/red-bank/src/interest_rates.rs +++ b/contracts/red-bank/src/interest_rates.rs @@ -1,6 +1,6 @@ use std::str; -use cosmwasm_std::{Addr, Decimal, Env, Event, Response, Storage, Uint128}; +use cosmwasm_std::{Addr, Coin, Decimal, Env, Event, Response, Storage, Uint128}; use mars_interest_rate::{ calculate_applied_linear_interest_rate, compute_scaled_amount, compute_underlying_amount, get_underlying_debt_amount, get_underlying_liquidity_amount, ScalingOperation, @@ -90,6 +90,11 @@ pub fn apply_accumulated_interests( None, )?; market.increase_collateral(reward_amount_scaled)?; + + let rewards_fee_coin = Coin::new(accrued_protocol_rewards.u128(), market.denom.clone()); + response = response + .add_attribute("rewards_collector", rewards_collector_addr.to_string()) + .add_attribute("rewards_collector_fee", rewards_fee_coin.to_string()); } Ok(response) diff --git a/contracts/red-bank/src/migrations/mod.rs b/contracts/red-bank/src/migrations/mod.rs index 78e0d72f..dfd90f0b 100644 --- a/contracts/red-bank/src/migrations/mod.rs +++ b/contracts/red-bank/src/migrations/mod.rs @@ -1 +1,2 @@ pub mod v2_1_0; +pub mod v2_1_1; diff --git a/contracts/red-bank/src/migrations/v2_1_0.rs b/contracts/red-bank/src/migrations/v2_1_0.rs index cd7a7761..c2a3df9f 100644 --- a/contracts/red-bank/src/migrations/v2_1_0.rs +++ b/contracts/red-bank/src/migrations/v2_1_0.rs @@ -1,12 +1,10 @@ use cosmwasm_std::{DepsMut, Response}; use cw2::{assert_contract_version, set_contract_version}; -use crate::{ - contract::{CONTRACT_NAME, CONTRACT_VERSION}, - error::ContractError, -}; +use crate::{contract::CONTRACT_NAME, error::ContractError}; const FROM_VERSION: &str = "2.0.1"; +const TO_VERSION: &str = "2.1.0"; pub mod v1_state { use cosmwasm_std::{Addr, DepsMut, Uint128}; @@ -27,10 +25,10 @@ pub fn migrate(mut deps: DepsMut) -> Result { // Clear old state v1_state::clear_state(&mut deps); - set_contract_version(deps.storage, format!("crates.io:{CONTRACT_NAME}"), CONTRACT_VERSION)?; + set_contract_version(deps.storage, format!("crates.io:{CONTRACT_NAME}"), TO_VERSION)?; Ok(Response::new() .add_attribute("action", "migrate") .add_attribute("from_version", FROM_VERSION) - .add_attribute("to_version", CONTRACT_VERSION)) + .add_attribute("to_version", TO_VERSION)) } diff --git a/contracts/red-bank/src/migrations/v2_1_1.rs b/contracts/red-bank/src/migrations/v2_1_1.rs new file mode 100644 index 00000000..34733f84 --- /dev/null +++ b/contracts/red-bank/src/migrations/v2_1_1.rs @@ -0,0 +1,19 @@ +use cosmwasm_std::{DepsMut, Response}; +use cw2::{assert_contract_version, set_contract_version}; + +use crate::{contract::CONTRACT_NAME, error::ContractError}; + +const FROM_VERSION: &str = "2.1.0"; +const TO_VERSION: &str = "2.1.1"; + +pub fn migrate(deps: DepsMut) -> Result { + // make sure we're migrating the correct contract and from the correct version + assert_contract_version(deps.storage, &format!("crates.io:{CONTRACT_NAME}"), FROM_VERSION)?; + + set_contract_version(deps.storage, format!("crates.io:{CONTRACT_NAME}"), TO_VERSION)?; + + Ok(Response::new() + .add_attribute("action", "migrate") + .add_attribute("from_version", FROM_VERSION) + .add_attribute("to_version", TO_VERSION)) +} diff --git a/contracts/red-bank/tests/tests/test_liquidate.rs b/contracts/red-bank/tests/tests/test_liquidate.rs index 9bc1c1f0..4bc012f1 100644 --- a/contracts/red-bank/tests/tests/test_liquidate.rs +++ b/contracts/red-bank/tests/tests/test_liquidate.rs @@ -1044,6 +1044,12 @@ fn response_verification() { mars_testing::assert_eq_vec( res.attributes, vec![ + attr("rewards_collector", MarsAddressType::RewardsCollector.to_string()), + attr( + "rewards_collector_fee", + coin(expected_debt_rates.protocol_rewards_to_distribute.u128(), "uusdc") + .to_string(), + ), attr("action", "liquidate"), attr("user", liquidatee.as_str()), attr("liquidator", liquidator.as_str()), diff --git a/contracts/red-bank/tests/tests/test_migration_v2.rs b/contracts/red-bank/tests/tests/test_migration_v2.rs index 0dcfa22b..66bef9d7 100644 --- a/contracts/red-bank/tests/tests/test_migration_v2.rs +++ b/contracts/red-bank/tests/tests/test_migration_v2.rs @@ -1,30 +1,33 @@ -use cosmwasm_std::{attr, testing::mock_env, Empty, Event}; +use cosmwasm_std::{attr, testing::mock_env, Event}; use cw2::{ContractVersion, VersionError}; use mars_red_bank::{contract::migrate, error::ContractError}; use mars_testing::mock_dependencies; +use mars_types::red_bank::MigrateMsg; + +const CONTRACT_NAME: &str = "crates.io:mars-red-bank"; #[test] -fn wrong_contract_name() { +fn v2_0_1_to_v2_1_0_wrong_contract_name() { let mut deps = mock_dependencies(&[]); cw2::set_contract_version(deps.as_mut().storage, "contract_xyz", "2.0.1").unwrap(); - let err = migrate(deps.as_mut(), mock_env(), Empty {}).unwrap_err(); + let err = migrate(deps.as_mut(), mock_env(), MigrateMsg::V2_0_1ToV2_1_0 {}).unwrap_err(); assert_eq!( err, ContractError::Version(VersionError::WrongContract { - expected: "crates.io:mars-red-bank".to_string(), + expected: CONTRACT_NAME.to_string(), found: "contract_xyz".to_string() }) ); } #[test] -fn wrong_contract_version() { +fn v2_0_1_to_v2_1_0_wrong_contract_version() { let mut deps = mock_dependencies(&[]); - cw2::set_contract_version(deps.as_mut().storage, "crates.io:mars-red-bank", "4.1.0").unwrap(); + cw2::set_contract_version(deps.as_mut().storage, CONTRACT_NAME, "4.1.0").unwrap(); - let err = migrate(deps.as_mut(), mock_env(), Empty {}).unwrap_err(); + let err = migrate(deps.as_mut(), mock_env(), MigrateMsg::V2_0_1ToV2_1_0 {}).unwrap_err(); assert_eq!( err, @@ -36,11 +39,11 @@ fn wrong_contract_version() { } #[test] -fn successful_migration() { +fn v2_0_1_to_v2_1_0_successful_migration() { let mut deps = mock_dependencies(&[]); - cw2::set_contract_version(deps.as_mut().storage, "crates.io:mars-red-bank", "2.0.1").unwrap(); + cw2::set_contract_version(deps.as_mut().storage, CONTRACT_NAME, "2.0.1").unwrap(); - let res = migrate(deps.as_mut(), mock_env(), Empty {}).unwrap(); + let res = migrate(deps.as_mut(), mock_env(), MigrateMsg::V2_0_1ToV2_1_0 {}).unwrap(); assert_eq!(res.messages, vec![]); assert_eq!(res.events, vec![] as Vec); @@ -51,8 +54,62 @@ fn successful_migration() { ); let new_contract_version = ContractVersion { - contract: "crates.io:mars-red-bank".to_string(), + contract: CONTRACT_NAME.to_string(), version: "2.1.0".to_string(), }; assert_eq!(cw2::get_contract_version(deps.as_ref().storage).unwrap(), new_contract_version); } + +#[test] +fn v2_1_0_to_v2_1_1_wrong_contract_name() { + let mut deps = mock_dependencies(&[]); + cw2::set_contract_version(deps.as_mut().storage, "contract_xyz", "2.1.0").unwrap(); + + let err = migrate(deps.as_mut(), mock_env(), MigrateMsg::V2_1_0ToV2_1_1 {}).unwrap_err(); + + assert_eq!( + err, + ContractError::Version(VersionError::WrongContract { + expected: CONTRACT_NAME.to_string(), + found: "contract_xyz".to_string() + }) + ); +} + +#[test] +fn v2_1_0_to_v2_1_1_wrong_contract_version() { + let mut deps = mock_dependencies(&[]); + cw2::set_contract_version(deps.as_mut().storage, CONTRACT_NAME, "2.0.1").unwrap(); + + let err = migrate(deps.as_mut(), mock_env(), MigrateMsg::V2_1_0ToV2_1_1 {}).unwrap_err(); + + assert_eq!( + err, + ContractError::Version(VersionError::WrongVersion { + expected: "2.1.0".to_string(), + found: "2.0.1".to_string() + }) + ); +} + +#[test] +fn v2_1_0_to_v2_1_1_successful_migration() { + let mut deps = mock_dependencies(&[]); + cw2::set_contract_version(deps.as_mut().storage, CONTRACT_NAME, "2.1.0").unwrap(); + + let res = migrate(deps.as_mut(), mock_env(), MigrateMsg::V2_1_0ToV2_1_1 {}).unwrap(); + + assert_eq!(res.messages, vec![]); + assert_eq!(res.events, vec![] as Vec); + assert!(res.data.is_none()); + assert_eq!( + res.attributes, + vec![attr("action", "migrate"), attr("from_version", "2.1.0"), attr("to_version", "2.1.1")] + ); + + let new_contract_version = ContractVersion { + contract: CONTRACT_NAME.to_string(), + version: "2.1.1".to_string(), + }; + assert_eq!(cw2::get_contract_version(deps.as_ref().storage).unwrap(), new_contract_version); +} diff --git a/contracts/red-bank/tests/tests/test_withdraw.rs b/contracts/red-bank/tests/tests/test_withdraw.rs index 5d3623bc..51bfda94 100644 --- a/contracts/red-bank/tests/tests/test_withdraw.rs +++ b/contracts/red-bank/tests/tests/test_withdraw.rs @@ -222,6 +222,11 @@ fn withdrawing_partially() { assert_eq!( res.attributes, vec![ + attr("rewards_collector", MarsAddressType::RewardsCollector.to_string()), + attr( + "rewards_collector_fee", + coin(expected_params.protocol_rewards_to_distribute.u128(), denom).to_string() + ), attr("action", "withdraw"), attr("sender", &withdrawer_addr), attr("recipient", &withdrawer_addr), @@ -346,6 +351,11 @@ fn withdrawing_completely() { assert_eq!( res.attributes, vec![ + attr("rewards_collector", MarsAddressType::RewardsCollector.to_string()), + attr( + "rewards_collector_fee", + coin(expected_params.protocol_rewards_to_distribute.u128(), denom).to_string() + ), attr("action", "withdraw"), attr("sender", &withdrawer_addr), attr("recipient", &withdrawer_addr), @@ -458,6 +468,11 @@ fn withdrawing_to_another_user() { assert_eq!( res.attributes, vec![ + attr("rewards_collector", MarsAddressType::RewardsCollector.to_string()), + attr( + "rewards_collector_fee", + coin(expected_params.protocol_rewards_to_distribute.u128(), denom).to_string() + ), attr("action", "withdraw"), attr("sender", &withdrawer_addr), attr("recipient", &recipient_addr), diff --git a/packages/types/src/credit_manager/migrate.rs b/packages/types/src/credit_manager/migrate.rs index 67074229..3af94a16 100644 --- a/packages/types/src/credit_manager/migrate.rs +++ b/packages/types/src/credit_manager/migrate.rs @@ -1,22 +1,8 @@ use cosmwasm_schema::cw_serde; -use cosmwasm_std::Decimal; - -use crate::adapters::{ - health::HealthContractUnchecked, incentives::IncentivesUnchecked, params::ParamsUnchecked, - swapper::SwapperUnchecked, -}; - -#[cw_serde] -pub struct V2Updates { - pub health_contract: HealthContractUnchecked, - pub params: ParamsUnchecked, - pub incentives: IncentivesUnchecked, - pub swapper: SwapperUnchecked, - pub max_slippage: Decimal, -} #[cw_serde] pub enum MigrateMsg { - V1_0_0ToV2_0_0(V2Updates), - V2_0_2ToV2_0_3 {}, + V2_0_3ToV2_1_0 {}, + V2_1_0ToV2_2_0 {}, + V2_2_0ToV2_2_1 {}, } diff --git a/packages/types/src/red_bank/msg.rs b/packages/types/src/red_bank/msg.rs index fb219edb..3c631228 100644 --- a/packages/types/src/red_bank/msg.rs +++ b/packages/types/src/red_bank/msg.rs @@ -251,3 +251,9 @@ pub enum QueryMsg { amount_scaled: Uint128, }, } + +#[cw_serde] +pub enum MigrateMsg { + V2_0_1ToV2_1_0 {}, + V2_1_0ToV2_1_1 {}, +} diff --git a/schemas/mars-credit-manager/mars-credit-manager.json b/schemas/mars-credit-manager/mars-credit-manager.json index daba3146..3dcbccc7 100644 --- a/schemas/mars-credit-manager/mars-credit-manager.json +++ b/schemas/mars-credit-manager/mars-credit-manager.json @@ -1,6 +1,6 @@ { "contract_name": "mars-credit-manager", - "contract_version": "2.2.0", + "contract_version": "2.2.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/schemas/mars-red-bank/mars-red-bank.json b/schemas/mars-red-bank/mars-red-bank.json index 10a605c4..d00a457c 100644 --- a/schemas/mars-red-bank/mars-red-bank.json +++ b/schemas/mars-red-bank/mars-red-bank.json @@ -1,6 +1,6 @@ { "contract_name": "mars-red-bank", - "contract_version": "2.1.0", + "contract_version": "2.1.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#",