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 }