Skip to content

Commit c4f11d4

Browse files
committed
program: support fill record for base amount at expiry
1 parent 8687a68 commit c4f11d4

File tree

3 files changed

+73
-1
lines changed

3 files changed

+73
-1
lines changed

programs/drift/src/controller/pnl.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,13 @@ use crate::math::position::calculate_base_asset_value_with_expiry_price;
2020
use crate::math::safe_math::SafeMath;
2121
use crate::math::spot_balance::get_token_amount;
2222

23+
use crate::get_then_update_id;
2324
use crate::msg;
25+
use crate::state::events::{
26+
LiquidateBorrowForPerpPnlRecord, LiquidatePerpPnlForDepositRecord, LiquidatePerpRecord,
27+
LiquidateSpotRecord, LiquidationRecord, LiquidationType, OrderAction, OrderActionRecord,
28+
OrderRecord, PerpBankruptcyRecord, SpotBankruptcyRecord,
29+
};
2430
use crate::state::events::{OrderActionExplanation, SettlePnlExplanation, SettlePnlRecord};
2531
use crate::state::oracle_map::OracleMap;
2632
use crate::state::paused_operations::PerpOperation;
@@ -468,6 +474,56 @@ pub fn settle_expired_position(
468474
-pnl_to_settle_with_user.cast()?,
469475
)?;
470476

477+
if position_delta.base_asset_amount != 0 {
478+
// get ids for order fills
479+
let user_order_id = get_then_update_id!(user, next_order_id);
480+
let fill_record_id = { get_then_update_id!(perp_market, next_fill_record_id) };
481+
482+
let base_asset_amount = position_delta.base_asset_amount;
483+
let user_position_direction_to_close =
484+
user.perp_positions[position_index].get_direction_to_close();
485+
486+
let fill_record = OrderActionRecord {
487+
ts: now,
488+
action: OrderAction::Fill,
489+
action_explanation: OrderActionExplanation::MarketExpired,
490+
market_index: perp_market.market_index,
491+
market_type: MarketType::Perp,
492+
filler: None,
493+
filler_reward: None,
494+
fill_record_id: Some(fill_record_id),
495+
base_asset_amount_filled: Some(base_asset_amount.unsigned_abs()),
496+
quote_asset_amount_filled: Some(pnl.unsigned_abs()),
497+
taker_fee: Some(fee.unsigned_abs()),
498+
maker_fee: None,
499+
referrer_reward: None,
500+
quote_asset_amount_surplus: None,
501+
spot_fulfillment_method_fee: None,
502+
taker: Some(*user_key),
503+
taker_order_id: Some(user_order_id),
504+
taker_order_direction: Some(user_position_direction_to_close),
505+
taker_order_base_asset_amount: Some(base_asset_amount.unsigned_abs()),
506+
taker_order_cumulative_base_asset_amount_filled: Some(base_asset_amount.unsigned_abs()),
507+
taker_order_cumulative_quote_asset_amount_filled: Some(base_asset_value.unsigned_abs()),
508+
maker: None,
509+
maker_order_id: None,
510+
maker_order_direction: None,
511+
maker_order_base_asset_amount: None,
512+
maker_order_cumulative_base_asset_amount_filled: None,
513+
maker_order_cumulative_quote_asset_amount_filled: None,
514+
oracle_price: perp_market.expiry_price,
515+
bit_flags: 0,
516+
taker_existing_quote_entry_amount: Some(quote_entry_amount.unsigned_abs()),
517+
taker_existing_base_asset_amount: Some(base_asset_amount.unsigned_abs()),
518+
maker_existing_quote_entry_amount: None,
519+
maker_existing_base_asset_amount: None,
520+
trigger_price: None,
521+
builder_idx: None,
522+
builder_fee: None,
523+
};
524+
emit!(fill_record);
525+
}
526+
471527
update_settled_pnl(user, position_index, pnl_to_settle_with_user.cast()?)?;
472528

