mango-v4/programs/mango-v4/tests/cases/test_health_check.rs

177 lines
4.0 KiB
Rust

use crate::cases::{
create_funded_account, mango_setup, send_tx, tokio, HealthAccountSkipping,
HealthCheckInstruction, TestContext, TestKeypair, TokenWithdrawInstruction,
};
use crate::send_tx_expect_error;
use mango_v4::accounts_ix::{HealthCheck, HealthCheckKind};
use mango_v4::error::MangoError;
use solana_sdk::transport::TransportError;
#[tokio::test]
async fn test_health_check() -> Result<(), TransportError> {
let context = TestContext::new().await;
let solana = &context.solana.clone();
let admin = TestKeypair::new();
let owner = context.users[0].key;
let payer = context.users[1].key;
let payer_token_accounts = &context.users[1].token_accounts;
let mints = &context.mints[0..3];
let mango_setup::GroupWithTokens { group, tokens, .. } = mango_setup::GroupWithTokensConfig {
admin,
payer,
mints: mints.to_vec(),
zero_token_is_quote: true,
..mango_setup::GroupWithTokensConfig::default()
}
.create(solana)
.await;
// Funding to fill the vaults
create_funded_account(
&solana,
group,
owner,
0,
&context.users[1],
&mints,
1_000_000,
0,
)
.await;
let account = create_funded_account(
&solana,
group,
owner,
1,
&context.users[1],
&mints[0..2],
1000,
0,
)
.await;
send_tx(
solana,
TokenWithdrawInstruction {
amount: 775,
allow_borrow: true,
account,
owner,
token_account: payer_token_accounts[2],
bank_index: 0,
},
)
.await
.unwrap();
//
// TEST (Health is about 93% with all banks, 7% without banks 1)
//
send_tx(
solana,
HealthCheckInstruction {
account,
owner,
min_health_value: 20.0,
check_kind: HealthCheckKind::MaintRatio,
},
)
.await
.unwrap();
send_tx(
solana,
HealthCheckInstruction {
account,
owner,
min_health_value: 500.0,
check_kind: HealthCheckKind::Init,
},
)
.await
.unwrap();
send_tx_expect_error!(
solana,
HealthCheckInstruction {
owner,
account,
min_health_value: 600.0,
check_kind: HealthCheckKind::Init,
},
MangoError::InvalidHealth
);
send_tx(
solana,
HealthCheckInstruction {
account,
owner,
min_health_value: 800.0,
check_kind: HealthCheckKind::Maint,
},
)
.await
.unwrap();
send_tx_expect_error!(
solana,
HealthCheckInstruction {
owner,
account,
min_health_value: 100.0,
check_kind: HealthCheckKind::MaintRatio,
},
MangoError::InvalidHealth
);
send_tx(
solana,
HealthAccountSkipping {
inner: HealthCheckInstruction {
owner,
account,
min_health_value: 5.0,
check_kind: HealthCheckKind::MaintRatio,
},
skip_banks: vec![tokens[1].bank],
},
)
.await
.unwrap();
send_tx_expect_error!(
solana,
HealthAccountSkipping {
inner: HealthCheckInstruction {
owner,
account,
min_health_value: 10.0,
check_kind: HealthCheckKind::MaintRatio,
},
skip_banks: vec![tokens[1].bank],
},
MangoError::InvalidHealth
);
send_tx_expect_error!(
solana,
HealthAccountSkipping {
inner: HealthCheckInstruction {
owner,
account,
min_health_value: 10.0,
check_kind: HealthCheckKind::MaintRatio,
},
skip_banks: vec![tokens[2].bank],
},
MangoError::InvalidBank
);
Ok(())
}