mango-v4/programs/mango-v4/tests/test_health_compute.rs

283 lines
7.5 KiB
Rust
Raw Normal View History

2022-03-17 06:17:28 -07:00
#![cfg(feature = "test-bpf")]
2022-05-25 10:29:53 -07:00
use fixed::types::I80F48;
use mango_v4::state::*;
2022-03-17 06:17:28 -07:00
use solana_program_test::*;
use solana_sdk::transport::TransportError;
2022-03-17 06:17:28 -07:00
use program_test::*;
2022-08-26 06:59:47 -07:00
use mango_setup::*;
2022-03-17 06:17:28 -07:00
mod program_test;
// Try to reach compute limits in health checks by having many different tokens in an account
#[tokio::test]
async fn test_health_compute_tokens() -> Result<(), TransportError> {
let context = TestContext::new().await;
2022-03-17 06:17:28 -07:00
let solana = &context.solana.clone();
let admin = TestKeypair::new();
let owner = context.users[0].key;
let payer = context.users[1].key;
2022-03-17 06:17:28 -07:00
let mints = &context.mints[0..10];
//
// SETUP: Create a group and an account
//
2022-08-26 06:59:47 -07:00
let GroupWithTokens { group, .. } = GroupWithTokensConfig {
2022-03-20 23:49:51 -07:00
admin,
payer,
2022-09-12 06:25:50 -07:00
mints: mints.to_vec(),
..GroupWithTokensConfig::default()
2022-03-20 23:49:51 -07:00
}
.create(solana)
.await;
2022-03-17 06:17:28 -07:00
2022-08-26 06:59:47 -07:00
// each deposit ends with a health check
create_funded_account(&solana, group, owner, 0, &context.users[1], mints, 1000, 0).await;
2022-03-17 06:17:28 -07:00
// TODO: actual explicit CU comparisons.
// On 2022-5-25 the final deposit costs 36905 CU and each new token increases it by roughly 1600 CU
2022-03-17 06:17:28 -07:00
Ok(())
}
// Try to reach compute limits in health checks by having many serum markets in an account
#[tokio::test]
async fn test_health_compute_serum() -> Result<(), TransportError> {
let context = TestContext::new().await;
2022-03-17 06:17:28 -07:00
let solana = &context.solana.clone();
let admin = TestKeypair::new();
let owner = context.users[0].key;
let payer = context.users[1].key;
2022-03-17 06:17:28 -07:00
let mints = &context.mints[0..8];
let payer_mint_accounts = &context.users[1].token_accounts[0..mints.len()];
//
// SETUP: Create a group and an account
//
2022-07-04 04:13:11 -07:00
let mango_setup::GroupWithTokens { group, tokens, .. } = mango_setup::GroupWithTokensConfig {
2022-03-20 23:49:51 -07:00
admin,
payer,
2022-09-12 06:25:50 -07:00
mints: mints.to_vec(),
..GroupWithTokensConfig::default()
2022-03-20 23:49:51 -07:00
}
.create(solana)
.await;
2022-03-17 06:17:28 -07:00
let account = send_tx(
solana,
AccountCreateInstruction {
2022-03-17 06:17:28 -07:00
account_num: 0,
token_count: 16,
serum3_count: 8,
perp_count: 8,
perp_oo_count: 8,
2022-03-17 06:17:28 -07:00
group,
owner,
payer,
},
)
.await
.unwrap()
.account;
//
// SETUP: Create serum markets and register them
//
let quote_token = &tokens[0];
2022-03-17 06:17:28 -07:00
let mut serum_market_cookies = vec![];
for token in tokens[1..].iter() {
serum_market_cookies.push((
token,
context
.serum
.list_spot_market(&token.mint, &quote_token.mint)
.await,
));
2022-03-17 06:17:28 -07:00
}
let mut serum_markets = vec![];
for (base_token, spot) in serum_market_cookies {
2022-03-17 06:17:28 -07:00
serum_markets.push(
send_tx(
solana,
Serum3RegisterMarketInstruction {
2022-03-17 06:17:28 -07:00
group,
admin,
serum_program: context.serum.program_id,
serum_market_external: spot.market,
market_index: spot.coin_mint.index as u16,
base_bank: base_token.bank,
quote_bank: quote_token.bank,
2022-03-17 06:17:28 -07:00
payer,
},
)
.await
.unwrap()
.serum_market,
);
}
//
// TEST: Create open orders and trigger a Deposit to check health
//
for (i, &serum_market) in serum_markets.iter().enumerate() {
println!("adding market {}", i);
send_tx(
solana,
Serum3CreateOpenOrdersInstruction {
2022-03-17 06:17:28 -07:00
account,
serum_market,
owner,
payer,
},
)
.await
.unwrap();
send_tx(
solana,
TokenDepositInstruction {
2022-03-17 06:17:28 -07:00
amount: 10,
account,
owner,
token_account: payer_mint_accounts[0],
token_authority: payer.clone(),
bank_index: 0,
2022-03-17 06:17:28 -07:00
},
)
.await
.unwrap();
}
// TODO: actual explicit CU comparisons.
// On 2022-6-21 the final deposit costs 54074 CU and each new market increases it by roughly 4500 CU
Ok(())
}
// Try to reach compute limits in health checks by having many perp markets in an account
#[tokio::test]
async fn test_health_compute_perp() -> 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 mints = &context.mints[0..8];
let payer_mint_accounts = &context.users[1].token_accounts[0..mints.len()];
//
// SETUP: Create a group and an account
//
2022-07-04 04:13:11 -07:00
let mango_setup::GroupWithTokens { group, tokens, .. } = mango_setup::GroupWithTokensConfig {
admin,
payer,
2022-09-12 06:25:50 -07:00
mints: mints.to_vec(),
..GroupWithTokensConfig::default()
}
.create(solana)
.await;
2022-08-26 06:59:47 -07:00
let account = create_funded_account(
&solana,
group,
owner,
0,
&context.users[1],
&mints[..1],
1000,
0,
)
2022-08-26 06:59:47 -07:00
.await;
//
// SETUP: Create perp markets
//
let mut perp_markets = vec![];
for (perp_market_index, token) in tokens[1..].iter().enumerate() {
let mango_v4::accounts::PerpCreateMarket {
perp_market,
asks,
bids,
event_queue,
..
} = send_tx(
solana,
PerpCreateMarketInstruction {
group,
admin,
payer,
perp_market_index: perp_market_index as PerpMarketIndex,
quote_lot_size: 10,
base_lot_size: 100,
maint_asset_weight: 0.975,
init_asset_weight: 0.95,
maint_liab_weight: 1.025,
init_liab_weight: 1.05,
liquidation_fee: 0.012,
maker_fee: 0.0002,
taker_fee: 0.000,
2022-09-09 01:03:49 -07:00
..PerpCreateMarketInstruction::with_new_book_and_queue(&solana, &token).await
},
)
.await
.unwrap();
perp_markets.push((perp_market, asks, bids, event_queue));
}
2022-05-25 10:29:53 -07:00
let price_lots = {
let perp_market = solana.get_account::<PerpMarket>(perp_markets[0].0).await;
perp_market.native_price_to_lot(I80F48::from(1))
};
//
// TEST: Create a perp order for each market
//
for (i, &(perp_market, _asks, _bids, _event_queue)) in perp_markets.iter().enumerate() {
println!("adding market {}", i);
send_tx(
solana,
PerpPlaceOrderInstruction {
account,
perp_market,
owner,
side: Side::Bid,
2022-05-25 10:29:53 -07:00
price_lots,
max_base_lots: 1,
max_quote_lots: i64::MAX,
client_order_id: 0,
},
)
.await
.unwrap();
send_tx(
solana,
TokenDepositInstruction {
amount: 10,
account,
owner,
token_account: payer_mint_accounts[0],
token_authority: payer.clone(),
bank_index: 0,
},
)
.await
.unwrap();
}
// TODO: actual explicit CU comparisons.
// On 2022-5-25 the final deposit costs 32700 CU and each new market increases it by roughly 1500 CU
2022-03-17 06:17:28 -07:00
Ok(())
}