liquidator: cover errors during tcs execution
previously they could abort the liquidator
This commit is contained in:
parent
99cb3d4f4c
commit
b12b998e3a
|
@ -4,6 +4,7 @@ use std::sync::{Arc, RwLock};
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
use anchor_client::Cluster;
|
use anchor_client::Cluster;
|
||||||
|
use anyhow::Context;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use mango_v4::state::{PerpMarketIndex, TokenIndex};
|
use mango_v4::state::{PerpMarketIndex, TokenIndex};
|
||||||
use mango_v4_client::{
|
use mango_v4_client::{
|
||||||
|
@ -463,15 +464,20 @@ async fn main() -> anyhow::Result<()> {
|
||||||
|
|
||||||
let liquidated = liquidation
|
let liquidated = liquidation
|
||||||
.maybe_liquidate_one(account_addresses.iter())
|
.maybe_liquidate_one(account_addresses.iter())
|
||||||
.await
|
.await;
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let mut took_tcs = false;
|
let mut took_tcs = false;
|
||||||
if !liquidated && cli.take_tcs == BoolArg::True {
|
if !liquidated && cli.take_tcs == BoolArg::True {
|
||||||
took_tcs = liquidation
|
took_tcs = match liquidation
|
||||||
.maybe_take_token_conditional_swap(account_addresses.iter())
|
.maybe_take_token_conditional_swap(account_addresses.iter())
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
{
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(err) => {
|
||||||
|
error!("error during maybe_take_token_conditional_swap: {err}");
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
must_rebalance = must_rebalance || liquidated || took_tcs;
|
must_rebalance = must_rebalance || liquidated || took_tcs;
|
||||||
|
@ -577,7 +583,7 @@ impl LiquidationState {
|
||||||
async fn maybe_liquidate_one<'b>(
|
async fn maybe_liquidate_one<'b>(
|
||||||
&mut self,
|
&mut self,
|
||||||
accounts_iter: impl Iterator<Item = &'b Pubkey>,
|
accounts_iter: impl Iterator<Item = &'b Pubkey>,
|
||||||
) -> anyhow::Result<bool> {
|
) -> bool {
|
||||||
use rand::seq::SliceRandom;
|
use rand::seq::SliceRandom;
|
||||||
|
|
||||||
let mut accounts = accounts_iter.collect::<Vec<&Pubkey>>();
|
let mut accounts = accounts_iter.collect::<Vec<&Pubkey>>();
|
||||||
|
@ -592,11 +598,11 @@ impl LiquidationState {
|
||||||
.await
|
.await
|
||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
{
|
{
|
||||||
return Ok(true);
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(false)
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn maybe_liquidate_and_log_error(&mut self, pubkey: &Pubkey) -> anyhow::Result<bool> {
|
async fn maybe_liquidate_and_log_error(&mut self, pubkey: &Pubkey) -> anyhow::Result<bool> {
|
||||||
|
@ -652,9 +658,9 @@ impl LiquidationState {
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn maybe_take_token_conditional_swap<'b>(
|
async fn maybe_take_token_conditional_swap(
|
||||||
&mut self,
|
&mut self,
|
||||||
accounts_iter: impl Iterator<Item = &'b Pubkey>,
|
accounts_iter: impl Iterator<Item = &Pubkey>,
|
||||||
) -> anyhow::Result<bool> {
|
) -> anyhow::Result<bool> {
|
||||||
let accounts = accounts_iter.collect::<Vec<&Pubkey>>();
|
let accounts = accounts_iter.collect::<Vec<&Pubkey>>();
|
||||||
|
|
||||||
|
@ -721,14 +727,19 @@ impl LiquidationState {
|
||||||
|
|
||||||
let (txsigs, mut changed_pubkeys) = tcs_context
|
let (txsigs, mut changed_pubkeys) = tcs_context
|
||||||
.execute_tcs(&mut interesting_tcs, &mut self.tcs_execution_errors)
|
.execute_tcs(&mut interesting_tcs, &mut self.tcs_execution_errors)
|
||||||
.await?;
|
.await
|
||||||
|
.context("execute_tcs")?;
|
||||||
if txsigs.is_empty() {
|
if txsigs.is_empty() {
|
||||||
return Ok(false);
|
return Ok(false);
|
||||||
}
|
}
|
||||||
changed_pubkeys.push(self.mango_client.mango_account_address);
|
changed_pubkeys.push(self.mango_client.mango_account_address);
|
||||||
|
|
||||||
// Force a refresh of affected accounts
|
// Force a refresh of affected accounts
|
||||||
let slot = self.account_fetcher.transaction_max_slot(&txsigs).await?;
|
let slot = self
|
||||||
|
.account_fetcher
|
||||||
|
.transaction_max_slot(&txsigs)
|
||||||
|
.await
|
||||||
|
.context("transaction_max_slot")?;
|
||||||
if let Err(e) = self
|
if let Err(e) = self
|
||||||
.account_fetcher
|
.account_fetcher
|
||||||
.refresh_accounts_via_rpc_until_slot(
|
.refresh_accounts_via_rpc_until_slot(
|
||||||
|
|
Loading…
Reference in New Issue