473529
perp_market.amm.base_asset_amount_with_amm = perp_market

programs/drift/src/controller/pnl/delisting.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ pub mod delisting_test {
209209
amm_jit_intensity: 100,
210210
historical_oracle_data: HistoricalOracleData {
211211
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
212+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
212213
..HistoricalOracleData::default()
213214
},
214215
quote_asset_amount: -(QUOTE_PRECISION_I128 * 50), //longs have $100 cost basis
@@ -318,6 +319,7 @@ pub mod delisting_test {
318319
amm_jit_intensity: 100,
319320
historical_oracle_data: HistoricalOracleData {
320321
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
322+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
321323
..HistoricalOracleData::default()
322324
},
323325
quote_asset_amount: -(QUOTE_PRECISION_I128 * 10), //longs have $20 cost basis
@@ -430,6 +432,7 @@ pub mod delisting_test {
430432
amm_jit_intensity: 100,
431433
historical_oracle_data: HistoricalOracleData {
432434
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
435+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
433436
..HistoricalOracleData::default()
434437
},
435438
total_fee_minus_distributions: -(100000 * QUOTE_PRECISION_I128), // down $100k
@@ -543,6 +546,7 @@ pub mod delisting_test {
543546
amm_jit_intensity: 100,
544547
historical_oracle_data: HistoricalOracleData {
545548
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
549+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
546550
..HistoricalOracleData::default()
547551
},
548552
total_fee_minus_distributions: -(100000 * QUOTE_PRECISION_I128), // down $100k
@@ -652,6 +656,7 @@ pub mod delisting_test {
652656
amm_jit_intensity: 100,
653657
historical_oracle_data: HistoricalOracleData {
654658
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
659+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
655660
..HistoricalOracleData::default()
656661
},
657662
quote_asset_amount: -(QUOTE_PRECISION_I128 * 10), //longs have $20 cost basis
@@ -870,6 +875,8 @@ pub mod delisting_test {
870875
amm_jit_intensity: 100,
871876
historical_oracle_data: HistoricalOracleData {
872877
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
878+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
879+
873880
..HistoricalOracleData::default()
874881
},
875882
quote_asset_amount: (QUOTE_PRECISION_I128 * 10), //longs have -$20 cost basis
@@ -1091,6 +1098,8 @@ pub mod delisting_test {
10911098
amm_jit_intensity: 100,
10921099
historical_oracle_data: HistoricalOracleData {
10931100
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
1101+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
1102+
10941103
..HistoricalOracleData::default()
10951104
},
10961105
quote_asset_amount: (QUOTE_PRECISION_I128 * 20 * 2000), //longs have -$20 cost basis
@@ -1294,6 +1303,8 @@ pub mod delisting_test {
12941303
amm_jit_intensity: 100,
12951304
historical_oracle_data: HistoricalOracleData {
12961305
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
1306+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
1307+
12971308
..HistoricalOracleData::default()
12981309
},
12991310
quote_asset_amount: -(QUOTE_PRECISION_I128 * 20 * 1000 - QUOTE_PRECISION_I128),
@@ -1717,6 +1728,8 @@ pub mod delisting_test {
17171728
amm_jit_intensity: 100,
17181729
historical_oracle_data: HistoricalOracleData {
17191730
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
1731+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
1732+
17201733
..HistoricalOracleData::default()
17211734
},
17221735
quote_asset_amount: (QUOTE_PRECISION_I128 * 200)

programs/drift/src/controller/repeg.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,10 @@ pub fn settle_expired_market(
429429
let target_expiry_price = if market.amm.oracle_source == OracleSource::Prelaunch {
430430
market.amm.historical_oracle_data.last_oracle_price
431431
} else {
432-
market.amm.historical_oracle_data.last_oracle_price_twap_5min
432+
market
433+
.amm
434+
.historical_oracle_data
435+
.last_oracle_price_twap_5min
433436
};
434437

435438
crate::dlog!(target_expiry_price);

0 commit comments

Comments
 (0)