2023-01-30 12:09:47 -08:00
|
|
|
use super::*;
|
2022-09-05 07:18:40 -07:00
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
async fn test_perp_settle_fees() -> Result<(), TransportError> {
|
|
|
|
let context = TestContext::new().await;
|
|
|
|
let solana = &context.solana.clone();
|
|
|
|
|
2022-09-07 03:39:21 -07:00
|
|
|
let admin = TestKeypair::new();
|
|
|
|
let owner = context.users[0].key;
|
|
|
|
let payer = context.users[1].key;
|
2022-09-05 07:18:40 -07:00
|
|
|
let mints = &context.mints[0..2];
|
|
|
|
let payer_mint_accounts = &context.users[1].token_accounts[0..=2];
|
|
|
|
|
|
|
|
let initial_token_deposit = 10_000;
|
|
|
|
|
|
|
|
//
|
|
|
|
// SETUP: Create a group and an account
|
|
|
|
//
|
|
|
|
|
2022-09-12 06:25:50 -07:00
|
|
|
let GroupWithTokens { group, tokens, .. } = GroupWithTokensConfig {
|
2022-09-05 07:18:40 -07:00
|
|
|
admin,
|
|
|
|
payer,
|
2022-09-12 06:25:50 -07:00
|
|
|
mints: mints.to_vec(),
|
|
|
|
..GroupWithTokensConfig::default()
|
2022-09-05 07:18:40 -07:00
|
|
|
}
|
|
|
|
.create(solana)
|
|
|
|
.await;
|
|
|
|
|
|
|
|
let account_0 = send_tx(
|
|
|
|
solana,
|
|
|
|
AccountCreateInstruction {
|
|
|
|
account_num: 0,
|
|
|
|
token_count: 16,
|
|
|
|
serum3_count: 8,
|
|
|
|
perp_count: 8,
|
|
|
|
perp_oo_count: 8,
|
|
|
|
group,
|
|
|
|
owner,
|
|
|
|
payer,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap()
|
|
|
|
.account;
|
|
|
|
|
|
|
|
let account_1 = send_tx(
|
|
|
|
solana,
|
|
|
|
AccountCreateInstruction {
|
|
|
|
account_num: 1,
|
|
|
|
token_count: 16,
|
|
|
|
serum3_count: 8,
|
|
|
|
perp_count: 8,
|
|
|
|
perp_oo_count: 8,
|
|
|
|
group,
|
|
|
|
owner,
|
|
|
|
payer,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap()
|
|
|
|
.account;
|
|
|
|
|
|
|
|
//
|
|
|
|
// SETUP: Deposit user funds
|
|
|
|
//
|
|
|
|
{
|
|
|
|
let deposit_amount = initial_token_deposit;
|
|
|
|
|
|
|
|
send_tx(
|
|
|
|
solana,
|
|
|
|
TokenDepositInstruction {
|
|
|
|
amount: deposit_amount,
|
2023-01-04 00:24:40 -08:00
|
|
|
reduce_only: false,
|
2022-09-05 07:18:40 -07:00
|
|
|
account: account_0,
|
2022-09-30 04:21:01 -07:00
|
|
|
owner,
|
2022-09-05 07:18:40 -07:00
|
|
|
token_account: payer_mint_accounts[0],
|
|
|
|
token_authority: payer.clone(),
|
|
|
|
bank_index: 0,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
send_tx(
|
|
|
|
solana,
|
|
|
|
TokenDepositInstruction {
|
|
|
|
amount: deposit_amount,
|
2023-01-04 00:24:40 -08:00
|
|
|
reduce_only: false,
|
2022-09-05 07:18:40 -07:00
|
|
|
account: account_0,
|
2022-09-30 04:21:01 -07:00
|
|
|
owner,
|
2022-09-05 07:18:40 -07:00
|
|
|
token_account: payer_mint_accounts[1],
|
|
|
|
token_authority: payer.clone(),
|
|
|
|
bank_index: 0,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
let deposit_amount = initial_token_deposit;
|
|
|
|
|
|
|
|
send_tx(
|
|
|
|
solana,
|
|
|
|
TokenDepositInstruction {
|
|
|
|
amount: deposit_amount,
|
2023-01-04 00:24:40 -08:00
|
|
|
reduce_only: false,
|
2022-09-05 07:18:40 -07:00
|
|
|
account: account_1,
|
2022-09-30 04:21:01 -07:00
|
|
|
owner,
|
2022-09-05 07:18:40 -07:00
|
|
|
token_account: payer_mint_accounts[0],
|
|
|
|
token_authority: payer.clone(),
|
|
|
|
bank_index: 0,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
send_tx(
|
|
|
|
solana,
|
|
|
|
TokenDepositInstruction {
|
|
|
|
amount: deposit_amount,
|
2023-01-04 00:24:40 -08:00
|
|
|
reduce_only: false,
|
2022-09-05 07:18:40 -07:00
|
|
|
account: account_1,
|
2022-09-30 04:21:01 -07:00
|
|
|
owner,
|
2022-09-05 07:18:40 -07:00
|
|
|
token_account: payer_mint_accounts[1],
|
|
|
|
token_authority: payer.clone(),
|
|
|
|
bank_index: 0,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// TEST: Create a perp market
|
|
|
|
//
|
2022-09-09 00:45:32 -07:00
|
|
|
let mango_v4::accounts::PerpCreateMarket { perp_market, .. } = send_tx(
|
2022-09-05 07:18:40 -07:00
|
|
|
solana,
|
|
|
|
PerpCreateMarketInstruction {
|
|
|
|
group,
|
|
|
|
admin,
|
|
|
|
payer,
|
|
|
|
perp_market_index: 0,
|
|
|
|
quote_lot_size: 10,
|
|
|
|
base_lot_size: 100,
|
2023-01-16 07:49:09 -08:00
|
|
|
maint_base_asset_weight: 0.975,
|
|
|
|
init_base_asset_weight: 0.95,
|
|
|
|
maint_base_liab_weight: 1.025,
|
|
|
|
init_base_liab_weight: 1.05,
|
2023-02-02 00:00:37 -08:00
|
|
|
base_liquidation_fee: 0.012,
|
2022-09-05 07:18:40 -07:00
|
|
|
maker_fee: 0.0002,
|
|
|
|
taker_fee: 0.000,
|
2022-11-30 04:20:19 -08:00
|
|
|
settle_pnl_limit_factor: 0.2,
|
2022-12-02 03:24:11 -08:00
|
|
|
settle_pnl_limit_window_size_ts: 24 * 60 * 60,
|
2022-09-09 01:03:49 -07:00
|
|
|
..PerpCreateMarketInstruction::with_new_book_and_queue(&solana, &tokens[0]).await
|
2022-09-05 07:18:40 -07:00
|
|
|
},
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
//
|
|
|
|
// TEST: Create another perp market
|
|
|
|
//
|
|
|
|
let mango_v4::accounts::PerpCreateMarket {
|
|
|
|
perp_market: perp_market_2,
|
|
|
|
..
|
|
|
|
} = send_tx(
|
|
|
|
solana,
|
|
|
|
PerpCreateMarketInstruction {
|
|
|
|
group,
|
|
|
|
admin,
|
|
|
|
payer,
|
|
|
|
perp_market_index: 1,
|
|
|
|
quote_lot_size: 10,
|
|
|
|
base_lot_size: 100,
|
2023-01-16 07:49:09 -08:00
|
|
|
maint_base_asset_weight: 0.975,
|
|
|
|
init_base_asset_weight: 0.95,
|
|
|
|
maint_base_liab_weight: 1.025,
|
|
|
|
init_base_liab_weight: 1.05,
|
2023-02-02 00:00:37 -08:00
|
|
|
base_liquidation_fee: 0.012,
|
2022-09-05 07:18:40 -07:00
|
|
|
maker_fee: 0.0002,
|
|
|
|
taker_fee: 0.000,
|
2022-11-30 04:20:19 -08:00
|
|
|
settle_pnl_limit_factor: 0.2,
|
2022-12-02 03:24:11 -08:00
|
|
|
settle_pnl_limit_window_size_ts: 24 * 60 * 60,
|
2022-09-09 01:03:49 -07:00
|
|
|
..PerpCreateMarketInstruction::with_new_book_and_queue(&solana, &tokens[1]).await
|
2022-09-05 07:18:40 -07:00
|
|
|
},
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
let price_lots = {
|
|
|
|
let perp_market = solana.get_account::<PerpMarket>(perp_market).await;
|
|
|
|
perp_market.native_price_to_lot(I80F48::from(1000))
|
|
|
|
};
|
|
|
|
|
|
|
|
// Set the initial oracle price
|
2022-11-24 02:55:22 -08:00
|
|
|
set_bank_stub_oracle_price(solana, group, &tokens[0], admin, 1000.0).await;
|
2022-09-05 07:18:40 -07:00
|
|
|
|
|
|
|
//
|
|
|
|
// Place orders and create a position
|
|
|
|
//
|
|
|
|
send_tx(
|
|
|
|
solana,
|
|
|
|
PerpPlaceOrderInstruction {
|
|
|
|
account: account_0,
|
|
|
|
perp_market,
|
|
|
|
owner,
|
|
|
|
side: Side::Bid,
|
|
|
|
price_lots,
|
|
|
|
max_base_lots: 1,
|
2023-05-15 01:40:41 -07:00
|
|
|
..PerpPlaceOrderInstruction::default()
|
2022-09-05 07:18:40 -07:00
|
|
|
},
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
send_tx(
|
|
|
|
solana,
|
|
|
|
PerpPlaceOrderInstruction {
|
|
|
|
account: account_1,
|
|
|
|
perp_market,
|
|
|
|
owner,
|
|
|
|
side: Side::Ask,
|
|
|
|
price_lots,
|
|
|
|
max_base_lots: 1,
|
2023-05-15 01:40:41 -07:00
|
|
|
..PerpPlaceOrderInstruction::default()
|
2022-09-05 07:18:40 -07:00
|
|
|
},
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
send_tx(
|
|
|
|
solana,
|
|
|
|
PerpConsumeEventsInstruction {
|
|
|
|
perp_market,
|
|
|
|
mango_accounts: vec![account_0, account_1],
|
|
|
|
},
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
let mango_account_0 = solana.get_account::<MangoAccount>(account_0).await;
|
2022-09-07 08:02:51 -07:00
|
|
|
assert_eq!(mango_account_0.perps[0].base_position_lots(), 1);
|
2022-09-05 07:18:40 -07:00
|
|
|
assert_eq!(
|
2022-09-07 08:02:51 -07:00
|
|
|
mango_account_0.perps[0].quote_position_native().round(),
|
2022-09-05 07:18:40 -07:00
|
|
|
-100_020
|
|
|
|
);
|
|
|
|
|
|
|
|
let mango_account_1 = solana.get_account::<MangoAccount>(account_1).await;
|
2022-09-07 08:02:51 -07:00
|
|
|
assert_eq!(mango_account_1.perps[0].base_position_lots(), -1);
|
|
|
|
assert_eq!(mango_account_1.perps[0].quote_position_native(), 100_000);
|
2022-09-05 07:18:40 -07:00
|
|
|
|
|
|
|
// Bank must be valid for quote currency
|
|
|
|
let result = send_tx(
|
|
|
|
solana,
|
|
|
|
PerpSettleFeesInstruction {
|
|
|
|
account: account_0,
|
|
|
|
perp_market,
|
2022-09-29 05:13:28 -07:00
|
|
|
settle_bank: tokens[1].bank,
|
2022-09-09 03:29:02 -07:00
|
|
|
max_settle_amount: u64::MAX,
|
2022-09-05 07:18:40 -07:00
|
|
|
},
|
|
|
|
)
|
|
|
|
.await;
|
|
|
|
|
|
|
|
assert_mango_error(
|
|
|
|
&result,
|
|
|
|
MangoError::InvalidBank.into(),
|
|
|
|
"Bank must be valid for quote currency".to_string(),
|
|
|
|
);
|
|
|
|
|
|
|
|
// Cannot settle position that does not exist
|
|
|
|
let result = send_tx(
|
|
|
|
solana,
|
|
|
|
PerpSettleFeesInstruction {
|
|
|
|
account: account_1,
|
|
|
|
perp_market: perp_market_2,
|
2022-09-29 05:13:28 -07:00
|
|
|
settle_bank: tokens[0].bank,
|
2022-09-09 03:29:02 -07:00
|
|
|
max_settle_amount: u64::MAX,
|
2022-09-05 07:18:40 -07:00
|
|
|
},
|
|
|
|
)
|
|
|
|
.await;
|
|
|
|
|
|
|
|
assert_mango_error(
|
|
|
|
&result,
|
|
|
|
MangoError::PerpPositionDoesNotExist.into(),
|
|
|
|
"Cannot settle a position that does not exist".to_string(),
|
|
|
|
);
|
|
|
|
|
|
|
|
// max_settle_amount must be greater than zero
|
2022-09-09 03:29:02 -07:00
|
|
|
let result = send_tx(
|
|
|
|
solana,
|
|
|
|
PerpSettleFeesInstruction {
|
|
|
|
account: account_1,
|
|
|
|
perp_market: perp_market,
|
2022-09-29 05:13:28 -07:00
|
|
|
settle_bank: tokens[0].bank,
|
2022-09-09 03:29:02 -07:00
|
|
|
max_settle_amount: 0,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
.await;
|
2022-09-05 07:18:40 -07:00
|
|
|
|
2022-09-09 03:29:02 -07:00
|
|
|
assert_mango_error(
|
|
|
|
&result,
|
|
|
|
MangoError::MaxSettleAmountMustBeGreaterThanZero.into(),
|
|
|
|
"max_settle_amount must be greater than zero".to_string(),
|
|
|
|
);
|
2022-09-05 07:18:40 -07:00
|
|
|
|
|
|
|
// TODO: Test funding settlement
|
|
|
|
|
|
|
|
{
|
|
|
|
let bank = solana.get_account::<Bank>(tokens[0].bank).await;
|
|
|
|
assert_eq!(
|
|
|
|
mango_account_0.tokens[0].native(&bank).round(),
|
|
|
|
initial_token_deposit,
|
|
|
|
"account 0 has expected amount of tokens"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
mango_account_1.tokens[0].native(&bank).round(),
|
|
|
|
initial_token_deposit,
|
|
|
|
"account 1 has expected amount of tokens"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Try and settle with high price
|
2022-11-24 02:55:22 -08:00
|
|
|
set_bank_stub_oracle_price(solana, group, &tokens[0], admin, 1200.0).await;
|
2022-09-05 07:18:40 -07:00
|
|
|
|
2023-03-31 03:45:05 -07:00
|
|
|
// Account must have a loss, should not settle anything and instead return early
|
|
|
|
send_tx(
|
2022-09-05 07:18:40 -07:00
|
|
|
solana,
|
|
|
|
PerpSettleFeesInstruction {
|
|
|
|
account: account_0,
|
|
|
|
perp_market,
|
2022-09-29 05:13:28 -07:00
|
|
|
settle_bank: tokens[0].bank,
|
2022-09-09 03:29:02 -07:00
|
|
|
max_settle_amount: u64::MAX,
|
2022-09-05 07:18:40 -07:00
|
|
|
},
|
|
|
|
)
|
2023-04-12 23:56:33 -07:00
|
|
|
.await
|
|
|
|
.unwrap();
|
2023-03-31 03:45:05 -07:00
|
|
|
// No change
|
|
|
|
{
|
|
|
|
let perp_market = solana.get_account::<PerpMarket>(perp_market).await;
|
|
|
|
assert_eq!(
|
|
|
|
get_pnl_native(&mango_account_0.perps[0], &perp_market, I80F48::from(1200)).round(),
|
|
|
|
19980
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
get_pnl_native(&mango_account_1.perps[0], &perp_market, I80F48::from(1200)),
|
|
|
|
-20000
|
|
|
|
);
|
|
|
|
}
|
2022-09-05 07:18:40 -07:00
|
|
|
|
|
|
|
// TODO: Difficult to test health due to fees being so small. Need alternative
|
|
|
|
// let result = send_tx(
|
|
|
|
// solana,
|
|
|
|
// PerpSettleFeesInstruction {
|
|
|
|
// group,
|
|
|
|
// account: account_1,
|
|
|
|
// perp_market,
|
|
|
|
// oracle: tokens[0].oracle,
|
2022-09-29 05:13:28 -07:00
|
|
|
// settle_bank: tokens[0].bank,
|
2022-09-05 07:18:40 -07:00
|
|
|
// max_settle_amount: I80F48::MAX,
|
|
|
|
// },
|
|
|
|
// )
|
|
|
|
// .await;
|
|
|
|
|
|
|
|
// assert_mango_error(
|
|
|
|
// &result,
|
|
|
|
// MangoError::HealthMustBePositive.into(),
|
|
|
|
// "Health of losing account must be positive to settle".to_string(),
|
|
|
|
// );
|
|
|
|
|
|
|
|
// Change the oracle to a more reasonable price
|
2022-11-24 02:55:22 -08:00
|
|
|
set_bank_stub_oracle_price(solana, group, &tokens[0], admin, 1005.0).await;
|
2022-09-05 07:18:40 -07:00
|
|
|
|
|
|
|
let expected_pnl_0 = I80F48::from(480); // Less due to fees
|
|
|
|
let expected_pnl_1 = I80F48::from(-500);
|
|
|
|
|
|
|
|
{
|
|
|
|
let perp_market = solana.get_account::<PerpMarket>(perp_market).await;
|
|
|
|
assert_eq!(
|
|
|
|
get_pnl_native(&mango_account_0.perps[0], &perp_market, I80F48::from(1005)).round(),
|
|
|
|
expected_pnl_0
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
get_pnl_native(&mango_account_1.perps[0], &perp_market, I80F48::from(1005)),
|
|
|
|
expected_pnl_1
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check the fees accrued
|
|
|
|
let initial_fees = I80F48::from(20);
|
|
|
|
{
|
|
|
|
let perp_market = solana.get_account::<PerpMarket>(perp_market).await;
|
|
|
|
assert_eq!(
|
|
|
|
perp_market.fees_accrued.round(),
|
|
|
|
initial_fees,
|
|
|
|
"Fees from trading have been accrued"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
perp_market.fees_settled.round(),
|
|
|
|
0,
|
|
|
|
"No fees have been settled yet"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Partially execute the settle
|
2022-09-09 03:29:02 -07:00
|
|
|
let partial_settle_amount = 10;
|
2022-09-05 07:18:40 -07:00
|
|
|
send_tx(
|
|
|
|
solana,
|
|
|
|
PerpSettleFeesInstruction {
|
|
|
|
account: account_1,
|
|
|
|
perp_market,
|
2022-09-29 05:13:28 -07:00
|
|
|
settle_bank: tokens[0].bank,
|
2022-09-05 07:18:40 -07:00
|
|
|
max_settle_amount: partial_settle_amount,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
{
|
|
|
|
let bank = solana.get_account::<Bank>(tokens[0].bank).await;
|
|
|
|
let mango_account_1 = solana.get_account::<MangoAccount>(account_1).await;
|
|
|
|
let perp_market = solana.get_account::<PerpMarket>(perp_market).await;
|
|
|
|
|
|
|
|
assert_eq!(
|
2022-09-07 08:02:51 -07:00
|
|
|
mango_account_1.perps[0].base_position_lots(),
|
|
|
|
-1,
|
2022-09-05 07:18:40 -07:00
|
|
|
"base position unchanged for account 1"
|
|
|
|
);
|
|
|
|
|
|
|
|
assert_eq!(
|
2022-09-07 08:02:51 -07:00
|
|
|
mango_account_1.perps[0].quote_position_native().round(),
|
2022-09-09 03:29:02 -07:00
|
|
|
I80F48::from(100_000 + partial_settle_amount),
|
2022-09-05 07:18:40 -07:00
|
|
|
"quote position increased for losing position by fee settle amount"
|
|
|
|
);
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
mango_account_1.tokens[0].native(&bank).round(),
|
2022-09-09 03:29:02 -07:00
|
|
|
I80F48::from(initial_token_deposit - partial_settle_amount),
|
2022-09-05 07:18:40 -07:00
|
|
|
"account 1 token native position decreased (loss) by max_settle_amount"
|
|
|
|
);
|
|
|
|
|
|
|
|
assert_eq!(
|
2022-10-07 12:12:55 -07:00
|
|
|
mango_account_1.perp_spot_transfers,
|
2022-09-09 03:29:02 -07:00
|
|
|
-(partial_settle_amount as i64),
|
2022-10-07 12:12:55 -07:00
|
|
|
"perp_spot_transfers on account 1 updated with loss from settlement"
|
2022-09-05 07:18:40 -07:00
|
|
|
);
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
perp_market.fees_accrued.round(),
|
2022-09-09 03:29:02 -07:00
|
|
|
initial_fees - I80F48::from(partial_settle_amount),
|
2022-09-05 07:18:40 -07:00
|
|
|
"Fees accrued have been reduced by partial settle"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
perp_market.fees_settled.round(),
|
|
|
|
partial_settle_amount,
|
|
|
|
"Fees have been partially settled"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Fully execute the settle
|
|
|
|
send_tx(
|
|
|
|
solana,
|
|
|
|
PerpSettleFeesInstruction {
|
|
|
|
account: account_1,
|
|
|
|
perp_market,
|
2022-09-29 05:13:28 -07:00
|
|
|
settle_bank: tokens[0].bank,
|
2022-09-09 03:29:02 -07:00
|
|
|
max_settle_amount: u64::MAX,
|
2022-09-05 07:18:40 -07:00
|
|
|
},
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
{
|
|
|
|
let bank = solana.get_account::<Bank>(tokens[0].bank).await;
|
|
|
|
let mango_account_1 = solana.get_account::<MangoAccount>(account_1).await;
|
|
|
|
let perp_market = solana.get_account::<PerpMarket>(perp_market).await;
|
|
|
|
|
|
|
|
assert_eq!(
|
2022-09-07 08:02:51 -07:00
|
|
|
mango_account_1.perps[0].base_position_lots(),
|
|
|
|
-1,
|
2022-09-05 07:18:40 -07:00
|
|
|
"base position unchanged for account 1"
|
|
|
|
);
|
|
|
|
|
|
|
|
assert_eq!(
|
2022-09-07 08:02:51 -07:00
|
|
|
mango_account_1.perps[0].quote_position_native().round(),
|
2022-09-05 07:18:40 -07:00
|
|
|
I80F48::from(100_000) + initial_fees,
|
|
|
|
"quote position increased for losing position by fees settled"
|
|
|
|
);
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
mango_account_1.tokens[0].native(&bank).round(),
|
|
|
|
I80F48::from(initial_token_deposit) - initial_fees,
|
|
|
|
"account 1 token native position decreased (loss)"
|
|
|
|
);
|
|
|
|
|
|
|
|
assert_eq!(
|
2022-10-07 12:12:55 -07:00
|
|
|
mango_account_1.perp_spot_transfers, -initial_fees,
|
|
|
|
"perp_spot_transfers on account 1 updated with loss from settlement"
|
2022-09-05 07:18:40 -07:00
|
|
|
);
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
perp_market.fees_accrued.round(),
|
|
|
|
0,
|
|
|
|
"Fees accrued have been reduced to zero"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
perp_market.fees_settled.round(),
|
|
|
|
initial_fees,
|
|
|
|
"Fees have been fully settled"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|