mars-params 1.0.7

Contract storing the asset params for Credit Manager and Red Bank.
Documentation
use std::str::FromStr;

use cosmwasm_std::{Decimal, StdError::GenericErr};
use mars_params::{
    error::ContractError::{Std, Validation},
    msg::VaultConfigUpdate,
    types::hls::HlsParamsUnchecked,
};
use mars_utils::error::ValidationError::InvalidParam;

use crate::helpers::{assert_err, default_vault_config, MockEnv};

pub mod helpers;

#[test]
fn vault_addr_must_be_valid() {
    let mut mock = MockEnv::new().build().unwrap();

    let res = mock.update_vault_config(
        &mock.query_owner(),
        VaultConfigUpdate::AddOrUpdate {
            config: default_vault_config("%"),
        },
    );
    assert_err(
        res,
        Std(GenericErr { msg: "Invalid input: human address too short for this mock implementation (must be >= 3).".to_string() }),
    );
}

#[test]
fn vault_max_ltv_less_than_or_equal_to_one() {
    let mut mock = MockEnv::new().build().unwrap();
    let mut config = default_vault_config("vault_xyz");
    config.max_loan_to_value = Decimal::from_str("1.1235").unwrap();

    let res = mock.update_vault_config(
        &mock.query_owner(),
        VaultConfigUpdate::AddOrUpdate {
            config,
        },
    );
    assert_err(
        res,
        Validation(InvalidParam {
            param_name: "max_loan_to_value".to_string(),
            invalid_value: "1.1235".to_string(),
            predicate: "<= 1".to_string(),
        }),
    );
}

#[test]
fn vault_liquidation_threshold_less_than_or_equal_to_one() {
    let mut mock = MockEnv::new().build().unwrap();
    let mut config = default_vault_config("vault_xyz");
    config.liquidation_threshold = Decimal::from_str("1.1235").unwrap();

    let res = mock.update_vault_config(
        &mock.query_owner(),
        VaultConfigUpdate::AddOrUpdate {
            config,
        },
    );
    assert_err(
        res,
        Validation(InvalidParam {
            param_name: "liquidation_threshold".to_string(),
            invalid_value: "1.1235".to_string(),
            predicate: "<= 1".to_string(),
        }),
    );
}

#[test]
fn vault_liq_threshold_gt_max_ltv() {
    let mut mock = MockEnv::new().build().unwrap();
    let mut config = default_vault_config("vault_xyz");
    config.liquidation_threshold = Decimal::from_str("0.5").unwrap();
    config.max_loan_to_value = Decimal::from_str("0.6").unwrap();

    let res = mock.update_vault_config(
        &mock.query_owner(),
        VaultConfigUpdate::AddOrUpdate {
            config,
        },
    );
    assert_err(
        res,
        Validation(InvalidParam {
            param_name: "liquidation_threshold".to_string(),
            invalid_value: "0.5".to_string(),
            predicate: "> 0.6 (max LTV)".to_string(),
        }),
    );
}

#[test]
fn vault_hls_max_ltv_less_than_or_equal_to_one() {
    let mut mock = MockEnv::new().build().unwrap();
    let mut config = default_vault_config("vault_xyz");
    config.hls = Some(HlsParamsUnchecked {
        max_loan_to_value: Decimal::from_str("1.1235").unwrap(),
        liquidation_threshold: Decimal::from_str("2.1235").unwrap(),
        correlations: vec![],
    });

    let res = mock.update_vault_config(
        &mock.query_owner(),
        VaultConfigUpdate::AddOrUpdate {
            config,
        },
    );
    assert_err(
        res,
        Validation(InvalidParam {
            param_name: "hls_max_loan_to_value".to_string(),
            invalid_value: "1.1235".to_string(),
            predicate: "<= 1".to_string(),
        }),
    );
}

#[test]
fn vault_hls_liquidation_threshold_less_than_or_equal_to_one() {
    let mut mock = MockEnv::new().build().unwrap();
    let mut config = default_vault_config("vault_xyz");
    config.hls = Some(HlsParamsUnchecked {
        max_loan_to_value: Decimal::from_str("0.8").unwrap(),
        liquidation_threshold: Decimal::from_str("1.1235").unwrap(),
        correlations: vec![],
    });

    let res = mock.update_vault_config(
        &mock.query_owner(),
        VaultConfigUpdate::AddOrUpdate {
            config,
        },
    );
    assert_err(
        res,
        Validation(InvalidParam {
            param_name: "hls_liquidation_threshold".to_string(),
            invalid_value: "1.1235".to_string(),
            predicate: "<= 1".to_string(),
        }),
    );
}

#[test]
fn vault_hls_liq_threshold_gt_max_ltv() {
    let mut mock = MockEnv::new().build().unwrap();
    let mut config = default_vault_config("vault_xyz");
    config.hls = Some(HlsParamsUnchecked {
        max_loan_to_value: Decimal::from_str("0.6").unwrap(),
        liquidation_threshold: Decimal::from_str("0.5").unwrap(),
        correlations: vec![],
    });

    let res = mock.update_vault_config(
        &mock.query_owner(),
        VaultConfigUpdate::AddOrUpdate {
            config,
        },
    );
    assert_err(
        res,
        Validation(InvalidParam {
            param_name: "hls_liquidation_threshold".to_string(),
            invalid_value: "0.5".to_string(),
            predicate: "> 0.6 (hls max LTV)".to_string(),
        }),
    );
}