From 800fe73a9c744f875fe721e0e607ea56f1ce88d8 Mon Sep 17 00:00:00 2001 From: microwavedcola1 <89031858+microwavedcola1@users.noreply.github.com> Date: Sat, 21 Jan 2023 11:35:31 +0100 Subject: [PATCH] abort if new tokens or perp markets listed (#411) * abort if new tokens or perp markets listed Signed-off-by: microwavedcola1 * fixes from review Signed-off-by: microwavedcola1 * fixes from review Signed-off-by: microwavedcola1 Signed-off-by: microwavedcola1 --- client/src/context.rs | 15 +++++++++++++++ keeper/src/crank.rs | 26 ++++++++++++++++++++++++++ keeper/src/main.rs | 4 ++++ 3 files changed, 45 insertions(+) diff --git a/client/src/context.rs b/client/src/context.rs index 499e5b6d4..43f5aa9c4 100644 --- a/client/src/context.rs +++ b/client/src/context.rs @@ -335,6 +335,21 @@ impl MangoGroupContext { .chain(serum_oos.map(to_account_meta)) .collect()) } + + pub async fn new_tokens_listed(&self, rpc: &RpcClientAsync) -> anyhow::Result { + let mint_infos = fetch_mint_infos(rpc, mango_v4::id(), self.group).await?; + Ok(mint_infos.len() > self.tokens.len()) + } + + pub async fn new_serum3_markets_listed(&self, rpc: &RpcClientAsync) -> anyhow::Result { + let serum3_markets = fetch_serum3_markets(rpc, mango_v4::id(), self.group).await?; + Ok(serum3_markets.len() > self.serum3_markets.len()) + } + + pub async fn new_perp_markets_listed(&self, rpc: &RpcClientAsync) -> anyhow::Result { + let new_perp_markets = fetch_perp_markets(rpc, mango_v4::id(), self.group).await?; + Ok(new_perp_markets.len() > self.perp_markets.len()) + } } fn from_serum_style_pubkey(d: [u64; 4]) -> Pubkey { diff --git a/keeper/src/crank.rs b/keeper/src/crank.rs index ba4f903ef..f26e54e63 100644 --- a/keeper/src/crank.rs +++ b/keeper/src/crank.rs @@ -21,6 +21,7 @@ pub async fn runner( interval_update_banks: u64, interval_consume_events: u64, interval_update_funding: u64, + interval_check_new_listings_and_abort: u64, ) -> Result<(), anyhow::Error> { let handles1 = mango_client .context @@ -73,12 +74,37 @@ pub async fn runner( futures::future::join_all(handles1), futures::future::join_all(handles2), futures::future::join_all(handles3), + loop_check_new_listings_and_abort( + mango_client.clone(), + interval_check_new_listings_and_abort + ), debugging_handle ); Ok(()) } +pub async fn loop_check_new_listings_and_abort(mango_client: Arc, interval: u64) { + let mut interval = time::interval(Duration::from_secs(interval)); + loop { + if mango_client + .context + .new_tokens_listed(&mango_client.client.rpc_async()) + .await + .unwrap() + || mango_client + .context + .new_perp_markets_listed(&mango_client.client.rpc_async()) + .await + .unwrap() + { + std::process::abort(); + } + + interval.tick().await; + } +} + pub async fn loop_update_index_and_rate( mango_client: Arc, token_indices: Vec, diff --git a/keeper/src/main.rs b/keeper/src/main.rs index 4425b5b48..f95e83227 100644 --- a/keeper/src/main.rs +++ b/keeper/src/main.rs @@ -53,6 +53,9 @@ struct Cli { #[clap(long, env, default_value_t = 5)] interval_update_funding: u64, + #[clap(long, env, default_value_t = 120)] + interval_check_new_listings_and_abort: u64, + #[clap(long, env, default_value_t = 10)] timeout: u64, } @@ -126,6 +129,7 @@ async fn main() -> Result<(), anyhow::Error> { cli.interval_update_banks, cli.interval_consume_events, cli.interval_update_funding, + cli.interval_check_new_listings_and_abort, ) .await }