mars-params 1.0.7

Contract storing the asset params for Credit Manager and Red Bank.
Documentation
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());
}