@@ -5,7 +5,8 @@ pub mod perp_lp_pool_settlement {
55 use crate :: error:: ErrorCode ;
66 use crate :: math:: casting:: Cast ;
77 use crate :: math:: constants:: QUOTE_PRECISION_U64 ;
8- use crate :: state:: spot_market:: SpotBalanceType ;
8+ use crate :: math:: spot_balance:: get_token_amount;
9+ use crate :: state:: spot_market:: { SpotBalance , SpotBalanceType } ;
910 use crate :: {
1011 math:: safe_math:: SafeMath ,
1112 state:: { amm_cache:: CacheInfo , perp_market:: PerpMarket , spot_market:: SpotMarket } ,
@@ -55,6 +56,8 @@ pub mod perp_lp_pool_settlement {
5556 pub fn validate_settlement_amount (
5657 ctx : & SettlementContext ,
5758 result : & SettlementResult ,
59+ perp_market : & PerpMarket ,
60+ quote_spot_market : & SpotMarket ,
5861 ) -> Result < ( ) > {
5962 if result. amount_transferred > ctx. max_settle_quote_amount {
6063 msg ! (
@@ -64,6 +67,49 @@ pub mod perp_lp_pool_settlement {
6467 ) ;
6568 return Err ( ErrorCode :: LpPoolSettleInvariantBreached . into ( ) ) ;
6669 }
70+
71+ if result. direction == SettlementDirection :: ToLpPool {
72+ if result. fee_pool_used > 0 {
73+ let fee_pool_token_amount = get_token_amount (
74+ perp_market. amm . fee_pool . balance ( ) ,
75+ quote_spot_market,
76+ & SpotBalanceType :: Deposit ,
77+ ) ?;
78+ validate ! (
79+ fee_pool_token_amount >= result. fee_pool_used,
80+ ErrorCode :: LpPoolSettleInvariantBreached . into( ) ,
81+ "Fee pool balance insufficient for settlement: {} < {}" ,
82+ fee_pool_token_amount,
83+ result. fee_pool_used
84+ ) ?;
85+ }
86+
87+ if result. pnl_pool_used > 0 {
88+ let pnl_pool_token_amount = get_token_amount (
89+ perp_market. pnl_pool . balance ( ) ,
90+ quote_spot_market,
91+ & SpotBalanceType :: Deposit ,
92+ ) ?;
93+ validate ! (
94+ pnl_pool_token_amount >= result. pnl_pool_used,
95+ ErrorCode :: LpPoolSettleInvariantBreached . into( ) ,
96+ "Pnl pool balance insufficient for settlement: {} < {}" ,
97+ pnl_pool_token_amount,
98+ result. pnl_pool_used
99+ ) ?;
100+ }
101+ }
102+ if result. direction == SettlementDirection :: FromLpPool {
103+ validate ! (
104+ ctx. quote_constituent_token_balance
105+ . saturating_sub( result. amount_transferred)
106+ >= QUOTE_PRECISION_U64 ,
107+ ErrorCode :: LpPoolSettleInvariantBreached . into( ) ,
108+ "Quote constituent token balance insufficient for settlement: {} < {}" ,
109+ ctx. quote_constituent_token_balance,
110+ result. amount_transferred
111+ ) ?;
112+ }
67113 Ok ( ( ) )
68114 }
69115
0 commit comments