Liquidator: Fix condition for starting to liquidate
This commit is contained in:
parent
421b2d3d19
commit
4c65204c19
|
@ -111,9 +111,10 @@ pub fn maybe_liquidate_account(
|
|||
let health_cache =
|
||||
new_health_cache_(&mango_client.context, account_fetcher, &account).expect("always ok");
|
||||
let maint_health = health_cache.health(HealthType::Maint);
|
||||
let is_bankrupt = !health_cache.has_liquidatable_assets() && health_cache.has_borrows();
|
||||
let is_bankrupt = health_cache.is_bankrupt();
|
||||
let is_liquidatable = health_cache.is_liquidatable();
|
||||
|
||||
if maint_health >= 0 && !is_bankrupt {
|
||||
if !is_liquidatable && !is_bankrupt {
|
||||
return Ok(false);
|
||||
}
|
||||
|
||||
|
@ -132,7 +133,8 @@ pub fn maybe_liquidate_account(
|
|||
let health_cache =
|
||||
new_health_cache_(&mango_client.context, account_fetcher, &account).expect("always ok");
|
||||
let maint_health = health_cache.health(HealthType::Maint);
|
||||
let is_bankrupt = !health_cache.has_liquidatable_assets() && health_cache.has_borrows();
|
||||
let is_bankrupt = health_cache.is_bankrupt();
|
||||
let is_liquidatable = health_cache.is_liquidatable();
|
||||
|
||||
// find asset and liab tokens
|
||||
let mut tokens = account
|
||||
|
@ -205,7 +207,7 @@ pub fn maybe_liquidate_account(
|
|||
sig
|
||||
);
|
||||
sig
|
||||
} else if maint_health.is_negative() {
|
||||
} else if is_liquidatable {
|
||||
let asset_token_index = tokens
|
||||
.iter()
|
||||
.rev()
|
||||
|
|
|
@ -523,6 +523,7 @@ pub struct HealthCache {
|
|||
token_infos: Vec<TokenInfo>,
|
||||
serum3_infos: Vec<Serum3Info>,
|
||||
perp_infos: Vec<PerpInfo>,
|
||||
being_liquidated: bool,
|
||||
}
|
||||
|
||||
impl HealthCache {
|
||||
|
@ -566,6 +567,20 @@ impl HealthCache {
|
|||
spot_borrows || perp_borrows
|
||||
}
|
||||
|
||||
#[cfg(feature = "client")]
|
||||
pub fn is_bankrupt(&self) -> bool {
|
||||
!self.has_liquidatable_assets() && self.has_borrows()
|
||||
}
|
||||
|
||||
#[cfg(feature = "client")]
|
||||
pub fn is_liquidatable(&self) -> bool {
|
||||
if self.being_liquidated {
|
||||
self.health(HealthType::Init).is_negative()
|
||||
} else {
|
||||
self.health(HealthType::Maint).is_negative()
|
||||
}
|
||||
}
|
||||
|
||||
fn health_sum(&self, health_type: HealthType, mut action: impl FnMut(I80F48)) {
|
||||
for token_info in self.token_infos.iter() {
|
||||
let contrib = token_info.health_contribution(health_type);
|
||||
|
@ -922,6 +937,7 @@ pub fn new_health_cache(
|
|||
token_infos,
|
||||
serum3_infos,
|
||||
perp_infos,
|
||||
being_liquidated: account.fixed.being_liquidated(),
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -1478,6 +1494,7 @@ mod tests {
|
|||
],
|
||||
serum3_infos: vec![],
|
||||
perp_infos: vec![],
|
||||
being_liquidated: false,
|
||||
};
|
||||
|
||||
assert_eq!(health_cache.health(HealthType::Init), I80F48::ZERO);
|
||||
|
|
|
@ -3854,6 +3854,10 @@ export type MangoV4 = {
|
|||
"defined": "PerpInfo"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "beingLiquidated",
|
||||
"type": "bool"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -8881,6 +8885,10 @@ export const IDL: MangoV4 = {
|
|||
"defined": "PerpInfo"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "beingLiquidated",
|
||||
"type": "bool"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue