BeingLiquidated: Deactivate flag on positive health
This commit is contained in:
parent
24d94ae626
commit
403226dc28
|
@ -225,11 +225,12 @@ pub fn flash_loan_end<'key, 'accounts, 'remaining, 'info>(
|
||||||
})?;
|
})?;
|
||||||
let vaults_index = remaining_len - 2 * vaults_len - 1;
|
let vaults_index = remaining_len - 2 * vaults_len - 1;
|
||||||
|
|
||||||
// First initialize to the remaining delegated amount
|
|
||||||
let health_ais = &ctx.remaining_accounts[..vaults_index];
|
let health_ais = &ctx.remaining_accounts[..vaults_index];
|
||||||
let vaults = &ctx.remaining_accounts[vaults_index..vaults_index + vaults_len];
|
let vaults = &ctx.remaining_accounts[vaults_index..vaults_index + vaults_len];
|
||||||
let token_accounts =
|
let token_accounts =
|
||||||
&ctx.remaining_accounts[vaults_index + vaults_len..vaults_index + 2 * vaults_len];
|
&ctx.remaining_accounts[vaults_index + vaults_len..vaults_index + 2 * vaults_len];
|
||||||
|
|
||||||
|
// Verify that each mentioned vault has a bank in the health accounts
|
||||||
let mut vaults_with_banks = vec![false; vaults.len()];
|
let mut vaults_with_banks = vec![false; vaults.len()];
|
||||||
|
|
||||||
// Loop over the banks, finding matching vaults
|
// Loop over the banks, finding matching vaults
|
||||||
|
@ -313,13 +314,9 @@ pub fn flash_loan_end<'key, 'accounts, 'remaining, 'info>(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check pre-cpi health
|
// Check health before balance adjustments
|
||||||
// NOTE: This health check isn't strictly necessary. It will be, later, when
|
|
||||||
// we want to have reduce_only or be able to move an account out of bankruptcy.
|
|
||||||
let retriever = new_fixed_order_account_retriever(health_ais, &account.borrow())?;
|
let retriever = new_fixed_order_account_retriever(health_ais, &account.borrow())?;
|
||||||
let pre_cpi_health = compute_health(&account.borrow(), HealthType::Init, &retriever)?;
|
let _pre_health = compute_health(&account.borrow(), HealthType::Init, &retriever)?;
|
||||||
require!(pre_cpi_health >= 0, MangoError::HealthMustBePositive);
|
|
||||||
msg!("pre_cpi_health {:?}", pre_cpi_health);
|
|
||||||
|
|
||||||
// Prices for logging
|
// Prices for logging
|
||||||
let mut prices = vec![];
|
let mut prices = vec![];
|
||||||
|
@ -390,11 +387,14 @@ pub fn flash_loan_end<'key, 'accounts, 'remaining, 'info>(
|
||||||
token_loan_details
|
token_loan_details
|
||||||
});
|
});
|
||||||
|
|
||||||
// Check post-cpi health
|
// Check health after account position changes
|
||||||
let post_cpi_health =
|
let post_health =
|
||||||
compute_health_from_fixed_accounts(&account.borrow(), HealthType::Init, health_ais)?;
|
compute_health_from_fixed_accounts(&account.borrow(), HealthType::Init, health_ais)?;
|
||||||
require!(post_cpi_health >= 0, MangoError::HealthMustBePositive);
|
msg!("post_cpi_health {:?}", post_health);
|
||||||
msg!("post_cpi_health {:?}", post_cpi_health);
|
require!(post_health >= 0, MangoError::HealthMustBePositive);
|
||||||
|
account
|
||||||
|
.fixed
|
||||||
|
.maybe_recover_from_being_liquidated(post_health);
|
||||||
|
|
||||||
// Deactivate inactive token accounts after health check
|
// Deactivate inactive token accounts after health check
|
||||||
for raw_token_index in deactivated_token_positions {
|
for raw_token_index in deactivated_token_positions {
|
||||||
|
|
|
@ -136,6 +136,7 @@ pub fn perp_place_order(
|
||||||
let health = compute_health(&account.borrow(), HealthType::Init, &retriever)?;
|
let health = compute_health(&account.borrow(), HealthType::Init, &retriever)?;
|
||||||
msg!("health: {}", health);
|
msg!("health: {}", health);
|
||||||
require!(health >= 0, MangoError::HealthMustBePositive);
|
require!(health >= 0, MangoError::HealthMustBePositive);
|
||||||
|
account.fixed.maybe_recover_from_being_liquidated(health);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -294,6 +294,7 @@ pub fn serum3_place_order(
|
||||||
let health = compute_health(&account.borrow(), HealthType::Init, &retriever)?;
|
let health = compute_health(&account.borrow(), HealthType::Init, &retriever)?;
|
||||||
msg!("health: {}", health);
|
msg!("health: {}", health);
|
||||||
require!(health >= 0, MangoError::HealthMustBePositive);
|
require!(health >= 0, MangoError::HealthMustBePositive);
|
||||||
|
account.fixed.maybe_recover_from_being_liquidated(health);
|
||||||
|
|
||||||
vault_difference_result.deactivate_inactive_token_accounts(&mut account.borrow_mut());
|
vault_difference_result.deactivate_inactive_token_accounts(&mut account.borrow_mut());
|
||||||
|
|
||||||
|
|
|
@ -136,6 +136,7 @@ pub fn token_withdraw(ctx: Context<TokenWithdraw>, amount: u64, allow_borrow: bo
|
||||||
.context("post-withdraw init health")?;
|
.context("post-withdraw init health")?;
|
||||||
msg!("health: {}", health);
|
msg!("health: {}", health);
|
||||||
require!(health >= 0, MangoError::HealthMustBePositive);
|
require!(health >= 0, MangoError::HealthMustBePositive);
|
||||||
|
account.fixed.maybe_recover_from_being_liquidated(health);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Deactivate the position only after the health check because the user passed in
|
// Deactivate the position only after the health check because the user passed in
|
||||||
|
|
|
@ -51,7 +51,11 @@ pub struct MangoAccount {
|
||||||
|
|
||||||
pub account_num: u8,
|
pub account_num: u8,
|
||||||
|
|
||||||
/// This account cannot open new positions or borrow until `init_health >= 0`
|
/// Tracks that this account should be liquidated until init_health >= 0.
|
||||||
|
///
|
||||||
|
/// Normally accounts can not be liquidated while maint_health >= 0. But when an account
|
||||||
|
/// reaches maint_health < 0, liquidators will call a liquidation instruction and thereby
|
||||||
|
/// set this flag. Now the account may be liquidated until init_health >= 0.
|
||||||
being_liquidated: u8,
|
being_liquidated: u8,
|
||||||
|
|
||||||
padding5: u8,
|
padding5: u8,
|
||||||
|
|
Loading…
Reference in New Issue