use cosmwasm_std::Addr;
use mars_owner::OwnerError;
use mars_params::{
error::ContractError::Owner,
msg::{
AssetParamsUpdate, CmEmergencyUpdate, EmergencyUpdate, RedBankEmergencyUpdate,
VaultConfigUpdate,
},
};
use crate::helpers::{assert_err, default_asset_params, default_vault_config, MockEnv};
pub mod helpers;
#[test]
fn only_owner_can_invoke_emergency_powers() {
let mut mock = MockEnv::new().build().unwrap();
let bad_guy = Addr::unchecked("doctor_otto_983");
let res = mock.emergency_update(
&bad_guy,
EmergencyUpdate::RedBank(RedBankEmergencyUpdate::DisableBorrowing("xyz".to_string())),
);
assert_err(res, Owner(OwnerError::NotEmergencyOwner {}));
let res = mock.emergency_update(
&bad_guy,
EmergencyUpdate::CreditManager(CmEmergencyUpdate::DisallowCoin("xyz".to_string())),
);
assert_err(res, Owner(OwnerError::NotEmergencyOwner {}));
let res = mock.emergency_update(
&bad_guy,
EmergencyUpdate::CreditManager(CmEmergencyUpdate::SetZeroDepositCapOnVault(
"xyz".to_string(),
)),
);
assert_err(res, Owner(OwnerError::NotEmergencyOwner {}));
let res = mock.emergency_update(
&bad_guy,
EmergencyUpdate::CreditManager(CmEmergencyUpdate::SetZeroMaxLtvOnVault("xyz".to_string())),
);
assert_err(res, Owner(OwnerError::NotEmergencyOwner {}));
}
#[test]
fn disabling_borrowing() {
let emergency_owner = Addr::unchecked("miles_morales");
let mut mock = MockEnv::new().emergency_owner(emergency_owner.as_str()).build().unwrap();
let denom = "atom".to_string();
let mut params = default_asset_params(&denom);
params.red_bank.borrow_enabled = true;
mock.update_asset_params(
&mock.query_owner(),
AssetParamsUpdate::AddOrUpdate {
params,
},
)
.unwrap();
let params = mock.query_asset_params(&denom);
assert!(params.red_bank.borrow_enabled);
mock.emergency_update(
&emergency_owner,
EmergencyUpdate::RedBank(RedBankEmergencyUpdate::DisableBorrowing(denom.clone())),
)
.unwrap();
let params = mock.query_asset_params(&denom);
assert!(!params.red_bank.borrow_enabled);
}
#[test]
fn disallow_coin() {
let emergency_owner = Addr::unchecked("miles_morales");
let mut mock = MockEnv::new().emergency_owner(emergency_owner.as_str()).build().unwrap();
let denom = "atom".to_string();
let mut params = default_asset_params(&denom);
params.credit_manager.whitelisted = true;
mock.update_asset_params(
&mock.query_owner(),
AssetParamsUpdate::AddOrUpdate {
params,
},
)
.unwrap();
let params = mock.query_asset_params(&denom);
assert!(params.credit_manager.whitelisted);
mock.emergency_update(
&emergency_owner,
EmergencyUpdate::CreditManager(CmEmergencyUpdate::DisallowCoin(denom.clone())),
)
.unwrap();
let params = mock.query_asset_params(&denom);
assert!(!params.credit_manager.whitelisted);
}
#[test]
fn set_zero_max_ltv() {
let emergency_owner = Addr::unchecked("miles_morales");
let mut mock = MockEnv::new().emergency_owner(emergency_owner.as_str()).build().unwrap();
let vault = "vault_addr_123".to_string();
mock.update_vault_config(
&mock.query_owner(),
VaultConfigUpdate::AddOrUpdate {
config: default_vault_config(&vault),
},
)
.unwrap();
let params = mock.query_vault_config(&vault);
assert!(!params.max_loan_to_value.is_zero());
mock.emergency_update(
&emergency_owner,
EmergencyUpdate::CreditManager(CmEmergencyUpdate::SetZeroMaxLtvOnVault(vault.clone())),
)
.unwrap();
let params = mock.query_vault_config(&vault);
assert!(params.max_loan_to_value.is_zero());
}
#[test]
fn set_zero_deposit_cap() {
let emergency_owner = Addr::unchecked("miles_morales");
let mut mock = MockEnv::new().emergency_owner(emergency_owner.as_str()).build().unwrap();
let vault = "vault_addr_123".to_string();
mock.update_vault_config(
&mock.query_owner(),
VaultConfigUpdate::AddOrUpdate {
config: default_vault_config(&vault),
},
)
.unwrap();
let params = mock.query_vault_config(&vault);
assert!(!params.deposit_cap.amount.is_zero());
mock.emergency_update(
&emergency_owner,
EmergencyUpdate::CreditManager(CmEmergencyUpdate::SetZeroDepositCapOnVault(vault.clone())),
)
.unwrap();
let params = mock.query_vault_config(&vault);
assert!(params.deposit_cap.amount.is_zero());
}