From 4c91d3625543c4edd7c1d20901da8bc0597a88ab Mon Sep 17 00:00:00 2001 From: Lou-Kamades <128186011+Lou-Kamades@users.noreply.github.com> Date: Mon, 26 Feb 2024 09:45:14 -0800 Subject: [PATCH 01/31] Add raydium CLMM oracle fallbacks (#856) * add RaydiumCLMM oracle type * add deserializing raydium pool state * test: consolidate clmm oralce unit tests * test: add failure check to test_orca_fallback_oracle * test: add test_raydium_fallback_oracle * restore get_quote_oracle() * ensure RaydiumCLMM is a valid fallback type --- lib/client/src/context.rs | 12 +- ...1d4AXwxqyeXX6Pc3G4pFNr6iWb3dd8YfBBQMPr.bin | Bin 0 -> 1544 bytes programs/mango-v4/src/state/amm_cpi.rs | 168 +++++++++++ programs/mango-v4/src/state/mod.rs | 4 +- programs/mango-v4/src/state/oracle.rs | 281 ++++++++++-------- programs/mango-v4/src/state/orca_cpi.rs | 76 ----- .../tests/cases/test_stale_oracles.rs | 233 ++++++++++++++- 7 files changed, 575 insertions(+), 199 deletions(-) create mode 100644 programs/mango-v4/resources/test/Ds33rQ1d4AXwxqyeXX6Pc3G4pFNr6iWb3dd8YfBBQMPr.bin create mode 100644 programs/mango-v4/src/state/amm_cpi.rs delete mode 100644 programs/mango-v4/src/state/orca_cpi.rs diff --git a/lib/client/src/context.rs b/lib/client/src/context.rs index 2654c7ab8..b9d87f861 100644 --- a/lib/client/src/context.rs +++ b/lib/client/src/context.rs @@ -7,9 +7,9 @@ use anchor_lang::__private::bytemuck; use mango_v4::{ accounts_zerocopy::{KeyedAccountReader, KeyedAccountSharedData}, state::{ - determine_oracle_type, load_whirlpool_state, oracle_state_unchecked, Group, - MangoAccountValue, OracleAccountInfos, OracleConfig, OracleConfigParams, OracleType, - PerpMarketIndex, Serum3MarketIndex, TokenIndex, MAX_BANKS, + determine_oracle_type, load_orca_pool_state, load_raydium_pool_state, + oracle_state_unchecked, Group, MangoAccountValue, OracleAccountInfos, OracleConfig, + OracleConfigParams, OracleType, PerpMarketIndex, Serum3MarketIndex, TokenIndex, MAX_BANKS, }, }; @@ -711,10 +711,14 @@ async fn fetch_raw_account(rpc: &RpcClientAsync, address: Pubkey) -> Result Pubkey { let maybe_key = match determine_oracle_type(acc_info).ok() { Some(oracle_type) => match oracle_type { - OracleType::OrcaCLMM => match load_whirlpool_state(acc_info).ok() { + OracleType::OrcaCLMM => match load_orca_pool_state(acc_info).ok() { Some(whirlpool) => whirlpool.get_quote_oracle().ok(), None => None, }, + OracleType::RaydiumCLMM => match load_raydium_pool_state(acc_info).ok() { + Some(pool) => pool.get_quote_oracle().ok(), + None => None, + }, _ => None, }, None => None, diff --git a/programs/mango-v4/resources/test/Ds33rQ1d4AXwxqyeXX6Pc3G4pFNr6iWb3dd8YfBBQMPr.bin b/programs/mango-v4/resources/test/Ds33rQ1d4AXwxqyeXX6Pc3G4pFNr6iWb3dd8YfBBQMPr.bin new file mode 100644 index 0000000000000000000000000000000000000000..a0c6541cbf79042d1512742d652b68aea9791e42 GIT binary patch literal 1544 zcmezV_VL&2hwr)lRW07ID$22b{+T=3I!xyJahy&?g@5d(Oint$(|BxEVavTu%_qXe zXRpe7S8AAHF|TBkFwfn8Wi9V#7uKg8t`eKcHoGJI-|EJe-x>AEZW0GfZym9`BlX%k zbjE@Y3_!qm>{r$2eYe+I*`|KZT79y_aO3VLhc114@T6uL6SJ#+Y~q&1s|+mJ+k95o zEN1GDJ)yqXt(x(Q)2srEq=`H79nKoxyF1IfEqTF`_LX)b(v_=&cztx1_A*Xh@uEPp z;ig%6^YfBZ>dD;da%=Qj?^cV8%ijGOdN230)-#Xu{jcXSoYduHV`NCkjQ<023=FK? z%(CTh^nXtnpMC!S|DPH88N35^)@1#^A_)`kpLONriS;*NTn49%e~ci`Ekg~km`e8- z26KM6G{ccg8@jTS zAOjNvg92s%&`M+%*O^726q>YlQU{3sxVK*oWS7-DV-*mc%cKELz&5$?Tmcdu1;Zo+ E0IVU=f&c&j literal 0 HcmV?d00001 diff --git a/programs/mango-v4/src/state/amm_cpi.rs b/programs/mango-v4/src/state/amm_cpi.rs new file mode 100644 index 000000000..307eb2869 --- /dev/null +++ b/programs/mango-v4/src/state/amm_cpi.rs @@ -0,0 +1,168 @@ +use anchor_lang::prelude::*; +use fixed::types::{I80F48, U64F64}; +use solana_program::pubkey::Pubkey; + +use crate::{accounts_zerocopy::KeyedAccountReader, error::MangoError}; + +use super::{ + get_pyth_state, pyth_mainnet_sol_oracle, pyth_mainnet_usdc_oracle, sol_mint_mainnet, + usdc_mint_mainnet, OracleAccountInfos, OracleState, QUOTE_DECIMALS, SOL_DECIMALS, +}; + +pub mod orca_mainnet_whirlpool { + use solana_program::declare_id; + declare_id!("whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc"); +} + +pub mod raydium_mainnet { + use solana_program::declare_id; + declare_id!("CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK"); +} + +pub const ORCA_WHIRLPOOL_LEN: usize = 653; +pub const ORCA_WHIRLPOOL_DISCRIMINATOR: [u8; 8] = [63, 149, 209, 12, 225, 128, 99, 9]; + +pub const RAYDIUM_POOL_LEN: usize = 1544; +pub const RAYDIUM_POOL_DISCRIMINATOR: [u8; 8] = [247, 237, 227, 245, 215, 195, 222, 70]; + +pub struct CLMMPoolState { + // Q64.64 + pub sqrt_price: u128, // 16 + pub token_mint_a: Pubkey, // 32 + pub token_mint_b: Pubkey, // 32 +} + +impl CLMMPoolState { + pub fn is_inverted(&self) -> bool { + self.token_mint_a == usdc_mint_mainnet::ID + || (self.token_mint_a == sol_mint_mainnet::ID + && self.token_mint_b != usdc_mint_mainnet::ID) + } + + pub fn get_clmm_price(&self) -> I80F48 { + if self.is_inverted() { + let sqrt_price = U64F64::from_bits(self.sqrt_price).to_num::(); + let inverted_price = sqrt_price * sqrt_price; + I80F48::from_num(1.0f64 / inverted_price) + } else { + let sqrt_price = U64F64::from_bits(self.sqrt_price); + I80F48::from_num(sqrt_price * sqrt_price) + } + } + + pub fn quote_state_unchecked( + &self, + acc_infos: &OracleAccountInfos, + ) -> Result { + if self.is_inverted() { + self.quote_state_inner(acc_infos, &self.token_mint_a) + } else { + self.quote_state_inner(acc_infos, &self.token_mint_b) + } + } + + fn quote_state_inner( + &self, + acc_infos: &OracleAccountInfos, + quote_mint: &Pubkey, + ) -> Result { + if quote_mint == &usdc_mint_mainnet::ID { + let usd_feed = acc_infos + .usdc_opt + .ok_or_else(|| error!(MangoError::MissingFeedForCLMMOracle))?; + let usd_state = get_pyth_state(usd_feed, QUOTE_DECIMALS as u8)?; + return Ok(usd_state); + } else if quote_mint == &sol_mint_mainnet::ID { + let sol_feed = acc_infos + .sol_opt + .ok_or_else(|| error!(MangoError::MissingFeedForCLMMOracle))?; + let sol_state = get_pyth_state(sol_feed, SOL_DECIMALS as u8)?; + return Ok(sol_state); + } else { + return Err(MangoError::MissingFeedForCLMMOracle.into()); + } + } + + pub fn get_quote_oracle(&self) -> Result { + let mint = if self.is_inverted() { + self.token_mint_a + } else { + self.token_mint_b + }; + + if mint == usdc_mint_mainnet::ID { + return Ok(pyth_mainnet_usdc_oracle::ID); + } else if mint == sol_mint_mainnet::ID { + return Ok(pyth_mainnet_sol_oracle::ID); + } else { + return Err(MangoError::MissingFeedForCLMMOracle.into()); + } + } + + pub fn has_quote_token(&self) -> bool { + let has_usdc_token = self.token_mint_a == usdc_mint_mainnet::ID + || self.token_mint_b == usdc_mint_mainnet::ID; + let has_sol_token = + self.token_mint_a == sol_mint_mainnet::ID || self.token_mint_b == sol_mint_mainnet::ID; + + has_usdc_token || has_sol_token + } +} + +pub fn load_orca_pool_state(acc_info: &impl KeyedAccountReader) -> Result { + let data = &acc_info.data(); + require!( + data[0..8] == ORCA_WHIRLPOOL_DISCRIMINATOR[..], + MangoError::InvalidCLMMOracle + ); + require!( + data.len() == ORCA_WHIRLPOOL_LEN, + MangoError::InvalidCLMMOracle + ); + require!( + acc_info.owner() == &orca_mainnet_whirlpool::ID, + MangoError::InvalidCLMMOracle + ); + + let price_bytes: &[u8; 16] = &data[65..81].try_into().unwrap(); + let sqrt_price = u128::from_le_bytes(*price_bytes); + let a: &[u8; 32] = &(&data[101..133]).try_into().unwrap(); + let b: &[u8; 32] = &(&data[181..213]).try_into().unwrap(); + let mint_a = Pubkey::from(*a); + let mint_b = Pubkey::from(*b); + + Ok(CLMMPoolState { + sqrt_price, + token_mint_a: mint_a, + token_mint_b: mint_b, + }) +} + +pub fn load_raydium_pool_state(acc_info: &impl KeyedAccountReader) -> Result { + let data = &acc_info.data(); + require!( + data[0..8] == RAYDIUM_POOL_DISCRIMINATOR[..], + MangoError::InvalidCLMMOracle + ); + require!( + data.len() == RAYDIUM_POOL_LEN, + MangoError::InvalidCLMMOracle + ); + require!( + acc_info.owner() == &raydium_mainnet::ID, + MangoError::InvalidCLMMOracle + ); + + let price_bytes: &[u8; 16] = &data[253..269].try_into().unwrap(); + let sqrt_price = u128::from_le_bytes(*price_bytes); + let a: &[u8; 32] = &(&data[73..105]).try_into().unwrap(); + let b: &[u8; 32] = &(&data[105..137]).try_into().unwrap(); + let mint_a = Pubkey::from(*a); + let mint_b = Pubkey::from(*b); + + Ok(CLMMPoolState { + sqrt_price, + token_mint_a: mint_a, + token_mint_b: mint_b, + }) +} diff --git a/programs/mango-v4/src/state/mod.rs b/programs/mango-v4/src/state/mod.rs index 92f182ffb..a0320dd5d 100644 --- a/programs/mango-v4/src/state/mod.rs +++ b/programs/mango-v4/src/state/mod.rs @@ -1,3 +1,4 @@ +pub use amm_cpi::*; pub use bank::*; pub use dynamic_account::*; pub use equity::*; @@ -7,13 +8,13 @@ pub use mango_account_components::*; pub use mint_info::*; pub use openbook_v2_market::*; pub use oracle::*; -pub use orca_cpi::*; pub use orderbook::*; pub use perp_market::*; pub use serum3_market::*; pub use stable_price::*; pub use token_conditional_swap::*; +mod amm_cpi; mod bank; mod dynamic_account; mod equity; @@ -23,7 +24,6 @@ mod mango_account_components; mod mint_info; mod openbook_v2_market; mod oracle; -mod orca_cpi; mod orderbook; mod perp_market; mod serum3_market; diff --git a/programs/mango-v4/src/state/oracle.rs b/programs/mango-v4/src/state/oracle.rs index fc4106941..64ce6327f 100644 --- a/programs/mango-v4/src/state/oracle.rs +++ b/programs/mango-v4/src/state/oracle.rs @@ -3,7 +3,7 @@ use std::mem::size_of; use anchor_lang::prelude::*; use anchor_lang::{AnchorDeserialize, Discriminator}; use derivative::Derivative; -use fixed::types::{I80F48, U64F64}; +use fixed::types::I80F48; use static_assertions::const_assert_eq; use switchboard_program::FastRoundResultAccountData; @@ -12,9 +12,9 @@ use switchboard_v2::AggregatorAccountData; use crate::accounts_zerocopy::*; use crate::error::*; -use crate::state::load_whirlpool_state; +use crate::state::load_orca_pool_state; -use super::orca_mainnet_whirlpool; +use super::{load_raydium_pool_state, orca_mainnet_whirlpool, raydium_mainnet}; const DECIMAL_CONSTANT_ZERO_INDEX: i8 = 12; const DECIMAL_CONSTANTS: [I80F48; 25] = [ @@ -117,6 +117,7 @@ pub enum OracleType { SwitchboardV1, SwitchboardV2, OrcaCLMM, + RaydiumCLMM, } pub struct OracleState { @@ -195,6 +196,8 @@ pub fn determine_oracle_type(acc_info: &impl KeyedAccountReader) -> Result Res return Ok(()); }; let oracle_type = determine_oracle_type(acc_info)?; - if oracle_type == OracleType::OrcaCLMM { - let whirlpool = load_whirlpool_state(acc_info)?; + let valid_oracle = match oracle_type { + OracleType::OrcaCLMM => { + let whirlpool = load_orca_pool_state(acc_info)?; + whirlpool.has_quote_token() + } + OracleType::RaydiumCLMM => { + let pool = load_raydium_pool_state(acc_info)?; + pool.has_quote_token() + } + _ => true, + }; - let has_usdc_token = whirlpool.token_mint_a == usdc_mint_mainnet::ID - || whirlpool.token_mint_b == usdc_mint_mainnet::ID; - let has_sol_token = whirlpool.token_mint_a == sol_mint_mainnet::ID - || whirlpool.token_mint_b == sol_mint_mainnet::ID; - require!( - has_usdc_token || has_sol_token, - MangoError::InvalidCLMMOracle - ); - } + require!(valid_oracle, MangoError::UnexpectedOracle); Ok(()) } @@ -253,7 +257,7 @@ fn pyth_get_price( } } -fn get_pyth_state( +pub fn get_pyth_state( acc_info: &(impl KeyedAccountReader + ?Sized), base_decimals: u8, ) -> Result { @@ -404,56 +408,32 @@ fn oracle_state_unchecked_inner( } } OracleType::OrcaCLMM => { - let whirlpool = load_whirlpool_state(oracle_info)?; - - let inverted = whirlpool.is_inverted(); - let quote_state = if inverted { - quote_state_unchecked(acc_infos, &whirlpool.token_mint_a)? - } else { - quote_state_unchecked(acc_infos, &whirlpool.token_mint_b)? - }; - - let clmm_price = if inverted { - let sqrt_price = U64F64::from_bits(whirlpool.sqrt_price).to_num::(); - let inverted_price = sqrt_price * sqrt_price; - I80F48::from_num(1.0f64 / inverted_price) - } else { - let sqrt_price = U64F64::from_bits(whirlpool.sqrt_price); - I80F48::from_num(sqrt_price * sqrt_price) - }; - - let price = clmm_price * quote_state.price; + let whirlpool = load_orca_pool_state(oracle_info)?; + let clmm_price = whirlpool.get_clmm_price(); + let quote_oracle_state = whirlpool.quote_state_unchecked(acc_infos)?; + let price = clmm_price * quote_oracle_state.price; OracleState { price, - last_update_slot: quote_state.last_update_slot, - deviation: quote_state.deviation, + last_update_slot: quote_oracle_state.last_update_slot, + deviation: quote_oracle_state.deviation, oracle_type: OracleType::OrcaCLMM, } } + OracleType::RaydiumCLMM => { + let whirlpool = load_raydium_pool_state(oracle_info)?; + let clmm_price = whirlpool.get_clmm_price(); + let quote_oracle_state = whirlpool.quote_state_unchecked(acc_infos)?; + let price = clmm_price * quote_oracle_state.price; + OracleState { + price, + last_update_slot: quote_oracle_state.last_update_slot, + deviation: quote_oracle_state.deviation, + oracle_type: OracleType::RaydiumCLMM, + } + } }) } -fn quote_state_unchecked( - acc_infos: &OracleAccountInfos, - quote_mint: &Pubkey, -) -> Result { - if quote_mint == &usdc_mint_mainnet::ID { - let usd_feed = acc_infos - .usdc_opt - .ok_or_else(|| error!(MangoError::MissingFeedForCLMMOracle))?; - let usd_state = get_pyth_state(usd_feed, QUOTE_DECIMALS as u8)?; - return Ok(usd_state); - } else if quote_mint == &sol_mint_mainnet::ID { - let sol_feed = acc_infos - .sol_opt - .ok_or_else(|| error!(MangoError::MissingFeedForCLMMOracle))?; - let sol_state = get_pyth_state(sol_feed, SOL_DECIMALS as u8)?; - return Ok(sol_state); - } else { - return Err(MangoError::MissingFeedForCLMMOracle.into()); - } -} - pub fn oracle_log_context( name: &str, state: &OracleState, @@ -545,7 +525,87 @@ mod tests { } #[test] - pub fn test_clmm_price() -> Result<()> { + pub fn test_clmm_prices() -> Result<()> { + // add ability to find fixtures + let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + d.push("resources/test"); + + let usdc_fixture = ( + "Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD", + OracleType::Pyth, + Pubkey::default(), + 6, + ); + + let clmm_fixtures = vec![ + ( + "83v8iPyZihDEjDdY8RdZddyZNyUtXngz69Lgo9Kt5d6d", + OracleType::OrcaCLMM, + orca_mainnet_whirlpool::ID, + 9, // SOL/USDC pool + ), + ( + "Ds33rQ1d4AXwxqyeXX6Pc3G4pFNr6iWb3dd8YfBBQMPr", + OracleType::RaydiumCLMM, + raydium_mainnet::ID, + 9, // SOL/USDC pool + ), + ]; + + for fixture in clmm_fixtures { + let clmm_file = format!("resources/test/{}.bin", fixture.0); + let mut clmm_data = read_file(find_file(&clmm_file).unwrap()); + let data = RefCell::new(&mut clmm_data[..]); + let ai = &AccountInfoRef { + key: &Pubkey::from_str(fixture.0).unwrap(), + owner: &fixture.2, + data: data.borrow(), + }; + + let pyth_file = format!("resources/test/{}.bin", usdc_fixture.0); + let mut pyth_data = read_file(find_file(&pyth_file).unwrap()); + let pyth_data_cell = RefCell::new(&mut pyth_data[..]); + let usdc_ai = &AccountInfoRef { + key: &Pubkey::from_str(usdc_fixture.0).unwrap(), + owner: &usdc_fixture.2, + data: pyth_data_cell.borrow(), + }; + let base_decimals = fixture.3; + let usdc_decimals = usdc_fixture.3; + + let usdc_ais = OracleAccountInfos { + oracle: usdc_ai, + fallback_opt: None, + usdc_opt: None, + sol_opt: None, + }; + let clmm_ais = OracleAccountInfos { + oracle: ai, + fallback_opt: None, + usdc_opt: Some(usdc_ai), + sol_opt: None, + }; + let usdc = oracle_state_unchecked(&usdc_ais, usdc_decimals).unwrap(); + let clmm = oracle_state_unchecked(&clmm_ais, base_decimals).unwrap(); + assert!(usdc.price == I80F48::from_num(1.00000758274099)); + + match fixture.1 { + OracleType::OrcaCLMM => { + // 63.006792786538313 * 1.00000758274099 (but in native/native) + assert!(clmm.price == I80F48::from_num(0.06300727055072872)) + } + OracleType::RaydiumCLMM => { + // 83.551469620431 * 1.00000758274099 (but in native/native) + assert!(clmm.price == I80F48::from_num(0.083552103169584)) + } + _ => unimplemented!(), + } + } + Ok(()) + } + + #[test] + pub fn test_clmm_price_missing_usdc() -> Result<()> { // add ability to find fixtures let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); d.push("resources/test"); @@ -558,67 +618,13 @@ mod tests { 9, // SOL/USDC pool ), ( - "Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD", - OracleType::Pyth, - Pubkey::default(), - 6, + "Ds33rQ1d4AXwxqyeXX6Pc3G4pFNr6iWb3dd8YfBBQMPr", + OracleType::RaydiumCLMM, + raydium_mainnet::ID, + 9, // SOL/USDC pool ), ]; - let clmm_file = format!("resources/test/{}.bin", fixtures[0].0); - let mut clmm_data = read_file(find_file(&clmm_file).unwrap()); - let data = RefCell::new(&mut clmm_data[..]); - let ai = &AccountInfoRef { - key: &Pubkey::from_str(fixtures[0].0).unwrap(), - owner: &fixtures[0].2, - data: data.borrow(), - }; - - let pyth_file = format!("resources/test/{}.bin", fixtures[1].0); - let mut pyth_data = read_file(find_file(&pyth_file).unwrap()); - let pyth_data_cell = RefCell::new(&mut pyth_data[..]); - let usdc_ai = &AccountInfoRef { - key: &Pubkey::from_str(fixtures[1].0).unwrap(), - owner: &fixtures[1].2, - data: pyth_data_cell.borrow(), - }; - let base_decimals = fixtures[0].3; - let usdc_decimals = fixtures[1].3; - - let usdc_ais = OracleAccountInfos { - oracle: usdc_ai, - fallback_opt: None, - usdc_opt: None, - sol_opt: None, - }; - let orca_ais = OracleAccountInfos { - oracle: ai, - fallback_opt: None, - usdc_opt: Some(usdc_ai), - sol_opt: None, - }; - let usdc = oracle_state_unchecked(&usdc_ais, usdc_decimals).unwrap(); - let orca = oracle_state_unchecked(&orca_ais, base_decimals).unwrap(); - assert!(usdc.price == I80F48::from_num(1.00000758274099)); - // 63.006792786538313 * 1.00000758274099 (but in native/native) - assert!(orca.price == I80F48::from_num(0.06300727055072872)); - - Ok(()) - } - - #[test] - pub fn test_clmm_price_missing_usdc() -> Result<()> { - // add ability to find fixtures - let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - d.push("resources/test"); - - let fixtures = vec![( - "83v8iPyZihDEjDdY8RdZddyZNyUtXngz69Lgo9Kt5d6d", - OracleType::OrcaCLMM, - orca_mainnet_whirlpool::ID, - 9, // SOL/USDC pool - )]; - for fixture in fixtures { let filename = format!("resources/test/{}.bin", fixture.0); let mut clmm_data = read_file(find_file(&filename).unwrap()); @@ -642,4 +648,47 @@ mod tests { Ok(()) } + + #[test] + pub fn test_valid_fallbacks() -> Result<()> { + // add ability to find fixtures + let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + d.push("resources/test"); + + let usdc_fixture = ( + "Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD", + OracleType::Pyth, + Pubkey::default(), + 6, + ); + + let clmm_fixtures = vec![ + ( + "83v8iPyZihDEjDdY8RdZddyZNyUtXngz69Lgo9Kt5d6d", + OracleType::OrcaCLMM, + orca_mainnet_whirlpool::ID, + 9, // SOL/USDC pool + ), + ( + "Ds33rQ1d4AXwxqyeXX6Pc3G4pFNr6iWb3dd8YfBBQMPr", + OracleType::RaydiumCLMM, + raydium_mainnet::ID, + 9, // SOL/USDC pool + ), + ]; + + for fixture in clmm_fixtures { + let clmm_file = format!("resources/test/{}.bin", fixture.0); + let mut clmm_data = read_file(find_file(&clmm_file).unwrap()); + let data = RefCell::new(&mut clmm_data[..]); + let ai = &AccountInfoRef { + key: &Pubkey::from_str(fixture.0).unwrap(), + owner: &fixture.2, + data: data.borrow(), + }; + + check_is_valid_fallback_oracle(ai)?; + } + Ok(()) + } } diff --git a/programs/mango-v4/src/state/orca_cpi.rs b/programs/mango-v4/src/state/orca_cpi.rs deleted file mode 100644 index f33f7ff0b..000000000 --- a/programs/mango-v4/src/state/orca_cpi.rs +++ /dev/null @@ -1,76 +0,0 @@ -use anchor_lang::prelude::*; -use solana_program::pubkey::Pubkey; - -use crate::{accounts_zerocopy::KeyedAccountReader, error::MangoError}; - -use super::{ - pyth_mainnet_sol_oracle, pyth_mainnet_usdc_oracle, sol_mint_mainnet, usdc_mint_mainnet, -}; - -pub mod orca_mainnet_whirlpool { - use solana_program::declare_id; - declare_id!("whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc"); -} - -pub const ORCA_WHIRLPOOL_LEN: usize = 653; -pub const ORCA_WHIRLPOOL_DISCRIMINATOR: [u8; 8] = [63, 149, 209, 12, 225, 128, 99, 9]; - -pub struct WhirlpoolState { - // Q64.64 - pub sqrt_price: u128, // 16 - pub token_mint_a: Pubkey, // 32 - pub token_mint_b: Pubkey, // 32 -} - -impl WhirlpoolState { - pub fn is_inverted(&self) -> bool { - self.token_mint_a == usdc_mint_mainnet::ID - || (self.token_mint_a == sol_mint_mainnet::ID - && self.token_mint_b != usdc_mint_mainnet::ID) - } - - pub fn get_quote_oracle(&self) -> Result { - let mint = if self.is_inverted() { - self.token_mint_a - } else { - self.token_mint_b - }; - - if mint == usdc_mint_mainnet::ID { - return Ok(pyth_mainnet_usdc_oracle::ID); - } else if mint == sol_mint_mainnet::ID { - return Ok(pyth_mainnet_sol_oracle::ID); - } else { - return Err(MangoError::MissingFeedForCLMMOracle.into()); - } - } -} - -pub fn load_whirlpool_state(acc_info: &impl KeyedAccountReader) -> Result { - let data = &acc_info.data(); - require!( - data[0..8] == ORCA_WHIRLPOOL_DISCRIMINATOR[..], - MangoError::InvalidCLMMOracle - ); - require!( - data.len() == ORCA_WHIRLPOOL_LEN, - MangoError::InvalidCLMMOracle - ); - require!( - acc_info.owner() == &orca_mainnet_whirlpool::ID, - MangoError::InvalidCLMMOracle - ); - - let price_bytes: &[u8; 16] = &data[65..81].try_into().unwrap(); - let sqrt_price = u128::from_le_bytes(*price_bytes); - let a: &[u8; 32] = &(&data[101..133]).try_into().unwrap(); - let b: &[u8; 32] = &(&data[181..213]).try_into().unwrap(); - let mint_a = Pubkey::from(*a); - let mint_b = Pubkey::from(*b); - - Ok(WhirlpoolState { - sqrt_price, - token_mint_a: mint_a, - token_mint_b: mint_b, - }) -} diff --git a/programs/mango-v4/tests/cases/test_stale_oracles.rs b/programs/mango-v4/tests/cases/test_stale_oracles.rs index 1a96fa578..0dc51fbb7 100644 --- a/programs/mango-v4/tests/cases/test_stale_oracles.rs +++ b/programs/mango-v4/tests/cases/test_stale_oracles.rs @@ -321,7 +321,7 @@ async fn test_fallback_oracle_withdraw() -> Result<(), TransportError> { } #[tokio::test] -async fn test_clmm_fallback_oracle() -> Result<(), TransportError> { +async fn test_orca_fallback_oracle() -> Result<(), TransportError> { // add ability to find fixtures let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); d.push("resources/test"); @@ -340,6 +340,237 @@ async fn test_clmm_fallback_oracle() -> Result<(), TransportError> { "Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD", "FsJ3A3u2vn5cTVofAjvy6y5kwABJAqYWpe4975bi2epH", ), + ( + "Ds33rQ1d4AXwxqyeXX6Pc3G4pFNr6iWb3dd8YfBBQMPr", + "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK", + ), + ]; + + let fallback_oracle = Pubkey::from_str(fixtures[0].0).unwrap(); + let pyth_usd_oracle = Pubkey::from_str(fixtures[1].0).unwrap(); + let wrong_fallback_oracle = Pubkey::from_str(fixtures[2].0).unwrap(); + + // setup pyth and clmm accounts + for fixture in fixtures { + let filename = format!("resources/test/{}.bin", fixture.0); + let data = read_file(find_file(&filename).unwrap()); + let mut account = + AccountSharedData::new(u64::MAX, data.len(), &Pubkey::from_str(fixture.1).unwrap()); + account.set_data(data); + let mut program_test_context = solana.context.borrow_mut(); + program_test_context.set_account(&Pubkey::from_str(fixture.0).unwrap(), &account); + } + + let admin = TestKeypair::new(); + let owner = context.users[0].key; + let payer = context.users[1].key; + let mints = &context.mints[0..4]; + let payer_token_accounts = &context.users[1].token_accounts[0..3]; + + let mango_setup::GroupWithTokens { group, tokens, .. } = mango_setup::GroupWithTokensConfig { + admin, + payer, + mints: mints.to_vec(), + ..mango_setup::GroupWithTokensConfig::default() + } + .create(solana) + .await; + + // add a fallback oracle + send_tx( + solana, + TokenEdit { + group, + admin, + mint: mints[2].pubkey, + fallback_oracle, + options: mango_v4::instruction::TokenEdit { + set_fallback_oracle: true, + ..token_edit_instruction_default() + }, + }, + ) + .await + .unwrap(); + + let bank_data: Bank = solana.get_account(tokens[2].bank).await; + assert!(bank_data.fallback_oracle == fallback_oracle); + + // fill vaults, so we can borrow + let _vault_account = create_funded_account( + &solana, + group, + owner, + 2, + &context.users[1], + mints, + 100_000, + 0, + ) + .await; + + // Create account with token3 of deposits + let account = create_funded_account( + &solana, + group, + owner, + 0, + &context.users[1], + &[mints[2]], + 10_000, + 0, + ) + .await; + + // Adjust oracle prices to match CLMM + for i in 0..3 { + send_tx( + solana, + StubOracleSetTestInstruction { + oracle: tokens[i].oracle, + group, + mint: mints[i].pubkey, + admin, + price: 0.06300727055072872, + last_update_slot: 0, + deviation: 0.0, + }, + ) + .await + .unwrap(); + } + + // Create some token1 borrows + send_tx( + solana, + TokenWithdrawInstruction { + amount: 100, + allow_borrow: true, + account, + owner, + token_account: payer_token_accounts[1], + bank_index: 0, + }, + ) + .await + .unwrap(); + + // Make oracle invalid by increasing deviation + send_tx( + solana, + StubOracleSetTestInstruction { + oracle: tokens[2].oracle, + group, + mint: mints[2].pubkey, + admin, + price: 0.06300727055072872, + last_update_slot: 0, + deviation: 100.0, + }, + ) + .await + .unwrap(); + + let token_withdraw_ix = TokenWithdrawInstruction { + amount: 1, + allow_borrow: true, + account, + owner, + token_account: payer_token_accounts[2], + bank_index: 0, + }; + + // Verify that withdrawing collateral won't work + assert!(send_tx(solana, token_withdraw_ix.clone()).await.is_err()); + + // Send txn with a fallback oracle in the remaining accounts, but no pyth USD feed + let fallback_oracle_meta = AccountMeta { + pubkey: fallback_oracle, + is_writable: false, + is_signer: false, + }; + assert!(send_tx_with_extra_accounts( + solana, + token_withdraw_ix.clone(), + vec![fallback_oracle_meta.clone()] + ) + .await + .unwrap() + .result + .is_err()); + + // add wrong_fallback_oracle for a different token + send_tx( + solana, + TokenEdit { + group, + admin, + mint: mints[3].pubkey, + fallback_oracle: wrong_fallback_oracle, + options: mango_v4::instruction::TokenEdit { + set_fallback_oracle: true, + ..token_edit_instruction_default() + }, + }, + ) + .await + .unwrap(); + + // Send txn with a the wrong fallback oracle + let wrong_fallback_meta = AccountMeta { + pubkey: wrong_fallback_oracle, + is_writable: false, + is_signer: false, + }; + assert!(send_tx_with_extra_accounts( + solana, + token_withdraw_ix.clone(), + vec![wrong_fallback_meta.clone()] + ) + .await + .unwrap() + .result + .is_err()); + + // Finally send txn with a fallback oracle and pyth USD feed + let pyth_usd_oracle_meta = AccountMeta { + pubkey: pyth_usd_oracle, + is_writable: false, + is_signer: false, + }; + send_tx_with_extra_accounts( + solana, + token_withdraw_ix, + vec![fallback_oracle_meta, pyth_usd_oracle_meta], + ) + .await + .unwrap() + .result + .unwrap(); + + Ok(()) +} + +#[tokio::test] +async fn test_raydium_fallback_oracle() -> Result<(), TransportError> { + // add ability to find fixtures + let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + d.push("resources/test"); + + let mut test_builder = TestContextBuilder::new(); + test_builder.test().set_compute_max_units(150_000); // bad oracles log a lot + let context = test_builder.start_default().await; + let solana = &context.solana.clone(); + + let fixtures = vec![ + ( + "Ds33rQ1d4AXwxqyeXX6Pc3G4pFNr6iWb3dd8YfBBQMPr", + "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK", + ), + ( + "Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD", + "FsJ3A3u2vn5cTVofAjvy6y5kwABJAqYWpe4975bi2epH", + ), ]; let fallback_oracle = Pubkey::from_str(fixtures[0].0).unwrap(); From ebe3e455a2cc963522fda55afa4ae28711bb7fb3 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Tue, 27 Feb 2024 15:56:03 +0100 Subject: [PATCH 02/31] tests: cleanup (#896) - nicer floating point equality comparisons using macros - nicer send-tx-and-expect-error calls --- programs/mango-v4/tests/cases/mod.rs | 3 +- programs/mango-v4/tests/cases/test_basic.rs | 14 +- .../tests/cases/test_borrow_limits.rs | 27 +-- .../tests/cases/test_collateral_fees.rs | 8 +- .../cases/test_fees_buyback_with_mngo.rs | 8 +- .../mango-v4/tests/cases/test_force_close.rs | 16 +- .../tests/cases/test_liq_perps_bankruptcy.rs | 4 +- .../test_liq_perps_base_and_bankruptcy.rs | 88 ++++----- .../cases/test_liq_perps_positive_pnl.rs | 8 +- .../mango-v4/tests/cases/test_liq_tokens.rs | 16 +- .../mango-v4/tests/cases/test_margin_trade.rs | 36 ++-- programs/mango-v4/tests/cases/test_perp.rs | 46 ++--- .../mango-v4/tests/cases/test_perp_settle.rs | 39 +--- .../tests/cases/test_perp_settle_fees.rs | 36 ++-- programs/mango-v4/tests/cases/test_serum.rs | 24 ++- .../cases/test_token_conditional_swap.rs | 169 +++++------------- .../cases/test_token_update_index_and_rate.rs | 32 ++-- programs/mango-v4/tests/program_test/utils.rs | 29 +-- 18 files changed, 220 insertions(+), 383 deletions(-) diff --git a/programs/mango-v4/tests/cases/mod.rs b/programs/mango-v4/tests/cases/mod.rs index 3d2c3b175..79aba39d8 100644 --- a/programs/mango-v4/tests/cases/mod.rs +++ b/programs/mango-v4/tests/cases/mod.rs @@ -10,7 +10,8 @@ pub use program_test::*; pub use super::program_test; -pub use utils::assert_equal_fixed_f64 as assert_equal; +pub use crate::assert_eq_f64; +pub use crate::assert_eq_fixed_f64; mod test_alt; mod test_bankrupt_tokens; diff --git a/programs/mango-v4/tests/cases/test_basic.rs b/programs/mango-v4/tests/cases/test_basic.rs index 6cc9e1a6d..928d2940a 100644 --- a/programs/mango-v4/tests/cases/test_basic.rs +++ b/programs/mango-v4/tests/cases/test_basic.rs @@ -450,7 +450,7 @@ async fn test_bank_maint_weight_shift() -> Result<(), TransportError> { .await; let maint_health = account_maint_health(solana, account).await; - assert!(assert_equal_f64_f64(maint_health, 1000.0, 1e-2)); + assert_eq_f64!(maint_health, 1000.0, 1e-2); let start_time = solana.clock_timestamp().await; @@ -474,17 +474,17 @@ async fn test_bank_maint_weight_shift() -> Result<(), TransportError> { .unwrap(); let maint_health = account_maint_health(solana, account).await; - assert!(assert_equal_f64_f64(maint_health, 1000.0, 1e-2)); + assert_eq_f64!(maint_health, 1000.0, 1e-2); solana.set_clock_timestamp(start_time + 1500).await; let maint_health = account_maint_health(solana, account).await; - assert!(assert_equal_f64_f64(maint_health, 750.0, 1e-2)); + assert_eq_f64!(maint_health, 750.0, 1e-2); solana.set_clock_timestamp(start_time + 3000).await; let maint_health = account_maint_health(solana, account).await; - assert!(assert_equal_f64_f64(maint_health, 500.0, 1e-2)); + assert_eq_f64!(maint_health, 500.0, 1e-2); solana.set_clock_timestamp(start_time + 1600).await; @@ -505,11 +505,11 @@ async fn test_bank_maint_weight_shift() -> Result<(), TransportError> { .unwrap(); let maint_health = account_maint_health(solana, account).await; - assert!(assert_equal_f64_f64(maint_health, 700.0, 1e-2)); + assert_eq_f64!(maint_health, 700.0, 1e-2); let bank: Bank = solana.get_account(tokens[0].bank).await; - assert!(assert_equal_fixed_f64(bank.maint_asset_weight, 0.7, 1e-4)); - assert!(assert_equal_fixed_f64(bank.maint_liab_weight, 1.3, 1e-4)); + assert_eq_fixed_f64!(bank.maint_asset_weight, 0.7, 1e-4); + assert_eq_fixed_f64!(bank.maint_liab_weight, 1.3, 1e-4); assert_eq!(bank.maint_weight_shift_duration_inv, I80F48::ZERO); Ok(()) diff --git a/programs/mango-v4/tests/cases/test_borrow_limits.rs b/programs/mango-v4/tests/cases/test_borrow_limits.rs index b8aaedc09..d1a656919 100644 --- a/programs/mango-v4/tests/cases/test_borrow_limits.rs +++ b/programs/mango-v4/tests/cases/test_borrow_limits.rs @@ -221,7 +221,7 @@ async fn test_bank_net_borrows_based_borrow_limit() -> Result<(), TransportError // fails because borrow is greater than remaining margin in net borrow limit // (requires the test to be quick enough to avoid accidentally going to the next borrow limit window!) - let res = send_tx( + send_tx_expect_error!( solana, TokenWithdrawInstruction { amount: 4000, @@ -231,12 +231,7 @@ async fn test_bank_net_borrows_based_borrow_limit() -> Result<(), TransportError token_account: payer_mint_accounts[0], bank_index: 0, }, - ) - .await; - assert_mango_error( - &res, - MangoError::BankNetBorrowsLimitReached.into(), - "".into(), + MangoError::BankNetBorrowsLimitReached ); // succeeds because is not a borrow @@ -314,7 +309,7 @@ async fn test_bank_net_borrows_based_borrow_limit() -> Result<(), TransportError set_bank_stub_oracle_price(solana, group, &tokens[0], admin, 10.0).await; // cannot borrow anything: net borrowed 1002 * price 10.0 > limit 6000 - let res = send_tx( + send_tx_expect_error!( solana, TokenWithdrawInstruction { amount: 1, @@ -324,12 +319,7 @@ async fn test_bank_net_borrows_based_borrow_limit() -> Result<(), TransportError token_account: payer_mint_accounts[0], bank_index: 0, }, - ) - .await; - assert_mango_error( - &res, - MangoError::BankNetBorrowsLimitReached.into(), - "".into(), + MangoError::BankNetBorrowsLimitReached ); // can still withdraw @@ -350,7 +340,7 @@ async fn test_bank_net_borrows_based_borrow_limit() -> Result<(), TransportError set_bank_stub_oracle_price(solana, group, &tokens[0], admin, 5.0).await; // cannot borrow this much: (net borrowed 1000 + new borrow 201) * price 5.0 > limit 6000 - let res = send_tx( + send_tx_expect_error!( solana, TokenWithdrawInstruction { amount: 200, @@ -360,12 +350,7 @@ async fn test_bank_net_borrows_based_borrow_limit() -> Result<(), TransportError token_account: payer_mint_accounts[0], bank_index: 0, }, - ) - .await; - assert_mango_error( - &res, - MangoError::BankNetBorrowsLimitReached.into(), - "".into(), + MangoError::BankNetBorrowsLimitReached ); // can borrow smaller amounts: (net borrowed 1000 + new borrow 199) * price 5.0 < limit 6000 diff --git a/programs/mango-v4/tests/cases/test_collateral_fees.rs b/programs/mango-v4/tests/cases/test_collateral_fees.rs index 5d069f023..1ee9d8fa5 100644 --- a/programs/mango-v4/tests/cases/test_collateral_fees.rs +++ b/programs/mango-v4/tests/cases/test_collateral_fees.rs @@ -177,11 +177,11 @@ async fn test_collateral_fees() -> Result<(), TransportError> { .await .unwrap(); last_time = solana.clock_timestamp().await; - assert!(assert_equal_f64_f64( + assert_eq_f64!( account_position_f64(solana, account, tokens[0].bank).await, 1500.0 * (1.0 - 0.1 * (9.0 / 24.0) * (600.0 / 1200.0)), 0.01 - )); + ); let last_balance = account_position_f64(solana, account, tokens[0].bank).await; // @@ -208,11 +208,11 @@ async fn test_collateral_fees() -> Result<(), TransportError> { .await .unwrap(); //last_time = solana.clock_timestamp().await; - assert!(assert_equal_f64_f64( + assert_eq_f64!( account_position_f64(solana, account, tokens[0].bank).await, last_balance * (1.0 - 0.1 * (7.0 / 24.0) * (720.0 / (last_balance * 0.8))), 0.01 - )); + ); Ok(()) } diff --git a/programs/mango-v4/tests/cases/test_fees_buyback_with_mngo.rs b/programs/mango-v4/tests/cases/test_fees_buyback_with_mngo.rs index cf86954b9..202732bfd 100644 --- a/programs/mango-v4/tests/cases/test_fees_buyback_with_mngo.rs +++ b/programs/mango-v4/tests/cases/test_fees_buyback_with_mngo.rs @@ -185,16 +185,16 @@ async fn test_fees_buyback_with_mngo() -> Result<(), TransportError> { assert_eq!(before_fees_accrued - after_fees_accrued, 19); // token[1] swapped at discount for token[0] - assert!(assert_equal( + assert_eq_fixed_f64!( fees_token_position_after - fees_token_position_before, 19.0 / 2.0, 0.1 - )); - assert!(assert_equal( + ); + assert_eq_fixed_f64!( mngo_token_position_after - mngo_token_position_before, -19.0 / 3.0 / 1.2, 0.1 - )); + ); Ok(()) } diff --git a/programs/mango-v4/tests/cases/test_force_close.rs b/programs/mango-v4/tests/cases/test_force_close.rs index 3deab6252..f6e5ecee0 100644 --- a/programs/mango-v4/tests/cases/test_force_close.rs +++ b/programs/mango-v4/tests/cases/test_force_close.rs @@ -357,18 +357,18 @@ async fn test_force_close_perp() -> Result<(), TransportError> { let mango_account_0 = solana.get_account::(account_0).await; assert_eq!(mango_account_0.perps[0].base_position_lots(), 1); - assert!(assert_equal( + assert_eq_fixed_f64!( mango_account_0.perps[0].quote_position_native(), -99.99, 0.001 - )); + ); let mango_account_1 = solana.get_account::(account_1).await; assert_eq!(mango_account_1.perps[0].base_position_lots(), -1); - assert!(assert_equal( + assert_eq_fixed_f64!( mango_account_1.perps[0].quote_position_native(), 99.98, 0.001 - )); + ); // Market needs to be in force close assert!(send_tx( @@ -423,18 +423,18 @@ async fn test_force_close_perp() -> Result<(), TransportError> { let mango_account_0 = solana.get_account::(account_0).await; assert_eq!(mango_account_0.perps[0].base_position_lots(), 0); - assert!(assert_equal( + assert_eq_fixed_f64!( mango_account_0.perps[0].quote_position_native(), 0.009, 0.001 - )); + ); let mango_account_1 = solana.get_account::(account_1).await; assert_eq!(mango_account_1.perps[0].base_position_lots(), 0); - assert!(assert_equal( + assert_eq_fixed_f64!( mango_account_1.perps[0].quote_position_native(), -0.0199, 0.001 - )); + ); Ok(()) } diff --git a/programs/mango-v4/tests/cases/test_liq_perps_bankruptcy.rs b/programs/mango-v4/tests/cases/test_liq_perps_bankruptcy.rs index e3bb11f08..d551cb4ed 100644 --- a/programs/mango-v4/tests/cases/test_liq_perps_bankruptcy.rs +++ b/programs/mango-v4/tests/cases/test_liq_perps_bankruptcy.rs @@ -337,11 +337,11 @@ async fn test_liq_perps_bankruptcy() -> Result<(), TransportError> { liqor_quote_before + 12 ); let acc_data = solana.get_account::(account).await; - assert!(assert_equal( + assert_eq_fixed_f64!( acc_data.perps[0].quote_position_native(), -50.0 + 11.0 + 27.0, 0.1 - )); + ); assert_eq!(acc_data.being_liquidated, 0); let (_liqor_data, liqor_perp) = liqor_info(perp_market, liqor).await; assert_eq!(liqor_perp.quote_position_native(), -11); diff --git a/programs/mango-v4/tests/cases/test_liq_perps_base_and_bankruptcy.rs b/programs/mango-v4/tests/cases/test_liq_perps_base_and_bankruptcy.rs index 2a0c4ee8e..524bf8d5b 100644 --- a/programs/mango-v4/tests/cases/test_liq_perps_base_and_bankruptcy.rs +++ b/programs/mango-v4/tests/cases/test_liq_perps_base_and_bankruptcy.rs @@ -217,35 +217,35 @@ async fn test_liq_perps_base_and_bankruptcy() -> Result<(), TransportError> { let liqee_amount = 10.0 * 100.0 * 0.6 * (1.0 - 0.05); let liqor_data = solana.get_account::(liqor).await; assert_eq!(liqor_data.perps[0].base_position_lots(), 10); - assert!(assert_equal( + assert_eq_fixed_f64!( liqor_data.perps[0].quote_position_native(), -liqor_amount, 0.1 - )); + ); let liqee_data = solana.get_account::(account_0).await; assert_eq!(liqee_data.perps[0].base_position_lots(), 10); - assert!(assert_equal( + assert_eq_fixed_f64!( liqee_data.perps[0].quote_position_native(), -20.0 * 100.0 + liqee_amount, 0.1 - )); - assert!(assert_equal( + ); + assert_eq_fixed_f64!( liqee_data.perps[0].realized_pnl_for_position_native, liqee_amount - 1000.0, 0.1 - )); + ); // stable price is 1.0, so 0.2 * 1000 assert_eq!(liqee_data.perps[0].recurring_settle_pnl_allowance, 201); - assert!(assert_equal( + assert_eq_fixed_f64!( perp_market_after.fees_accrued - perp_market_before.fees_accrued, liqor_amount - liqee_amount, 0.1, - )); - assert!(assert_equal( + ); + assert_eq_fixed_f64!( perp_market_after.accrued_liquidation_fees - perp_market_before.accrued_liquidation_fees, liqor_amount - liqee_amount, 0.1, - )); + ); // // TEST: Liquidate base position max @@ -268,18 +268,18 @@ async fn test_liq_perps_base_and_bankruptcy() -> Result<(), TransportError> { let liqee_amount_2 = 6.0 * 100.0 * 0.6 * (1.0 - 0.05); let liqor_data = solana.get_account::(liqor).await; assert_eq!(liqor_data.perps[0].base_position_lots(), 10 + 6); - assert!(assert_equal( + assert_eq_fixed_f64!( liqor_data.perps[0].quote_position_native(), -liqor_amount - liqor_amount_2, 0.1 - )); + ); let liqee_data = solana.get_account::(account_0).await; assert_eq!(liqee_data.perps[0].base_position_lots(), 4); - assert!(assert_equal( + assert_eq_fixed_f64!( liqee_data.perps[0].quote_position_native(), -20.0 * 100.0 + liqee_amount + liqee_amount_2, 0.1 - )); + ); // verify health is good again send_tx( @@ -339,28 +339,28 @@ async fn test_liq_perps_base_and_bankruptcy() -> Result<(), TransportError> { let liqee_amount_3 = 10.0 * 100.0 * 1.32 * (1.0 + 0.05); let liqor_data = solana.get_account::(liqor).await; assert_eq!(liqor_data.perps[0].base_position_lots(), 16 - 10); - assert!(assert_equal( + assert_eq_fixed_f64!( liqor_data.perps[0].quote_position_native(), -liqor_amount - liqor_amount_2 + liqor_amount_3, 0.1 - )); + ); let liqee_data = solana.get_account::(account_1).await; assert_eq!(liqee_data.perps[0].base_position_lots(), -10); - assert!(assert_equal( + assert_eq_fixed_f64!( liqee_data.perps[0].quote_position_native(), 20.0 * 100.0 - liqee_amount_3, 0.1 - )); - assert!(assert_equal( + ); + assert_eq_fixed_f64!( perp_market_after.fees_accrued - perp_market_before.fees_accrued, liqee_amount_3 - liqor_amount_3, 0.1, - )); - assert!(assert_equal( + ); + assert_eq_fixed_f64!( perp_market_after.accrued_liquidation_fees - perp_market_before.accrued_liquidation_fees, liqee_amount_3 - liqor_amount_3, 0.1, - )); + ); // // TEST: Liquidate base position max @@ -383,18 +383,18 @@ async fn test_liq_perps_base_and_bankruptcy() -> Result<(), TransportError> { let liqee_amount_4 = 7.0 * 100.0 * 1.32 * (1.0 + 0.05); let liqor_data = solana.get_account::(liqor).await; assert_eq!(liqor_data.perps[0].base_position_lots(), 6 - 7); - assert!(assert_equal( + assert_eq_fixed_f64!( liqor_data.perps[0].quote_position_native(), -liqor_amount - liqor_amount_2 + liqor_amount_3 + liqor_amount_4, 0.1 - )); + ); let liqee_data = solana.get_account::(account_1).await; assert_eq!(liqee_data.perps[0].base_position_lots(), -3); - assert!(assert_equal( + assert_eq_fixed_f64!( liqee_data.perps[0].quote_position_native(), 20.0 * 100.0 - liqee_amount_3 - liqee_amount_4, 0.1 - )); + ); // verify health is good again send_tx( @@ -438,18 +438,18 @@ async fn test_liq_perps_base_and_bankruptcy() -> Result<(), TransportError> { let liqee_amount_5 = 3.0 * 100.0 * 2.0 * (1.0 + 0.05); let liqor_data = solana.get_account::(liqor).await; assert_eq!(liqor_data.perps[0].base_position_lots(), -1 - 3); - assert!(assert_equal( + assert_eq_fixed_f64!( liqor_data.perps[0].quote_position_native(), -liqor_amount - liqor_amount_2 + liqor_amount_3 + liqor_amount_4 + liqor_amount_5, 0.1 - )); + ); let liqee_data = solana.get_account::(account_1).await; assert_eq!(liqee_data.perps[0].base_position_lots(), 0); - assert!(assert_equal( + assert_eq_fixed_f64!( liqee_data.perps[0].quote_position_native(), 20.0 * 100.0 - liqee_amount_3 - liqee_amount_4 - liqee_amount_5, 0.1 - )); + ); // // TEST: Can settle-pnl even though health is negative @@ -481,11 +481,11 @@ async fn test_liq_perps_base_and_bankruptcy() -> Result<(), TransportError> { assert!(remaining_pnl < 0.0); let liqee_data = solana.get_account::(account_1).await; assert_eq!(liqee_data.perps[0].base_position_lots(), 0); - assert!(assert_equal( + assert_eq_fixed_f64!( liqee_data.perps[0].quote_position_native(), remaining_pnl, 0.1 - )); + ); assert_eq!( account_position(solana, account_1, quote_token.bank).await, liqee_quote_deposits_before as i64 @@ -566,27 +566,27 @@ async fn test_liq_perps_base_and_bankruptcy() -> Result<(), TransportError> { // insurance fund was depleted and the liqor received it assert_eq!(solana.token_account_balance(insurance_vault).await, 0); - assert!(assert_equal( + assert_eq_fixed_f64!( liqor_data.tokens[0].native("e_bank), liqor_before.tokens[0].native("e_bank).to_num::() + insurance_vault_funding as f64, 0.1 - )); - assert!(assert_equal( + ); + assert_eq_fixed_f64!( liqor_data.tokens[1].native(&settle_bank), liqor_before.tokens[1].native(&settle_bank).to_num::() - liqee_settle_limit_before as f64, 0.1 - )); + ); // liqor took over the max possible negative pnl - assert!(assert_equal( + assert_eq_fixed_f64!( liqor_data.perps[0].quote_position_native(), liqor_before.perps[0] .quote_position_native() .to_num::() - liq_perp_quote_amount, 0.1 - )); + ); // liqee exited liquidation assert!(account_init_health(solana, account_1).await >= 0.0); @@ -602,21 +602,21 @@ async fn test_liq_perps_base_and_bankruptcy() -> Result<(), TransportError> { .unwrap(); let socialized_amount = (pnl_after - pnl_before).to_num::() - liq_perp_quote_amount; let open_interest = 2 * liqor_data.perps[0].base_position_lots.abs(); - assert!(assert_equal( + assert_eq_fixed_f64!( perp_market.long_funding, socialized_amount / open_interest as f64, 0.1 - )); - assert!(assert_equal( + ); + assert_eq_fixed_f64!( perp_market.short_funding, -socialized_amount / open_interest as f64, 0.1 - )); - assert!(assert_equal( + ); + assert_eq_fixed_f64!( account0_before.perps[0].unsettled_funding(&perp_market), socialized_amount / 2.0, 0.1 - )); + ); Ok(()) } diff --git a/programs/mango-v4/tests/cases/test_liq_perps_positive_pnl.rs b/programs/mango-v4/tests/cases/test_liq_perps_positive_pnl.rs index 3fef042e9..cf734f1f2 100644 --- a/programs/mango-v4/tests/cases/test_liq_perps_positive_pnl.rs +++ b/programs/mango-v4/tests/cases/test_liq_perps_positive_pnl.rs @@ -297,22 +297,22 @@ async fn test_liq_perps_positive_pnl() -> Result<(), TransportError> { let liqor_data = solana.get_account::(liqor).await; assert_eq!(liqor_data.perps[0].base_position_lots(), 1); - assert!(assert_equal( + assert_eq_fixed_f64!( liqor_data.perps[0].quote_position_native(), 100.0 + 600.0 - 2100.0 * 0.95, 0.1 - )); + ); assert_eq!( account_position(solana, liqor, settle_token.bank).await, 10000 - 95 - 570 ); let liqee_data = solana.get_account::(account_0).await; assert_eq!(liqee_data.perps[0].base_position_lots(), 9); - assert!(assert_equal( + assert_eq_fixed_f64!( liqee_data.perps[0].quote_position_native(), -10000.0 - 100.0 - 600.0 + 2100.0 * 0.95, 0.1 - )); + ); assert_eq!( account_position(solana, account_0, settle_token.bank).await, 95 + 570 diff --git a/programs/mango-v4/tests/cases/test_liq_tokens.rs b/programs/mango-v4/tests/cases/test_liq_tokens.rs index db049681d..c20c5eeee 100644 --- a/programs/mango-v4/tests/cases/test_liq_tokens.rs +++ b/programs/mango-v4/tests/cases/test_liq_tokens.rs @@ -421,24 +421,16 @@ async fn test_liq_tokens_with_token() -> Result<(), TransportError> { // The liqee pays for the 20 collateral at a price of 1.02*1.02. The liqor gets 1.01*1.01, // so the platform fee is let platform_fee = 20.0 * (1.0 - 1.01 * 1.01 / (1.02 * 1.02)); - assert!(assert_equal_f64_f64( + assert_eq_f64!( account_position_f64(solana, vault_account, collateral_token2.bank).await, 100000.0 + 20.0 - platform_fee, 0.001, - )); + ); // Verify platform liq fee tracking let colbank = solana.get_account::(collateral_token2.bank).await; - assert!(assert_equal_fixed_f64( - colbank.collected_fees_native, - platform_fee, - 0.001 - )); - assert!(assert_equal_fixed_f64( - colbank.collected_liquidation_fees, - platform_fee, - 0.001 - )); + assert_eq_fixed_f64!(colbank.collected_fees_native, platform_fee, 0.001); + assert_eq_fixed_f64!(colbank.collected_liquidation_fees, platform_fee, 0.001); let liqee = get_mango_account(solana, account).await; assert!(liqee.being_liquidated()); diff --git a/programs/mango-v4/tests/cases/test_margin_trade.rs b/programs/mango-v4/tests/cases/test_margin_trade.rs index 132cde90e..1d06b4441 100644 --- a/programs/mango-v4/tests/cases/test_margin_trade.rs +++ b/programs/mango-v4/tests/cases/test_margin_trade.rs @@ -16,9 +16,6 @@ async fn test_margin_trade() -> Result<(), BanksClientError> { let payer_mint0_account = context.users[1].token_accounts[0]; let loan_origination_fee = 0.0005; - // higher resolution that the loan_origination_fee for one token - let balance_f64eq = |a: f64, b: f64| utils::assert_equal_f64_f64(a, b, 0.0001); - // // SETUP: Create a group, account, register a token (mint0) // @@ -173,10 +170,11 @@ async fn test_margin_trade() -> Result<(), BanksClientError> { margin_account_initial + withdraw_amount - deposit_amount ); // no fee because user had positive balance - assert!(balance_f64eq( + assert_eq_f64!( account_position_f64(solana, account, bank).await, - (deposit_amount_initial - withdraw_amount + deposit_amount) as f64 - )); + (deposit_amount_initial - withdraw_amount + deposit_amount) as f64, + 0.0001 + ); // // TEST: Bringing the balance to 0 deactivates the token @@ -210,10 +208,11 @@ async fn test_margin_trade() -> Result<(), BanksClientError> { solana.token_account_balance(margin_account).await, margin_account_initial - deposit_amount ); - assert!(balance_f64eq( + assert_eq_f64!( account_position_f64(solana, account, bank).await, - deposit_amount as f64 - )); + deposit_amount as f64, + 0.0001 + ); // // TEST: Try loan fees by withdrawing more than the user balance @@ -232,11 +231,12 @@ async fn test_margin_trade() -> Result<(), BanksClientError> { solana.token_account_balance(margin_account).await, margin_account_initial + withdraw_amount - deposit_amount ); - assert!(balance_f64eq( + assert_eq_f64!( account_position_f64(solana, account, bank).await, (deposit_amount_initial + deposit_amount - withdraw_amount) as f64 - - (withdraw_amount - deposit_amount_initial) as f64 * loan_origination_fee - )); + - (withdraw_amount - deposit_amount_initial) as f64 * loan_origination_fee, + 0.0001 + ); Ok(()) } @@ -255,9 +255,6 @@ async fn test_flash_loan_swap_fee() -> Result<(), BanksClientError> { let owner_accounts = context.users[0].token_accounts.clone(); let payer_accounts = context.users[1].token_accounts.clone(); - // higher resolution that the loan_origination_fee for one token - let balance_f64eq = |a: f64, b: f64| utils::assert_equal_f64_f64(a, b, 0.0001); - // // SETUP: Create a group, account, register a token (mint0) // @@ -414,13 +411,14 @@ async fn test_flash_loan_swap_fee() -> Result<(), BanksClientError> { ); let mango_withdraw_amount = account_position_f64(solana, account, tokens[0].bank).await; - assert!(balance_f64eq( + assert_eq_f64!( mango_withdraw_amount, - initial_deposit as f64 - withdraw_amount as f64 * (1.0 + swap_fee_rate) - )); + initial_deposit as f64 - withdraw_amount as f64 * (1.0 + swap_fee_rate), + 0.0001 + ); let mango_deposit_amount = account_position_f64(solana, account, tokens[1].bank).await; - assert!(balance_f64eq(mango_deposit_amount, deposit_amount as f64)); + assert_eq_f64!(mango_deposit_amount, deposit_amount as f64, 0.0001); Ok(()) } diff --git a/programs/mango-v4/tests/cases/test_perp.rs b/programs/mango-v4/tests/cases/test_perp.rs index 93b4916bc..2db63a045 100644 --- a/programs/mango-v4/tests/cases/test_perp.rs +++ b/programs/mango-v4/tests/cases/test_perp.rs @@ -287,19 +287,19 @@ async fn test_perp_fixed() -> Result<(), TransportError> { let mango_account_0 = solana.get_account::(account_0).await; assert_eq!(mango_account_0.perps[0].base_position_lots(), 1); - assert!(assert_equal( + assert_eq_fixed_f64!( mango_account_0.perps[0].quote_position_native(), -99.99, 0.001 - )); + ); let mango_account_1 = solana.get_account::(account_1).await; assert_eq!(mango_account_1.perps[0].base_position_lots(), -1); - assert!(assert_equal( + assert_eq_fixed_f64!( mango_account_1.perps[0].quote_position_native(), 99.98, 0.001 - )); + ); // // TEST: closing perp positions @@ -364,19 +364,19 @@ async fn test_perp_fixed() -> Result<(), TransportError> { let mango_account_0 = solana.get_account::(account_0).await; assert_eq!(mango_account_0.perps[0].base_position_lots(), 0); - assert!(assert_equal( + assert_eq_fixed_f64!( mango_account_0.perps[0].quote_position_native(), 0.02, 0.001 - )); + ); let mango_account_1 = solana.get_account::(account_1).await; assert_eq!(mango_account_1.perps[0].base_position_lots(), 0); - assert!(assert_equal( + assert_eq_fixed_f64!( mango_account_1.perps[0].quote_position_native(), -0.04, 0.001 - )); + ); // settle pnl and fees to bring quote_position_native fully to 0 send_tx( @@ -644,19 +644,19 @@ async fn test_perp_oracle_peg() -> Result<(), TransportError> { let mango_account_0 = solana.get_account::(account_0).await; assert_eq!(mango_account_0.perps[0].base_position_lots(), 2); - assert!(assert_equal( + assert_eq_fixed_f64!( mango_account_0.perps[0].quote_position_native(), -19998.0, 0.001 - )); + ); let mango_account_1 = solana.get_account::(account_1).await; assert_eq!(mango_account_1.perps[0].base_position_lots(), -2); - assert!(assert_equal( + assert_eq_fixed_f64!( mango_account_1.perps[0].quote_position_native(), 19996.0, 0.001 - )); + ); // // TEST: Place a pegged order and check how it behaves with oracle changes @@ -1008,30 +1008,18 @@ async fn test_perp_realize_partially() -> Result<(), TransportError> { let mango_account_0 = solana.get_account::(account_0).await; let perp_0 = mango_account_0.perps[0]; assert_eq!(perp_0.base_position_lots(), 1); - assert!(assert_equal( + assert_eq_fixed_f64!( perp_0.quote_position_native(), -200_000.0 + 150_000.0, 0.001 - )); - assert!(assert_equal( - perp_0.realized_pnl_for_position_native, - 50_000.0, - 0.001 - )); + ); + assert_eq_fixed_f64!(perp_0.realized_pnl_for_position_native, 50_000.0, 0.001); let mango_account_1 = solana.get_account::(account_1).await; let perp_1 = mango_account_1.perps[0]; assert_eq!(perp_1.base_position_lots(), -1); - assert!(assert_equal( - perp_1.quote_position_native(), - 200_000.0 - 150_000.0, - 0.001 - )); - assert!(assert_equal( - perp_1.realized_pnl_for_position_native, - -50_000.0, - 0.001 - )); + assert_eq_fixed_f64!(perp_1.quote_position_native(), 200_000.0 - 150_000.0, 0.001); + assert_eq_fixed_f64!(perp_1.realized_pnl_for_position_native, -50_000.0, 0.001); Ok(()) } diff --git a/programs/mango-v4/tests/cases/test_perp_settle.rs b/programs/mango-v4/tests/cases/test_perp_settle.rs index cc3fbb956..ec5f120ad 100644 --- a/programs/mango-v4/tests/cases/test_perp_settle.rs +++ b/programs/mango-v4/tests/cases/test_perp_settle.rs @@ -176,7 +176,7 @@ async fn test_perp_settle_pnl_basic() -> Result<(), TransportError> { } // Cannot settle with yourself - let result = send_tx( + send_tx_expect_error!( solana, PerpSettlePnlInstruction { settler, @@ -185,17 +185,11 @@ async fn test_perp_settle_pnl_basic() -> Result<(), TransportError> { account_b: account_0, perp_market, }, - ) - .await; - - assert_mango_error( - &result, - MangoError::CannotSettleWithSelf.into(), - "Cannot settle with yourself".to_string(), + MangoError::CannotSettleWithSelf ); // Cannot settle position that does not exist - let result = send_tx( + send_tx_expect_error!( solana, PerpSettlePnlInstruction { settler, @@ -204,13 +198,7 @@ async fn test_perp_settle_pnl_basic() -> Result<(), TransportError> { account_b: account_1, perp_market: perp_market_2, }, - ) - .await; - - assert_mango_error( - &result, - MangoError::PerpPositionDoesNotExist.into(), - "Cannot settle a position that does not exist".to_string(), + MangoError::PerpPositionDoesNotExist ); // TODO: Test funding settlement @@ -235,7 +223,7 @@ async fn test_perp_settle_pnl_basic() -> Result<(), TransportError> { set_perp_stub_oracle_price(solana, group, perp_market, &tokens[1], admin, 1200.0).await; // Account a must be the profitable one - let result = send_tx( + send_tx_expect_error!( solana, PerpSettlePnlInstruction { settler, @@ -244,13 +232,7 @@ async fn test_perp_settle_pnl_basic() -> Result<(), TransportError> { account_b: account_0, perp_market, }, - ) - .await; - - assert_mango_error( - &result, - MangoError::ProfitabilityMismatch.into(), - "Account a must be the profitable one".to_string(), + MangoError::ProfitabilityMismatch ); // Change the oracle to a more reasonable price @@ -1038,7 +1020,7 @@ async fn test_perp_pnl_settle_limit() -> Result<(), TransportError> { // Test 2: Once the settle limit is exhausted, we can't settle more // // we are in the same window, and we settled max. possible in previous attempt - let result = send_tx( + send_tx_expect_error!( solana, PerpSettlePnlInstruction { settler, @@ -1047,12 +1029,7 @@ async fn test_perp_pnl_settle_limit() -> Result<(), TransportError> { account_b: account_1, perp_market, }, - ) - .await; - assert_mango_error( - &result, - MangoError::ProfitabilityMismatch.into(), - "Account A has no settleable positive pnl left".to_string(), + MangoError::ProfitabilityMismatch ); // diff --git a/programs/mango-v4/tests/cases/test_perp_settle_fees.rs b/programs/mango-v4/tests/cases/test_perp_settle_fees.rs index 7867942b6..421655685 100644 --- a/programs/mango-v4/tests/cases/test_perp_settle_fees.rs +++ b/programs/mango-v4/tests/cases/test_perp_settle_fees.rs @@ -166,52 +166,40 @@ async fn test_perp_settle_fees() -> Result<(), TransportError> { let mango_account_0 = solana.get_account::(account_0).await; assert_eq!(mango_account_0.perps[0].base_position_lots(), 1); - assert!(assert_equal( + assert_eq_fixed_f64!( mango_account_0.perps[0].quote_position_native(), -100_020.0, 0.01 - )); + ); let mango_account_1 = solana.get_account::(account_1).await; assert_eq!(mango_account_1.perps[0].base_position_lots(), -1); - assert!(assert_equal( + assert_eq_fixed_f64!( mango_account_1.perps[0].quote_position_native(), 100_000.0, 0.01 - )); + ); // Cannot settle position that does not exist - let result = send_tx( + send_tx_expect_error!( solana, PerpSettleFeesInstruction { account: account_1, perp_market: perp_market_2, max_settle_amount: u64::MAX, }, - ) - .await; - - assert_mango_error( - &result, - MangoError::PerpPositionDoesNotExist.into(), - "Cannot settle a position that does not exist".to_string(), + MangoError::PerpPositionDoesNotExist ); // max_settle_amount must be greater than zero - let result = send_tx( + send_tx_expect_error!( solana, PerpSettleFeesInstruction { account: account_1, perp_market: perp_market, max_settle_amount: 0, }, - ) - .await; - - assert_mango_error( - &result, - MangoError::MaxSettleAmountMustBeGreaterThanZero.into(), - "max_settle_amount must be greater than zero".to_string(), + MangoError::MaxSettleAmountMustBeGreaterThanZero ); // TODO: Test funding settlement @@ -247,20 +235,20 @@ async fn test_perp_settle_fees() -> Result<(), TransportError> { // No change { let perp_market = solana.get_account::(perp_market).await; - assert!(assert_equal( + assert_eq_fixed_f64!( mango_account_0.perps[0] .unsettled_pnl(&perp_market, I80F48::from(1200)) .unwrap(), 19980.0, // 1*100*(1200-1000) - (20 in fees) 0.01 - )); - assert!(assert_equal( + ); + assert_eq_fixed_f64!( mango_account_1.perps[0] .unsettled_pnl(&perp_market, I80F48::from(1200)) .unwrap(), -20000.0, 0.01 - )); + ); } // TODO: Difficult to test health due to fees being so small. Need alternative diff --git a/programs/mango-v4/tests/cases/test_serum.rs b/programs/mango-v4/tests/cases/test_serum.rs index 20bf59fa3..87ef5cd5f 100644 --- a/programs/mango-v4/tests/cases/test_serum.rs +++ b/programs/mango-v4/tests/cases/test_serum.rs @@ -579,7 +579,7 @@ async fn test_serum_loan_origination_fees() -> Result<(), TransportError> { .get_account::(quote_bank) .await .collected_fees_native; - assert!(assert_equal(quote_fees2 - quote_fees1, 0.0, 0.1)); + assert_eq_fixed_f64!(quote_fees2 - quote_fees1, 0.0, 0.1); // check account2 balances too context @@ -610,11 +610,11 @@ async fn test_serum_loan_origination_fees() -> Result<(), TransportError> { .get_account::(quote_bank) .await .collected_fees_native; - assert!(assert_equal( + assert_eq_fixed_f64!( quote_fees3 - quote_fees1, loan_origination_fee(fill_amount - deposit_amount) as f64, 0.1 - )); + ); order_placer.settle().await; @@ -623,11 +623,11 @@ async fn test_serum_loan_origination_fees() -> Result<(), TransportError> { .get_account::(quote_bank) .await .collected_fees_native; - assert!(assert_equal( + assert_eq_fixed_f64!( quote_fees4 - quote_fees3, serum_fee(fill_amount) as f64, 0.1 - )); + ); let account_data = solana.get_account::(account).await; assert_eq!( @@ -720,11 +720,11 @@ async fn test_serum_settle_v1() -> Result<(), TransportError> { .get_account::(quote_bank) .await .collected_fees_native; - assert!(assert_equal( + assert_eq_fixed_f64!( quote_fees_end - quote_fees_start, (lof + serum_referrer_fee(amount)) as f64, 0.1 - )); + ); Ok(()) } @@ -817,11 +817,11 @@ async fn test_serum_settle_v2_to_dao() -> Result<(), TransportError> { .get_account::(quote_bank) .await .collected_fees_native; - assert!(assert_equal( + assert_eq_fixed_f64!( quote_fees_end - quote_fees_start, (lof + serum_referrer_fee(amount)) as f64, 0.1 - )); + ); let account_data = solana.get_account::(account).await; assert_eq!( @@ -913,11 +913,7 @@ async fn test_serum_settle_v2_to_account() -> Result<(), TransportError> { .get_account::(quote_bank) .await .collected_fees_native; - assert!(assert_equal( - quote_fees_end - quote_fees_start, - lof as f64, - 0.1 - )); + assert_eq_fixed_f64!(quote_fees_end - quote_fees_start, lof as f64, 0.1); let account_data = solana.get_account::(account).await; assert_eq!(account_data.buyback_fees_accrued_current, 0); diff --git a/programs/mango-v4/tests/cases/test_token_conditional_swap.rs b/programs/mango-v4/tests/cases/test_token_conditional_swap.rs index 0945afff5..2f59f8eba 100644 --- a/programs/mango-v4/tests/cases/test_token_conditional_swap.rs +++ b/programs/mango-v4/tests/cases/test_token_conditional_swap.rs @@ -2,8 +2,6 @@ use super::*; #[tokio::test] async fn test_token_conditional_swap_basic() -> Result<(), TransportError> { - pub use utils::assert_equal_f64_f64 as assert_equal_f_f; - let context = TestContext::new().await; let solana = &context.solana.clone(); @@ -263,17 +261,17 @@ async fn test_token_conditional_swap_basic() -> Result<(), TransportError> { let liqee_quote = account_position_f64(solana, account, quote_token.bank).await; let liqee_base = account_position_f64(solana, account, base_token.bank).await; - assert!(assert_equal_f_f( + assert_eq_f64!( liqee_quote, deposit_amount + 42.0, // roughly 50 / (1.1 * 1.1) 0.01 - )); - assert!(assert_equal_f_f(liqee_base, deposit_amount - 50.0, 0.01)); + ); + assert_eq_f64!(liqee_base, deposit_amount - 50.0, 0.01); let liqor_quote = account_position_f64(solana, liqor, quote_token.bank).await; let liqor_base = account_position_f64(solana, liqor, base_token.bank).await; - assert!(assert_equal_f_f(liqor_quote, deposit_amount - 42.0, 0.01)); - assert!(assert_equal_f_f(liqor_base, deposit_amount + 44.0, 0.01)); // roughly 42*1.1*0.95 + assert_eq_f64!(liqor_quote, deposit_amount - 42.0, 0.01); + assert_eq_f64!(liqor_base, deposit_amount + 44.0, 0.01); // roughly 42*1.1*0.95 // // TEST: requiring a too-high min buy token execution makes it fail @@ -315,13 +313,13 @@ async fn test_token_conditional_swap_basic() -> Result<(), TransportError> { let liqee_quote = account_position_f64(solana, account, quote_token.bank).await; let liqee_base = account_position_f64(solana, account, base_token.bank).await; - assert!(assert_equal_f_f(liqee_quote, deposit_amount + 84.0, 0.01)); - assert!(assert_equal_f_f(liqee_base, deposit_amount - 100.0, 0.01)); + assert_eq_f64!(liqee_quote, deposit_amount + 84.0, 0.01); + assert_eq_f64!(liqee_base, deposit_amount - 100.0, 0.01); let liqor_quote = account_position_f64(solana, liqor, quote_token.bank).await; let liqor_base = account_position_f64(solana, liqor, base_token.bank).await; - assert!(assert_equal_f_f(liqor_quote, deposit_amount - 84.0, 0.01)); - assert!(assert_equal_f_f(liqor_base, deposit_amount + 88.0, 0.01)); + assert_eq_f64!(liqor_quote, deposit_amount - 84.0, 0.01); + assert_eq_f64!(liqor_base, deposit_amount + 88.0, 0.01); let account_data = get_mango_account(solana, account).await; assert!(!account_data @@ -334,8 +332,6 @@ async fn test_token_conditional_swap_basic() -> Result<(), TransportError> { #[tokio::test] async fn test_token_conditional_swap_linear_auction() -> Result<(), TransportError> { - pub use utils::assert_equal_f64_f64 as assert_equal_f_f; - let context = TestContext::new().await; let solana = &context.solana.clone(); @@ -460,7 +456,7 @@ async fn test_token_conditional_swap_linear_auction() -> Result<(), TransportErr // TEST: Can't take an auction at any price when it's not started yet // - let res = send_tx( + send_tx_expect_error!( solana, TokenConditionalSwapTriggerInstruction { liqee: account, @@ -472,12 +468,7 @@ async fn test_token_conditional_swap_linear_auction() -> Result<(), TransportErr min_buy_token: 0, min_taker_price: 0.0, }, - ) - .await; - assert_mango_error( - &res, - MangoError::TokenConditionalSwapNotStarted.into(), - "tcs should not be started yet".to_string(), + MangoError::TokenConditionalSwapNotStarted ); // @@ -507,21 +498,13 @@ async fn test_token_conditional_swap_linear_auction() -> Result<(), TransportErr let account_quote = account_position_f64(solana, account, quote_token.bank).await; let account_base = account_position_f64(solana, account, base_token.bank).await; - assert!(assert_equal_f64_f64( - account_quote, - account_quote_expected, - 0.1 - )); - assert!(assert_equal_f64_f64( - account_base, - account_base_expected, - 0.1 - )); + assert_eq_f64!(account_quote, account_quote_expected, 0.1); + assert_eq_f64!(account_base, account_base_expected, 0.1); let liqor_quote = account_position_f64(solana, liqor, quote_token.bank).await; let liqor_base = account_position_f64(solana, liqor, base_token.bank).await; - assert!(assert_equal_f64_f64(liqor_quote, liqor_quote_expected, 0.1)); - assert!(assert_equal_f64_f64(liqor_base, liqor_base_expected, 0.1)); + assert_eq_f64!(liqor_quote, liqor_quote_expected, 0.1); + assert_eq_f64!(liqor_base, liqor_base_expected, 0.1); // // TEST: Stays at end price after end and before expiry @@ -550,27 +533,19 @@ async fn test_token_conditional_swap_linear_auction() -> Result<(), TransportErr let account_quote = account_position_f64(solana, account, quote_token.bank).await; let account_base = account_position_f64(solana, account, base_token.bank).await; - assert!(assert_equal_f64_f64( - account_quote, - account_quote_expected, - 0.1 - )); - assert!(assert_equal_f64_f64( - account_base, - account_base_expected, - 0.1 - )); + assert_eq_f64!(account_quote, account_quote_expected, 0.1); + assert_eq_f64!(account_base, account_base_expected, 0.1); let liqor_quote = account_position_f64(solana, liqor, quote_token.bank).await; let liqor_base = account_position_f64(solana, liqor, base_token.bank).await; - assert!(assert_equal_f64_f64(liqor_quote, liqor_quote_expected, 0.1)); - assert!(assert_equal_f64_f64(liqor_base, liqor_base_expected, 0.1)); + assert_eq_f64!(liqor_quote, liqor_quote_expected, 0.1); + assert_eq_f64!(liqor_base, liqor_base_expected, 0.1); // // TEST: Can't take when expired // solana.set_clock_timestamp(initial_time + 22).await; - let res = send_tx( + send_tx_expect_error!( solana, TokenConditionalSwapTriggerInstruction { liqee: account, @@ -582,12 +557,7 @@ async fn test_token_conditional_swap_linear_auction() -> Result<(), TransportErr min_buy_token: 1, min_taker_price: 0.0, }, - ) - .await; - assert_mango_error( - &res, - MangoError::TokenConditionalSwapExpired.into(), - "tcs should be expired".to_string(), + MangoError::TokenConditionalSwapExpired ); Ok(()) @@ -595,8 +565,6 @@ async fn test_token_conditional_swap_linear_auction() -> Result<(), TransportErr #[tokio::test] async fn test_token_conditional_swap_premium_auction() -> Result<(), TransportError> { - pub use utils::assert_equal_f64_f64 as assert_equal_f_f; - let context = TestContext::new().await; let solana = &context.solana.clone(); @@ -720,7 +688,7 @@ async fn test_token_conditional_swap_premium_auction() -> Result<(), TransportEr // set_bank_stub_oracle_price(solana, group, &base_token, admin, 10.0).await; - let res = send_tx( + send_tx_expect_error!( solana, TokenConditionalSwapTriggerInstruction { liqee: account, @@ -732,15 +700,10 @@ async fn test_token_conditional_swap_premium_auction() -> Result<(), TransportEr min_buy_token: 0, min_taker_price: 0.0, }, - ) - .await; - assert_mango_error( - &res, - MangoError::TokenConditionalSwapNotStarted.into(), - "not started yet".to_string(), + MangoError::TokenConditionalSwapNotStarted ); - let res = send_tx( + send_tx_expect_error!( solana, TokenConditionalSwapStartInstruction { liqee: account, @@ -748,19 +711,14 @@ async fn test_token_conditional_swap_premium_auction() -> Result<(), TransportEr liqor_owner: owner, index: 0, }, - ) - .await; - assert_mango_error( - &res, - MangoError::TokenConditionalSwapPriceNotInRange.into(), - "price not in range".to_string(), + MangoError::TokenConditionalSwapPriceNotInRange ); // // TEST: Cannot trigger without start // set_bank_stub_oracle_price(solana, group, &base_token, admin, 1.0).await; - let res = send_tx( + send_tx_expect_error!( solana, TokenConditionalSwapTriggerInstruction { liqee: account, @@ -772,12 +730,7 @@ async fn test_token_conditional_swap_premium_auction() -> Result<(), TransportEr min_buy_token: 1, min_taker_price: 0.0, }, - ) - .await; - assert_mango_error( - &res, - MangoError::TokenConditionalSwapNotStarted.into(), - "not started yet".to_string(), + MangoError::TokenConditionalSwapNotStarted ); send_tx( @@ -815,21 +768,13 @@ async fn test_token_conditional_swap_premium_auction() -> Result<(), TransportEr let account_quote = account_position_f64(solana, account, quote_token.bank).await; let account_base = account_position_f64(solana, account, base_token.bank).await; - assert!(assert_equal_f64_f64( - account_quote, - account_quote_expected, - 0.1 - )); - assert!(assert_equal_f64_f64( - account_base, - account_base_expected, - 0.1 - )); + assert_eq_f64!(account_quote, account_quote_expected, 0.1); + assert_eq_f64!(account_base, account_base_expected, 0.1); let liqor_quote = account_position_f64(solana, liqor, quote_token.bank).await; let liqor_base = account_position_f64(solana, liqor, base_token.bank).await; - assert!(assert_equal_f64_f64(liqor_quote, liqor_quote_expected, 0.1)); - assert!(assert_equal_f64_f64(liqor_base, liqor_base_expected, 0.1)); + assert_eq_f64!(liqor_quote, liqor_quote_expected, 0.1); + assert_eq_f64!(liqor_base, liqor_base_expected, 0.1); let account_data = get_mango_account(solana, account).await; let tcs = account_data @@ -866,21 +811,13 @@ async fn test_token_conditional_swap_premium_auction() -> Result<(), TransportEr let account_quote = account_position_f64(solana, account, quote_token.bank).await; let account_base = account_position_f64(solana, account, base_token.bank).await; - assert!(assert_equal_f64_f64( - account_quote, - account_quote_expected, - 0.1 - )); - assert!(assert_equal_f64_f64( - account_base, - account_base_expected, - 0.1 - )); + assert_eq_f64!(account_quote, account_quote_expected, 0.1); + assert_eq_f64!(account_base, account_base_expected, 0.1); let liqor_quote = account_position_f64(solana, liqor, quote_token.bank).await; let liqor_base = account_position_f64(solana, liqor, base_token.bank).await; - assert!(assert_equal_f64_f64(liqor_quote, liqor_quote_expected, 0.1)); - assert!(assert_equal_f64_f64(liqor_base, liqor_base_expected, 0.1)); + assert_eq_f64!(liqor_quote, liqor_quote_expected, 0.1); + assert_eq_f64!(liqor_base, liqor_base_expected, 0.1); // // TEST: Premium stops at max increases @@ -910,21 +847,13 @@ async fn test_token_conditional_swap_premium_auction() -> Result<(), TransportEr let account_quote = account_position_f64(solana, account, quote_token.bank).await; let account_base = account_position_f64(solana, account, base_token.bank).await; - assert!(assert_equal_f64_f64( - account_quote, - account_quote_expected, - 0.1 - )); - assert!(assert_equal_f64_f64( - account_base, - account_base_expected, - 0.1 - )); + assert_eq_f64!(account_quote, account_quote_expected, 0.1); + assert_eq_f64!(account_base, account_base_expected, 0.1); let liqor_quote = account_position_f64(solana, liqor, quote_token.bank).await; let liqor_base = account_position_f64(solana, liqor, base_token.bank).await; - assert!(assert_equal_f64_f64(liqor_quote, liqor_quote_expected, 0.1)); - assert!(assert_equal_f64_f64(liqor_base, liqor_base_expected, 0.1)); + assert_eq_f64!(liqor_quote, liqor_quote_expected, 0.1); + assert_eq_f64!(liqor_base, liqor_base_expected, 0.1); // // SETUP: make another premium auction to test starting @@ -954,7 +883,7 @@ async fn test_token_conditional_swap_premium_auction() -> Result<(), TransportEr // TEST: Can't start if oracle not in range // - let res = send_tx( + send_tx_expect_error!( solana, TokenConditionalSwapStartInstruction { liqee: account, @@ -962,12 +891,7 @@ async fn test_token_conditional_swap_premium_auction() -> Result<(), TransportEr liqor_owner: owner, index: 1, }, - ) - .await; - assert_mango_error( - &res, - MangoError::TokenConditionalSwapPriceNotInRange.into(), - "price is not in range".to_string(), + MangoError::TokenConditionalSwapPriceNotInRange ); // @@ -998,7 +922,7 @@ async fn test_token_conditional_swap_premium_auction() -> Result<(), TransportEr // TEST: Can't start a second time // - let res = send_tx( + send_tx_expect_error!( solana, TokenConditionalSwapStartInstruction { liqee: account, @@ -1006,12 +930,7 @@ async fn test_token_conditional_swap_premium_auction() -> Result<(), TransportEr liqor_owner: owner, index: 1, }, - ) - .await; - assert_mango_error( - &res, - MangoError::TokenConditionalSwapAlreadyStarted.into(), - "already started".to_string(), + MangoError::TokenConditionalSwapAlreadyStarted ); Ok(()) @@ -1019,8 +938,6 @@ async fn test_token_conditional_swap_premium_auction() -> Result<(), TransportEr #[tokio::test] async fn test_token_conditional_swap_deposit_limit() -> Result<(), TransportError> { - pub use utils::assert_equal_f64_f64 as assert_equal_f_f; - let context = TestContext::new().await; let solana = &context.solana.clone(); diff --git a/programs/mango-v4/tests/cases/test_token_update_index_and_rate.rs b/programs/mango-v4/tests/cases/test_token_update_index_and_rate.rs index 29a197a4a..242125c42 100644 --- a/programs/mango-v4/tests/cases/test_token_update_index_and_rate.rs +++ b/programs/mango-v4/tests/cases/test_token_update_index_and_rate.rs @@ -78,22 +78,22 @@ async fn test_token_update_index_and_rate() -> Result<(), TransportError> { let interest_change = 5000.0 * (dynamic_rate + loan_fee_rate) * diff_ts / year; let fee_change = 5000.0 * loan_fee_rate * diff_ts / year; - assert!(assert_equal( + assert_eq_fixed_f64!( bank_after.native_borrows() - bank_before.native_borrows(), interest_change, 0.1 - )); - assert!(assert_equal( + ); + assert_eq_fixed_f64!( bank_after.native_deposits() - bank_before.native_deposits(), interest_change, 0.1 - )); - assert!(assert_equal( + ); + assert_eq_fixed_f64!( bank_after.collected_fees_native - bank_before.collected_fees_native, fee_change, 0.1 - )); - assert!(assert_equal(bank_after.avg_utilization, utilization, 0.01)); + ); + assert_eq_fixed_f64!(bank_after.avg_utilization, utilization, 0.01); Ok(()) } @@ -140,19 +140,11 @@ async fn test_token_rates_migrate() -> Result<(), TransportError> { let bank_after = solana.get_account::(tokens[0].bank).await; - assert!(assert_equal_fixed_f64(bank_after.rate0, 0.07 / 3.0, 0.0001)); - assert!(assert_equal_fixed_f64(bank_after.rate1, 0.9 / 3.0, 0.0001)); - assert!(assert_equal_fixed_f64(bank_after.max_rate, 0.5, 0.0001)); - assert!(assert_equal_f64_f64( - bank_after.interest_curve_scaling, - 3.0, - 0.0001 - )); - assert!(assert_equal_f64_f64( - bank_after.interest_target_utilization as f64, - 0.4, - 0.0001 - )); + assert_eq_fixed_f64!(bank_after.rate0, 0.07 / 3.0, 0.0001); + assert_eq_fixed_f64!(bank_after.rate1, 0.9 / 3.0, 0.0001); + assert_eq_fixed_f64!(bank_after.max_rate, 0.5, 0.0001); + assert_eq_f64!(bank_after.interest_curve_scaling, 3.0, 0.0001); + assert_eq_f64!(bank_after.interest_target_utilization as f64, 0.4, 0.0001); Ok(()) } diff --git a/programs/mango-v4/tests/program_test/utils.rs b/programs/mango-v4/tests/program_test/utils.rs index d774f541f..a42ae133e 100644 --- a/programs/mango-v4/tests/program_test/utils.rs +++ b/programs/mango-v4/tests/program_test/utils.rs @@ -1,7 +1,6 @@ #![allow(dead_code)] use bytemuck::{bytes_of, Contiguous}; -use fixed::types::I80F48; use solana_program::instruction::InstructionError; use solana_program::program_error::ProgramError; use solana_sdk::pubkey::Pubkey; @@ -97,18 +96,22 @@ pub fn assert_mango_error( } } -pub fn assert_equal_fixed_f64(value: I80F48, expected: f64, max_error: f64) -> bool { - let ok = (value.to_num::() - expected).abs() < max_error; - if !ok { - println!("comparison failed: value: {value}, expected: {expected}"); - } - ok +#[macro_export] +macro_rules! assert_eq_f64 { + ($value:expr, $expected:expr, $max_error:expr $(,)?) => { + let value = $value; + let expected = $expected; + let ok = (value - expected).abs() < $max_error; + if !ok { + println!("comparison failed: value: {value}, expected: {expected}"); + } + assert!(ok); + }; } -pub fn assert_equal_f64_f64(value: f64, expected: f64, max_error: f64) -> bool { - let ok = (value - expected).abs() < max_error; - if !ok { - println!("comparison failed: value: {value}, expected: {expected}"); - } - ok +#[macro_export] +macro_rules! assert_eq_fixed_f64 { + ($value:expr, $expected:expr, $max_error:expr $(,)?) => { + assert_eq_f64!($value.to_num::(), $expected, $max_error); + }; } From aa9bc8b1f1149b2f6e5c27f35e653427f965aa32 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Tue, 27 Feb 2024 15:56:14 +0100 Subject: [PATCH 03/31] Bank: more parameter sanity checks (#895) --- programs/mango-v4/src/state/bank.rs | 9 +++++++-- programs/mango-v4/tests/cases/test_basic.rs | 2 ++ programs/mango-v4/tests/cases/test_force_close.rs | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/programs/mango-v4/src/state/bank.rs b/programs/mango-v4/src/state/bank.rs index 6f378a69c..cfc6aea3d 100644 --- a/programs/mango-v4/src/state/bank.rs +++ b/programs/mango-v4/src/state/bank.rs @@ -394,14 +394,18 @@ impl Bank { require_gte!(self.rate0, I80F48::ZERO); require_gte!(self.rate1, I80F48::ZERO); require_gte!(self.max_rate, I80F48::ZERO); + require_gte!(self.adjustment_factor, 0.0); require_gte!(self.loan_fee_rate, 0.0); require_gte!(self.loan_origination_fee_rate, 0.0); - require_gte!(self.maint_asset_weight, 0.0); + require_gte!(self.stable_price_model.delay_growth_limit, 0.0); + require_gte!(self.stable_price_model.stable_growth_limit, 0.0); require_gte!(self.init_asset_weight, 0.0); + require_gte!(self.maint_asset_weight, self.init_asset_weight); require_gte!(self.maint_liab_weight, 0.0); - require_gte!(self.init_liab_weight, 0.0); + require_gte!(self.init_liab_weight, self.maint_liab_weight); require_gte!(self.liquidation_fee, 0.0); require_gte!(self.min_vault_to_deposits_ratio, 0.0); + require_gte!(1.0, self.min_vault_to_deposits_ratio); require_gte!(self.net_borrow_limit_per_window_quote, -1); require_gt!(self.borrow_weight_scale_start_quote, 0.0); require_gt!(self.deposit_weight_scale_start_quote, 0.0); @@ -411,6 +415,7 @@ impl Bank { require_gte!(self.flash_loan_swap_fee_rate, 0.0); require_gte!(self.interest_curve_scaling, 1.0); require_gte!(self.interest_target_utilization, 0.0); + require_gte!(1.0, self.interest_target_utilization); require_gte!(self.maint_weight_shift_duration_inv, 0.0); require_gte!(self.maint_weight_shift_asset_target, 0.0); require_gte!(self.maint_weight_shift_liab_target, 0.0); diff --git a/programs/mango-v4/tests/cases/test_basic.rs b/programs/mango-v4/tests/cases/test_basic.rs index 928d2940a..50be1f45d 100644 --- a/programs/mango-v4/tests/cases/test_basic.rs +++ b/programs/mango-v4/tests/cases/test_basic.rs @@ -462,6 +462,8 @@ async fn test_bank_maint_weight_shift() -> Result<(), TransportError> { mint: mints[0].pubkey, fallback_oracle: Pubkey::default(), options: mango_v4::instruction::TokenEdit { + init_asset_weight_opt: Some(0.0), + init_liab_weight_opt: Some(2.0), maint_weight_shift_start_opt: Some(start_time + 1000), maint_weight_shift_end_opt: Some(start_time + 2000), maint_weight_shift_asset_target_opt: Some(0.5), diff --git a/programs/mango-v4/tests/cases/test_force_close.rs b/programs/mango-v4/tests/cases/test_force_close.rs index f6e5ecee0..e2098b028 100644 --- a/programs/mango-v4/tests/cases/test_force_close.rs +++ b/programs/mango-v4/tests/cases/test_force_close.rs @@ -501,6 +501,7 @@ async fn test_force_withdraw_token() -> Result<(), TransportError> { mint: token.mint.pubkey, fallback_oracle: Pubkey::default(), options: mango_v4::instruction::TokenEdit { + init_asset_weight_opt: Some(0.0), maint_asset_weight_opt: Some(0.0), reduce_only_opt: Some(1), disable_asset_liquidation_opt: Some(true), From fd5914f1fc14d0099426a9f17f09286f2ced3466 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Wed, 28 Feb 2024 15:49:18 +0100 Subject: [PATCH 04/31] doc: releasing.md update --- RELEASING.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 01496df95..74703dd03 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -7,19 +7,18 @@ - 4MangoMjqJ2firMokCjjGgoK8d4MXcrgL7XJaL3w6fVg is the address of the Mango v4 Program - FP4PxqHTVzeG2c6eZd7974F9WvKUSdBeduUK3rjYyvBw is the address of the Mango v4 Program Governance -- Check out the latest version of the `dev` branch +- Assuming there's a release branch (like release/program-v0.22.0) + with a completed audit and an updated changelog. -- Update the changelog - - git log program-v0.11.0..HEAD -- programs/mango-v4/ +- Check out the release branch - Make sure the version is bumped in programs/mango-v4/Cargo.toml -- Update the idl ./update-local-idl.sh +- Update the idl ./update-local-idl.sh and verify that there's no difference -- Run the tests to double check +- Run the tests to double check there are no failures -- Tag and push +- Tag (`git tag program-v0.xy.z HEAD`) and push it (`git push `) - Do a verifiable build From e7f9af92613de84d0d9b5292c9cafeac3304c967 Mon Sep 17 00:00:00 2001 From: Lou-Kamades <128186011+Lou-Kamades@users.noreply.github.com> Date: Wed, 28 Feb 2024 09:31:00 -0800 Subject: [PATCH 05/31] add TokenBalanceLog in token_charge_collateral_fees (#894) * add TokenBalanceLog in token_charge_collateral_fees * increase cu_per_charge_collateral_fees_token --- lib/client/src/context.rs | 2 +- .../instructions/token_charge_collateral_fees.rs | 15 ++++++++++++++- programs/mango-v4/src/logs.rs | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/client/src/context.rs b/lib/client/src/context.rs index b9d87f861..185555a04 100644 --- a/lib/client/src/context.rs +++ b/lib/client/src/context.rs @@ -144,7 +144,7 @@ impl Default for ComputeEstimates { // the base cost is mostly the division cu_per_charge_collateral_fees: 20_000, // per-chargable-token cost - cu_per_charge_collateral_fees_token: 12_000, + cu_per_charge_collateral_fees_token: 15_000, } } } diff --git a/programs/mango-v4/src/instructions/token_charge_collateral_fees.rs b/programs/mango-v4/src/instructions/token_charge_collateral_fees.rs index fc145ba11..f58fbf1d3 100644 --- a/programs/mango-v4/src/instructions/token_charge_collateral_fees.rs +++ b/programs/mango-v4/src/instructions/token_charge_collateral_fees.rs @@ -5,7 +5,7 @@ use anchor_lang::prelude::*; use fixed::types::I80F48; use crate::accounts_ix::*; -use crate::logs::{emit_stack, TokenCollateralFeeLog}; +use crate::logs::{emit_stack, TokenBalanceLog, TokenCollateralFeeLog}; pub fn token_charge_collateral_fees(ctx: Context) -> Result<()> { let group = ctx.accounts.group.load()?; @@ -103,12 +103,25 @@ pub fn token_charge_collateral_fees(ctx: Context) -> bank.collected_fees_native += fee; bank.collected_collateral_fees += fee; + let token_info = health_cache.token_info(bank.token_index)?; + let token_position = account.token_position(bank.token_index)?; + emit_stack(TokenCollateralFeeLog { mango_group: ctx.accounts.group.key(), mango_account: ctx.accounts.account.key(), token_index: bank.token_index, fee: fee.to_bits(), asset_usage_fraction: asset_usage_scaling.to_bits(), + price: token_info.prices.oracle.to_bits(), + }); + + emit_stack(TokenBalanceLog { + mango_group: ctx.accounts.group.key(), + mango_account: ctx.accounts.account.key(), + token_index: bank.token_index, + indexed_position: token_position.indexed_position.to_bits(), + deposit_index: bank.deposit_index.to_bits(), + borrow_index: bank.borrow_index.to_bits(), }) } diff --git a/programs/mango-v4/src/logs.rs b/programs/mango-v4/src/logs.rs index 7f7a44a3c..9032b3bc6 100644 --- a/programs/mango-v4/src/logs.rs +++ b/programs/mango-v4/src/logs.rs @@ -803,6 +803,7 @@ pub struct TokenCollateralFeeLog { pub token_index: u16, pub asset_usage_fraction: i128, pub fee: i128, + pub price: i128, } #[event] From dc5f46b7f79361c47c0e4b1c1dfbf5154a4269d9 Mon Sep 17 00:00:00 2001 From: Robert Chen Date: Thu, 29 Feb 2024 05:07:42 -0700 Subject: [PATCH 06/31] add audit report for v0.22.0 (#897) --- audits/Audit_OtterSec_Mango_v0.22.0.pdf | Bin 0 -> 303550 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 audits/Audit_OtterSec_Mango_v0.22.0.pdf diff --git a/audits/Audit_OtterSec_Mango_v0.22.0.pdf b/audits/Audit_OtterSec_Mango_v0.22.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6a17d2d8aec3ddfbcdc5dcc630efe11e8c455979 GIT binary patch literal 303550 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

QDwzC!3$4v|t@N##z_NzA2&VYF>U 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%0DR=h!)m-1m(FkwlLAeB_{af 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

5&9;>{OVdl_PWa10Kt1&D9&l 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 C#p#;> literal 0 HcmV?d00001 From 6aa8a883f4090e677d644edfa9de6656fa9a55f1 Mon Sep 17 00:00:00 2001 From: Serge Farny Date: Thu, 29 Feb 2024 17:05:29 +0100 Subject: [PATCH 07/31] service-mango-health: monitors/historizes accounts health (#890) * service-mango-health: add a new service that compute health for all mango accounts and persist an history in postgres sql --- .github/workflows/ci-docker-publish.yml | 1 + Cargo.lock | 66 ++ Dockerfile | 1 + bin/service-mango-fills/Cargo.toml | 1 + .../src/fill_event_postgres_target.rs | 62 +- .../src/postgres_config.rs | 9 +- bin/service-mango-health/Cargo.toml | 60 ++ bin/service-mango-health/README.md | 4 + .../conf/example-config.toml | 27 + .../conf/template-config.toml | 26 + .../sql_scripts/setup.sql | 26 + bin/service-mango-health/src/configuration.rs | 35 + bin/service-mango-health/src/main.rs | 87 +++ .../src/processors/data.rs | 210 ++++++ .../src/processors/exit.rs | 39 + .../src/processors/health.rs | 177 +++++ .../src/processors/logger.rs | 81 ++ .../src/processors/mod.rs | 5 + .../src/processors/persister.rs | 712 ++++++++++++++++++ bin/service-mango-health/src/utils/mod.rs | 1 + cd/health.toml | 9 + lib/services-mango-lib/Cargo.toml | 20 + lib/services-mango-lib/src/lib.rs | 3 + .../src/postgres_configuration.rs | 16 + .../src/postgres_connection.rs | 66 ++ lib/services-mango-lib/src/retry_counter.rs | 59 ++ 26 files changed, 1743 insertions(+), 60 deletions(-) create mode 100644 bin/service-mango-health/Cargo.toml create mode 100644 bin/service-mango-health/README.md create mode 100644 bin/service-mango-health/conf/example-config.toml create mode 100644 bin/service-mango-health/conf/template-config.toml create mode 100644 bin/service-mango-health/sql_scripts/setup.sql create mode 100644 bin/service-mango-health/src/configuration.rs create mode 100644 bin/service-mango-health/src/main.rs create mode 100644 bin/service-mango-health/src/processors/data.rs create mode 100644 bin/service-mango-health/src/processors/exit.rs create mode 100644 bin/service-mango-health/src/processors/health.rs create mode 100644 bin/service-mango-health/src/processors/logger.rs create mode 100644 bin/service-mango-health/src/processors/mod.rs create mode 100644 bin/service-mango-health/src/processors/persister.rs create mode 100644 bin/service-mango-health/src/utils/mod.rs create mode 100644 cd/health.toml create mode 100644 lib/services-mango-lib/Cargo.toml create mode 100644 lib/services-mango-lib/src/lib.rs create mode 100644 lib/services-mango-lib/src/postgres_configuration.rs create mode 100644 lib/services-mango-lib/src/postgres_connection.rs create mode 100644 lib/services-mango-lib/src/retry_counter.rs diff --git a/.github/workflows/ci-docker-publish.yml b/.github/workflows/ci-docker-publish.yml index 5df69bd84..70d1c169e 100644 --- a/.github/workflows/ci-docker-publish.yml +++ b/.github/workflows/ci-docker-publish.yml @@ -15,6 +15,7 @@ on: 'bin/service-mango-fills/**', 'bin/service-mango-orderbook/**', 'bin/service-mango-pnl/**', + 'bin/service-mango-health/**', ] workflow_dispatch: diff --git a/Cargo.lock b/Cargo.lock index a5c572ac1..3953e9ce6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5986,6 +5986,7 @@ dependencies = [ "serde_derive", "serde_json", "serum_dex 0.5.10 (git+https://github.com/openbook-dex/program.git)", + "services-mango-lib", "solana-client", "solana-logger", "solana-sdk", @@ -5997,6 +5998,53 @@ dependencies = [ "ws", ] +[[package]] +name = "service-mango-health" +version = "0.1.0" +dependencies = [ + "anchor-client", + "anchor-lang", + "anyhow", + "async-channel", + "async-trait", + "base64 0.21.4", + "bs58 0.3.1", + "bytemuck", + "chrono", + "fixed 1.11.0 (git+https://github.com/blockworks-foundation/fixed.git?branch=v1.11.0-borsh0_10-mango)", + "futures 0.3.28", + "futures-channel", + "futures-core", + "futures-util", + "itertools", + "jemallocator", + "log 0.4.20", + "mango-feeds-connector", + "mango-feeds-lib", + "mango-v4", + "mango-v4-client", + "native-tls", + "postgres-native-tls", + "postgres-types", + "postgres_query", + "rustls 0.20.9", + "serde", + "serde_derive", + "serde_json", + "serum_dex 0.5.10 (git+https://github.com/openbook-dex/program.git)", + "services-mango-lib", + "solana-client", + "solana-logger", + "solana-sdk", + "tokio", + "tokio-postgres", + "tokio-postgres-rustls", + "tokio-tungstenite 0.17.2", + "toml", + "tracing", + "ws", +] + [[package]] name = "service-mango-orderbook" version = "0.1.0" @@ -6055,6 +6103,24 @@ dependencies = [ "toml", ] +[[package]] +name = "services-mango-lib" +version = "0.1.0" +dependencies = [ + "anyhow", + "base64 0.21.4", + "native-tls", + "postgres-native-tls", + "postgres-types", + "postgres_query", + "rustls 0.20.9", + "serde", + "tokio", + "tokio-postgres", + "tokio-postgres-rustls", + "tracing", +] + [[package]] name = "sgx-quote" version = "0.1.0" diff --git a/Dockerfile b/Dockerfile index 98dcbdd15..1743b9b9b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,6 +27,7 @@ COPY --from=build /app/target/release/service-mango-* /usr/local/bin/ COPY --from=build /app/bin/service-mango-pnl/conf/template-config.toml ./pnl-config.toml COPY --from=build /app/bin/service-mango-fills/conf/template-config.toml ./fills-config.toml COPY --from=build /app/bin/service-mango-orderbook/conf/template-config.toml ./orderbook-config.toml +COPY --from=build /app/bin/service-mango-health/conf/template-config.toml ./health-config.toml COPY --from=build /app/bin/service-mango-pnl/conf/template-config.toml ./pnl-config.toml COPY --from=build /app/bin/service-mango-fills/conf//template-config.toml ./fills-config.toml diff --git a/bin/service-mango-fills/Cargo.toml b/bin/service-mango-fills/Cargo.toml index acd55d9ba..d3187b1f6 100644 --- a/bin/service-mango-fills/Cargo.toml +++ b/bin/service-mango-fills/Cargo.toml @@ -6,6 +6,7 @@ edition = "2018" license = "AGPL-3.0-or-later" [dependencies] +services-mango-lib = { path = "../../lib/services-mango-lib" } mango-feeds-lib = { path = "../../lib/mango-feeds-lib" } mango-feeds-connector = { workspace = true } diff --git a/bin/service-mango-fills/src/fill_event_postgres_target.rs b/bin/service-mango-fills/src/fill_event_postgres_target.rs index d92d7ecb6..de8018b89 100644 --- a/bin/service-mango-fills/src/fill_event_postgres_target.rs +++ b/bin/service-mango-fills/src/fill_event_postgres_target.rs @@ -2,12 +2,10 @@ use crate::postgres_config::PostgresConfig; use chrono::{TimeZone, Utc}; use log::*; use mango_feeds_connector::metrics::{MetricType, MetricU64, Metrics}; -use native_tls::{Certificate, Identity, TlsConnector}; -use postgres_native_tls::MakeTlsConnector; use postgres_query::Caching; use service_mango_fills::*; +use services_mango_lib::postgres_configuration::PostgresConfiguration; use std::{ - env, fs, sync::{ atomic::{AtomicBool, Ordering}, Arc, @@ -24,56 +22,15 @@ async fn postgres_connection( ) -> anyhow::Result>> { let (tx, rx) = async_channel::unbounded(); - // openssl pkcs12 -export -in client.cer -inkey client-key.cer -out client.pks - // base64 -i ca.cer -o ca.cer.b64 && base64 -i client.pks -o client.pks.b64 - // fly secrets set PG_CA_CERT=- < ./ca.cer.b64 -a mango-fills - // fly secrets set PG_CLIENT_KEY=- < ./client.pks.b64 -a mango-fills - let tls = match &config.tls { - Some(tls) => { - use base64::{engine::general_purpose, Engine as _}; - let ca_cert = match &tls.ca_cert_path.chars().next().unwrap() { - '$' => general_purpose::STANDARD - .decode( - env::var(&tls.ca_cert_path[1..]) - .expect("reading client cert from env") - .into_bytes(), - ) - .expect("decoding client cert"), - _ => fs::read(&tls.ca_cert_path).expect("reading client cert from file"), - }; - let client_key = match &tls.client_key_path.chars().next().unwrap() { - '$' => general_purpose::STANDARD - .decode( - env::var(&tls.client_key_path[1..]) - .expect("reading client key from env") - .into_bytes(), - ) - .expect("decoding client key"), - _ => fs::read(&tls.client_key_path).expect("reading client key from file"), - }; - MakeTlsConnector::new( - TlsConnector::builder() - .add_root_certificate(Certificate::from_pem(&ca_cert)?) - .identity(Identity::from_pkcs12(&client_key, "pass")?) - .danger_accept_invalid_certs(config.allow_invalid_certs) - .build()?, - ) - } - None => MakeTlsConnector::new( - TlsConnector::builder() - .danger_accept_invalid_certs(config.allow_invalid_certs) - .build()?, - ), + let config = config.clone(); + let lib_config = PostgresConfiguration { + connection_string: config.connection_string.clone(), + allow_invalid_certs: config.allow_invalid_certs, + tls: config.tls.clone(), }; - let config = config.clone(); - let connection_string = match &config.connection_string.chars().next().unwrap() { - '$' => { - env::var(&config.connection_string[1..]).expect("reading connection string from env") - } - _ => config.connection_string.clone(), - }; - let mut initial = Some(tokio_postgres::connect(&connection_string, tls.clone()).await?); + let mut initial = Some(services_mango_lib::postgres_connection::connect(&lib_config).await?); + let mut metric_retries = metric_retries; let mut metric_live = metric_live; tokio::spawn(async move { @@ -86,7 +43,8 @@ async fn postgres_connection( let (client, connection) = match initial.take() { Some(v) => v, None => { - let result = tokio_postgres::connect(&connection_string, tls.clone()).await; + let result = + services_mango_lib::postgres_connection::connect(&lib_config).await; match result { Ok(v) => v, Err(err) => { diff --git a/bin/service-mango-fills/src/postgres_config.rs b/bin/service-mango-fills/src/postgres_config.rs index b67f674f2..35342673a 100644 --- a/bin/service-mango-fills/src/postgres_config.rs +++ b/bin/service-mango-fills/src/postgres_config.rs @@ -1,4 +1,5 @@ use serde_derive::Deserialize; +use services_mango_lib::postgres_configuration::PostgresTlsConfig; #[derive(Clone, Debug, Deserialize)] pub struct PostgresConfig { @@ -21,11 +22,3 @@ pub struct PostgresConfig { pub allow_invalid_certs: bool, pub tls: Option, } - -#[derive(Clone, Debug, Deserialize)] -pub struct PostgresTlsConfig { - /// CA Cert file or env var - pub ca_cert_path: String, - /// PKCS12 client cert path - pub client_key_path: String, -} diff --git a/bin/service-mango-health/Cargo.toml b/bin/service-mango-health/Cargo.toml new file mode 100644 index 000000000..f5fad86ab --- /dev/null +++ b/bin/service-mango-health/Cargo.toml @@ -0,0 +1,60 @@ +[package] +name = "service-mango-health" +version = "0.1.0" +authors = ["Christian Kamm ", "Maximilian Schneider ", "Serge Farny "] +edition = "2018" +license = "AGPL-3.0-or-later" + +[dependencies] +mango-feeds-lib = { path = "../../lib/mango-feeds-lib" } +mango-feeds-connector = { workspace = true } +services-mango-lib = { path = "../../lib/services-mango-lib" } + +solana-client = { workspace = true } +solana-logger = { workspace = true } +solana-sdk = { workspace = true } + +anchor-lang = { workspace = true } +anchor-client = { workspace = true } + +fixed = { workspace = true, features = ["serde", "borsh"] } + +mango-v4 = { path = "../../programs/mango-v4", features = ["client"] } +mango-v4-client = { path = "../../lib/client" } + + +serum_dex = { workspace = true } + +bs58 = "0.3.1" +log = "0.4" +anyhow = "1.0" +toml = "0.5" +serde = "1.0.130" +serde_derive = "1.0.130" +serde_json = "1.0.68" +futures = "0.3.17" +futures-core = "0.3" +futures-channel = "0.3" +futures-util = "0.3" +ws = "^0.9.2" +async-channel = "1.6" +async-trait = "0.1" +bytemuck = "^1.7.2" +itertools = "0.10.3" +jemallocator = "0.3.2" +chrono = "0.4.23" +base64 = "0.21" + +tokio = { version = "1", features = ["full"] } +tokio-tungstenite = "0.17" + +tokio-postgres = { version = "0.7", features = ["with-chrono-0_4"] } +tokio-postgres-rustls = "0.9.0" +postgres-types = { version = "0.2", features = ["array-impls", "derive", "with-chrono-0_4"] } +postgres-native-tls = "0.5" +native-tls = "0.2" +rustls = "0.20.8" +# postgres_query hasn't updated its crate in a while +postgres_query = { git = "https://github.com/nolanderc/rust-postgres-query", rev = "b4422051c8a31fbba4a35f88004c1cefb1878dd5" } +tracing = { version = "0.1", features = ["log"] } + diff --git a/bin/service-mango-health/README.md b/bin/service-mango-health/README.md new file mode 100644 index 000000000..3505e168e --- /dev/null +++ b/bin/service-mango-health/README.md @@ -0,0 +1,4 @@ +# service-mango-health + +This service monitors all mango accounts health (publish and persists health ratio) + diff --git a/bin/service-mango-health/conf/example-config.toml b/bin/service-mango-health/conf/example-config.toml new file mode 100644 index 000000000..edbb9e493 --- /dev/null +++ b/bin/service-mango-health/conf/example-config.toml @@ -0,0 +1,27 @@ +rpc_ws_url = "wss://mango.rpcpool.com/" +rpc_http_url = "http://mango.rpcpool.com/" +mango_group = "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX" + +# [postgres] +# connection_string = "$PG_CONNECTION_STRING" +# allow_invalid_certs = true +# max_retry_count = 2 + +# # [postgres.tls] +# # ca_cert_path = "$PG_CA_CERT" +# # client_key_path = "$PG_CLIENT_KEY" + +[computing_configuration] +recompute_interval_ms = 100 + +[logging_configuration] +log_health_to_stdout = true +#log_health_for_accounts = ["xxx"] + +[persistence_configuration] +enabled = true +history_time_to_live_secs = 2678400 # 31 days +persist_max_periodicity_secs = 60 +snapshot_queue_length = 30 # 30 * persist_max_periodicity_secs secs of backup in queue +max_failure_duration_secs = 3600 +max_retry_count = 3 \ No newline at end of file diff --git a/bin/service-mango-health/conf/template-config.toml b/bin/service-mango-health/conf/template-config.toml new file mode 100644 index 000000000..a7684de85 --- /dev/null +++ b/bin/service-mango-health/conf/template-config.toml @@ -0,0 +1,26 @@ +rpc_http_url = "$RPC_HTTP_URL" +rpc_ws_url = "$RPC_WS_URL" +mango_group = "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX" + +[postgres] +connection_string = "$PG_CONNECTION_STRING" +max_retry_count = 2 +allow_invalid_certs = true + +[postgres.tls] +ca_cert_path = "$PG_CA_CERT" +client_key_path = "$PG_CLIENT_KEY" + +[computing_configuration] +recompute_interval_ms = 100 + +[logging_configuration] +log_health_to_stdout = false + +[persistence_configuration] +enabled = true +history_time_to_live_secs = 2678400 # 31 days +persist_max_periodicity_secs = 60 +snapshot_queue_length = 30 # 30 * persist_max_periodicity_secs secs of backup in queue +max_failure_duration_secs = 3600 +max_retry_count = 3 diff --git a/bin/service-mango-health/sql_scripts/setup.sql b/bin/service-mango-health/sql_scripts/setup.sql new file mode 100644 index 000000000..150d93b99 --- /dev/null +++ b/bin/service-mango-health/sql_scripts/setup.sql @@ -0,0 +1,26 @@ +CREATE SCHEMA IF NOT EXISTS mango_monitoring AUTHORIZATION CURRENT_ROLE; +CREATE TABLE IF NOT EXISTS mango_monitoring.health_history +( + Pubkey VARCHAR(44) NOT NULL, + Timestamp TIMESTAMP WITH TIME ZONE NOT NULL, + MaintenanceRatio DOUBLE PRECISION, + Maintenance DOUBLE PRECISION, + Initial DOUBLE PRECISION, + LiquidationEnd DOUBLE PRECISION, + IsBeingLiquidated BOOLEAN +); +CREATE MATERIALIZED VIEW mango_monitoring.health_current AS + SELECT DISTINCT ON (pubkey) + * + FROM mango_monitoring.health_history + ORDER BY pubkey, timestamp DESC; + +CREATE INDEX health_history_pubkey_index ON mango_monitoring.health_history +( + Pubkey ASC, + Timestamp ASC +); +CREATE INDEX health_history_timestamp_index ON mango_monitoring.health_history +( + Timestamp ASC +); \ No newline at end of file diff --git a/bin/service-mango-health/src/configuration.rs b/bin/service-mango-health/src/configuration.rs new file mode 100644 index 000000000..9552898b9 --- /dev/null +++ b/bin/service-mango-health/src/configuration.rs @@ -0,0 +1,35 @@ +use serde_derive::Deserialize; +use services_mango_lib::postgres_configuration::PostgresConfiguration; +use std::collections::HashSet; + +#[derive(Clone, Debug, Deserialize)] +pub struct Configuration { + pub postgres: Option, + pub rpc_http_url: String, + pub rpc_ws_url: String, + pub mango_group: String, + pub computing_configuration: ComputingConfiguration, + pub logging_configuration: LoggingConfiguration, + pub persistence_configuration: PersistenceConfiguration, +} + +#[derive(Clone, Debug, Deserialize)] +pub struct ComputingConfiguration { + pub recompute_interval_ms: u64, +} + +#[derive(Clone, Debug, Deserialize)] +pub struct LoggingConfiguration { + pub log_health_to_stdout: bool, + pub log_health_for_accounts: Option>, +} + +#[derive(Clone, Debug, Deserialize)] +pub struct PersistenceConfiguration { + pub enabled: bool, + pub history_time_to_live_secs: i64, + pub persist_max_periodicity_secs: i64, + pub max_failure_duration_secs: i64, + pub max_retry_count: u64, + pub snapshot_queue_length: usize, +} diff --git a/bin/service-mango-health/src/main.rs b/bin/service-mango-health/src/main.rs new file mode 100644 index 000000000..9b3b5174a --- /dev/null +++ b/bin/service-mango-health/src/main.rs @@ -0,0 +1,87 @@ +mod configuration; +mod processors; +mod utils; + +use futures_util::StreamExt; +// use mango_feeds_connector::metrics; +use mango_v4_client::tracing_subscriber_init; +use std::fs::File; +use std::io::Read; +use std::sync::atomic::Ordering; + +use crate::configuration::Configuration; +use crate::processors::data::DataProcessor; +use crate::processors::exit::ExitProcessor; +use crate::processors::health::HealthProcessor; +use crate::processors::logger::LoggerProcessor; +use crate::processors::persister::PersisterProcessor; + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let args: Vec = std::env::args().collect(); + + if args.len() < 2 { + eprintln!("Please enter a config file path argument."); + return Ok(()); + } + + let configuration: Configuration = { + let mut file = File::open(&args[1])?; + let mut contents = String::new(); + file.read_to_string(&mut contents)?; + toml::from_str(&contents).unwrap() + }; + + tracing_subscriber_init(); + + // TODO FAS Add metrics + // let metrics_tx = metrics::start(configuration.metrics.clone(), "health".into()); + + let exit_processor = ExitProcessor::init().await?; + + let data_processor: DataProcessor = + DataProcessor::init(&configuration, exit_processor.exit.clone()).await?; + + let health_processor = HealthProcessor::init( + &data_processor.channel, + data_processor.chain_data.clone(), + &configuration, + exit_processor.exit.clone(), + ) + .await?; + + let logger = LoggerProcessor::init( + &health_processor.channel, + &configuration, + exit_processor.exit.clone(), + ) + .await?; + + let persister = PersisterProcessor::init( + &health_processor.channel, + &configuration, + exit_processor.exit.clone(), + ) + .await?; + + let mut jobs = vec![exit_processor.job, data_processor.job, health_processor.job]; + + if let Some(logger) = logger { + jobs.push(logger.job) + } + + if let Some(persister) = persister { + jobs.push(persister.job) + } + + let mut jobs: futures::stream::FuturesUnordered<_> = jobs.into_iter().collect(); + + while let Some(_) = jobs.next().await { + // if any job exit, stop the others threads & wait + exit_processor.exit.store(true, Ordering::Relaxed); + } + + // for now, we force exit here because websocket connection to RPC is not properly closed on exit + tracing::warn!("killing process"); + std::process::exit(0x0100); +} diff --git a/bin/service-mango-health/src/processors/data.rs b/bin/service-mango-health/src/processors/data.rs new file mode 100644 index 000000000..c9b3f6ac5 --- /dev/null +++ b/bin/service-mango-health/src/processors/data.rs @@ -0,0 +1,210 @@ +use crate::configuration::Configuration; +use crate::processors::data::DataEvent::{AccountUpdate, Other, Snapshot}; +use async_channel::Receiver; +use chrono::Utc; +use itertools::Itertools; +use mango_v4_client::account_update_stream::Message; +use mango_v4_client::snapshot_source::is_mango_account; +use mango_v4_client::{ + account_update_stream, chain_data, snapshot_source, websocket_source, MangoGroupContext, +}; +use services_mango_lib::fail_or_retry; +use services_mango_lib::retry_counter::RetryCounter; +use solana_client::nonblocking::rpc_client::RpcClient as RpcClientAsync; +use solana_sdk::commitment_config::CommitmentConfig; +use solana_sdk::pubkey::Pubkey; +use std::str::FromStr; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::{Arc, RwLock}; +use std::time::Duration; +use tokio::task::JoinHandle; +use tracing::warn; + +pub struct DataProcessor { + pub channel: tokio::sync::broadcast::Sender, + pub job: JoinHandle<()>, + pub chain_data: Arc>, +} + +#[derive(Clone, Debug)] +pub enum DataEvent { + Other, + Snapshot(SnapshotEvent), + AccountUpdate(AccountUpdateEvent), +} + +#[derive(Clone, Debug)] +pub struct SnapshotEvent { + pub received_at: chrono::DateTime, + pub accounts: Vec, +} + +#[derive(Clone, Debug)] +pub struct AccountUpdateEvent { + pub received_at: chrono::DateTime, + pub account: Pubkey, +} + +impl DataProcessor { + pub async fn init( + configuration: &Configuration, + exit: Arc, + ) -> anyhow::Result { + let mut retry_counter = RetryCounter::new(2); + let mango_group = Pubkey::from_str(&configuration.mango_group)?; + let mango_stream = + fail_or_retry!(retry_counter, Self::init_mango_source(configuration).await)?; + let (sender, _) = tokio::sync::broadcast::channel(8192); + let sender_clone = sender.clone(); + + // The representation of current on-chain account data + let chain_data = Arc::new(RwLock::new(chain_data::ChainData::new())); + let chain_data_clone = chain_data.clone(); + + let job = tokio::spawn(async move { + loop { + if exit.load(Ordering::Relaxed) { + warn!("shutting down data processor..."); + break; + } + tokio::select! { + Ok(msg) = mango_stream.recv() => { + let received_at = Utc::now(); + + msg.update_chain_data(&mut chain_data_clone.write().unwrap()); + + if sender_clone.receiver_count() == 0 { + continue; + } + + let event = Self::parse_message(msg, received_at, mango_group); + + if event.is_none() { + continue; + } + + let res = sender_clone.send(event.unwrap()); + if res.is_err() { + break; + } + }, + else => { + warn!("mango update channel err"); + break; + } + } + } + }); + + let result = DataProcessor { + channel: sender, + job, + chain_data, + }; + + Ok(result) + } + + fn new_rpc_async(configuration: &Configuration) -> RpcClientAsync { + let commitment = CommitmentConfig::processed(); + RpcClientAsync::new_with_timeout_and_commitment( + configuration.rpc_http_url.clone(), + Duration::from_secs(60), + commitment, + ) + } + + fn parse_message( + message: Message, + received_at: chrono::DateTime, + mango_group: Pubkey, + ) -> Option { + match message { + Message::Account(account_write) => { + if is_mango_account(&account_write.account, &mango_group).is_some() { + return Some(AccountUpdate(AccountUpdateEvent { + account: account_write.pubkey, + received_at, + })); + } + } + Message::Snapshot(snapshot) => { + let mut result = Vec::new(); + for update in snapshot.iter() { + if is_mango_account(&update.account, &mango_group).is_some() { + result.push(update.pubkey); + } + } + + return Some(Snapshot(SnapshotEvent { + accounts: result, + received_at, + })); + } + _ => {} + }; + + return Some(Other); + } + + async fn init_mango_source(configuration: &Configuration) -> anyhow::Result> { + // + // Client setup + // + let rpc_async = Self::new_rpc_async(configuration); + + let mango_group = Pubkey::from_str(&configuration.mango_group)?; + let group_context = MangoGroupContext::new_from_rpc(&rpc_async, mango_group).await?; + + let mango_oracles = group_context + .tokens + .values() + .map(|value| value.oracle) + .chain(group_context.perp_markets.values().map(|p| p.oracle)) + .unique() + .collect::>(); + + let serum_programs = group_context + .serum3_markets + .values() + .map(|s3| s3.serum_program) + .unique() + .collect_vec(); + + let (account_update_sender, account_update_receiver) = + async_channel::unbounded::(); + + websocket_source::start( + websocket_source::Config { + rpc_ws_url: configuration.rpc_ws_url.clone(), + serum_programs, + open_orders_authority: mango_group, + }, + mango_oracles.clone(), + account_update_sender.clone(), + ); + + let first_websocket_slot = websocket_source::get_next_create_bank_slot( + account_update_receiver.clone(), + Duration::from_secs(10), + ) + .await?; + + // Getting solana account snapshots via jsonrpc + // FUTURE: of what to fetch a snapshot - should probably take as an input + snapshot_source::start( + snapshot_source::Config { + rpc_http_url: configuration.rpc_http_url.clone(), + mango_group, + get_multiple_accounts_count: 100, + parallel_rpc_requests: 10, + snapshot_interval: Duration::from_secs(5 * 60), + min_slot: first_websocket_slot + 10, + }, + mango_oracles, + account_update_sender, + ); + + Ok(account_update_receiver) + } +} diff --git a/bin/service-mango-health/src/processors/exit.rs b/bin/service-mango-health/src/processors/exit.rs new file mode 100644 index 000000000..8ef8d0ef4 --- /dev/null +++ b/bin/service-mango-health/src/processors/exit.rs @@ -0,0 +1,39 @@ +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; +use tokio::task::JoinHandle; +use tracing::{info, warn}; + +pub struct ExitProcessor { + pub job: JoinHandle<()>, + pub exit: Arc, +} + +impl ExitProcessor { + pub async fn init() -> anyhow::Result { + let exit: Arc = Arc::new(AtomicBool::new(false)); + let exit_clone = exit.clone(); + + let job = tokio::spawn(async move { + let mut interval = tokio::time::interval(std::time::Duration::from_millis(1000)); + loop { + if exit_clone.load(Ordering::Relaxed) { + warn!("shutting down logger processor..."); + break; + } + tokio::select! { + _ = interval.tick() => {} + _ = tokio::signal::ctrl_c()=> { + info!("Received SIGINT, shutting down..."); + exit_clone.store(true, Ordering::Relaxed); + break; + } + } + } + + warn!("shutting down exit processor..."); + }); + + let result = ExitProcessor { job, exit }; + Ok(result) + } +} diff --git a/bin/service-mango-health/src/processors/health.rs b/bin/service-mango-health/src/processors/health.rs new file mode 100644 index 000000000..d6dfe6fda --- /dev/null +++ b/bin/service-mango-health/src/processors/health.rs @@ -0,0 +1,177 @@ +use crate::configuration::Configuration; +use crate::processors::data::DataEvent; +use chrono::Utc; +use mango_v4::health::HealthType; +use mango_v4_client::chain_data::AccountFetcher; +use mango_v4_client::{chain_data, health_cache, FallbackOracleConfig, MangoGroupContext}; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_sdk::pubkey::Pubkey; +use std::collections::HashSet; +use std::str::FromStr; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::{Arc, RwLock}; +use std::time::Instant; +use tokio::task::JoinHandle; +use tracing::warn; + +pub struct HealthProcessor { + pub channel: tokio::sync::broadcast::Sender, + pub job: JoinHandle<()>, +} + +#[derive(Clone, Debug)] +pub struct HealthEvent { + pub computed_at: chrono::DateTime, + pub components: Vec, +} + +#[derive(Clone, Debug)] +pub struct HealthComponent { + pub account: Pubkey, + pub value: Option, +} + +#[derive(Clone, Debug)] +pub struct HealthComponentValue { + pub maintenance_ratio: f64, + pub initial_health: f64, + pub maintenance_health: f64, + pub liquidation_end_health: f64, + pub is_being_liquidated: bool, +} + +impl HealthProcessor { + pub async fn init( + data_sender: &tokio::sync::broadcast::Sender, + chain_data: Arc>, + configuration: &Configuration, + exit: Arc, + ) -> anyhow::Result { + let (sender, _) = tokio::sync::broadcast::channel(8192); + let sender_clone = sender.clone(); + let mut data = data_sender.subscribe(); + let mut accounts = HashSet::::new(); + let mut snapshot_received = false; + let mut last_recompute = Instant::now(); + let recompute_interval = std::time::Duration::from_millis( + configuration.computing_configuration.recompute_interval_ms, + ); + + let account_fetcher = chain_data::AccountFetcher { + chain_data: chain_data.clone(), + rpc: RpcClient::new(configuration.rpc_http_url.clone()), + }; + + let mango_group_context = MangoGroupContext::new_from_rpc( + &account_fetcher.rpc, + Pubkey::from_str(&configuration.mango_group)?, + ) + .await?; + + let job = tokio::spawn(async move { + loop { + if exit.load(Ordering::Relaxed) { + warn!("shutting down health processor..."); + break; + } + + tokio::select! { + Ok(msg) = data.recv() => { + match msg { + DataEvent::AccountUpdate(upd) => { + accounts.insert(upd.account); + }, + DataEvent::Snapshot(snap) => { + for account in snap.accounts { + accounts.insert(account); + } + snapshot_received = true; + }, + DataEvent::Other => { + } + } + + if sender_clone.receiver_count() == 0 { + continue; + } + + if snapshot_received && last_recompute.elapsed() >= recompute_interval { + last_recompute = Instant::now(); + + let health_event = Self::compute_health(&mango_group_context, + &account_fetcher, + &accounts).await; + + let res = sender_clone.send(health_event); + if res.is_err() { + break; + } + } + }, + else => { + warn!("data update channel err"); + break; + } + } + } + }); + + let result = HealthProcessor { + channel: sender, + job, + }; + + Ok(result) + } + + async fn compute_health( + mango_group_context: &MangoGroupContext, + account_fetcher: &AccountFetcher, + accounts: &HashSet, + ) -> HealthEvent { + let computed_at = Utc::now(); + let mut components = Vec::new(); + + for account in accounts { + let value = + Self::compute_account_health(&mango_group_context, account_fetcher, &account).await; + + components.push({ + HealthComponent { + account: *account, + value: value.ok(), + } + }) + } + + HealthEvent { + computed_at, + components, + } + } + + async fn compute_account_health( + mango_group_context: &&MangoGroupContext, + account_fetcher: &AccountFetcher, + account: &Pubkey, + ) -> anyhow::Result { + let mango_account = account_fetcher.fetch_mango_account(account)?; + let health_cache = health_cache::new( + &mango_group_context, + &FallbackOracleConfig::Never, + &*account_fetcher, + &mango_account, + ) + .await?; + + let res = HealthComponentValue { + maintenance_ratio: health_cache.health_ratio(HealthType::Maint).to_num(), + initial_health: health_cache.health(HealthType::Init).to_num(), + maintenance_health: health_cache.health(HealthType::Maint).to_num(), + liquidation_end_health: health_cache.health(HealthType::LiquidationEnd).to_num(), + is_being_liquidated: mango_account.fixed.being_liquidated(), + }; + + Ok(res) + } +} diff --git a/bin/service-mango-health/src/processors/logger.rs b/bin/service-mango-health/src/processors/logger.rs new file mode 100644 index 000000000..aea15a033 --- /dev/null +++ b/bin/service-mango-health/src/processors/logger.rs @@ -0,0 +1,81 @@ +use crate::configuration::Configuration; +use crate::processors::health::{HealthComponentValue, HealthEvent}; +use solana_sdk::pubkey::Pubkey; +use std::collections::HashSet; +use std::str::FromStr; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; +use tokio::task::JoinHandle; +use tracing::{info, warn}; + +pub struct LoggerProcessor { + pub job: JoinHandle<()>, +} + +impl LoggerProcessor { + pub async fn init( + data_sender: &tokio::sync::broadcast::Sender, + configuration: &Configuration, + exit: Arc, + ) -> anyhow::Result> { + let enable_logging = configuration.logging_configuration.log_health_to_stdout; + if !enable_logging { + return Ok(None); + } + + let mut data = data_sender.subscribe(); + let filter: HashSet = configuration + .logging_configuration + .log_health_for_accounts + .clone() + .unwrap_or_default() + .iter() + .map(|s| Pubkey::from_str(s).unwrap()) + .collect(); + + let job = tokio::spawn(async move { + let mut interval = tokio::time::interval(std::time::Duration::from_millis(1000)); + loop { + if exit.load(Ordering::Relaxed) { + warn!("shutting down logger processor..."); + break; + } + tokio::select! { + _ = interval.tick() => { + }, + Ok(msg) = data.recv() => { + for component in msg.components { + if !filter.is_empty() && !filter.contains(&component.account) { + continue; + } + + if component.value.is_some() { + let value: HealthComponentValue = component.value.unwrap(); + + info!( + computed_at = %msg.computed_at, + account = %component.account, + maintenance_ratio = %value.maintenance_ratio, + initial_health = %value.initial_health, + maintenance_health = %value.maintenance_health, + liquidation_end_health = %value.liquidation_end_health, + is_being_liquidated = %value.is_being_liquidated, + ) + } else { + info!( + computed_at = %msg.computed_at, + account = %component.account, + error = "Missing health data" + ) + } + } + }, + } + } + }); + + let result = LoggerProcessor { job }; + + Ok(Some(result)) + } +} diff --git a/bin/service-mango-health/src/processors/mod.rs b/bin/service-mango-health/src/processors/mod.rs new file mode 100644 index 000000000..c3387cddc --- /dev/null +++ b/bin/service-mango-health/src/processors/mod.rs @@ -0,0 +1,5 @@ +pub mod data; +pub mod exit; +pub mod health; +pub mod logger; +pub mod persister; diff --git a/bin/service-mango-health/src/processors/persister.rs b/bin/service-mango-health/src/processors/persister.rs new file mode 100644 index 000000000..7843781b8 --- /dev/null +++ b/bin/service-mango-health/src/processors/persister.rs @@ -0,0 +1,712 @@ +use crate::configuration::Configuration; +use crate::processors::health::{HealthComponent, HealthEvent}; +use anchor_lang::prelude::Pubkey; +use chrono::{Duration, DurationRound, Utc}; +use futures_util::pin_mut; +use postgres_types::{ToSql, Type}; +use services_mango_lib::fail_or_retry; +use services_mango_lib::postgres_configuration::PostgresConfiguration; +use services_mango_lib::postgres_connection; +use services_mango_lib::retry_counter::RetryCounter; +use std::collections::{HashMap, VecDeque}; +use std::str::FromStr; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; +use tokio::task::JoinHandle; +use tokio_postgres::binary_copy::BinaryCopyInWriter; +use tokio_postgres::{Client, Transaction}; +use tracing::{error, warn}; + +pub struct PersisterProcessor { + pub job: JoinHandle<()>, +} + +impl PersisterProcessor { + pub async fn init( + data_sender: &tokio::sync::broadcast::Sender, + configuration: &Configuration, + exit: Arc, + ) -> anyhow::Result> { + let postgres_configuration = configuration.postgres.clone().unwrap_or_default(); + let persistence_configuration = configuration.persistence_configuration.clone(); + let time_to_live = Duration::seconds(persistence_configuration.history_time_to_live_secs); + let periodicity = Duration::seconds(persistence_configuration.persist_max_periodicity_secs); + let max_snapshot_count = persistence_configuration.snapshot_queue_length; + let max_failure_duration = + Duration::seconds(persistence_configuration.max_failure_duration_secs); + + if !persistence_configuration.enabled { + return Ok(None); + } + + let mut data = data_sender.subscribe(); + let mut unpersisted_snapshots = VecDeque::new(); + + let job = tokio::spawn(async move { + let mut interval = tokio::time::interval(std::time::Duration::from_millis(1000)); + let mut retry_counter = RetryCounter::new(persistence_configuration.max_retry_count); + let mut last_successful_persistence = chrono::Utc::now(); + + let mut connection = match fail_or_retry!( + retry_counter, + postgres_connection::connect(&postgres_configuration).await + ) { + Err(e) => { + tracing::error!("Failed to connect to postgres sql: {}", e); + return; + } + Ok(cnt) => cnt.0, + }; + + let mut previous = + match fail_or_retry!(retry_counter, Self::load_previous(&connection).await) { + Ok(prv) => prv, + Err(e) => { + error!("loading of previous state failed: {}", e); + return; + } + }; + + loop { + if exit.load(Ordering::Relaxed) { + warn!("shutting down persister processor..."); + break; + } + + tokio::select! { + _ = interval.tick() => { + }, + Ok(event) = data.recv() => { + Self::store_snapshot( + &previous, + &mut unpersisted_snapshots, + &event, + periodicity, + max_snapshot_count, + ); + + if let Err(e) = retry_counter.fail_or_ignore( + Self::persist_all_snapshots_and_update_state( + &mut connection, + &mut previous, + &mut unpersisted_snapshots, + time_to_live, + ) + .await, + ) { + error!("persistence failed (for {}): {}", chrono::Utc::now() - last_successful_persistence, e); + + match Self::try_to_reconnect(&postgres_configuration).await { + Ok(client) => { + connection = client; + } + Err(e) => { + if chrono::Utc::now() - last_successful_persistence + > max_failure_duration + { + error!("failed to reconnect (after multiple retries): {}", e); + break; // Shutdown processor + } + } + }; + } + + if unpersisted_snapshots.is_empty() { + last_successful_persistence = chrono::Utc::now(); + } + } + } + } + }); + + let result = PersisterProcessor { job }; + + Ok(Some(result)) + } + + fn build_persisted_data( + computed_at: chrono::DateTime, + component: &HealthComponent, + ) -> PersistedData { + match &component.value { + Some(value) => PersistedData { + computed_at: computed_at, + maintenance_ratio: Some(value.maintenance_ratio), + initial_health: Some(value.initial_health), + maintenance_health: Some(value.maintenance_health), + liquidation_end_health: Some(value.liquidation_end_health), + is_being_liquidated: Some(value.is_being_liquidated), + }, + None => PersistedData { + computed_at: computed_at, + maintenance_ratio: None, + initial_health: None, + maintenance_health: None, + liquidation_end_health: None, + is_being_liquidated: None, + }, + } + } + + fn store_snapshot( + previous: &HashMap, + snapshots: &mut VecDeque, + event: &HealthEvent, + periodicity: chrono::Duration, + max_snapshot_count: usize, + ) { + let bucket = event + .computed_at + .duration_round(periodicity) + .unwrap_or(chrono::DateTime::::MIN_UTC); + let mut previous_snapshot = &PersisterSnapshot { + bucket, + value: HashMap::new(), + }; + if !snapshots.is_empty() { + previous_snapshot = &snapshots[snapshots.len() - 1]; + } + + let updates = event + .components + .iter() + .filter_map(|component| { + let persisted_data = Self::build_persisted_data(event.computed_at, &component); + let should_insert_new_point = Self::should_insert( + &previous, + &component.account, + &persisted_data, + periodicity, + ); + let should_update_exising_point = + previous_snapshot.value.contains_key(&component.account); + + (should_insert_new_point || should_update_exising_point) + .then(|| (component.account, persisted_data)) + }) + .collect(); + + if let Some(existing_snapshot_for_bucket) = (*snapshots) + .iter_mut() + .find(|s| s.bucket == bucket) + .as_mut() + { + for (k, v) in updates { + existing_snapshot_for_bucket.value.insert(k, v); + } + return; + } + + if snapshots.len() >= max_snapshot_count { + snapshots.pop_front(); + } + + let snapshot = PersisterSnapshot { + bucket, + value: updates, + }; + + snapshots.push_back(snapshot); + } + + async fn persist_all_snapshots_and_update_state( + client: &mut Client, + previous: &mut HashMap, + snapshots: &mut VecDeque, + ttl: Duration, + ) -> anyhow::Result<()> { + loop { + if snapshots.is_empty() { + break; + } + + let snapshot = &snapshots[0]; + + if snapshot.value.len() == 0 { + snapshots.pop_front(); + continue; + } + + Self::persist_snapshot(client, &snapshot.value, ttl).await?; + + let snapshot = snapshots.pop_front().unwrap(); + for (k, v) in snapshot.value { + previous.insert(k, v); + } + } + + Ok(()) + } + + async fn try_to_reconnect( + postgres_configuration: &PostgresConfiguration, + ) -> anyhow::Result { + let client = postgres_connection::connect(&postgres_configuration) + .await? + .0; + + Ok(client) + } + + async fn load_previous(client: &Client) -> anyhow::Result> { + let rows = client + .query( + "SELECT Pubkey, Timestamp, MaintenanceRatio, Initial, Maintenance, LiquidationEnd, IsBeingLiquidated FROM mango_monitoring.health_current", + &[], + ) + .await?; + + let mut result = HashMap::::new(); + for row in rows { + let key = Pubkey::from_str(row.get(0))?; + result.insert( + key, + PersistedData { + computed_at: row.get(1), + maintenance_ratio: row.get(2), + initial_health: row.get(3), + maintenance_health: row.get(4), + liquidation_end_health: row.get(5), + is_being_liquidated: row.get(6), + }, + ); + } + + Ok(result) + } + + async fn persist_snapshot( + client: &mut Client, + updates: &HashMap, + ttl: chrono::Duration, + ) -> anyhow::Result<()> { + let tx = client.transaction().await?; + Self::insert_history(&tx, &updates).await?; + Self::delete_old_history(&tx, chrono::Utc::now(), ttl).await?; + Self::update_current(&tx).await?; + tx.commit().await?; + Ok(()) + } + + async fn insert_history<'tx>( + client: &Transaction<'tx>, + updates: &HashMap, + ) -> anyhow::Result<()> { + let col_types = [ + Type::VARCHAR, + Type::TIMESTAMPTZ, + Type::FLOAT8, + Type::FLOAT8, + Type::FLOAT8, + Type::FLOAT8, + Type::BOOL, + ]; + let sink = client.copy_in("COPY mango_monitoring.health_history (Pubkey, Timestamp, MaintenanceRatio, Initial, Maintenance, LiquidationEnd, IsBeingLiquidated) FROM STDIN BINARY").await?; + let writer = BinaryCopyInWriter::new(sink, &col_types); + pin_mut!(writer); + + for (key, value) in updates { + let key = key.to_string(); + let row: Vec<&'_ (dyn ToSql + Sync)> = vec![ + &key, + &value.computed_at, + &value.maintenance_ratio, + &value.initial_health, + &value.maintenance_health, + &value.liquidation_end_health, + &value.is_being_liquidated, + ]; + writer.as_mut().write(&row).await?; + } + + writer.finish().await?; + Ok(()) + } + + async fn update_current<'tx>(client: &Transaction<'tx>) -> anyhow::Result<()> { + let query = + postgres_query::query!("REFRESH MATERIALIZED VIEW mango_monitoring.health_current"); + query.execute(client).await?; + Ok(()) + } + + async fn delete_old_history<'tx>( + client: &Transaction<'tx>, + now: chrono::DateTime, + ttl: chrono::Duration, + ) -> anyhow::Result<()> { + let min_ts = now - ttl; + let query = postgres_query::query!( + "DELETE FROM mango_monitoring.health_history WHERE timestamp < $min_ts", + min_ts + ); + query.execute(client).await?; + Ok(()) + } + + fn should_insert( + persisted_data: &HashMap, + health_component_key: &Pubkey, + health_component: &PersistedData, + periodicity: Duration, + ) -> bool { + match persisted_data.get(health_component_key) { + None => true, + Some(previous) => { + let is_old = health_component.computed_at - previous.computed_at >= periodicity; + let between_none_and_some = previous.is_some() != health_component.is_some(); + + if is_old || between_none_and_some { + true + } else if previous.is_some() && health_component.is_some() { + let changing_flag = health_component.is_being_liquidated.unwrap() + != previous.is_being_liquidated.unwrap(); + + let curr = health_component.maintenance_ratio.unwrap(); + let prev = previous.maintenance_ratio.unwrap(); + let changing_side = (prev <= 0.0 && curr > 0.0) || (prev > 0.0 && curr <= 0.0); + let big_move = prev != 0.0 && (prev - curr).abs() / prev > 0.1; + + changing_side || changing_flag || big_move + } else { + false + } + } + } + } +} + +struct PersistedData { + pub computed_at: chrono::DateTime, + pub maintenance_ratio: Option, + pub initial_health: Option, + pub maintenance_health: Option, + pub liquidation_end_health: Option, + pub is_being_liquidated: Option, +} + +impl PersistedData { + pub fn is_some(&self) -> bool { + self.maintenance_ratio.is_some() + && self.initial_health.is_some() + && self.maintenance_health.is_some() + && self.liquidation_end_health.is_some() + && self.is_being_liquidated.is_some() + } +} + +struct PersisterSnapshot { + pub value: HashMap, + pub bucket: chrono::DateTime, +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::processors::health::HealthComponentValue; + use chrono::SubsecRound; + + fn make_value(hr: f64, i: u64, m: u64, le: u64, ibl: bool) -> Option { + Some(HealthComponentValue { + maintenance_ratio: hr, + initial_health: i as f64, + maintenance_health: m as f64, + liquidation_end_health: le as f64, + is_being_liquidated: ibl, + }) + } + + fn make_persisted_empty(t_secs: i64) -> PersistedData { + PersistedData { + computed_at: chrono::Utc::now() - chrono::Duration::seconds(t_secs), + maintenance_ratio: None, + initial_health: None, + maintenance_health: None, + liquidation_end_health: None, + is_being_liquidated: None, + } + } + + fn make_persisted(t_secs: i64, mr: f64) -> PersistedData { + PersistedData { + computed_at: chrono::Utc::now() - chrono::Duration::seconds(t_secs), + maintenance_ratio: Some(mr), + initial_health: Some(1000f64), + maintenance_health: Some(1000f64), + liquidation_end_health: Some(1f64), + is_being_liquidated: Some(false), + } + } + + fn make_persisted_with_liquidated_flag(t_secs: i64, mr: f64) -> PersistedData { + PersistedData { + computed_at: chrono::Utc::now() - chrono::Duration::seconds(t_secs), + maintenance_ratio: Some(mr), + initial_health: Some(1000f64), + maintenance_health: Some(1000f64), + liquidation_end_health: Some(1f64), + is_being_liquidated: Some(true), + } + } + + #[test] + fn should_persist_if_there_is_no_previous_point() { + let previous = HashMap::new(); + + assert!(PersisterProcessor::should_insert( + &previous, + &Pubkey::new_unique(), + &make_persisted(0, 123f64), + chrono::Duration::seconds(60) + )); + + assert!(PersisterProcessor::should_insert( + &previous, + &Pubkey::new_unique(), + &make_persisted(0, 0f64), + chrono::Duration::seconds(60) + )); + + assert!(PersisterProcessor::should_insert( + &previous, + &Pubkey::new_unique(), + &make_persisted_empty(0), + chrono::Duration::seconds(60) + )); + } + + #[test] + fn should_persist_if_previous_point_is_old() { + let mut previous = HashMap::new(); + let pk1 = Pubkey::new_unique(); + let pk2 = Pubkey::new_unique(); + previous.insert(pk1, make_persisted(120, 123.0)); + previous.insert(pk2, make_persisted(3, 123.0)); + + assert!(PersisterProcessor::should_insert( + &previous, + &pk1, + &make_persisted(0, 124.0), + chrono::Duration::seconds(60) + )); + + assert!(!PersisterProcessor::should_insert( + &previous, + &pk2, + &make_persisted(0, 124.0), + chrono::Duration::seconds(60) + )); + } + + #[test] + fn should_persist_when_change_is_interesting() { + let mut previous = HashMap::new(); + let pk1 = Pubkey::new_unique(); + let pk2 = Pubkey::new_unique(); + + previous.insert(pk1, make_persisted(0, 123f64)); + + previous.insert(pk2, make_persisted(0, 0.01)); + + // small move, nop + assert!(!PersisterProcessor::should_insert( + &previous, + &pk1, + &make_persisted(0, 124.0), + chrono::Duration::seconds(60) + )); + + // big move, insert + assert!(PersisterProcessor::should_insert( + &previous, + &pk1, + &make_persisted(0, 100.0), + chrono::Duration::seconds(60) + )); + + // small move, but cross 0, insert + assert!(PersisterProcessor::should_insert( + &previous, + &pk2, + &make_persisted(0, -0.001), + chrono::Duration::seconds(60) + )); + + // small move, does not cross 0, nop + assert!(!PersisterProcessor::should_insert( + &previous, + &pk2, + &make_persisted(0, 0.0099), + chrono::Duration::seconds(60) + )); + + // no change except flag being liquidated change + assert!(PersisterProcessor::should_insert( + &previous, + &pk2, + &make_persisted_with_liquidated_flag(0, 0.01), + chrono::Duration::seconds(60) + )); + } + + #[test] + fn should_correctly_convert_event_into_data() { + let computed_at = chrono::Utc::now(); + let component = HealthComponent { + account: Pubkey::new_unique(), + value: Some(HealthComponentValue { + maintenance_ratio: 123.0, + initial_health: 1000.0, + maintenance_health: 2000.0, + liquidation_end_health: 3000.0, + is_being_liquidated: false, + }), + }; + + let converted = PersisterProcessor::build_persisted_data(computed_at, &component); + + assert_eq!(converted.computed_at, computed_at); + assert_eq!(converted.maintenance_ratio.unwrap(), 123.0); + assert_eq!(converted.initial_health.unwrap(), 1000.0); + assert_eq!(converted.maintenance_health.unwrap(), 2000.0); + assert_eq!(converted.liquidation_end_health.unwrap(), 3000.0); + assert_eq!(converted.is_being_liquidated.unwrap(), false); + } + + #[test] + fn should_store_or_replace_snapshot() { + let pk = Pubkey::new_unique(); + let previous = HashMap::new(); + let mut snapshots = VecDeque::new(); + let event1 = HealthEvent { + computed_at: chrono::Utc::now().trunc_subsecs(0) - chrono::Duration::seconds(300), + components: vec![HealthComponent { + account: pk, + value: make_value(50.25f64, 2, 3, 4, false), + }], + }; + let event2 = HealthEvent { + computed_at: chrono::Utc::now().trunc_subsecs(0) - chrono::Duration::seconds(290), + components: vec![HealthComponent { + account: pk, + value: make_value(502.5f64, 20, 30, 40, false), + }], + }; + let event3 = HealthEvent { + computed_at: chrono::Utc::now().trunc_subsecs(0) - chrono::Duration::seconds(200), + components: vec![HealthComponent { + account: pk, + value: make_value(5025.0f64, 200, 300, 400, false), + }], + }; + let event4 = HealthEvent { + computed_at: chrono::Utc::now().trunc_subsecs(0) - chrono::Duration::seconds(100), + components: vec![HealthComponent { + account: pk, + value: make_value(50250.0f64, 2000, 3000, 4000, false), + }], + }; + + PersisterProcessor::store_snapshot( + &previous, + &mut snapshots, + &event1, + Duration::seconds(60), + 2, + ); + assert_eq!(snapshots.len(), 1); + assert_eq!( + snapshots[0] + .value + .iter() + .next() + .unwrap() + .1 + .maintenance_health + .unwrap(), + 3.0 + ); + + PersisterProcessor::store_snapshot( + &previous, + &mut snapshots, + &event2, + Duration::seconds(60), + 2, + ); + assert_eq!(snapshots.len(), 1); + assert_eq!( + snapshots[0] + .value + .iter() + .next() + .unwrap() + .1 + .maintenance_health + .unwrap(), + 30.0 + ); + + PersisterProcessor::store_snapshot( + &previous, + &mut snapshots, + &event3, + Duration::seconds(60), + 2, + ); + assert_eq!(snapshots.len(), 2); + assert_eq!( + snapshots[0] + .value + .iter() + .next() + .unwrap() + .1 + .maintenance_health + .unwrap(), + 30.0 + ); + assert_eq!( + snapshots[1] + .value + .iter() + .next() + .unwrap() + .1 + .maintenance_health + .unwrap(), + 300.0 + ); + + PersisterProcessor::store_snapshot( + &previous, + &mut snapshots, + &event4, + Duration::seconds(60), + 2, + ); + assert_eq!(snapshots.len(), 2); + assert_eq!( + snapshots[0] + .value + .iter() + .next() + .unwrap() + .1 + .maintenance_health + .unwrap(), + 300.0 + ); + assert_eq!( + snapshots[1] + .value + .iter() + .next() + .unwrap() + .1 + .maintenance_health + .unwrap(), + 3000.0 + ); + } +} diff --git a/bin/service-mango-health/src/utils/mod.rs b/bin/service-mango-health/src/utils/mod.rs new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/bin/service-mango-health/src/utils/mod.rs @@ -0,0 +1 @@ + diff --git a/cd/health.toml b/cd/health.toml new file mode 100644 index 000000000..66a37eb6d --- /dev/null +++ b/cd/health.toml @@ -0,0 +1,9 @@ +app = "mango-health-monitoring" +kill_signal = "SIGTERM" +kill_timeout = 30 + +[build] + dockerfile = "../Dockerfile" + +[experimental] + cmd = ["service-mango-health", "health-config.toml"] diff --git a/lib/services-mango-lib/Cargo.toml b/lib/services-mango-lib/Cargo.toml new file mode 100644 index 000000000..87911ede0 --- /dev/null +++ b/lib/services-mango-lib/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "services-mango-lib" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0" +base64 = "0.21" +tokio = { version = "1", features = ["full"] } +tokio-postgres = { version = "0.7", features = ["with-chrono-0_4"] } +tokio-postgres-rustls = "0.9.0" +postgres-types = { version = "0.2", features = ["array-impls", "derive", "with-chrono-0_4"] } +postgres-native-tls = "0.5" +native-tls = "0.2" +rustls = "0.20.8" +postgres_query = { git = "https://github.com/nolanderc/rust-postgres-query", rev = "b4422051c8a31fbba4a35f88004c1cefb1878dd5" } +tracing = { version = "0.1", features = ["log"] } +serde = { version = "1.0.188", features = ["derive"] } diff --git a/lib/services-mango-lib/src/lib.rs b/lib/services-mango-lib/src/lib.rs new file mode 100644 index 000000000..36329b591 --- /dev/null +++ b/lib/services-mango-lib/src/lib.rs @@ -0,0 +1,3 @@ +pub mod postgres_configuration; +pub mod postgres_connection; +pub mod retry_counter; diff --git a/lib/services-mango-lib/src/postgres_configuration.rs b/lib/services-mango-lib/src/postgres_configuration.rs new file mode 100644 index 000000000..85f8f6e75 --- /dev/null +++ b/lib/services-mango-lib/src/postgres_configuration.rs @@ -0,0 +1,16 @@ +use serde::Deserialize; + +#[derive(Clone, Debug, Deserialize, Default)] +pub struct PostgresConfiguration { + pub connection_string: String, + pub allow_invalid_certs: bool, + pub tls: Option, +} + +#[derive(Clone, Debug, Deserialize)] +pub struct PostgresTlsConfig { + /// CA Cert file or env var + pub ca_cert_path: String, + /// PKCS12 client cert path + pub client_key_path: String, +} diff --git a/lib/services-mango-lib/src/postgres_connection.rs b/lib/services-mango-lib/src/postgres_connection.rs new file mode 100644 index 000000000..def70aa49 --- /dev/null +++ b/lib/services-mango-lib/src/postgres_connection.rs @@ -0,0 +1,66 @@ +use crate::postgres_configuration::PostgresConfiguration; +use native_tls::{Certificate, Identity, TlsConnector}; +use postgres_native_tls::MakeTlsConnector; +use std::{env, fs}; +use tokio::task::JoinHandle; +use tokio_postgres::Client; + +pub async fn connect( + config: &PostgresConfiguration, +) -> anyhow::Result<(Client, JoinHandle>)> { + // openssl pkcs12 -export -in client.cer -inkey client-key.cer -out client.pks + // base64 -i ca.cer -o ca.cer.b64 && base64 -i client.pks -o client.pks.b64 + // fly secrets set PG_CA_CERT=- < ./ca.cer.b64 -a mango-fills + // fly secrets set PG_CLIENT_KEY=- < ./client.pks.b64 -a mango-fills + let tls = match &config.tls { + Some(tls) => { + use base64::{engine::general_purpose, Engine as _}; + let ca_cert = match &tls.ca_cert_path.chars().next().unwrap() { + '$' => general_purpose::STANDARD + .decode( + env::var(&tls.ca_cert_path[1..]) + .expect("reading client cert from env") + .into_bytes(), + ) + .expect("decoding client cert"), + _ => fs::read(&tls.ca_cert_path).expect("reading client cert from file"), + }; + let client_key = match &tls.client_key_path.chars().next().unwrap() { + '$' => general_purpose::STANDARD + .decode( + env::var(&tls.client_key_path[1..]) + .expect("reading client key from env") + .into_bytes(), + ) + .expect("decoding client key"), + _ => fs::read(&tls.client_key_path).expect("reading client key from file"), + }; + MakeTlsConnector::new( + TlsConnector::builder() + .add_root_certificate(Certificate::from_pem(&ca_cert)?) + .identity(Identity::from_pkcs12(&client_key, "pass")?) + .danger_accept_invalid_certs(config.allow_invalid_certs) + .build()?, + ) + } + None => MakeTlsConnector::new( + TlsConnector::builder() + .danger_accept_invalid_certs(config.allow_invalid_certs) + .build()?, + ), + }; + + let config = config.clone(); + let connection_string = match &config.connection_string.chars().next().unwrap() { + '$' => { + env::var(&config.connection_string[1..]).expect("reading connection string from env") + } + _ => config.connection_string.clone(), + }; + + let (client, connection) = tokio_postgres::connect(&connection_string, tls).await?; + + let handle = tokio::spawn(async move { connection.await }); + + Ok((client, handle)) +} diff --git a/lib/services-mango-lib/src/retry_counter.rs b/lib/services-mango-lib/src/retry_counter.rs new file mode 100644 index 000000000..a8423b8ee --- /dev/null +++ b/lib/services-mango-lib/src/retry_counter.rs @@ -0,0 +1,59 @@ +pub struct RetryCounter { + error_count: u64, + max_retry_count: u64, +} + +impl RetryCounter { + pub fn new(max_retry_count: u64) -> Self { + RetryCounter { + max_retry_count, + error_count: 0, + } + } + + pub fn reset(&mut self) { + self.error_count = 0; + } + + /// true if should retry, false if should bail + pub fn on_new_error(&mut self) -> bool { + self.error_count += 1; + self.error_count <= self.max_retry_count + } + + pub fn fail_or_ignore(&mut self, result: anyhow::Result) -> anyhow::Result> { + match result { + Err(e) => match self.on_new_error() { + true => Ok(None), + false => { + self.reset(); + Err(e) + } + }, + Ok(v) => { + self.reset(); + Ok(Some(v)) + } + } + } +} + +#[macro_export] +macro_rules! fail_or_retry { + ($retry_counter:expr, $f:expr) => {{ + loop { + let result = $retry_counter.fail_or_ignore($f); + match result { + Ok(Some(value)) => { + break Ok(value); + } + Ok(None) => { + continue; + } + Err(e) => { + break Err(e); + } + } + } + }}; +} From 53517f876b3cf516d25839315836cbb0acfb6b3c Mon Sep 17 00:00:00 2001 From: Serge Farny Date: Fri, 1 Mar 2024 11:21:58 +0100 Subject: [PATCH 08/31] ts client: fix imports (#898) --- ts/client/src/client.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ts/client/src/client.ts b/ts/client/src/client.ts index 77896e27d..e0b9054a3 100644 --- a/ts/client/src/client.ts +++ b/ts/client/src/client.ts @@ -1,4 +1,10 @@ -import { AnchorProvider, BN, Program, Wallet } from '@coral-xyz/anchor'; +import { + AnchorProvider, + BN, + Program, + Provider, + Wallet, +} from '@coral-xyz/anchor'; import { OpenOrders, decodeEventQueue } from '@project-serum/serum'; import { createAccount, @@ -63,6 +69,7 @@ import { } from './accounts/serum3'; import { IxGateParams, + PerpEditParams, TokenEditParams, TokenRegisterParams, buildIxGate, From af9b21c430b8afd962f34e05708275ee3d130787 Mon Sep 17 00:00:00 2001 From: Serge Farny Date: Fri, 1 Mar 2024 17:07:49 +0100 Subject: [PATCH 09/31] service-mango-health: read env variable for more configuration entries (#901) --- .../src/postgres_config.rs | 2 ++ bin/service-mango-health/src/configuration.rs | 4 ++++ lib/services-mango-lib/src/env_helper.rs | 21 +++++++++++++++++++ lib/services-mango-lib/src/lib.rs | 1 + .../src/postgres_configuration.rs | 2 ++ .../src/postgres_connection.rs | 8 +------ 6 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 lib/services-mango-lib/src/env_helper.rs diff --git a/bin/service-mango-fills/src/postgres_config.rs b/bin/service-mango-fills/src/postgres_config.rs index 35342673a..e238c23de 100644 --- a/bin/service-mango-fills/src/postgres_config.rs +++ b/bin/service-mango-fills/src/postgres_config.rs @@ -1,8 +1,10 @@ use serde_derive::Deserialize; +use services_mango_lib::env_helper::string_or_env; use services_mango_lib::postgres_configuration::PostgresTlsConfig; #[derive(Clone, Debug, Deserialize)] pub struct PostgresConfig { + #[serde(deserialize_with = "string_or_env")] pub connection_string: String, /// Number of parallel postgres connections used for insertions pub connection_count: u64, diff --git a/bin/service-mango-health/src/configuration.rs b/bin/service-mango-health/src/configuration.rs index 9552898b9..76ca7944d 100644 --- a/bin/service-mango-health/src/configuration.rs +++ b/bin/service-mango-health/src/configuration.rs @@ -1,12 +1,16 @@ use serde_derive::Deserialize; +use services_mango_lib::env_helper::string_or_env; use services_mango_lib::postgres_configuration::PostgresConfiguration; use std::collections::HashSet; #[derive(Clone, Debug, Deserialize)] pub struct Configuration { pub postgres: Option, + #[serde(deserialize_with = "string_or_env")] pub rpc_http_url: String, + #[serde(deserialize_with = "string_or_env")] pub rpc_ws_url: String, + #[serde(deserialize_with = "string_or_env")] pub mango_group: String, pub computing_configuration: ComputingConfiguration, pub logging_configuration: LoggingConfiguration, diff --git a/lib/services-mango-lib/src/env_helper.rs b/lib/services-mango-lib/src/env_helper.rs new file mode 100644 index 000000000..242262ad1 --- /dev/null +++ b/lib/services-mango-lib/src/env_helper.rs @@ -0,0 +1,21 @@ +use serde::{Deserialize, Deserializer}; +use std::env; + +/// Get a string content, or the content of an Env variable it the string start with $ +/// +/// Example: +/// - "abc" -> "abc" +/// - "$something" -> read env variable named something and return it's content +/// +/// *WARNING*: May kill the program if we are asking for anv environment variable that does not exist +pub fn string_or_env<'de, D>(deserializer: D) -> Result +where + D: Deserializer<'de>, +{ + let value_or_env = String::deserialize(deserializer)?; + let value = match &value_or_env.chars().next().unwrap() { + '$' => env::var(&value_or_env[1..]).expect("reading from env"), + _ => value_or_env, + }; + Ok(value) +} diff --git a/lib/services-mango-lib/src/lib.rs b/lib/services-mango-lib/src/lib.rs index 36329b591..211b75722 100644 --- a/lib/services-mango-lib/src/lib.rs +++ b/lib/services-mango-lib/src/lib.rs @@ -1,3 +1,4 @@ +pub mod env_helper; pub mod postgres_configuration; pub mod postgres_connection; pub mod retry_counter; diff --git a/lib/services-mango-lib/src/postgres_configuration.rs b/lib/services-mango-lib/src/postgres_configuration.rs index 85f8f6e75..718f3a5ea 100644 --- a/lib/services-mango-lib/src/postgres_configuration.rs +++ b/lib/services-mango-lib/src/postgres_configuration.rs @@ -1,7 +1,9 @@ +use crate::env_helper::string_or_env; use serde::Deserialize; #[derive(Clone, Debug, Deserialize, Default)] pub struct PostgresConfiguration { + #[serde(deserialize_with = "string_or_env")] pub connection_string: String, pub allow_invalid_certs: bool, pub tls: Option, diff --git a/lib/services-mango-lib/src/postgres_connection.rs b/lib/services-mango-lib/src/postgres_connection.rs index def70aa49..bc393ac88 100644 --- a/lib/services-mango-lib/src/postgres_connection.rs +++ b/lib/services-mango-lib/src/postgres_connection.rs @@ -51,14 +51,8 @@ pub async fn connect( }; let config = config.clone(); - let connection_string = match &config.connection_string.chars().next().unwrap() { - '$' => { - env::var(&config.connection_string[1..]).expect("reading connection string from env") - } - _ => config.connection_string.clone(), - }; - let (client, connection) = tokio_postgres::connect(&connection_string, tls).await?; + let (client, connection) = tokio_postgres::connect(&config.connection_string, tls).await?; let handle = tokio::spawn(async move { connection.await }); From cb685bd739824c085340336b3f93fb9e821a3ece Mon Sep 17 00:00:00 2001 From: Robert Chen Date: Mon, 4 Mar 2024 02:11:41 -0700 Subject: [PATCH 10/31] add audit report for v0.23.0 (#902) --- audits/Audit_OtterSec_Mango_v0.23.0.pdf | Bin 0 -> 303561 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 audits/Audit_OtterSec_Mango_v0.23.0.pdf diff --git a/audits/Audit_OtterSec_Mango_v0.23.0.pdf b/audits/Audit_OtterSec_Mango_v0.23.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0f76ab97da0f99ed7fe8db59d70bf3eea82b7926 GIT binary patch literal 303561 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

|vr2~MOF&TFHq#PUNNkk}M1Gi6!hv~N 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�?e^oGba2X)`A|hp_Nm?J28~G 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 v{{1%s|Bb+ZBkGBU72l8}hVi9-GlcsR-k literal 0 HcmV?d00001 From e7f5cd74988c00cef098dc46f435c904dc1482d0 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 4 Mar 2024 11:15:23 +0100 Subject: [PATCH 11/31] Bump program version to v0.24.0, update idl --- Cargo.lock | 2 +- mango_v4.json | 110 +++++++++++++++++- programs/mango-v4/Cargo.toml | 2 +- ts/client/src/mango_v4.ts | 220 ++++++++++++++++++++++++++++++++++- 4 files changed, 329 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3953e9ce6..ad1289b71 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3367,7 +3367,7 @@ dependencies = [ [[package]] name = "mango-v4" -version = "0.22.0" +version = "0.24.0" dependencies = [ "anchor-lang", "anchor-spl", diff --git a/mango_v4.json b/mango_v4.json index bf1308a1d..d041fa22f 100644 --- a/mango_v4.json +++ b/mango_v4.json @@ -1,5 +1,5 @@ { - "version": "0.22.0", + "version": "0.24.0", "name": "mango_v4", "instructions": [ { @@ -11048,6 +11048,9 @@ }, { "name": "OrcaCLMM" + }, + { + "name": "RaydiumCLMM" } ] } @@ -12871,6 +12874,71 @@ } ] }, + { + "name": "PerpLiqBaseOrPositivePnlLogV3", + "fields": [ + { + "name": "mangoGroup", + "type": "publicKey", + "index": false + }, + { + "name": "perpMarketIndex", + "type": "u16", + "index": false + }, + { + "name": "liqor", + "type": "publicKey", + "index": false + }, + { + "name": "liqee", + "type": "publicKey", + "index": false + }, + { + "name": "baseTransferLiqee", + "type": "i64", + "index": false + }, + { + "name": "quoteTransferLiqee", + "type": "i128", + "index": false + }, + { + "name": "quoteTransferLiqor", + "type": "i128", + "index": false + }, + { + "name": "quotePlatformFee", + "type": "i128", + "index": false + }, + { + "name": "pnlTransfer", + "type": "i128", + "index": false + }, + { + "name": "pnlSettleLimitTransferRecurring", + "type": "i64", + "index": false + }, + { + "name": "pnlSettleLimitTransferOneshot", + "type": "i64", + "index": false + }, + { + "name": "price", + "type": "i128", + "index": false + } + ] + }, { "name": "PerpLiqBankruptcyLog", "fields": [ @@ -13888,6 +13956,46 @@ "name": "fee", "type": "i128", "index": false + }, + { + "name": "price", + "type": "i128", + "index": false + } + ] + }, + { + "name": "ForceWithdrawLog", + "fields": [ + { + "name": "mangoGroup", + "type": "publicKey", + "index": false + }, + { + "name": "mangoAccount", + "type": "publicKey", + "index": false + }, + { + "name": "tokenIndex", + "type": "u16", + "index": false + }, + { + "name": "quantity", + "type": "u64", + "index": false + }, + { + "name": "price", + "type": "i128", + "index": false + }, + { + "name": "toTokenAccount", + "type": "publicKey", + "index": false } ] } diff --git a/programs/mango-v4/Cargo.toml b/programs/mango-v4/Cargo.toml index b0b3fc7b2..83f3a9491 100644 --- a/programs/mango-v4/Cargo.toml +++ b/programs/mango-v4/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mango-v4" -version = "0.22.0" +version = "0.24.0" description = "Created with Anchor" edition = "2021" diff --git a/ts/client/src/mango_v4.ts b/ts/client/src/mango_v4.ts index 14c08749e..bcce269fb 100644 --- a/ts/client/src/mango_v4.ts +++ b/ts/client/src/mango_v4.ts @@ -1,5 +1,5 @@ export type MangoV4 = { - "version": "0.22.0", + "version": "0.24.0", "name": "mango_v4", "instructions": [ { @@ -11048,6 +11048,9 @@ export type MangoV4 = { }, { "name": "OrcaCLMM" + }, + { + "name": "RaydiumCLMM" } ] } @@ -12871,6 +12874,71 @@ export type MangoV4 = { } ] }, + { + "name": "PerpLiqBaseOrPositivePnlLogV3", + "fields": [ + { + "name": "mangoGroup", + "type": "publicKey", + "index": false + }, + { + "name": "perpMarketIndex", + "type": "u16", + "index": false + }, + { + "name": "liqor", + "type": "publicKey", + "index": false + }, + { + "name": "liqee", + "type": "publicKey", + "index": false + }, + { + "name": "baseTransferLiqee", + "type": "i64", + "index": false + }, + { + "name": "quoteTransferLiqee", + "type": "i128", + "index": false + }, + { + "name": "quoteTransferLiqor", + "type": "i128", + "index": false + }, + { + "name": "quotePlatformFee", + "type": "i128", + "index": false + }, + { + "name": "pnlTransfer", + "type": "i128", + "index": false + }, + { + "name": "pnlSettleLimitTransferRecurring", + "type": "i64", + "index": false + }, + { + "name": "pnlSettleLimitTransferOneshot", + "type": "i64", + "index": false + }, + { + "name": "price", + "type": "i128", + "index": false + } + ] + }, { "name": "PerpLiqBankruptcyLog", "fields": [ @@ -13888,6 +13956,46 @@ export type MangoV4 = { "name": "fee", "type": "i128", "index": false + }, + { + "name": "price", + "type": "i128", + "index": false + } + ] + }, + { + "name": "ForceWithdrawLog", + "fields": [ + { + "name": "mangoGroup", + "type": "publicKey", + "index": false + }, + { + "name": "mangoAccount", + "type": "publicKey", + "index": false + }, + { + "name": "tokenIndex", + "type": "u16", + "index": false + }, + { + "name": "quantity", + "type": "u64", + "index": false + }, + { + "name": "price", + "type": "i128", + "index": false + }, + { + "name": "toTokenAccount", + "type": "publicKey", + "index": false } ] } @@ -14247,7 +14355,7 @@ export type MangoV4 = { }; export const IDL: MangoV4 = { - "version": "0.22.0", + "version": "0.24.0", "name": "mango_v4", "instructions": [ { @@ -25296,6 +25404,9 @@ export const IDL: MangoV4 = { }, { "name": "OrcaCLMM" + }, + { + "name": "RaydiumCLMM" } ] } @@ -27119,6 +27230,71 @@ export const IDL: MangoV4 = { } ] }, + { + "name": "PerpLiqBaseOrPositivePnlLogV3", + "fields": [ + { + "name": "mangoGroup", + "type": "publicKey", + "index": false + }, + { + "name": "perpMarketIndex", + "type": "u16", + "index": false + }, + { + "name": "liqor", + "type": "publicKey", + "index": false + }, + { + "name": "liqee", + "type": "publicKey", + "index": false + }, + { + "name": "baseTransferLiqee", + "type": "i64", + "index": false + }, + { + "name": "quoteTransferLiqee", + "type": "i128", + "index": false + }, + { + "name": "quoteTransferLiqor", + "type": "i128", + "index": false + }, + { + "name": "quotePlatformFee", + "type": "i128", + "index": false + }, + { + "name": "pnlTransfer", + "type": "i128", + "index": false + }, + { + "name": "pnlSettleLimitTransferRecurring", + "type": "i64", + "index": false + }, + { + "name": "pnlSettleLimitTransferOneshot", + "type": "i64", + "index": false + }, + { + "name": "price", + "type": "i128", + "index": false + } + ] + }, { "name": "PerpLiqBankruptcyLog", "fields": [ @@ -28136,6 +28312,46 @@ export const IDL: MangoV4 = { "name": "fee", "type": "i128", "index": false + }, + { + "name": "price", + "type": "i128", + "index": false + } + ] + }, + { + "name": "ForceWithdrawLog", + "fields": [ + { + "name": "mangoGroup", + "type": "publicKey", + "index": false + }, + { + "name": "mangoAccount", + "type": "publicKey", + "index": false + }, + { + "name": "tokenIndex", + "type": "u16", + "index": false + }, + { + "name": "quantity", + "type": "u64", + "index": false + }, + { + "name": "price", + "type": "i128", + "index": false + }, + { + "name": "toTokenAccount", + "type": "publicKey", + "index": false } ] } From df15672522f31c41d76854706fce86a339dfc88f Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 4 Mar 2024 11:20:13 +0100 Subject: [PATCH 12/31] Changelog for v0.23.0 (#903) --- CHANGELOG.md | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5d921f3b..059ff79d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,13 +4,75 @@ Update this for each program release and mainnet deployment. ## not on mainnet +### v0.23.0, 2024-3- + +- Allow disabling asset liquidations for tokens (#867) + + This allows listing tokens that have no reliable oracle. Those tokens could be + traded through mango but can't be borrowed, can't have asset weight and can't + even be liquidated. + +- Add configurable collateral fees for tokens (#868, #880, #894) + + Collateral fees allow the DAO to regularly charge users for using particular + types of collateral to back their liabilities. + +- Add force_withdraw token state (#884) + + There already is a force_close_borrows state, but for a full delisting user + deposits need to be removed too. In force_withdraw, user deposits can be + permissionlessly withdrawn to their owners' token accounts. + +- Flash loan: Add a "swap without flash loan fees" option (#882) +- Cleanup, tests and minor (#878, #875, #854, #838, #895) + ## mainnet -### v0.21.2, 2024-1- +### v0.22.0, 2024-3-3 + +Deployment: Mar 3, 2024 at 23:52:08 Central European Standard Time, https://explorer.solana.com/tx/3MpEMU12Pv7RpSnwfShoM9sbyr41KAEeJFCVx9ypkq8nuK8Q5vm7CRLkdhH3u91yQ4k44a32armZHaoYguX6NqsY + +- Perp: Allow reusing your own perp order slots immediately (#817) + + Previously users who placed a lot of perp orders and used time-in-force needed + to wait for out-event cranking if their perp order before reusing an order + slot. Now perp order slots can be reused even when the out-event is still on + the event queue. + +- Introduce fallback oracles (#790, #813) + + Fallback oracles can be used when the primary oracle is stale or not confident. + These oracles need to configured by the DAO to be usable by clients. + + Fallback oracles may be based on Orca in addition to the other supported types. + +- Add serum3_cancel_by_client_order_id instruction (#798) + + Can now cancel by client order id and not just the order id. + +- Add configurable platform liquidation fees for tokens and perps (#849, #858) +- Delegates can now withdraw small token amounts to the owner's ata (#820) +- Custom allocator to allow larger heap use if needed (#801) +- Optimize compute use in token_deposit instruction (#786) +- Disable support for v1 and v2 mango accounts (#783) +- Cleanups, logging and tests (#819, #799, #818, #823, #834, #828, #833) + +### v0.21.3, 2024-2-9 + +Deployment: Feb 9, 2024 at 11:21:58 Central European Standard Time, https://explorer.solana.com/tx/44f2wcLyLiic1aycdaPTdfwXJBMeGeuA984kvCByg4L5iGprH6xW3D35gd3bvZ6kU3SipEtoY3kDuexJghbxL89T + +- Remove deposit limit check on Openbook v1 when placing an order to sell + deposits (#869) + +### v0.21.2, 2024-1-30 + +Deployment: Jan 30, 2024 at 12:36:09 Central European Standard Time, https://explorer.solana.com/tx/2kw6XhRUpLbh1fsPyQimCgNWjhy717qnUvxNMtLcBS4VNu8i59AJK4wY7wfZV62gT3GkSRTyaDNyD7Dkrg2gUFxC - Allow fast-listing of Openbook v1 markets (#839, #841) -### v0.21.1, 2024-1- +### v0.21.1, 2024-1-3 + +Deployment: Jan 3, 2024 at 14:35:10 Central European Standard Time, https://explorer.solana.com/tx/345NMQAvvtXeuGENz8icErXjGNmgkdU84JpvAMJFWXEGYZ2BNxFFcyZsHp5ELwLNUzY4s2hLa6wxHWPBFsTBLspA - Prevent withdraw operations from bringing token utilization over 100%. - Prevent extreme interest rates for tokens with borrows but near zero deposits. From a7aaaff07e22ffcbc3b8b6a907a04a8f837bde0e Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 4 Mar 2024 15:49:14 +0100 Subject: [PATCH 13/31] allow skipping banks and oracles in fixed-order health account list (#891) The following instructions now allow skipping banks and oracles if health and the token position balance is not negative: - token_withdraw - token_deposit - serum3_place_order - perp_place_order - flash_loan They also allow skipping oracles that are stale. --- programs/mango-v4/src/error.rs | 2 + .../mango-v4/src/health/account_retriever.rs | 213 +++++++++++-- programs/mango-v4/src/health/cache.rs | 235 +++++++++++++- .../mango-v4/src/instructions/flash_loan.rs | 40 ++- .../perp_liq_force_cancel_orders.rs | 5 +- .../src/instructions/perp_place_order.rs | 24 +- .../src/instructions/perp_settle_fees.rs | 6 +- .../serum3_liq_force_cancel_orders.rs | 6 +- .../src/instructions/serum3_place_order.rs | 39 ++- .../token_charge_collateral_fees.rs | 5 +- .../src/instructions/token_deposit.rs | 24 +- .../src/instructions/token_withdraw.rs | 68 ++-- programs/mango-v4/src/util.rs | 6 + programs/mango-v4/tests/cases/test_basic.rs | 260 ++++++++++++++++ .../tests/cases/test_health_compute.rs | 2 +- .../mango-v4/tests/cases/test_margin_trade.rs | 109 +++++++ programs/mango-v4/tests/cases/test_perp.rs | 132 ++++++++ programs/mango-v4/tests/cases/test_serum.rs | 117 +++++-- .../tests/program_test/mango_client.rs | 292 ++++++++++-------- 19 files changed, 1334 insertions(+), 251 deletions(-) diff --git a/programs/mango-v4/src/error.rs b/programs/mango-v4/src/error.rs index 1859d26aa..c7510ba3c 100644 --- a/programs/mango-v4/src/error.rs +++ b/programs/mango-v4/src/error.rs @@ -145,6 +145,8 @@ pub enum MangoError { MissingFeedForCLMMOracle, #[msg("the asset does not allow liquidation")] TokenAssetLiquidationDisabled, + #[msg("for borrows the bank must be in the health account list")] + BorrowsRequireHealthAccountBank, } impl MangoError { diff --git a/programs/mango-v4/src/health/account_retriever.rs b/programs/mango-v4/src/health/account_retriever.rs index 27bc0f14d..43bffd482 100644 --- a/programs/mango-v4/src/health/account_retriever.rs +++ b/programs/mango-v4/src/health/account_retriever.rs @@ -26,6 +26,8 @@ use crate::state::{Bank, MangoAccountRef, PerpMarket, PerpMarketIndex, TokenInde /// are passed because health needs to be computed for different baskets in /// one instruction (such as for liquidation instructions). pub trait AccountRetriever { + fn available_banks(&self) -> Result>; + fn bank_and_oracle( &self, group: &Pubkey, @@ -45,11 +47,12 @@ pub trait AccountRetriever { /// Assumes the account infos needed for the health computation follow a strict order. /// -/// 1. n_banks Bank account, in the order of account.token_iter_active() +/// 1. n_banks Bank account, in the order of account.active_token_positions() although it's +/// allowed for some of the banks (and their oracles in 2.) to be skipped /// 2. n_banks oracle accounts, one for each bank in the same order -/// 3. PerpMarket accounts, in the order of account.perps.iter_active_accounts() +/// 3. PerpMarket accounts, in the order of account.perps.active_perp_positions() /// 4. PerpMarket oracle accounts, in the order of the perp market accounts -/// 5. serum3 OpenOrders accounts, in the order of account.serum3.iter_active() +/// 5. serum3 OpenOrders accounts, in the order of account.active_serum3_orders() /// 6. fallback oracle accounts, order and existence of accounts is not guaranteed pub struct FixedOrderAccountRetriever { pub ais: Vec, @@ -63,20 +66,61 @@ pub struct FixedOrderAccountRetriever { pub sol_oracle_index: Option, } +/// Creates a FixedOrderAccountRetriever where all banks are present pub fn new_fixed_order_account_retriever<'a, 'info>( ais: &'a [AccountInfo<'info>], account: &MangoAccountRef, + now_slot: u64, ) -> Result>> { let active_token_len = account.active_token_positions().count(); + + // Load the banks early to verify them + for ai in &ais[0..active_token_len] { + ai.load::()?; + } + + new_fixed_order_account_retriever_inner(ais, account, now_slot, active_token_len) +} + +/// A FixedOrderAccountRetriever with n_banks <= active_token_positions().count(), +/// depending on which banks were passed. +pub fn new_fixed_order_account_retriever_with_optional_banks<'a, 'info>( + ais: &'a [AccountInfo<'info>], + account: &MangoAccountRef, + now_slot: u64, +) -> Result>> { + // Scan for the number of banks provided + let mut n_banks = 0; + for ai in ais { + if let Some((_, bank_result)) = can_load_as::((0, ai)) { + bank_result?; + n_banks += 1; + } else { + break; + } + } + + let active_token_len = account.active_token_positions().count(); + require_gte!(active_token_len, n_banks); + + new_fixed_order_account_retriever_inner(ais, account, now_slot, n_banks) +} + +pub fn new_fixed_order_account_retriever_inner<'a, 'info>( + ais: &'a [AccountInfo<'info>], + account: &MangoAccountRef, + now_slot: u64, + n_banks: usize, +) -> Result>> { let active_serum3_len = account.active_serum3_orders().count(); let active_perp_len = account.active_perp_positions().count(); - let expected_ais = active_token_len * 2 // banks + oracles + let expected_ais = n_banks * 2 // banks + oracles + active_perp_len * 2 // PerpMarkets + Oracles + active_serum3_len; // open_orders require_msg_typed!(ais.len() >= expected_ais, MangoError::InvalidHealthAccountCount, "received {} accounts but expected {} ({} banks, {} bank oracles, {} perp markets, {} perp oracles, {} serum3 oos)", ais.len(), expected_ais, - active_token_len, active_token_len, active_perp_len, active_perp_len, active_serum3_len + n_banks, n_banks, active_perp_len, active_perp_len, active_serum3_len ); let usdc_oracle_index = ais[..] .iter() @@ -87,11 +131,11 @@ pub fn new_fixed_order_account_retriever<'a, 'info>( Ok(FixedOrderAccountRetriever { ais: AccountInfoRef::borrow_slice(ais)?, - n_banks: active_token_len, + n_banks, n_perps: active_perp_len, - begin_perp: active_token_len * 2, - begin_serum3: active_token_len * 2 + active_perp_len * 2, - staleness_slot: Some(Clock::get()?.slot), + begin_perp: n_banks * 2, + begin_serum3: n_banks * 2 + active_perp_len * 2, + staleness_slot: Some(now_slot), begin_fallback_oracles: expected_ais, usdc_oracle_index, sol_oracle_index, @@ -99,11 +143,28 @@ pub fn new_fixed_order_account_retriever<'a, 'info>( } impl FixedOrderAccountRetriever { - fn bank(&self, group: &Pubkey, account_index: usize, token_index: TokenIndex) -> Result<&Bank> { - let bank = self.ais[account_index].load::()?; - require_keys_eq!(bank.group, *group); - require_eq!(bank.token_index, token_index); - Ok(bank) + fn bank( + &self, + group: &Pubkey, + active_token_position_index: usize, + token_index: TokenIndex, + ) -> Result<(usize, &Bank)> { + // Maybe not all banks were passed: The desired bank must be at or + // to the left of account_index and left of n_banks. + let end_index = (active_token_position_index + 1).min(self.n_banks); + for i in (0..end_index).rev() { + let ai = &self.ais[i]; + let bank = ai.load_fully_unchecked::()?; + if bank.token_index == token_index { + require_keys_eq!(bank.group, *group); + return Ok((i, bank)); + } + } + Err(error_msg_typed!( + MangoError::InvalidHealthAccountCount, + "bank for token index {} not found", + token_index + )) } fn perp_market( @@ -146,25 +207,25 @@ impl FixedOrderAccountRetriever { } impl AccountRetriever for FixedOrderAccountRetriever { + fn available_banks(&self) -> Result> { + let mut result = Vec::with_capacity(self.n_banks); + for bank_ai in &self.ais[0..self.n_banks] { + let bank = bank_ai.load_fully_unchecked::()?; + result.push(bank.token_index); + } + Ok(result) + } + fn bank_and_oracle( &self, group: &Pubkey, active_token_position_index: usize, token_index: TokenIndex, ) -> Result<(&Bank, I80F48)> { - let bank_account_index = active_token_position_index; - let bank = self - .bank(group, bank_account_index, token_index) - .with_context(|| { - format!( - "loading bank with health account index {}, token index {}, passed account {}", - bank_account_index, - token_index, - self.ais[bank_account_index].key(), - ) - })?; + let (bank_account_index, bank) = + self.bank(group, active_token_position_index, token_index)?; - let oracle_index = self.n_banks + active_token_position_index; + let oracle_index = self.n_banks + bank_account_index; let oracle_acc_infos = &self.create_oracle_infos(oracle_index, &bank.fallback_oracle); let oracle_price_result = bank.oracle_price(oracle_acc_infos, self.staleness_slot); let oracle_price = oracle_price_result.with_context(|| { @@ -505,6 +566,10 @@ impl<'a, 'info> ScanningAccountRetriever<'a, 'info> { } impl<'a, 'info> AccountRetriever for ScanningAccountRetriever<'a, 'info> { + fn available_banks(&self) -> Result> { + Ok(self.banks_and_oracles.index_map.keys().copied().collect()) + } + fn bank_and_oracle( &self, _group: &Pubkey, @@ -530,6 +595,8 @@ impl<'a, 'info> AccountRetriever for ScanningAccountRetriever<'a, 'info> { #[cfg(test)] mod tests { + use crate::state::{MangoAccount, MangoAccountValue}; + use super::super::test::*; use super::*; use serum_dex::state::OpenOrders; @@ -650,4 +717,98 @@ mod tests { .perp_market_and_oracle_price(&group, 1, 5) .is_err()); } + + #[test] + fn test_fixed_account_retriever_with_skips() { + let group = Pubkey::new_unique(); + + let (mut bank1, mut oracle1) = mock_bank_and_oracle(group, 10, 1.0, 0.2, 0.1); + let (mut bank2, mut oracle2) = mock_bank_and_oracle(group, 20, 2.0, 0.2, 0.1); + let (mut bank3, mut oracle3) = mock_bank_and_oracle(group, 30, 3.0, 0.2, 0.1); + + let mut perp1 = mock_perp_market(group, oracle2.pubkey, 2.0, 9, (0.2, 0.1), (0.05, 0.02)); + let mut oracle2_clone = oracle2.clone(); + + let buffer = MangoAccount::default_for_tests().try_to_vec().unwrap(); + let mut account = MangoAccountValue::from_bytes(&buffer).unwrap(); + account.ensure_token_position(10).unwrap(); + account.ensure_token_position(20).unwrap(); + account.ensure_token_position(30).unwrap(); + account.ensure_perp_position(9, 10).unwrap(); + + // pass all + { + let ais = vec![ + bank1.as_account_info(), + bank2.as_account_info(), + bank3.as_account_info(), + oracle1.as_account_info(), + oracle2.as_account_info(), + oracle3.as_account_info(), + perp1.as_account_info(), + oracle2_clone.as_account_info(), + ]; + let retriever = + new_fixed_order_account_retriever_with_optional_banks(&ais, &account.borrow(), 0) + .unwrap(); + assert_eq!(retriever.available_banks(), Ok(vec![10, 20, 30])); + + let (i, bank) = retriever.bank(&group, 0, 10).unwrap(); + assert_eq!(i, 0); + assert_eq!(bank.token_index, 10); + + let (i, bank) = retriever.bank(&group, 1, 20).unwrap(); + assert_eq!(i, 1); + assert_eq!(bank.token_index, 20); + + let (i, bank) = retriever.bank(&group, 2, 30).unwrap(); + assert_eq!(i, 2); + assert_eq!(bank.token_index, 30); + + assert!(retriever.perp_market(&group, 6, 9).is_ok()); + } + + // skip bank2 + { + let ais = vec![ + bank1.as_account_info(), + bank3.as_account_info(), + oracle1.as_account_info(), + oracle3.as_account_info(), + perp1.as_account_info(), + oracle2_clone.as_account_info(), + ]; + let retriever = + new_fixed_order_account_retriever_with_optional_banks(&ais, &account.borrow(), 0) + .unwrap(); + assert_eq!(retriever.available_banks(), Ok(vec![10, 30])); + + let (i, bank) = retriever.bank(&group, 0, 10).unwrap(); + assert_eq!(i, 0); + assert_eq!(bank.token_index, 10); + + let (i, bank) = retriever.bank(&group, 2, 30).unwrap(); + assert_eq!(i, 1); + assert_eq!(bank.token_index, 30); + + assert!(retriever.bank(&group, 1, 20).is_err()); + + assert!(retriever.perp_market(&group, 4, 9).is_ok()); + } + + // skip all + { + let ais = vec![perp1.as_account_info(), oracle2_clone.as_account_info()]; + let retriever = + new_fixed_order_account_retriever_with_optional_banks(&ais, &account.borrow(), 0) + .unwrap(); + assert_eq!(retriever.available_banks(), Ok(vec![])); + + assert!(retriever.bank(&group, 0, 10).is_err()); + assert!(retriever.bank(&group, 1, 20).is_err()); + assert!(retriever.bank(&group, 2, 30).is_err()); + + assert!(retriever.perp_market(&group, 0, 9).is_ok()); + } + } } diff --git a/programs/mango-v4/src/health/cache.rs b/programs/mango-v4/src/health/cache.rs index 4c9fa7c3e..6a105af36 100644 --- a/programs/mango-v4/src/health/cache.rs +++ b/programs/mango-v4/src/health/cache.rs @@ -96,7 +96,7 @@ pub fn compute_health_from_fixed_accounts( ais: &[AccountInfo], now_ts: u64, ) -> Result { - let retriever = new_fixed_order_account_retriever(ais, account)?; + let retriever = new_fixed_order_account_retriever(ais, account, Clock::get()?.slot)?; Ok(new_health_cache(account, &retriever, now_ts)?.health(health_type)) } @@ -1230,7 +1230,7 @@ pub fn new_health_cache( retriever: &impl AccountRetriever, now_ts: u64, ) -> Result { - new_health_cache_impl(account, retriever, now_ts, false) + new_health_cache_impl(account, retriever, now_ts, false, false) } /// Generate a special HealthCache for an account and its health accounts @@ -1243,7 +1243,15 @@ pub fn new_health_cache_skipping_bad_oracles( retriever: &impl AccountRetriever, now_ts: u64, ) -> Result { - new_health_cache_impl(account, retriever, now_ts, true) + new_health_cache_impl(account, retriever, now_ts, true, false) +} + +pub fn new_health_cache_skipping_missing_banks_and_bad_oracles( + account: &MangoAccountRef, + retriever: &impl AccountRetriever, + now_ts: u64, +) -> Result { + new_health_cache_impl(account, retriever, now_ts, true, true) } fn new_health_cache_impl( @@ -1254,13 +1262,40 @@ fn new_health_cache_impl( // not be negative, skip it. This decreases health, but maybe overall it's // still positive? skip_bad_oracles: bool, + skip_missing_banks: bool, ) -> Result { // token contribution from token accounts let mut token_infos = Vec::with_capacity(account.active_token_positions().count()); + // As a CU optimization, don't call available_banks() unless necessary + let available_banks_opt = if skip_missing_banks { + Some(retriever.available_banks()?) + } else { + None + }; + for (i, position) in account.active_token_positions().enumerate() { + // Allow skipping of missing banks only if the account has a nonnegative balance + if skip_missing_banks { + let bank_is_available = available_banks_opt + .as_ref() + .unwrap() + .contains(&position.token_index); + if !bank_is_available { + require_msg_typed!( + position.indexed_position >= 0, + MangoError::InvalidBank, + "the bank for token index {} is a required health account when the account has a negative balance in it", + position.token_index + ); + continue; + } + } + let bank_oracle_result = retriever.bank_and_oracle(&account.fixed.group, i, position.token_index); + + // Allow skipping of bad-oracle banks if the account has a nonnegative balance if skip_bad_oracles && bank_oracle_result.is_oracle_error() && position.indexed_position >= 0 @@ -1301,9 +1336,25 @@ fn new_health_cache_impl( let oo = retriever.serum_oo(i, &serum_account.open_orders)?; // find the TokenInfos for the market's base and quote tokens - let base_info_index = find_token_info_index(&token_infos, serum_account.base_token_index)?; - let quote_info_index = - find_token_info_index(&token_infos, serum_account.quote_token_index)?; + // and potentially skip the whole serum contribution if they are not available + let info_index_results = ( + find_token_info_index(&token_infos, serum_account.base_token_index), + find_token_info_index(&token_infos, serum_account.quote_token_index), + ); + let (base_info_index, quote_info_index) = match info_index_results { + (Ok(base), Ok(quote)) => (base, quote), + _ => { + require_msg_typed!( + skip_bad_oracles || skip_missing_banks, + MangoError::InvalidBank, + "serum market {} misses health accounts for bank {} or {}", + serum_account.market_index, + serum_account.base_token_index, + serum_account.quote_token_index, + ); + continue; + } + }; // add the amounts that are freely settleable immediately to token balances let base_free = I80F48::from(oo.native_coin_free); @@ -1329,6 +1380,12 @@ fn new_health_cache_impl( i, perp_position.market_index, )?; + + // Ensure the settle token is available in the health cache + if skip_bad_oracles || skip_missing_banks { + find_token_info_index(&token_infos, perp_market.settle_token_index)?; + } + perp_infos.push(PerpInfo::new( perp_position, perp_market, @@ -1879,4 +1936,170 @@ mod tests { test_health1_runner(testcase); } } + + #[test] + fn test_health_with_skips() { + let testcase = TestHealth1Case { + // 6, reserved oo funds + token1: 100, + token2: 10, + token3: -10, + oo_1_2: (5, 1), + oo_1_3: (0, 0), + ..Default::default() + }; + + let buffer = MangoAccount::default_for_tests().try_to_vec().unwrap(); + let mut account = MangoAccountValue::from_bytes(&buffer).unwrap(); + + let group = Pubkey::new_unique(); + account.fixed.group = group; + + let (mut bank1, mut oracle1) = mock_bank_and_oracle(group, 0, 1.0, 0.2, 0.1); + let (mut bank2, mut oracle2) = mock_bank_and_oracle(group, 4, 5.0, 0.5, 0.3); + let (mut bank3, mut oracle3) = mock_bank_and_oracle(group, 5, 10.0, 0.5, 0.3); + bank1 + .data() + .change_without_fee( + account.ensure_token_position(0).unwrap().0, + I80F48::from(testcase.token1), + DUMMY_NOW_TS, + ) + .unwrap(); + bank2 + .data() + .change_without_fee( + account.ensure_token_position(4).unwrap().0, + I80F48::from(testcase.token2), + DUMMY_NOW_TS, + ) + .unwrap(); + bank3 + .data() + .change_without_fee( + account.ensure_token_position(5).unwrap().0, + I80F48::from(testcase.token3), + DUMMY_NOW_TS, + ) + .unwrap(); + + let mut oo1 = TestAccount::::new_zeroed(); + let serum3account1 = account.create_serum3_orders(2).unwrap(); + serum3account1.open_orders = oo1.pubkey; + serum3account1.base_token_index = 4; + serum3account1.quote_token_index = 0; + oo1.data().native_pc_total = testcase.oo_1_2.0; + oo1.data().native_coin_total = testcase.oo_1_2.1; + + fn compute_health_with_retriever<'a, 'info>( + ais: &[AccountInfo], + account: &MangoAccountValue, + group: Pubkey, + kind: bool, + ) -> Result { + let hc = if kind { + let retriever = + ScanningAccountRetriever::new_with_staleness(&ais, &group, None).unwrap(); + new_health_cache_skipping_missing_banks_and_bad_oracles( + &account.borrow(), + &retriever, + DUMMY_NOW_TS, + )? + } else { + let retriever = new_fixed_order_account_retriever_with_optional_banks( + &ais, + &account.borrow(), + 0, + ) + .unwrap(); + new_health_cache_skipping_missing_banks_and_bad_oracles( + &account.borrow(), + &retriever, + DUMMY_NOW_TS, + )? + }; + Ok(hc.health(HealthType::Init)) + } + + for retriever_kind in [false, true] { + // baseline with everything + { + let ais = vec![ + bank1.as_account_info(), + bank2.as_account_info(), + bank3.as_account_info(), + oracle1.as_account_info(), + oracle2.as_account_info(), + oracle3.as_account_info(), + oo1.as_account_info(), + ]; + + let health = + compute_health_with_retriever(&ais, &account, group, retriever_kind).unwrap(); + assert!(health_eq( + health, + 0.8 * 100.0 + 0.5 * 5.0 * (10.0 + 2.0) - 1.5 * 10.0 * 10.0 + )); + } + + // missing bank1 + { + let ais = vec![ + bank2.as_account_info(), + bank3.as_account_info(), + oracle2.as_account_info(), + oracle3.as_account_info(), + oo1.as_account_info(), + ]; + + let health = + compute_health_with_retriever(&ais, &account, group, retriever_kind).unwrap(); + assert!(health_eq(health, 0.5 * 5.0 * 10.0 - 1.5 * 10.0 * 10.0)); + } + + // missing bank2 + { + let ais = vec![ + bank1.as_account_info(), + bank3.as_account_info(), + oracle1.as_account_info(), + oracle3.as_account_info(), + oo1.as_account_info(), + ]; + + let health = + compute_health_with_retriever(&ais, &account, group, retriever_kind).unwrap(); + assert!(health_eq(health, 0.8 * 100.0 - 1.5 * 10.0 * 10.0)); + } + + // missing bank1 and 2 + { + let ais = vec![ + bank3.as_account_info(), + oracle3.as_account_info(), + oo1.as_account_info(), + ]; + + let health = + compute_health_with_retriever(&ais, &account, group, retriever_kind).unwrap(); + assert!(health_eq(health, -1.5 * 10.0 * 10.0)); + } + + // missing bank3 + { + let ais = vec![ + bank1.as_account_info(), + bank2.as_account_info(), + oracle1.as_account_info(), + oracle2.as_account_info(), + oo1.as_account_info(), + ]; + + // bank3 has a negative balance and can't be skipped! + assert!( + compute_health_with_retriever(&ais, &account, group, retriever_kind).is_err() + ); + } + } + } } diff --git a/programs/mango-v4/src/instructions/flash_loan.rs b/programs/mango-v4/src/instructions/flash_loan.rs index 5b2ecfc18..09defac67 100644 --- a/programs/mango-v4/src/instructions/flash_loan.rs +++ b/programs/mango-v4/src/instructions/flash_loan.rs @@ -2,9 +2,10 @@ use crate::accounts_ix::*; use crate::accounts_zerocopy::*; use crate::error::*; use crate::group_seeds; -use crate::health::{new_fixed_order_account_retriever, new_health_cache, AccountRetriever}; +use crate::health::*; use crate::logs::{emit_stack, FlashLoanLogV3, FlashLoanTokenDetailV3, TokenBalanceLog}; use crate::state::*; +use crate::util::clock_now; use anchor_lang::prelude::*; use anchor_lang::solana_program::sysvar::instructions as tx_instructions; @@ -368,8 +369,9 @@ pub fn flash_loan_end<'key, 'accounts, 'remaining, 'info>( // all vaults must have had matching banks for (i, has_bank) in vaults_with_banks.iter().enumerate() { - require_msg!( + require_msg_typed!( has_bank, + MangoError::InvalidBank, "missing bank for vault index {}, address {}", i, vaults[i].key @@ -387,12 +389,26 @@ pub fn flash_loan_end<'key, 'accounts, 'remaining, 'info>( } // Check health before balance adjustments - let retriever = new_fixed_order_account_retriever(health_ais, &account.borrow())?; - let now_ts: u64 = Clock::get()?.unix_timestamp.try_into().unwrap(); - let health_cache = new_health_cache(&account.borrow(), &retriever, now_ts)?; + // The vault-to-bank matching above ensures that the banks for the affected tokens are available. + let (now_ts, now_slot) = clock_now(); + let retriever = new_fixed_order_account_retriever_with_optional_banks( + health_ais, + &account.borrow(), + now_slot, + )?; + let health_cache = new_health_cache_skipping_missing_banks_and_bad_oracles( + &account.borrow(), + &retriever, + now_ts, + )?; + let pre_init_health = account.check_health_pre(&health_cache)?; // Prices for logging and net borrow checks + // + // This also verifies that all affected banks/oracles are available in health_cache: + // That is essential to avoid issues around withdrawing tokens when init health is negative + // (similar issue to token_withdraw) let mut oracle_prices = vec![]; for change in &changes { let (_, oracle_price) = retriever.bank_and_oracle( @@ -400,6 +416,8 @@ pub fn flash_loan_end<'key, 'accounts, 'remaining, 'info>( change.bank_index, change.token_index, )?; + // Sanity check + health_cache.token_info_index(change.token_index)?; oracle_prices.push(oracle_price); } @@ -502,8 +520,16 @@ pub fn flash_loan_end<'key, 'accounts, 'remaining, 'info>( }); // Check health after account position changes - let retriever = new_fixed_order_account_retriever(health_ais, &account.borrow())?; - let health_cache = new_health_cache(&account.borrow(), &retriever, now_ts)?; + let retriever = new_fixed_order_account_retriever_with_optional_banks( + health_ais, + &account.borrow(), + now_slot, + )?; + let health_cache = new_health_cache_skipping_missing_banks_and_bad_oracles( + &account.borrow(), + &retriever, + now_ts, + )?; account.check_health_post(&health_cache, pre_init_health)?; // Deactivate inactive token accounts after health check diff --git a/programs/mango-v4/src/instructions/perp_liq_force_cancel_orders.rs b/programs/mango-v4/src/instructions/perp_liq_force_cancel_orders.rs index 0e39a4b5d..37bfdc6d5 100644 --- a/programs/mango-v4/src/instructions/perp_liq_force_cancel_orders.rs +++ b/programs/mango-v4/src/instructions/perp_liq_force_cancel_orders.rs @@ -4,6 +4,7 @@ use crate::accounts_ix::*; use crate::error::*; use crate::health::*; use crate::state::*; +use crate::util::clock_now; pub fn perp_liq_force_cancel_orders( ctx: Context, @@ -11,10 +12,10 @@ pub fn perp_liq_force_cancel_orders( ) -> Result<()> { let mut account = ctx.accounts.account.load_full_mut()?; - let now_ts: u64 = Clock::get()?.unix_timestamp.try_into().unwrap(); + let (now_ts, now_slot) = clock_now(); let mut health_cache = { let retriever = - new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow())?; + new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow(), now_slot)?; new_health_cache(&account.borrow(), &retriever, now_ts).context("create health cache")? }; diff --git a/programs/mango-v4/src/instructions/perp_place_order.rs b/programs/mango-v4/src/instructions/perp_place_order.rs index adf17a354..36e3b9579 100644 --- a/programs/mango-v4/src/instructions/perp_place_order.rs +++ b/programs/mango-v4/src/instructions/perp_place_order.rs @@ -3,8 +3,9 @@ use anchor_lang::prelude::*; use crate::accounts_ix::*; use crate::accounts_zerocopy::*; use crate::error::*; -use crate::health::{new_fixed_order_account_retriever, new_health_cache}; +use crate::health::*; use crate::state::*; +use crate::util::clock_now; // TODO #[allow(clippy::too_many_arguments)] @@ -16,7 +17,7 @@ pub fn perp_place_order( require_gte!(order.max_base_lots, 0); require_gte!(order.max_quote_lots, 0); - let now_ts: u64 = Clock::get()?.unix_timestamp.try_into().unwrap(); + let (now_ts, now_slot) = clock_now(); let oracle_price; // Update funding if possible. @@ -66,10 +67,21 @@ pub fn perp_place_order( // Pre-health computation, _after_ perp position is created // let pre_health_opt = if !account.fixed.is_in_health_region() { - let retriever = - new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow())?; - let health_cache = new_health_cache(&account.borrow(), &retriever, now_ts) - .context("pre-withdraw init health")?; + let retriever = new_fixed_order_account_retriever_with_optional_banks( + ctx.remaining_accounts, + &account.borrow(), + now_slot, + )?; + let health_cache = new_health_cache_skipping_missing_banks_and_bad_oracles( + &account.borrow(), + &retriever, + now_ts, + ) + .context("pre init health")?; + + // The settle token banks/oracles must be passed and be valid + health_cache.token_info_index(settle_token_index)?; + let pre_init_health = account.check_health_pre(&health_cache)?; Some((health_cache, pre_init_health)) } else { diff --git a/programs/mango-v4/src/instructions/perp_settle_fees.rs b/programs/mango-v4/src/instructions/perp_settle_fees.rs index d7c31cf82..627f484c5 100644 --- a/programs/mango-v4/src/instructions/perp_settle_fees.rs +++ b/programs/mango-v4/src/instructions/perp_settle_fees.rs @@ -9,6 +9,7 @@ use crate::state::*; use crate::accounts_ix::*; use crate::logs::{emit_perp_balances, emit_stack, PerpSettleFeesLog, TokenBalanceLog}; +use crate::util::clock_now; pub fn perp_settle_fees(ctx: Context, max_settle_amount: u64) -> Result<()> { // max_settle_amount must greater than zero @@ -123,8 +124,9 @@ pub fn perp_settle_fees(ctx: Context, max_settle_amount: u64) -> drop(perp_market); // Verify that the result of settling did not violate the health of the account that lost money - let retriever = new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow())?; - let now_ts: u64 = Clock::get()?.unix_timestamp.try_into().unwrap(); + let (now_ts, now_slot) = clock_now(); + let retriever = + new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow(), now_slot)?; let health = compute_health(&account.borrow(), HealthType::Init, &retriever, now_ts)?; require!(health >= 0, MangoError::HealthMustBePositive); diff --git a/programs/mango-v4/src/instructions/serum3_liq_force_cancel_orders.rs b/programs/mango-v4/src/instructions/serum3_liq_force_cancel_orders.rs index ed395d091..5a508b183 100644 --- a/programs/mango-v4/src/instructions/serum3_liq_force_cancel_orders.rs +++ b/programs/mango-v4/src/instructions/serum3_liq_force_cancel_orders.rs @@ -8,6 +8,7 @@ use crate::instructions::charge_loan_origination_fees; use crate::logs::{emit_stack, Serum3OpenOrdersBalanceLogV2}; use crate::serum3_cpi::{load_open_orders_ref, OpenOrdersAmounts, OpenOrdersSlim}; use crate::state::*; +use crate::util::clock_now; pub fn serum3_liq_force_cancel_orders( ctx: Context, @@ -50,14 +51,15 @@ pub fn serum3_liq_force_cancel_orders( ); } + let (now_ts, now_slot) = clock_now(); + // // Early return if if liquidation is not allowed or if market is not in force close // let mut health_cache = { let mut account = ctx.accounts.account.load_full_mut()?; let retriever = - new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow())?; - let now_ts: u64 = Clock::get()?.unix_timestamp.try_into().unwrap(); + new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow(), now_slot)?; let health_cache = new_health_cache(&account.borrow(), &retriever, now_ts) .context("create health cache")?; diff --git a/programs/mango-v4/src/instructions/serum3_place_order.rs b/programs/mango-v4/src/instructions/serum3_place_order.rs index 725c72dd6..80d43fb18 100644 --- a/programs/mango-v4/src/instructions/serum3_place_order.rs +++ b/programs/mango-v4/src/instructions/serum3_place_order.rs @@ -9,6 +9,7 @@ use crate::logs::{emit_stack, Serum3OpenOrdersBalanceLogV2, TokenBalanceLog}; use crate::serum3_cpi::{ load_market_state, load_open_orders_ref, OpenOrdersAmounts, OpenOrdersSlim, }; +use crate::util::clock_now; use anchor_lang::prelude::*; use fixed::types::I80F48; @@ -40,6 +41,7 @@ pub fn serum3_place_order( // Validation // let receiver_token_index; + let payer_token_index; { let account = ctx.accounts.account.load_full()?; // account constraint #1 @@ -60,7 +62,7 @@ pub fn serum3_place_order( // Validate bank and vault #3 let payer_bank = ctx.accounts.payer_bank.load()?; require_keys_eq!(payer_bank.vault, ctx.accounts.payer_vault.key()); - let payer_token_index = match side { + payer_token_index = match side { Serum3Side::Bid => serum_market.quote_token_index, Serum3Side::Ask => serum_market.base_token_index, }; @@ -76,10 +78,23 @@ pub fn serum3_place_order( // Pre-health computation // let mut account = ctx.accounts.account.load_full_mut()?; - let retriever = new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow())?; - let now_ts: u64 = Clock::get()?.unix_timestamp.try_into().unwrap(); - let mut health_cache = new_health_cache(&account.borrow(), &retriever, now_ts) - .context("pre-withdraw init health")?; + let (now_ts, now_slot) = clock_now(); + let retriever = new_fixed_order_account_retriever_with_optional_banks( + ctx.remaining_accounts, + &account.borrow(), + now_slot, + )?; + let mut health_cache = new_health_cache_skipping_missing_banks_and_bad_oracles( + &account.borrow(), + &retriever, + now_ts, + ) + .context("pre init health")?; + + // The payer and receiver token banks/oracles must be passed and be valid + health_cache.token_info_index(payer_token_index)?; + health_cache.token_info_index(receiver_token_index)?; + let pre_health_opt = if !account.fixed.is_in_health_region() { let pre_init_health = account.check_health_pre(&health_cache)?; Some(pre_init_health) @@ -412,6 +427,20 @@ pub fn serum3_place_order( // Note that all orders on the book executing can still cause a net deposit. That's because // the total serum3 potential amount assumes all reserved amounts convert at the current // oracle price. + // + // This also requires that all serum3 oos that touch the receiver_token are avaliable in the + // health cache. We make this a general requirement to avoid surprises. + for serum3 in account.active_serum3_orders() { + if serum3.base_token_index == receiver_token_index + || serum3.quote_token_index == receiver_token_index + { + require_msg!( + health_cache.serum3_infos.iter().any(|s3| s3.market_index == serum3.market_index), + "health cache is missing serum3 info {} involving receiver token {}; passed banks and oracles?", + serum3.market_index, receiver_token_index + ); + } + } if receiver_bank_reduce_only { let balance = health_cache.token_info(receiver_token_index)?.balance_spot; let potential = diff --git a/programs/mango-v4/src/instructions/token_charge_collateral_fees.rs b/programs/mango-v4/src/instructions/token_charge_collateral_fees.rs index f58fbf1d3..944c2722d 100644 --- a/programs/mango-v4/src/instructions/token_charge_collateral_fees.rs +++ b/programs/mango-v4/src/instructions/token_charge_collateral_fees.rs @@ -1,6 +1,7 @@ use crate::accounts_zerocopy::*; use crate::health::*; use crate::state::*; +use crate::util::clock_now; use anchor_lang::prelude::*; use fixed::types::I80F48; @@ -10,7 +11,7 @@ use crate::logs::{emit_stack, TokenBalanceLog, TokenCollateralFeeLog}; pub fn token_charge_collateral_fees(ctx: Context) -> Result<()> { let group = ctx.accounts.group.load()?; let mut account = ctx.accounts.account.load_full_mut()?; - let now_ts: u64 = Clock::get()?.unix_timestamp.try_into().unwrap(); + let (now_ts, now_slot) = clock_now(); if group.collateral_fee_interval == 0 { // By resetting, a new enabling of collateral fees will not immediately create a charge @@ -42,7 +43,7 @@ pub fn token_charge_collateral_fees(ctx: Context) -> let health_cache = { let retriever = - new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow())?; + new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow(), now_slot)?; new_health_cache(&account.borrow(), &retriever, now_ts)? }; diff --git a/programs/mango-v4/src/instructions/token_deposit.rs b/programs/mango-v4/src/instructions/token_deposit.rs index da0630a95..1155cd7d9 100644 --- a/programs/mango-v4/src/instructions/token_deposit.rs +++ b/programs/mango-v4/src/instructions/token_deposit.rs @@ -11,6 +11,7 @@ use crate::state::*; use crate::accounts_ix::*; use crate::logs::*; +use crate::util::clock_now; struct DepositCommon<'a, 'info> { pub group: &'a AccountLoader<'info, Group>, @@ -119,13 +120,21 @@ impl<'a, 'info> DepositCommon<'a, 'info> { // // Health computation // - let retriever = new_fixed_order_account_retriever(remaining_accounts, &account.borrow())?; - let now_ts: u64 = Clock::get()?.unix_timestamp.try_into().unwrap(); + let (now_ts, now_slot) = clock_now(); + let retriever = new_fixed_order_account_retriever_with_optional_banks( + remaining_accounts, + &account.borrow(), + now_slot, + )?; // We only compute health to check if the account leaves the being_liquidated state. - // So it's ok to possibly skip token positions for bad oracles and compute a health + // So it's ok to possibly skip nonnegative token positions and compute a health // value that is too low. - let cache = new_health_cache_skipping_bad_oracles(&account.borrow(), &retriever, now_ts)?; + let cache = new_health_cache_skipping_missing_banks_and_bad_oracles( + &account.borrow(), + &retriever, + now_ts, + )?; // Since depositing can only increase health, we can skip the usual pre-health computation. // Also, TokenDeposit is one of the rare instructions that is allowed even during being_liquidated. @@ -143,6 +152,13 @@ impl<'a, 'info> DepositCommon<'a, 'info> { // Group level deposit limit on account let group = self.group.load()?; if group.deposit_limit_quote > 0 { + // Requires that all banks were provided an all oracles are healthy, otherwise we + // can't know how much this account has deposited + require_eq!( + cache.token_infos.len(), + account.active_token_positions().count() + ); + let assets = cache .health_assets_and_liabs_stable_assets(HealthType::Init) .0 diff --git a/programs/mango-v4/src/instructions/token_withdraw.rs b/programs/mango-v4/src/instructions/token_withdraw.rs index bcbfbc172..4b79760b7 100644 --- a/programs/mango-v4/src/instructions/token_withdraw.rs +++ b/programs/mango-v4/src/instructions/token_withdraw.rs @@ -2,6 +2,7 @@ use crate::accounts_zerocopy::*; use crate::error::*; use crate::health::*; use crate::state::*; +use crate::util::clock_now; use anchor_lang::prelude::*; use anchor_spl::associated_token; use anchor_spl::token; @@ -19,7 +20,7 @@ pub fn token_withdraw(ctx: Context, amount: u64, allow_borrow: bo let group = ctx.accounts.group.load()?; let token_index = ctx.accounts.bank.load()?.token_index; - let now_ts: u64 = Clock::get()?.unix_timestamp.try_into().unwrap(); + let (now_ts, now_slot) = clock_now(); // Create the account's position for that token index let mut account = ctx.accounts.account.load_full_mut()?; @@ -27,21 +28,19 @@ pub fn token_withdraw(ctx: Context, amount: u64, allow_borrow: bo // Health check _after_ the token position is guaranteed to exist let pre_health_opt = if !account.fixed.is_in_health_region() { - let retriever = - new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow())?; - let hc_result = new_health_cache(&account.borrow(), &retriever, now_ts) - .context("pre-withdraw health cache"); - if hc_result.is_oracle_error() { - // We allow NOT checking the pre init health. That means later on the health - // check will be stricter (post_init > 0, without the post_init >= pre_init option) - // Then later we can compute the health while ignoring potential nonnegative - // health contributions from tokens with stale oracles. - None - } else { - let health_cache = hc_result?; - let pre_init_health = account.check_health_pre(&health_cache)?; - Some((health_cache, pre_init_health)) - } + let retriever = new_fixed_order_account_retriever_with_optional_banks( + ctx.remaining_accounts, + &account.borrow(), + now_slot, + )?; + let health_cache = new_health_cache_skipping_missing_banks_and_bad_oracles( + &account.borrow(), + &retriever, + now_ts, + ) + .context("pre-withdraw health cache")?; + let pre_init_health = account.check_health_pre(&health_cache)?; + Some((health_cache, pre_init_health)) } else { None }; @@ -156,26 +155,29 @@ pub fn token_withdraw(ctx: Context, amount: u64, allow_borrow: bo // // Health check // - if !account.fixed.is_in_health_region() { - if let Some((mut health_cache, pre_init_health)) = pre_health_opt { - // This is the normal case + if let Some((mut health_cache, pre_init_health_lower_bound)) = pre_health_opt { + if health_cache.token_info_index(token_index).is_ok() { + // This is the normal case: the health cache knows about the token, we can + // compute the health for the new state by adjusting its balance health_cache.adjust_token_balance(&bank, native_position_after - native_position)?; - account.check_health_post(&health_cache, pre_init_health)?; + account.check_health_post(&health_cache, pre_init_health_lower_bound)?; } else { - // Some oracle was stale/not confident enough above. + // The health cache does not know about the token! It has a bad oracle or wasn't + // provided in the health accounts. Borrows are out of the question! + require!(!is_borrow, MangoError::BorrowsRequireHealthAccountBank); + + // Since the health cache isn't aware of the bank we changed, the health + // estimation is the same. + let post_init_health_lower_bound = pre_init_health_lower_bound; + + // If health without the token is positive, then full health is positive and + // withdrawing all of the token would still keep it positive. + // However, if health without it is negative then full health could be negative + // and could be made worse by withdrawals. // - // Try computing health while ignoring nonnegative contributions from bad oracles. - // If the health is good enough without those, we can pass. - // - // Note that this must include the normal pre and post health checks. - let retriever = - new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow())?; - let health_cache = - new_health_cache_skipping_bad_oracles(&account.borrow(), &retriever, now_ts) - .context("special post-withdraw health-cache")?; - let post_init_health = health_cache.health(HealthType::Init); - account.check_health_pre_checks(&health_cache, post_init_health)?; - account.check_health_post_checks(I80F48::MAX, post_init_health)?; + // We don't know the true pre_init_health, and substitute MAX. That way the check + // won't pass because post == pre. + account.check_health_post_checks(I80F48::MAX, post_init_health_lower_bound)?; } } diff --git a/programs/mango-v4/src/util.rs b/programs/mango-v4/src/util.rs index 58c34dc72..e49fb18c2 100644 --- a/programs/mango-v4/src/util.rs +++ b/programs/mango-v4/src/util.rs @@ -31,6 +31,12 @@ pub fn format_zero_terminated_utf8_bytes( ) } +// Returns (now_ts, now_slot) +pub fn clock_now() -> (u64, u64) { + let clock = Clock::get().unwrap(); + (clock.unix_timestamp.try_into().unwrap(), clock.slot) +} + #[cfg(test)] mod tests { use super::*; diff --git a/programs/mango-v4/tests/cases/test_basic.rs b/programs/mango-v4/tests/cases/test_basic.rs index 50be1f45d..ee774c080 100644 --- a/programs/mango-v4/tests/cases/test_basic.rs +++ b/programs/mango-v4/tests/cases/test_basic.rs @@ -687,3 +687,263 @@ async fn test_bank_deposit_limit() -> Result<(), TransportError> { Ok(()) } + +#[tokio::test] +async fn test_withdraw_skip_bank() -> Result<(), TransportError> { + let context = TestContext::new().await; + let solana = &context.solana.clone(); + + let admin = TestKeypair::new(); + let owner = context.users[0].key; + let payer = context.users[1].key; + let payer_token_accounts = &context.users[1].token_accounts; + let mints = &context.mints[0..3]; + + let mango_setup::GroupWithTokens { group, tokens, .. } = mango_setup::GroupWithTokensConfig { + admin, + payer, + mints: mints.to_vec(), + zero_token_is_quote: true, + ..mango_setup::GroupWithTokensConfig::default() + } + .create(solana) + .await; + + // Funding to fill the vaults + create_funded_account( + &solana, + group, + owner, + 0, + &context.users[1], + &mints, + 1_000_000, + 0, + ) + .await; + + let account = create_funded_account( + &solana, + group, + owner, + 1, + &context.users[1], + &mints[0..2], + 1000, + 0, + ) + .await; + + // + // TEST: when all balances are positive + // + + send_tx( + solana, + HealthAccountSkipping { + inner: TokenWithdrawInstruction { + amount: 1, + allow_borrow: false, + account, + owner, + token_account: payer_token_accounts[0], + bank_index: 0, + }, + skip_banks: vec![tokens[0].bank], + }, + ) + .await + .unwrap(); + + send_tx( + solana, + HealthAccountSkipping { + inner: TokenWithdrawInstruction { + amount: 1, + allow_borrow: false, + account, + owner, + token_account: payer_token_accounts[0], + bank_index: 0, + }, + skip_banks: vec![tokens[1].bank], + }, + ) + .await + .unwrap(); + + // ok even when total health = 0 + send_tx( + solana, + HealthAccountSkipping { + inner: TokenWithdrawInstruction { + amount: 1, + allow_borrow: false, + account, + owner, + token_account: payer_token_accounts[0], + bank_index: 0, + }, + skip_banks: vec![tokens[0].bank, tokens[1].bank], + }, + ) + .await + .unwrap(); + + send_tx_expect_error!( + solana, + HealthAccountSkipping { + inner: TokenWithdrawInstruction { + amount: 1001, + allow_borrow: true, + account, + owner, + token_account: payer_token_accounts[0], + bank_index: 0, + }, + skip_banks: vec![tokens[0].bank], + }, + MangoError::BorrowsRequireHealthAccountBank + ); + + send_tx_expect_error!( + solana, + HealthAccountSkipping { + inner: TokenWithdrawInstruction { + amount: 1001, + allow_borrow: true, + account, + owner, + token_account: payer_token_accounts[0], + bank_index: 0, + }, + skip_banks: vec![tokens[1].bank], + }, + MangoError::HealthMustBePositiveOrIncrease + ); + + // + // TEST: create a borrow + // + + send_tx_expect_error!( + solana, + HealthAccountSkipping { + inner: TokenWithdrawInstruction { + amount: 1, + allow_borrow: true, + account, + owner, + token_account: payer_token_accounts[2], + bank_index: 0, + }, + skip_banks: vec![tokens[0].bank, tokens[1].bank], + }, + MangoError::HealthMustBePositiveOrIncrease + ); + + send_tx_expect_error!( + solana, + HealthAccountSkipping { + inner: TokenWithdrawInstruction { + amount: 1, + allow_borrow: true, + account, + owner, + token_account: payer_token_accounts[2], + bank_index: 0, + }, + skip_banks: vec![tokens[2].bank], + }, + MangoError::BorrowsRequireHealthAccountBank + ); + + send_tx( + solana, + HealthAccountSkipping { + inner: TokenWithdrawInstruction { + amount: 1, + allow_borrow: true, + account, + owner, + token_account: payer_token_accounts[2], + bank_index: 0, + }, + skip_banks: vec![tokens[0].bank], + }, + ) + .await + .unwrap(); + + // + // TEST: withdraw positive balances when there's a borrow + // + + send_tx( + solana, + HealthAccountSkipping { + inner: TokenWithdrawInstruction { + amount: 1, + allow_borrow: false, + account, + owner, + token_account: payer_token_accounts[0], + bank_index: 0, + }, + skip_banks: vec![tokens[0].bank], + }, + ) + .await + .unwrap(); + + send_tx( + solana, + HealthAccountSkipping { + inner: TokenWithdrawInstruction { + amount: 1, + allow_borrow: false, + account, + owner, + token_account: payer_token_accounts[0], + bank_index: 0, + }, + skip_banks: vec![tokens[1].bank], + }, + ) + .await + .unwrap(); + + send_tx_expect_error!( + solana, + HealthAccountSkipping { + inner: TokenWithdrawInstruction { + amount: 1, + allow_borrow: false, + account, + owner, + token_account: payer_token_accounts[0], + bank_index: 0, + }, + skip_banks: vec![tokens[2].bank], + }, + MangoError::InvalidBank + ); + + send_tx_expect_error!( + solana, + HealthAccountSkipping { + inner: TokenWithdrawInstruction { + amount: 1, + allow_borrow: false, + account, + owner, + token_account: payer_token_accounts[0], + bank_index: 0, + }, + skip_banks: vec![tokens[0].bank, tokens[1].bank], + }, + MangoError::HealthMustBePositiveOrIncrease + ); + + Ok(()) +} diff --git a/programs/mango-v4/tests/cases/test_health_compute.rs b/programs/mango-v4/tests/cases/test_health_compute.rs index 091205042..f72eaba49 100644 --- a/programs/mango-v4/tests/cases/test_health_compute.rs +++ b/programs/mango-v4/tests/cases/test_health_compute.rs @@ -344,7 +344,7 @@ async fn test_health_compute_tokens_fallback_oracles() -> Result<(), TransportEr #[tokio::test] async fn test_health_compute_serum() -> Result<(), TransportError> { let mut test_builder = TestContextBuilder::new(); - test_builder.test().set_compute_max_units(135_000); + test_builder.test().set_compute_max_units(137_000); let context = test_builder.start_default().await; let solana = &context.solana.clone(); diff --git a/programs/mango-v4/tests/cases/test_margin_trade.rs b/programs/mango-v4/tests/cases/test_margin_trade.rs index 1d06b4441..92839d3cf 100644 --- a/programs/mango-v4/tests/cases/test_margin_trade.rs +++ b/programs/mango-v4/tests/cases/test_margin_trade.rs @@ -730,3 +730,112 @@ async fn test_margin_trade_deposit_limit() -> Result<(), BanksClientError> { Ok(()) } + +#[tokio::test] +async fn test_margin_trade_skip_bank() -> Result<(), BanksClientError> { + let mut test_builder = TestContextBuilder::new(); + test_builder.test().set_compute_max_units(100_000); + let context = test_builder.start_default().await; + let solana = &context.solana.clone(); + + let admin = TestKeypair::new(); + let owner = context.users[0].key; + let payer = context.users[1].key; + let mints = &context.mints[0..2]; + let payer_mint0_account = context.users[1].token_accounts[0]; + + // + // SETUP: Create a group, account, register a token (mint0) + // + + let GroupWithTokens { group, tokens, .. } = GroupWithTokensConfig { + admin, + payer, + mints: mints.to_vec(), + ..GroupWithTokensConfig::default() + } + .create(solana) + .await; + let bank = tokens[0].bank; + + // + // create the test user account + // + + let deposit_amount_initial = 100; + let account = create_funded_account( + &solana, + group, + owner, + 0, + &context.users[1], + &mints, + deposit_amount_initial, + 0, + ) + .await; + + // + // TEST: Margin trade + // + let margin_account = payer_mint0_account; + let target_token_account = context.users[0].token_accounts[0]; + let make_flash_loan_tx = |solana, deposit_amount, skip_banks| async move { + let mut tx = ClientTransaction::new(solana); + let loans = vec![FlashLoanPart { + bank, + token_account: target_token_account, + withdraw_amount: 0, + }]; + tx.add_instruction(FlashLoanBeginInstruction { + account, + owner, + loans: loans.clone(), + }) + .await; + tx.add_instruction_direct( + spl_token::instruction::transfer( + &spl_token::ID, + &margin_account, + &target_token_account, + &payer.pubkey(), + &[&payer.pubkey()], + deposit_amount, + ) + .unwrap(), + ); + tx.add_signer(payer); + tx.add_instruction(HealthAccountSkipping { + inner: FlashLoanEndInstruction { + account, + owner, + loans, + // the test only accesses a single token: not a swap + flash_loan_type: mango_v4::accounts_ix::FlashLoanType::Unknown, + }, + skip_banks, + }) + .await; + tx + }; + + make_flash_loan_tx(solana, 1, vec![]) + .await + .send() + .await + .unwrap(); + + make_flash_loan_tx(solana, 1, vec![tokens[1].bank]) + .await + .send() + .await + .unwrap(); + + make_flash_loan_tx(solana, 1, vec![tokens[0].bank]) + .await + .send_expect_error(MangoError::InvalidBank) + .await + .unwrap(); + + Ok(()) +} diff --git a/programs/mango-v4/tests/cases/test_perp.rs b/programs/mango-v4/tests/cases/test_perp.rs index 2db63a045..2b9fcfcd4 100644 --- a/programs/mango-v4/tests/cases/test_perp.rs +++ b/programs/mango-v4/tests/cases/test_perp.rs @@ -1581,6 +1581,138 @@ async fn test_perp_cancel_with_in_flight_events() -> Result<(), TransportError> Ok(()) } +#[tokio::test] +async fn test_perp_skip_bank() -> Result<(), TransportError> { + let context = TestContext::new().await; + let solana = &context.solana.clone(); + + let admin = TestKeypair::new(); + let owner = context.users[0].key; + let payer = context.users[1].key; + let mints = &context.mints[0..2]; + + // + // SETUP: Create a group and an account + // + + let GroupWithTokens { group, tokens, .. } = GroupWithTokensConfig { + admin, + payer, + mints: mints.to_vec(), + ..GroupWithTokensConfig::default() + } + .create(solana) + .await; + + let deposit_amount = 1000; + let account = create_funded_account( + &solana, + group, + owner, + 0, + &context.users[1], + mints, + deposit_amount, + 0, + ) + .await; + + // + // SETUP: Create a perp market + // + let mango_v4::accounts::PerpCreateMarket { perp_market, .. } = send_tx( + solana, + PerpCreateMarketInstruction { + group, + admin, + payer, + perp_market_index: 0, + quote_lot_size: 10, + base_lot_size: 100, + maint_base_asset_weight: 0.975, + init_base_asset_weight: 0.95, + maint_base_liab_weight: 1.025, + init_base_liab_weight: 1.05, + base_liquidation_fee: 0.012, + maker_fee: 0.0000, + taker_fee: 0.0000, + settle_pnl_limit_factor: -1.0, + settle_pnl_limit_window_size_ts: 24 * 60 * 60, + ..PerpCreateMarketInstruction::with_new_book_and_queue(&solana, &tokens[1]).await + }, + ) + .await + .unwrap(); + + let perp_market_data = solana.get_account::(perp_market).await; + let price_lots = perp_market_data.native_price_to_lot(I80F48::from(1)); + + // + // TESTS + // + + // good without skips + send_tx( + solana, + HealthAccountSkipping { + inner: PerpPlaceOrderInstruction { + account, + perp_market, + owner, + side: Side::Bid, + price_lots, + max_base_lots: 2, + client_order_id: 5, + ..PerpPlaceOrderInstruction::default() + }, + skip_banks: vec![], + }, + ) + .await + .unwrap(); + + // can skip unrelated + send_tx( + solana, + HealthAccountSkipping { + inner: PerpPlaceOrderInstruction { + account, + perp_market, + owner, + side: Side::Bid, + price_lots, + max_base_lots: 2, + client_order_id: 5, + ..PerpPlaceOrderInstruction::default() + }, + skip_banks: vec![tokens[1].bank], + }, + ) + .await + .unwrap(); + + // can't skip settle token index + send_tx_expect_error!( + solana, + HealthAccountSkipping { + inner: PerpPlaceOrderInstruction { + account, + perp_market, + owner, + side: Side::Bid, + price_lots, + max_base_lots: 2, + client_order_id: 5, + ..PerpPlaceOrderInstruction::default() + }, + skip_banks: vec![tokens[0].bank], + }, + MangoError::TokenPositionDoesNotExist, + ); + + Ok(()) +} + async fn assert_no_perp_orders(solana: &SolanaCookie, account_0: Pubkey) { let mango_account_0 = solana.get_account::(account_0).await; diff --git a/programs/mango-v4/tests/cases/test_serum.rs b/programs/mango-v4/tests/cases/test_serum.rs index 87ef5cd5f..27613a830 100644 --- a/programs/mango-v4/tests/cases/test_serum.rs +++ b/programs/mango-v4/tests/cases/test_serum.rs @@ -36,35 +36,39 @@ impl SerumOrderPlacer { None } + fn bid_ix( + &mut self, + limit_price: f64, + max_base: u64, + taker: bool, + ) -> Serum3PlaceOrderInstruction { + let client_order_id = self.inc_client_order_id(); + let fees = if taker { 0.0004 } else { 0.0 }; + Serum3PlaceOrderInstruction { + side: Serum3Side::Bid, + limit_price: (limit_price * 100.0 / 10.0) as u64, // in quote_lot (10) per base lot (100) + max_base_qty: max_base / 100, // in base lot (100) + // 4 bps taker fees added in + max_native_quote_qty_including_fees: (limit_price * (max_base as f64) * (1.0 + fees)) + .ceil() as u64, + self_trade_behavior: Serum3SelfTradeBehavior::AbortTransaction, + order_type: Serum3OrderType::Limit, + client_order_id, + limit: 10, + account: self.account, + owner: self.owner, + serum_market: self.serum_market, + } + } + async fn try_bid( &mut self, limit_price: f64, max_base: u64, taker: bool, ) -> Result { - let client_order_id = self.inc_client_order_id(); - let fees = if taker { 0.0004 } else { 0.0 }; - send_tx( - &self.solana, - Serum3PlaceOrderInstruction { - side: Serum3Side::Bid, - limit_price: (limit_price * 100.0 / 10.0) as u64, // in quote_lot (10) per base lot (100) - max_base_qty: max_base / 100, // in base lot (100) - // 4 bps taker fees added in - max_native_quote_qty_including_fees: (limit_price - * (max_base as f64) - * (1.0 + fees)) - .ceil() as u64, - self_trade_behavior: Serum3SelfTradeBehavior::AbortTransaction, - order_type: Serum3OrderType::Limit, - client_order_id, - limit: 10, - account: self.account, - owner: self.owner, - serum_market: self.serum_market, - }, - ) - .await + let ix = self.bid_ix(limit_price, max_base, taker); + send_tx(&self.solana, ix).await } async fn bid_maker(&mut self, limit_price: f64, max_base: u64) -> Option<(u128, u64)> { @@ -1025,7 +1029,7 @@ async fn test_serum_reduce_only_deposits1() -> Result<(), TransportError> { #[tokio::test] async fn test_serum_reduce_only_deposits2() -> Result<(), TransportError> { let mut test_builder = TestContextBuilder::new(); - test_builder.test().set_compute_max_units(95_000); // Serum3PlaceOrder needs 92.8k + test_builder.test().set_compute_max_units(97_000); // Serum3PlaceOrder needs 95.8k let context = test_builder.start_default().await; let solana = &context.solana.clone(); @@ -1948,6 +1952,71 @@ async fn test_serum_deposit_limits() -> Result<(), TransportError> { Ok(()) } +#[tokio::test] +async fn test_serum_skip_bank() -> Result<(), TransportError> { + let mut test_builder = TestContextBuilder::new(); + test_builder.test().set_compute_max_units(150_000); // Serum3PlaceOrder needs lots + let context = test_builder.start_default().await; + let solana = &context.solana.clone(); + + // + // SETUP: Create a group, accounts, market etc + // + let deposit_amount = 5000; + let CommonSetup { + group_with_tokens, + mut order_placer, + .. + } = common_setup(&context, deposit_amount).await; + let tokens = group_with_tokens.tokens; + + // + // TESTS + // + + // verify generally good + send_tx( + solana, + HealthAccountSkipping { + inner: order_placer.bid_ix(1.0, 100, false), + skip_banks: vec![], + }, + ) + .await + .unwrap(); + + // can skip uninvolved token + send_tx( + solana, + HealthAccountSkipping { + inner: order_placer.bid_ix(1.0, 100, false), + skip_banks: vec![tokens[2].bank], + }, + ) + .await + .unwrap(); + + // can't skip base or quote token + send_tx_expect_error!( + solana, + HealthAccountSkipping { + inner: order_placer.bid_ix(1.0, 100, false), + skip_banks: vec![tokens[0].bank], + }, + MangoError::TokenPositionDoesNotExist + ); + send_tx_expect_error!( + solana, + HealthAccountSkipping { + inner: order_placer.bid_ix(1.0, 100, false), + skip_banks: vec![tokens[1].bank], + }, + MangoError::TokenPositionDoesNotExist + ); + + Ok(()) +} + struct CommonSetup { group_with_tokens: GroupWithTokens, serum_market_cookie: SpotMarketCookie, diff --git a/programs/mango-v4/tests/program_test/mango_client.rs b/programs/mango-v4/tests/program_test/mango_client.rs index a0e28b5a2..6fc904022 100644 --- a/programs/mango-v4/tests/program_test/mango_client.rs +++ b/programs/mango-v4/tests/program_test/mango_client.rs @@ -35,7 +35,7 @@ pub trait ClientAccountLoader { } #[async_trait::async_trait(?Send)] -impl ClientAccountLoader for &SolanaCookie { +impl ClientAccountLoader for SolanaCookie { async fn load_bytes(&self, pubkey: &Pubkey) -> Option> { self.get_account_data(*pubkey).await } @@ -186,7 +186,7 @@ pub trait ClientInstruction { async fn to_instruction( &self, - loader: impl ClientAccountLoader + 'async_trait, + loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction); fn signers(&self) -> Vec; } @@ -552,7 +552,7 @@ impl ClientInstruction for FlashLoanBeginInstruction { type Instruction = mango_v4::instruction::FlashLoanBegin; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -626,7 +626,7 @@ impl ClientInstruction for FlashLoanSwapBeginInstruction { type Instruction = mango_v4::instruction::FlashLoanSwapBegin; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -718,7 +718,7 @@ impl ClientInstruction for FlashLoanEndInstruction { type Instruction = mango_v4::instruction::FlashLoanEndV2; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -735,14 +735,9 @@ impl ClientInstruction for FlashLoanEndInstruction { account.ensure_token_position(bank.token_index).unwrap(); } - let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, - &account, - None, - true, - None, - ) - .await; + let health_check_metas = + derive_health_check_remaining_account_metas(account_loader, &account, None, true, None) + .await; let accounts = Self::Accounts { account: self.account, @@ -797,7 +792,7 @@ impl ClientInstruction for TokenWithdrawInstruction { type Instruction = mango_v4::instruction::TokenWithdraw; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -823,7 +818,7 @@ impl ClientInstruction for TokenWithdrawInstruction { let mint_info: MintInfo = account_loader.load(&mint_info).await.unwrap(); let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, + account_loader, &account, Some(mint_info.banks[self.bank_index]), false, @@ -869,7 +864,7 @@ impl ClientInstruction for TokenDepositInstruction { type Instruction = mango_v4::instruction::TokenDeposit; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -895,7 +890,7 @@ impl ClientInstruction for TokenDepositInstruction { let mint_info: MintInfo = account_loader.load(&mint_info).await.unwrap(); let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, + account_loader, &account, Some(mint_info.banks[self.bank_index]), false, @@ -940,7 +935,7 @@ impl ClientInstruction for TokenDepositIntoExistingInstruction { type Instruction = mango_v4::instruction::TokenDepositIntoExisting; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -966,7 +961,7 @@ impl ClientInstruction for TokenDepositIntoExistingInstruction { let mint_info: MintInfo = account_loader.load(&mint_info).await.unwrap(); let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, + account_loader, &account, Some(mint_info.banks[self.bank_index]), false, @@ -1030,7 +1025,7 @@ impl ClientInstruction for TokenRegisterInstruction { type Instruction = mango_v4::instruction::TokenRegister; async fn to_instruction( &self, - _account_loader: impl ClientAccountLoader + 'async_trait, + _account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -1150,7 +1145,7 @@ impl ClientInstruction for TokenAddBankInstruction { type Instruction = mango_v4::instruction::TokenAddBank; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -1239,7 +1234,7 @@ impl ClientInstruction for TokenDeregisterInstruction { async fn to_instruction( &self, - _loader: impl ClientAccountLoader + 'async_trait, + _loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -1345,7 +1340,7 @@ impl ClientInstruction for TokenEdit { type Instruction = mango_v4::instruction::TokenEdit; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -1401,7 +1396,7 @@ impl ClientInstruction for TokenEditWeights { type Instruction = mango_v4::instruction::TokenEdit; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -1460,7 +1455,7 @@ impl ClientInstruction for TokenResetStablePriceModel { type Instruction = mango_v4::instruction::TokenEdit; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -1520,7 +1515,7 @@ impl ClientInstruction for TokenResetNetBorrows { type Instruction = mango_v4::instruction::TokenEdit; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -1581,7 +1576,7 @@ impl ClientInstruction for TokenMakeReduceOnly { type Instruction = mango_v4::instruction::TokenEdit; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -1640,7 +1635,7 @@ impl ClientInstruction for StubOracleSetInstruction { async fn to_instruction( &self, - _loader: impl ClientAccountLoader + 'async_trait, + _loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -1678,7 +1673,7 @@ impl ClientInstruction for StubOracleSetTestInstruction { async fn to_instruction( &self, - _loader: impl ClientAccountLoader + 'async_trait, + _loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -1716,7 +1711,7 @@ impl ClientInstruction for StubOracleCreate { async fn to_instruction( &self, - _loader: impl ClientAccountLoader + 'async_trait, + _loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -1755,7 +1750,7 @@ impl ClientInstruction for StubOracleCloseInstruction { async fn to_instruction( &self, - _loader: impl ClientAccountLoader + 'async_trait, + _loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -1788,7 +1783,7 @@ impl ClientInstruction for GroupCreateInstruction { type Instruction = mango_v4::instruction::GroupCreate; async fn to_instruction( &self, - _account_loader: impl ClientAccountLoader + 'async_trait, + _account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -1864,7 +1859,7 @@ impl ClientInstruction for GroupEditFeeParameters { type Instruction = mango_v4::instruction::GroupEdit; async fn to_instruction( &self, - _account_loader: impl ClientAccountLoader + 'async_trait, + _account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -1900,7 +1895,7 @@ impl ClientInstruction for GroupEdit { type Instruction = mango_v4::instruction::GroupEdit; async fn to_instruction( &self, - _account_loader: impl ClientAccountLoader + 'async_trait, + _account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = &self.options; @@ -1930,7 +1925,7 @@ impl ClientInstruction for IxGateSetInstruction { type Instruction = mango_v4::instruction::IxGateSet; async fn to_instruction( &self, - _account_loader: impl ClientAccountLoader + 'async_trait, + _account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -1962,7 +1957,7 @@ impl ClientInstruction for GroupCloseInstruction { type Instruction = mango_v4::instruction::GroupClose; async fn to_instruction( &self, - _account_loader: impl ClientAccountLoader + 'async_trait, + _account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -2022,7 +2017,7 @@ impl ClientInstruction for AccountCreateInstruction { type Instruction = mango_v4::instruction::AccountCreateV2; async fn to_instruction( &self, - _account_loader: impl ClientAccountLoader + 'async_trait, + _account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -2081,7 +2076,7 @@ impl ClientInstruction for AccountExpandInstruction { type Instruction = mango_v4::instruction::AccountExpandV2; async fn to_instruction( &self, - _account_loader: impl ClientAccountLoader + 'async_trait, + _account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -2131,7 +2126,7 @@ impl ClientInstruction for AccountSizeMigrationInstruction { type Instruction = mango_v4::instruction::AccountSizeMigration; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -2170,7 +2165,7 @@ impl ClientInstruction for AccountEditInstruction { type Instruction = mango_v4::instruction::AccountEdit; async fn to_instruction( &self, - _account_loader: impl ClientAccountLoader + 'async_trait, + _account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = mango_v4::instruction::AccountEdit { @@ -2218,7 +2213,7 @@ impl ClientInstruction for AccountCloseInstruction { type Instruction = mango_v4::instruction::AccountClose; async fn to_instruction( &self, - _account_loader: impl ClientAccountLoader + 'async_trait, + _account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { force_close: false }; @@ -2252,7 +2247,7 @@ impl ClientInstruction for AccountBuybackFeesWithMngo { type Instruction = mango_v4::instruction::AccountBuybackFeesWithMngo; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -2308,7 +2303,7 @@ impl ClientInstruction for Serum3RegisterMarketInstruction { type Instruction = mango_v4::instruction::Serum3RegisterMarket; async fn to_instruction( &self, - _account_loader: impl ClientAccountLoader + 'async_trait, + _account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -2380,7 +2375,7 @@ impl ClientInstruction for Serum3EditMarketInstruction { type Instruction = mango_v4::instruction::Serum3EditMarket; async fn to_instruction( &self, - _account_loader: impl ClientAccountLoader + 'async_trait, + _account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -2411,7 +2406,7 @@ impl ClientInstruction for Serum3DeregisterMarketInstruction { type Instruction = mango_v4::instruction::Serum3DeregisterMarket; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -2467,7 +2462,7 @@ impl ClientInstruction for Serum3CreateOpenOrdersInstruction { type Instruction = mango_v4::instruction::Serum3CreateOpenOrders; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -2518,7 +2513,7 @@ impl ClientInstruction for Serum3CloseOpenOrdersInstruction { type Instruction = mango_v4::instruction::Serum3CloseOpenOrders; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -2576,7 +2571,7 @@ impl ClientInstruction for Serum3PlaceOrderInstruction { type Instruction = mango_v4::instruction::Serum3PlaceOrderV2; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -2600,10 +2595,10 @@ impl ClientInstruction for Serum3PlaceOrderInstruction { .unwrap() .open_orders; let quote_info = - get_mint_info_by_token_index(&account_loader, &account, serum_market.quote_token_index) + get_mint_info_by_token_index(account_loader, &account, serum_market.quote_token_index) .await; let base_info = - get_mint_info_by_token_index(&account_loader, &account, serum_market.base_token_index) + get_mint_info_by_token_index(account_loader, &account, serum_market.base_token_index) .await; let market_external_bytes = account_loader @@ -2628,7 +2623,7 @@ impl ClientInstruction for Serum3PlaceOrderInstruction { .unwrap(); let mut health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, + account_loader, &account, None, false, @@ -2694,7 +2689,7 @@ impl ClientInstruction for Serum3CancelOrderInstruction { type Instruction = mango_v4::instruction::Serum3CancelOrder; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -2760,7 +2755,7 @@ impl ClientInstruction for Serum3CancelOrderByClientOrderIdInstruction { type Instruction = mango_v4::instruction::Serum3CancelOrderByClientOrderId; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -2823,7 +2818,7 @@ impl ClientInstruction for Serum3CancelAllOrdersInstruction { type Instruction = mango_v4::instruction::Serum3CancelAllOrders; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { limit: self.limit }; @@ -2885,7 +2880,7 @@ impl ClientInstruction for Serum3SettleFundsV2Instruction { type Instruction = mango_v4::instruction::Serum3SettleFundsV2; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -2902,10 +2897,10 @@ impl ClientInstruction for Serum3SettleFundsV2Instruction { .unwrap() .open_orders; let quote_info = - get_mint_info_by_token_index(&account_loader, &account, serum_market.quote_token_index) + get_mint_info_by_token_index(account_loader, &account, serum_market.quote_token_index) .await; let base_info = - get_mint_info_by_token_index(&account_loader, &account, serum_market.base_token_index) + get_mint_info_by_token_index(account_loader, &account, serum_market.base_token_index) .await; let market_external_bytes = account_loader @@ -2969,7 +2964,7 @@ impl ClientInstruction for Serum3LiqForceCancelOrdersInstruction { type Instruction = mango_v4::instruction::Serum3LiqForceCancelOrders; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { limit: self.limit }; @@ -2984,10 +2979,10 @@ impl ClientInstruction for Serum3LiqForceCancelOrdersInstruction { .unwrap() .open_orders; let quote_info = - get_mint_info_by_token_index(&account_loader, &account, serum_market.quote_token_index) + get_mint_info_by_token_index(account_loader, &account, serum_market.quote_token_index) .await; let base_info = - get_mint_info_by_token_index(&account_loader, &account, serum_market.base_token_index) + get_mint_info_by_token_index(account_loader, &account, serum_market.base_token_index) .await; let market_external_bytes = account_loader @@ -3011,7 +3006,7 @@ impl ClientInstruction for Serum3LiqForceCancelOrdersInstruction { .unwrap(); let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, + account_loader, &account, None, false, @@ -3067,7 +3062,7 @@ impl ClientInstruction for TokenForceCloseBorrowsWithTokenInstruction { type Instruction = mango_v4::instruction::TokenForceCloseBorrowsWithToken; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -3085,7 +3080,7 @@ impl ClientInstruction for TokenForceCloseBorrowsWithTokenInstruction { .await .unwrap(); let health_check_metas = derive_liquidation_remaining_account_metas( - &account_loader, + account_loader, &liqee, &liqor, self.asset_token_index, @@ -3124,7 +3119,7 @@ impl ClientInstruction for TokenForceWithdrawInstruction { type Instruction = mango_v4::instruction::TokenForceWithdraw; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -3135,7 +3130,7 @@ impl ClientInstruction for TokenForceWithdrawInstruction { .unwrap(); let bank = account_loader.load::(&self.bank).await.unwrap(); let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, + account_loader, &account, None, false, @@ -3182,7 +3177,7 @@ impl ClientInstruction for TokenLiqWithTokenInstruction { type Instruction = mango_v4::instruction::TokenLiqWithToken; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -3200,7 +3195,7 @@ impl ClientInstruction for TokenLiqWithTokenInstruction { .await .unwrap(); let health_check_metas = derive_liquidation_remaining_account_metas( - &account_loader, + account_loader, &liqee, &liqor, self.asset_token_index, @@ -3242,7 +3237,7 @@ impl ClientInstruction for TokenLiqBankruptcyInstruction { type Instruction = mango_v4::instruction::TokenLiqBankruptcy; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -3259,7 +3254,7 @@ impl ClientInstruction for TokenLiqBankruptcyInstruction { .await .unwrap(); let health_check_metas = derive_liquidation_remaining_account_metas( - &account_loader, + account_loader, &liqee, &liqor, QUOTE_TOKEN_INDEX, @@ -3381,7 +3376,7 @@ impl ClientInstruction for PerpCreateMarketInstruction { type Instruction = mango_v4::instruction::PerpCreateMarket; async fn to_instruction( &self, - _loader: impl ClientAccountLoader + 'async_trait, + _loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -3497,7 +3492,7 @@ impl ClientInstruction for PerpResetStablePriceModel { type Instruction = mango_v4::instruction::PerpEditMarket; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -3537,7 +3532,7 @@ impl ClientInstruction for PerpSetSettleLimitWindow { type Instruction = mango_v4::instruction::PerpEditMarket; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -3578,7 +3573,7 @@ impl ClientInstruction for PerpMakeReduceOnly { type Instruction = mango_v4::instruction::PerpEditMarket; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -3620,7 +3615,7 @@ impl ClientInstruction for PerpChangeWeights { type Instruction = mango_v4::instruction::PerpEditMarket; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -3659,7 +3654,7 @@ impl ClientInstruction for PerpCloseMarketInstruction { type Instruction = mango_v4::instruction::PerpCloseMarket; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -3696,7 +3691,7 @@ impl ClientInstruction for PerpDeactivatePositionInstruction { type Instruction = mango_v4::instruction::PerpDeactivatePosition; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let perp_market: PerpMarket = account_loader.load(&self.perp_market).await.unwrap(); @@ -3754,7 +3749,7 @@ impl ClientInstruction for PerpPlaceOrderInstruction { type Instruction = mango_v4::instruction::PerpPlaceOrderV2; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -3776,7 +3771,7 @@ impl ClientInstruction for PerpPlaceOrderInstruction { .await .unwrap(); let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, + account_loader, &account, None, false, @@ -3822,7 +3817,7 @@ impl ClientInstruction for PerpPlaceOrderPeggedInstruction { type Instruction = mango_v4::instruction::PerpPlaceOrderPeggedV2; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -3846,7 +3841,7 @@ impl ClientInstruction for PerpPlaceOrderPeggedInstruction { .await .unwrap(); let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, + account_loader, &account, None, false, @@ -3887,7 +3882,7 @@ impl ClientInstruction for PerpCancelOrderInstruction { type Instruction = mango_v4::instruction::PerpCancelOrder; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -3924,7 +3919,7 @@ impl ClientInstruction for PerpCancelOrderByClientOrderIdInstruction { type Instruction = mango_v4::instruction::PerpCancelOrderByClientOrderId; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -3961,7 +3956,7 @@ impl ClientInstruction for PerpCancelAllOrdersInstruction { type Instruction = mango_v4::instruction::PerpCancelAllOrders; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { limit: self.limit }; @@ -3994,7 +3989,7 @@ impl ClientInstruction for PerpConsumeEventsInstruction { type Instruction = mango_v4::instruction::PerpConsumeEvents; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { limit: 10 }; @@ -4033,7 +4028,7 @@ impl ClientInstruction for PerpUpdateFundingInstruction { type Instruction = mango_v4::instruction::PerpUpdateFunding; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -4068,7 +4063,7 @@ impl ClientInstruction for PerpSettlePnlInstruction { type Instruction = mango_v4::instruction::PerpSettlePnl; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -4083,7 +4078,7 @@ impl ClientInstruction for PerpSettlePnlInstruction { .await .unwrap(); let health_check_metas = derive_liquidation_remaining_account_metas( - &account_loader, + account_loader, &account_a, &account_b, TokenIndex::MAX, @@ -4093,7 +4088,7 @@ impl ClientInstruction for PerpSettlePnlInstruction { ) .await; let settle_mint_info = get_mint_info_by_token_index( - &account_loader, + account_loader, &account_a, perp_market.settle_token_index, ) @@ -4133,7 +4128,7 @@ impl ClientInstruction for PerpForceClosePositionInstruction { type Instruction = mango_v4::instruction::PerpForceClosePosition; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -4169,7 +4164,7 @@ impl ClientInstruction for PerpSettleFeesInstruction { type Instruction = mango_v4::instruction::PerpSettleFees; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -4182,7 +4177,7 @@ impl ClientInstruction for PerpSettleFeesInstruction { .await .unwrap(); let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, + account_loader, &account, None, false, @@ -4190,7 +4185,7 @@ impl ClientInstruction for PerpSettleFeesInstruction { ) .await; let settle_mint_info = - get_mint_info_by_token_index(&account_loader, &account, perp_market.settle_token_index) + get_mint_info_by_token_index(account_loader, &account, perp_market.settle_token_index) .await; let accounts = Self::Accounts { @@ -4222,7 +4217,7 @@ impl ClientInstruction for PerpLiqForceCancelOrdersInstruction { type Instruction = mango_v4::instruction::PerpLiqForceCancelOrders; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { limit: 10 }; @@ -4233,7 +4228,7 @@ impl ClientInstruction for PerpLiqForceCancelOrdersInstruction { .await .unwrap(); let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, + account_loader, &account, None, false, @@ -4273,7 +4268,7 @@ impl ClientInstruction for PerpLiqBaseOrPositivePnlInstruction { type Instruction = mango_v4::instruction::PerpLiqBaseOrPositivePnl; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -4292,7 +4287,7 @@ impl ClientInstruction for PerpLiqBaseOrPositivePnlInstruction { .await .unwrap(); let health_check_metas = derive_liquidation_remaining_account_metas( - &account_loader, + account_loader, &liqee, &liqor, TokenIndex::MAX, @@ -4303,7 +4298,7 @@ impl ClientInstruction for PerpLiqBaseOrPositivePnlInstruction { .await; let settle_mint_info = - get_mint_info_by_token_index(&account_loader, &liqee, perp_market.settle_token_index) + get_mint_info_by_token_index(account_loader, &liqee, perp_market.settle_token_index) .await; let accounts = Self::Accounts { @@ -4341,7 +4336,7 @@ impl ClientInstruction for PerpLiqNegativePnlOrBankruptcyInstruction { type Instruction = mango_v4::instruction::PerpLiqNegativePnlOrBankruptcyV2; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -4359,7 +4354,7 @@ impl ClientInstruction for PerpLiqNegativePnlOrBankruptcyInstruction { .await .unwrap(); let health_check_metas = derive_liquidation_remaining_account_metas( - &account_loader, + account_loader, &liqee, &liqor, TokenIndex::MAX, @@ -4371,10 +4366,10 @@ impl ClientInstruction for PerpLiqNegativePnlOrBankruptcyInstruction { let group = account_loader.load::(&group_key).await.unwrap(); let settle_mint_info = - get_mint_info_by_token_index(&account_loader, &liqee, perp_market.settle_token_index) + get_mint_info_by_token_index(account_loader, &liqee, perp_market.settle_token_index) .await; let insurance_mint_info = - get_mint_info_by_token_index(&account_loader, &liqee, QUOTE_TOKEN_INDEX).await; + get_mint_info_by_token_index(account_loader, &liqee, QUOTE_TOKEN_INDEX).await; let accounts = Self::Accounts { group: group_key, @@ -4410,7 +4405,7 @@ impl ClientInstruction for BenchmarkInstruction { type Instruction = mango_v4::instruction::Benchmark; async fn to_instruction( &self, - _loader: impl ClientAccountLoader + 'async_trait, + _loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -4435,7 +4430,7 @@ impl ClientInstruction for TokenUpdateIndexAndRateInstruction { type Instruction = mango_v4::instruction::TokenUpdateIndexAndRate; async fn to_instruction( &self, - loader: impl ClientAccountLoader + 'async_trait, + loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -4478,7 +4473,7 @@ impl ClientInstruction for ComputeAccountDataInstruction { type Instruction = mango_v4::instruction::ComputeAccountData; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -4489,7 +4484,7 @@ impl ClientInstruction for ComputeAccountDataInstruction { .unwrap(); let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, + account_loader, &account, None, false, @@ -4522,7 +4517,7 @@ impl ClientInstruction for HealthRegionBeginInstruction { type Instruction = mango_v4::instruction::HealthRegionBegin; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -4533,7 +4528,7 @@ impl ClientInstruction for HealthRegionBeginInstruction { .unwrap(); let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, + account_loader, &account, None, false, @@ -4568,7 +4563,7 @@ impl ClientInstruction for HealthRegionEndInstruction { type Instruction = mango_v4::instruction::HealthRegionEnd; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; @@ -4579,7 +4574,7 @@ impl ClientInstruction for HealthRegionEndInstruction { .unwrap(); let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, + account_loader, &account, self.affected_bank, false, @@ -4614,7 +4609,7 @@ impl ClientInstruction for AltSetInstruction { type Instruction = mango_v4::instruction::AltSet; async fn to_instruction( &self, - _account_loader: impl ClientAccountLoader + 'async_trait, + _account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { index: self.index }; @@ -4648,7 +4643,7 @@ impl ClientInstruction for AltExtendInstruction { type Instruction = mango_v4::instruction::AltExtend; async fn to_instruction( &self, - _account_loader: impl ClientAccountLoader + 'async_trait, + _account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -4692,7 +4687,7 @@ impl ClientInstruction for TokenConditionalSwapCreateInstruction { type Instruction = mango_v4::instruction::TokenConditionalSwapCreateV2; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -4773,7 +4768,7 @@ impl ClientInstruction for TokenConditionalSwapCreateLinearAuctionInstruction { type Instruction = mango_v4::instruction::TokenConditionalSwapCreateLinearAuction; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -4853,7 +4848,7 @@ impl ClientInstruction for TokenConditionalSwapCreatePremiumAuctionInstruction { type Instruction = mango_v4::instruction::TokenConditionalSwapCreatePremiumAuction; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -4926,7 +4921,7 @@ impl ClientInstruction for TokenConditionalSwapCancelInstruction { type Instruction = mango_v4::instruction::TokenConditionalSwapCancel; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); let instruction = Self::Instruction { @@ -4941,9 +4936,9 @@ impl ClientInstruction for TokenConditionalSwapCancelInstruction { let tcs = account.token_conditional_swap_by_id(self.id).unwrap().1; let buy_mint_info = - get_mint_info_by_token_index(&account_loader, &account, tcs.buy_token_index).await; + get_mint_info_by_token_index(account_loader, &account, tcs.buy_token_index).await; let sell_mint_info = - get_mint_info_by_token_index(&account_loader, &account, tcs.sell_token_index).await; + get_mint_info_by_token_index(account_loader, &account, tcs.sell_token_index).await; let accounts = Self::Accounts { group: account.fixed.group, @@ -4979,7 +4974,7 @@ impl ClientInstruction for TokenConditionalSwapTriggerInstruction { type Instruction = mango_v4::instruction::TokenConditionalSwapTriggerV2; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -5007,7 +5002,7 @@ impl ClientInstruction for TokenConditionalSwapTriggerInstruction { }; let health_check_metas = derive_liquidation_remaining_account_metas( - &account_loader, + account_loader, &liqee, &liqor, tcs.buy_token_index, @@ -5047,7 +5042,7 @@ impl ClientInstruction for TokenConditionalSwapStartInstruction { type Instruction = mango_v4::instruction::TokenConditionalSwapStart; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -5062,7 +5057,7 @@ impl ClientInstruction for TokenConditionalSwapStartInstruction { .clone(); let sell_mint_info = - get_mint_info_by_token_index(&account_loader, &liqee, tcs.sell_token_index).await; + get_mint_info_by_token_index(account_loader, &liqee, tcs.sell_token_index).await; let instruction = Self::Instruction { token_conditional_swap_index: self.index, @@ -5070,7 +5065,7 @@ impl ClientInstruction for TokenConditionalSwapStartInstruction { }; let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, + account_loader, &liqee, Some(sell_mint_info.first_bank()), true, @@ -5105,7 +5100,7 @@ impl ClientInstruction for TokenChargeCollateralFeesInstruction { type Instruction = mango_v4::instruction::TokenChargeCollateralFees; async fn to_instruction( &self, - account_loader: impl ClientAccountLoader + 'async_trait, + account_loader: &(impl ClientAccountLoader + 'async_trait), ) -> (Self::Accounts, instruction::Instruction) { let program_id = mango_v4::id(); @@ -5116,14 +5111,9 @@ impl ClientInstruction for TokenChargeCollateralFeesInstruction { let instruction = Self::Instruction {}; - let health_check_metas = derive_health_check_remaining_account_metas( - &account_loader, - &account, - None, - true, - None, - ) - .await; + let health_check_metas = + derive_health_check_remaining_account_metas(account_loader, &account, None, true, None) + .await; let accounts = Self::Accounts { group: account.fixed.group, @@ -5139,3 +5129,43 @@ impl ClientInstruction for TokenChargeCollateralFeesInstruction { vec![] } } + +#[derive(Clone)] +pub struct HealthAccountSkipping { + pub inner: T, + pub skip_banks: Vec, +} +#[async_trait::async_trait(?Send)] +impl ClientInstruction for HealthAccountSkipping { + type Accounts = T::Accounts; + type Instruction = T::Instruction; + async fn to_instruction( + &self, + account_loader: &(impl ClientAccountLoader + 'async_trait), + ) -> (Self::Accounts, instruction::Instruction) { + let (accounts, mut instruction) = self.inner.to_instruction(account_loader).await; + + let ams = &mut instruction.accounts; + for bank_pk in &self.skip_banks { + let bank_pos = + ams.len() - 1 - ams.iter().rev().position(|m| m.pubkey == *bank_pk).unwrap(); + ams.remove(bank_pos); + + let bank = account_loader.load::(&bank_pk).await.unwrap(); + let oracle_pk = bank.oracle; + + let oracle_pos = bank_pos + + ams[bank_pos..] + .iter() + .position(|m| m.pubkey == oracle_pk) + .unwrap(); + ams.remove(oracle_pos); + } + + (accounts, instruction) + } + + fn signers(&self) -> Vec { + self.inner.signers() + } +} From 5affbb9cee626e62917a3ef1e6c7e153b06d7ae4 Mon Sep 17 00:00:00 2001 From: Serge Farny Date: Thu, 7 Mar 2024 11:44:23 +0100 Subject: [PATCH 14/31] liquidator: add some latency metrics (#904) liquidator: add some latency metrics --- Cargo.lock | 15 +++++ bin/liquidator/Cargo.toml | 1 + bin/liquidator/src/main.rs | 84 ++++++++++++++++++++++++- bin/liquidator/src/metrics.rs | 38 +++++++++++ lib/client/src/account_update_stream.rs | 13 +++- lib/client/src/snapshot_source.rs | 4 +- lib/client/src/websocket_source.rs | 11 ++-- 7 files changed, 157 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ad1289b71..bd7a430f7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2455,6 +2455,20 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +[[package]] +name = "hdrhistogram" +version = "7.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" +dependencies = [ + "base64 0.21.4", + "byteorder", + "crossbeam-channel", + "flate2 1.0.27", + "nom 7.1.3", + "num-traits", +] + [[package]] name = "headers" version = "0.3.9" @@ -3522,6 +3536,7 @@ dependencies = [ "futures 0.3.28", "futures-core", "futures-util", + "hdrhistogram", "itertools", "jemallocator", "jsonrpc-core 18.0.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/bin/liquidator/Cargo.toml b/bin/liquidator/Cargo.toml index 846aaaf7f..d591bd37b 100644 --- a/bin/liquidator/Cargo.toml +++ b/bin/liquidator/Cargo.toml @@ -49,3 +49,4 @@ tokio-stream = { version = "0.1.9"} tokio-tungstenite = "0.16.1" tracing = "0.1" regex = "1.9.5" +hdrhistogram = "7.5.4" \ No newline at end of file diff --git a/bin/liquidator/src/main.rs b/bin/liquidator/src/main.rs index ce0fcbf38..7b6e3d71b 100644 --- a/bin/liquidator/src/main.rs +++ b/bin/liquidator/src/main.rs @@ -282,6 +282,8 @@ async fn main() -> anyhow::Result<()> { let mut metric_account_update_queue_len = metrics.register_u64("account_update_queue_length".into()); + let mut metric_chain_update_latency = + metrics.register_latency("in-memory chain update".into()); let mut metric_mango_accounts = metrics.register_u64("mango_accounts".into()); let mut mint_infos = HashMap::::new(); @@ -294,6 +296,7 @@ async fn main() -> anyhow::Result<()> { .recv() .await .expect("channel not closed"); + let current_time = Instant::now(); metric_account_update_queue_len.set(account_update_receiver.len() as u64); message.update_chain_data(&mut chain_data.write().unwrap()); @@ -301,6 +304,15 @@ async fn main() -> anyhow::Result<()> { match message { Message::Account(account_write) => { let mut state = shared_state.write().unwrap(); + let reception_time = account_write.reception_time; + state.oldest_chain_event_reception_time = Some( + state + .oldest_chain_event_reception_time + .unwrap_or(reception_time), + ); + + metric_chain_update_latency.push(current_time - reception_time); + if is_mango_account(&account_write.account, &mango_group).is_some() { // e.g. to render debug logs RUST_LOG="liquidator=debug" debug!( @@ -315,8 +327,21 @@ async fn main() -> anyhow::Result<()> { } Message::Snapshot(snapshot) => { let mut state = shared_state.write().unwrap(); + let mut reception_time = None; + // Track all mango account pubkeys for update in snapshot.iter() { + reception_time = Some( + update + .reception_time + .min(reception_time.unwrap_or(update.reception_time)), + ); + state.oldest_chain_event_reception_time = Some( + state + .oldest_chain_event_reception_time + .unwrap_or(update.reception_time), + ); + if is_mango_account(&update.account, &mango_group).is_some() { state.mango_accounts.insert(update.pubkey); } @@ -330,6 +355,11 @@ async fn main() -> anyhow::Result<()> { oracles.insert(perp_market.oracle); } } + + if reception_time.is_some() { + metric_chain_update_latency + .push(current_time - reception_time.unwrap()); + } metric_mango_accounts.set(state.mango_accounts.len() as u64); state.one_snapshot_done = true; @@ -369,35 +399,82 @@ async fn main() -> anyhow::Result<()> { let liquidation_job = tokio::spawn({ let mut interval = mango_v4_client::delay_interval(Duration::from_millis(cli.check_interval_ms)); + let mut metric_liquidation_check = metrics.register_latency("liquidation_check".into()); + let mut metric_liquidation_start_end = + metrics.register_latency("liquidation_start_end".into()); + + let mut liquidation_start_time = None; + let mut tcs_start_time = None; + let shared_state = shared_state.clone(); async move { loop { interval.tick().await; let account_addresses = { - let state = shared_state.write().unwrap(); + let mut state = shared_state.write().unwrap(); if !state.one_snapshot_done { + // discard first latency info as it will skew data too much + state.oldest_chain_event_reception_time = None; continue; } + if state.oldest_chain_event_reception_time.is_none() + && liquidation_start_time.is_none() + { + // no new update, skip computing + continue; + } + state.mango_accounts.iter().cloned().collect_vec() }; liquidation.errors.update(); liquidation.oracle_errors.update(); + if liquidation_start_time.is_none() { + liquidation_start_time = Some(Instant::now()); + } + let liquidated = liquidation .maybe_liquidate_one(account_addresses.iter()) .await; + if !liquidated { + // This will be incorrect if we liquidate the last checked account + // (We will wait for next full run, skewing latency metrics) + // Probability is very low, might not need to be fixed + + let mut state = shared_state.write().unwrap(); + let reception_time = state.oldest_chain_event_reception_time.unwrap(); + let current_time = Instant::now(); + + state.oldest_chain_event_reception_time = None; + + metric_liquidation_check.push(current_time - reception_time); + metric_liquidation_start_end + .push(current_time - liquidation_start_time.unwrap()); + liquidation_start_time = None; + } + let mut took_tcs = false; if !liquidated && cli.take_tcs == BoolArg::True { + tcs_start_time = Some(tcs_start_time.unwrap_or(Instant::now())); + took_tcs = liquidation .maybe_take_token_conditional_swap(account_addresses.iter()) .await .unwrap_or_else(|err| { error!("error during maybe_take_token_conditional_swap: {err}"); false - }) + }); + + if !took_tcs { + let current_time = Instant::now(); + let mut metric_tcs_start_end = + metrics.register_latency("tcs_start_end".into()); + metric_tcs_start_end.push(current_time - tcs_start_time.unwrap()); + tcs_start_time = None; + } } if liquidated || took_tcs { @@ -477,6 +554,9 @@ struct SharedState { /// Is the first snapshot done? Only start checking account health when it is. one_snapshot_done: bool, + + /// Oldest chain event not processed yet + oldest_chain_event_reception_time: Option, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] diff --git a/bin/liquidator/src/metrics.rs b/bin/liquidator/src/metrics.rs index 526587576..68291b08f 100644 --- a/bin/liquidator/src/metrics.rs +++ b/bin/liquidator/src/metrics.rs @@ -1,3 +1,5 @@ +use hdrhistogram::Histogram; +use std::time::Duration; use { std::collections::HashMap, std::sync::{atomic, Arc, Mutex, RwLock}, @@ -10,6 +12,7 @@ enum Value { U64(Arc), I64(Arc), String(Arc>), + Latency(Arc>>), } #[derive(Debug)] @@ -49,6 +52,18 @@ impl MetricU64 { } } +#[derive(Clone)] +pub struct MetricLatency { + value: Arc>>, +} +impl MetricLatency { + pub fn push(&mut self, duration: std::time::Duration) { + let mut guard = self.value.lock().unwrap(); + let ns: u64 = duration.as_nanos().try_into().unwrap(); + guard.record(ns).expect("latency error"); + } +} + #[derive(Clone)] pub struct MetricI64 { value: Arc, @@ -110,6 +125,19 @@ impl Metrics { } } + pub fn register_latency(&self, name: String) -> MetricLatency { + let mut registry = self.registry.write().unwrap(); + let value = registry.entry(name).or_insert_with(|| { + Value::Latency(Arc::new(Mutex::new(Histogram::::new(3).unwrap()))) + }); + MetricLatency { + value: match value { + Value::Latency(v) => v.clone(), + _ => panic!("bad metric type"), + }, + } + } + pub fn register_string(&self, name: String) -> MetricString { let mut registry = self.registry.write().unwrap(); let value = registry @@ -187,6 +215,16 @@ pub fn start() -> Metrics { ); } } + Value::Latency(v) => { + let hist = v.lock().unwrap(); + + info!( + "metric: {}: 99'th percentile: {:?}, 99,9'th percentile: {:?}", + name, + Duration::from_nanos(hist.value_at_quantile(0.99)), + Duration::from_nanos(hist.value_at_quantile(0.999)) + ); + } } } } diff --git a/lib/client/src/account_update_stream.rs b/lib/client/src/account_update_stream.rs index d73987e2f..ec148d996 100644 --- a/lib/client/src/account_update_stream.rs +++ b/lib/client/src/account_update_stream.rs @@ -1,6 +1,7 @@ use solana_client::rpc_response::{Response, RpcKeyedAccount}; use solana_sdk::{account::AccountSharedData, pubkey::Pubkey}; +use std::time::Instant; use std::{str::FromStr, sync::Arc}; use tracing::*; @@ -11,6 +12,7 @@ pub struct AccountUpdate { pub pubkey: Pubkey, pub slot: u64, pub account: AccountSharedData, + pub reception_time: Instant, } impl AccountUpdate { @@ -25,15 +27,22 @@ impl AccountUpdate { pubkey, slot: rpc.context.slot, account, + reception_time: Instant::now(), }) } } +#[derive(Clone)] +pub struct ChainSlotUpdate { + pub slot_update: Arc, + pub reception_time: Instant, +} + #[derive(Clone)] pub enum Message { Account(AccountUpdate), Snapshot(Vec), - Slot(Arc), + Slot(ChainSlotUpdate), } impl Message { @@ -65,7 +74,7 @@ impl Message { } Message::Slot(slot_update) => { trace!("websocket slot message"); - let slot_update = match **slot_update { + let slot_update = match *(slot_update.slot_update) { solana_client::rpc_response::SlotUpdate::CreatedBank { slot, parent, .. } => Some(SlotData { diff --git a/lib/client/src/snapshot_source.rs b/lib/client/src/snapshot_source.rs index d39ab0c2f..44da48303 100644 --- a/lib/client/src/snapshot_source.rs +++ b/lib/client/src/snapshot_source.rs @@ -15,7 +15,7 @@ use futures::{stream, StreamExt}; use solana_rpc::rpc::rpc_accounts::AccountsDataClient; use solana_rpc::rpc::rpc_accounts_scan::AccountsScanClient; use std::str::FromStr; -use std::time::Duration; +use std::time::{Duration, Instant}; use tokio::time; use tracing::*; @@ -55,6 +55,7 @@ impl AccountSnapshot { .account .decode() .ok_or_else(|| anyhow::anyhow!("could not decode account"))?, + reception_time: Instant::now(), }); } Ok(()) @@ -74,6 +75,7 @@ impl AccountSnapshot { account: ui_account .decode() .ok_or_else(|| anyhow::anyhow!("could not decode account"))?, + reception_time: Instant::now(), }); } } diff --git a/lib/client/src/websocket_source.rs b/lib/client/src/websocket_source.rs index fa6a379b1..c3d9b89e7 100644 --- a/lib/client/src/websocket_source.rs +++ b/lib/client/src/websocket_source.rs @@ -11,11 +11,11 @@ use solana_rpc::rpc_pubsub::RpcSolPubSubClient; use solana_sdk::{commitment_config::CommitmentConfig, pubkey::Pubkey}; use anyhow::Context; -use std::time::Duration; +use std::time::{Duration, Instant}; use tokio_stream::StreamMap; use tracing::*; -use crate::account_update_stream::{AccountUpdate, Message}; +use crate::account_update_stream::{AccountUpdate, ChainSlotUpdate, Message}; use crate::AnyhowWrap; pub struct Config { @@ -143,7 +143,10 @@ async fn feed_data( }, message = slot_sub.next() => { if let Some(data) = message { - sender.send(Message::Slot(data.map_err_anyhow()?)).await.expect("sending must succeed"); + sender.send(Message::Slot(ChainSlotUpdate{ + slot_update: data.map_err_anyhow()?, + reception_time: Instant::now() + })).await.expect("sending must succeed"); } else { warn!("slot update stream closed"); return Ok(()); @@ -200,7 +203,7 @@ pub async fn get_next_create_bank_slot( match msg { Message::Slot(slot_update) => { if let solana_client::rpc_response::SlotUpdate::CreatedBank { slot, .. } = - *slot_update + *slot_update.slot_update { return Ok(slot); } From 81f05b32c71dda49dc3d1ed63ff2a544e844874c Mon Sep 17 00:00:00 2001 From: Serge Farny Date: Thu, 7 Mar 2024 11:44:46 +0100 Subject: [PATCH 15/31] service-mango-health: add config for snapshot interval (reduce memory pressure) (#906) --- bin/service-mango-health/conf/example-config.toml | 1 + bin/service-mango-health/conf/template-config.toml | 1 + bin/service-mango-health/src/configuration.rs | 2 ++ bin/service-mango-health/src/processors/data.rs | 2 +- 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/service-mango-health/conf/example-config.toml b/bin/service-mango-health/conf/example-config.toml index edbb9e493..40b290f1b 100644 --- a/bin/service-mango-health/conf/example-config.toml +++ b/bin/service-mango-health/conf/example-config.toml @@ -1,6 +1,7 @@ rpc_ws_url = "wss://mango.rpcpool.com/" rpc_http_url = "http://mango.rpcpool.com/" mango_group = "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX" +snapshot_interval_secs = 900 # [postgres] # connection_string = "$PG_CONNECTION_STRING" diff --git a/bin/service-mango-health/conf/template-config.toml b/bin/service-mango-health/conf/template-config.toml index a7684de85..ac5fcee40 100644 --- a/bin/service-mango-health/conf/template-config.toml +++ b/bin/service-mango-health/conf/template-config.toml @@ -1,6 +1,7 @@ rpc_http_url = "$RPC_HTTP_URL" rpc_ws_url = "$RPC_WS_URL" mango_group = "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX" +snapshot_interval_secs = 900 [postgres] connection_string = "$PG_CONNECTION_STRING" diff --git a/bin/service-mango-health/src/configuration.rs b/bin/service-mango-health/src/configuration.rs index 76ca7944d..3dc95cb33 100644 --- a/bin/service-mango-health/src/configuration.rs +++ b/bin/service-mango-health/src/configuration.rs @@ -15,6 +15,8 @@ pub struct Configuration { pub computing_configuration: ComputingConfiguration, pub logging_configuration: LoggingConfiguration, pub persistence_configuration: PersistenceConfiguration, + + pub snapshot_interval_secs: u64, } #[derive(Clone, Debug, Deserialize)] diff --git a/bin/service-mango-health/src/processors/data.rs b/bin/service-mango-health/src/processors/data.rs index c9b3f6ac5..3a25923b9 100644 --- a/bin/service-mango-health/src/processors/data.rs +++ b/bin/service-mango-health/src/processors/data.rs @@ -198,7 +198,7 @@ impl DataProcessor { mango_group, get_multiple_accounts_count: 100, parallel_rpc_requests: 10, - snapshot_interval: Duration::from_secs(5 * 60), + snapshot_interval: Duration::from_secs(configuration.snapshot_interval_secs), min_slot: first_websocket_slot + 10, }, mango_oracles, From 494835631ba7b173390203ed31d2a5163bc73e8a Mon Sep 17 00:00:00 2001 From: Serge Farny Date: Thu, 7 Mar 2024 14:59:05 +0100 Subject: [PATCH 16/31] program: add a sequence check IX (#908) Add a sequence check IX This new IX `SequenceCheck` can be used to avoid having multiple concurrent TX in flight causing unexpected result (multiple borrow for example) --- mango_v4.json | 55 ++++++++- programs/mango-v4/src/accounts_ix/mod.rs | 2 + .../src/accounts_ix/sequence_check.rs | 20 ++++ programs/mango-v4/src/error.rs | 2 + .../mango-v4/src/instructions/ix_gate_set.rs | 1 + programs/mango-v4/src/instructions/mod.rs | 2 + .../src/instructions/sequence_check.rs | 18 +++ programs/mango-v4/src/lib.rs | 9 ++ programs/mango-v4/src/state/group.rs | 1 + programs/mango-v4/src/state/mango_account.rs | 15 ++- programs/mango-v4/tests/cases/test_basic.rs | 102 ++++++++++++++++ .../tests/program_test/mango_client.rs | 39 +++++++ ts/client/src/accounts/mangoAccount.spec.ts | 1 + ts/client/src/accounts/mangoAccount.ts | 3 + ts/client/src/client.ts | 14 +++ ts/client/src/clientIxParamBuilder.ts | 3 + ts/client/src/mango_v4.ts | 110 +++++++++++++++++- 17 files changed, 386 insertions(+), 11 deletions(-) create mode 100644 programs/mango-v4/src/accounts_ix/sequence_check.rs create mode 100644 programs/mango-v4/src/instructions/sequence_check.rs diff --git a/mango_v4.json b/mango_v4.json index d041fa22f..b38b3df22 100644 --- a/mango_v4.json +++ b/mango_v4.json @@ -1760,6 +1760,36 @@ } ] }, + { + "name": "sequenceCheck", + "accounts": [ + { + "name": "group", + "isMut": false, + "isSigner": false + }, + { + "name": "account", + "isMut": true, + "isSigner": false, + "relations": [ + "group", + "owner" + ] + }, + { + "name": "owner", + "isMut": false, + "isSigner": true + } + ], + "args": [ + { + "name": "expectedSequenceNumber", + "type": "u64" + } + ] + }, { "name": "stubOracleCreate", "accounts": [ @@ -7942,12 +7972,16 @@ ], "type": "u64" }, + { + "name": "sequenceNumber", + "type": "u64" + }, { "name": "reserved", "type": { "array": [ "u8", - 152 + 144 ] } }, @@ -9721,12 +9755,16 @@ "name": "lastCollateralFeeCharge", "type": "u64" }, + { + "name": "sequenceNumber", + "type": "u64" + }, { "name": "reserved", "type": { "array": [ "u8", - 152 + 144 ] } } @@ -11008,6 +11046,9 @@ }, { "name": "TokenForceWithdraw" + }, + { + "name": "SequenceCheck" } ] } @@ -14350,6 +14391,16 @@ "code": 6069, "name": "TokenAssetLiquidationDisabled", "msg": "the asset does not allow liquidation" + }, + { + "code": 6070, + "name": "BorrowsRequireHealthAccountBank", + "msg": "for borrows the bank must be in the health account list" + }, + { + "code": 6071, + "name": "InvalidSequenceNumber", + "msg": "invalid sequence number" } ] } \ No newline at end of file diff --git a/programs/mango-v4/src/accounts_ix/mod.rs b/programs/mango-v4/src/accounts_ix/mod.rs index df8ea1f30..ac5b5639b 100644 --- a/programs/mango-v4/src/accounts_ix/mod.rs +++ b/programs/mango-v4/src/accounts_ix/mod.rs @@ -45,6 +45,7 @@ pub use perp_place_order::*; pub use perp_settle_fees::*; pub use perp_settle_pnl::*; pub use perp_update_funding::*; +pub use sequence_check::*; pub use serum3_cancel_all_orders::*; pub use serum3_cancel_order::*; pub use serum3_close_open_orders::*; @@ -123,6 +124,7 @@ mod perp_place_order; mod perp_settle_fees; mod perp_settle_pnl; mod perp_update_funding; +mod sequence_check; mod serum3_cancel_all_orders; mod serum3_cancel_order; mod serum3_close_open_orders; diff --git a/programs/mango-v4/src/accounts_ix/sequence_check.rs b/programs/mango-v4/src/accounts_ix/sequence_check.rs new file mode 100644 index 000000000..ca4a6f3b9 --- /dev/null +++ b/programs/mango-v4/src/accounts_ix/sequence_check.rs @@ -0,0 +1,20 @@ +use crate::error::*; +use crate::state::*; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +pub struct SequenceCheck<'info> { + #[account( + constraint = group.load()?.is_ix_enabled(IxGate::SequenceCheck) @ MangoError::IxIsDisabled, + )] + pub group: AccountLoader<'info, Group>, + + #[account( + mut, + has_one = group, + has_one = owner, + constraint = account.load()?.is_operational() @ MangoError::AccountIsFrozen + )] + pub account: AccountLoader<'info, MangoAccountFixed>, + pub owner: Signer<'info>, +} diff --git a/programs/mango-v4/src/error.rs b/programs/mango-v4/src/error.rs index c7510ba3c..0d283f444 100644 --- a/programs/mango-v4/src/error.rs +++ b/programs/mango-v4/src/error.rs @@ -147,6 +147,8 @@ pub enum MangoError { TokenAssetLiquidationDisabled, #[msg("for borrows the bank must be in the health account list")] BorrowsRequireHealthAccountBank, + #[msg("invalid sequence number")] + InvalidSequenceNumber, } impl MangoError { diff --git a/programs/mango-v4/src/instructions/ix_gate_set.rs b/programs/mango-v4/src/instructions/ix_gate_set.rs index 413b9ceff..9bae726ce 100644 --- a/programs/mango-v4/src/instructions/ix_gate_set.rs +++ b/programs/mango-v4/src/instructions/ix_gate_set.rs @@ -96,6 +96,7 @@ pub fn ix_gate_set(ctx: Context, ix_gate: u128) -> Result<()> { ); log_if_changed(&group, ix_gate, IxGate::Serum3PlaceOrderV2); log_if_changed(&group, ix_gate, IxGate::TokenForceWithdraw); + log_if_changed(&group, ix_gate, IxGate::SequenceCheck); group.ix_gate = ix_gate; diff --git a/programs/mango-v4/src/instructions/mod.rs b/programs/mango-v4/src/instructions/mod.rs index faa5d8e88..523d1f1f8 100644 --- a/programs/mango-v4/src/instructions/mod.rs +++ b/programs/mango-v4/src/instructions/mod.rs @@ -35,6 +35,7 @@ pub use perp_place_order::*; pub use perp_settle_fees::*; pub use perp_settle_pnl::*; pub use perp_update_funding::*; +pub use sequence_check::*; pub use serum3_cancel_all_orders::*; pub use serum3_cancel_order::*; pub use serum3_cancel_order_by_client_order_id::*; @@ -104,6 +105,7 @@ mod perp_place_order; mod perp_settle_fees; mod perp_settle_pnl; mod perp_update_funding; +mod sequence_check; mod serum3_cancel_all_orders; mod serum3_cancel_order; mod serum3_cancel_order_by_client_order_id; diff --git a/programs/mango-v4/src/instructions/sequence_check.rs b/programs/mango-v4/src/instructions/sequence_check.rs new file mode 100644 index 000000000..e42d042ac --- /dev/null +++ b/programs/mango-v4/src/instructions/sequence_check.rs @@ -0,0 +1,18 @@ +use anchor_lang::prelude::*; + +use crate::accounts_ix::*; +use crate::error::MangoError; +use crate::state::*; + +pub fn sequence_check(ctx: Context, expected_sequence_number: u64) -> Result<()> { + let mut account = ctx.accounts.account.load_full_mut()?; + + require_eq!( + expected_sequence_number, + account.fixed.sequence_number, + MangoError::InvalidSequenceNumber + ); + + account.fixed.sequence_number = account.fixed.sequence_number.wrapping_add(1); + Ok(()) +} diff --git a/programs/mango-v4/src/lib.rs b/programs/mango-v4/src/lib.rs index b1f4b9102..933ef1efb 100644 --- a/programs/mango-v4/src/lib.rs +++ b/programs/mango-v4/src/lib.rs @@ -458,6 +458,15 @@ pub mod mango_v4 { Ok(()) } + pub fn sequence_check( + ctx: Context, + expected_sequence_number: u64, + ) -> Result<()> { + #[cfg(feature = "enable-gpl")] + instructions::sequence_check(ctx, expected_sequence_number)?; + Ok(()) + } + // todo: // ckamm: generally, using an I80F48 arg will make it harder to call // because generic anchor clients won't know how to deal with it diff --git a/programs/mango-v4/src/state/group.rs b/programs/mango-v4/src/state/group.rs index 19fc8db03..e652a8dab 100644 --- a/programs/mango-v4/src/state/group.rs +++ b/programs/mango-v4/src/state/group.rs @@ -246,6 +246,7 @@ pub enum IxGate { TokenConditionalSwapCreateLinearAuction = 70, Serum3PlaceOrderV2 = 71, TokenForceWithdraw = 72, + SequenceCheck = 73, // NOTE: Adding new variants requires matching changes in ts and the ix_gate_set instruction. } diff --git a/programs/mango-v4/src/state/mango_account.rs b/programs/mango-v4/src/state/mango_account.rs index 99ea08781..0f6276491 100644 --- a/programs/mango-v4/src/state/mango_account.rs +++ b/programs/mango-v4/src/state/mango_account.rs @@ -157,8 +157,10 @@ pub struct MangoAccount { /// Time at which the last collateral fee was charged pub last_collateral_fee_charge: u64, + pub sequence_number: u64, + #[derivative(Debug = "ignore")] - pub reserved: [u8; 152], + pub reserved: [u8; 144], // dynamic pub header_version: u8, @@ -212,7 +214,8 @@ impl MangoAccount { temporary_delegate: Pubkey::default(), temporary_delegate_expiry: 0, last_collateral_fee_charge: 0, - reserved: [0; 152], + sequence_number: 0, + reserved: [0; 144], header_version: DEFAULT_MANGO_ACCOUNT_VERSION, padding3: Default::default(), padding4: Default::default(), @@ -337,11 +340,12 @@ pub struct MangoAccountFixed { pub temporary_delegate: Pubkey, pub temporary_delegate_expiry: u64, pub last_collateral_fee_charge: u64, - pub reserved: [u8; 152], + pub sequence_number: u64, + pub reserved: [u8; 144], } const_assert_eq!( size_of::(), - 32 * 4 + 8 + 8 * 8 + 32 + 8 + 8 + 152 + 32 * 4 + 8 + 8 * 8 + 32 + 8 + 8 + 8 + 144 ); const_assert_eq!(size_of::(), 400); const_assert_eq!(size_of::() % 8, 0); @@ -2909,7 +2913,8 @@ mod tests { temporary_delegate: fixed.temporary_delegate, temporary_delegate_expiry: fixed.temporary_delegate_expiry, last_collateral_fee_charge: fixed.last_collateral_fee_charge, - reserved: [0u8; 152], + sequence_number: 0, + reserved: [0u8; 144], header_version: *zerocopy_reader.header_version(), padding3: Default::default(), diff --git a/programs/mango-v4/tests/cases/test_basic.rs b/programs/mango-v4/tests/cases/test_basic.rs index ee774c080..c20efa8c2 100644 --- a/programs/mango-v4/tests/cases/test_basic.rs +++ b/programs/mango-v4/tests/cases/test_basic.rs @@ -947,3 +947,105 @@ async fn test_withdraw_skip_bank() -> Result<(), TransportError> { Ok(()) } + +#[tokio::test] +async fn test_sequence_check() -> Result<(), TransportError> { + let context = TestContext::new().await; + let solana = &context.solana.clone(); + + let admin = TestKeypair::new(); + let owner = context.users[0].key; + let payer = context.users[1].key; + let mints = &context.mints[0..1]; + + let mango_setup::GroupWithTokens { group, .. } = mango_setup::GroupWithTokensConfig { + admin, + payer, + mints: mints.to_vec(), + ..mango_setup::GroupWithTokensConfig::default() + } + .create(solana) + .await; + + let account = send_tx( + solana, + AccountCreateInstruction { + account_num: 0, + token_count: 6, + serum3_count: 3, + perp_count: 3, + perp_oo_count: 3, + token_conditional_swap_count: 3, + group, + owner, + payer, + }, + ) + .await + .unwrap() + .account; + + let mango_account = get_mango_account(solana, account).await; + assert_eq!(mango_account.fixed.sequence_number, 0); + + // + // TEST: Sequence check with right sequence number + // + + send_tx( + solana, + SequenceCheckInstruction { + account, + owner, + expected_sequence_number: 0, + }, + ) + .await + .unwrap(); + + let mango_account = get_mango_account(solana, account).await; + assert_eq!(mango_account.fixed.sequence_number, 1); + + send_tx( + solana, + SequenceCheckInstruction { + account, + owner, + expected_sequence_number: 1, + }, + ) + .await + .unwrap(); + + let mango_account = get_mango_account(solana, account).await; + assert_eq!(mango_account.fixed.sequence_number, 2); + + // + // TEST: Sequence check with wrong sequence number + // + + send_tx_expect_error!( + solana, + SequenceCheckInstruction { + account, + owner, + expected_sequence_number: 1 + }, + MangoError::InvalidSequenceNumber + ); + + send_tx_expect_error!( + solana, + SequenceCheckInstruction { + account, + owner, + expected_sequence_number: 4 + }, + MangoError::InvalidSequenceNumber + ); + + let mango_account = get_mango_account(solana, account).await; + assert_eq!(mango_account.fixed.sequence_number, 2); + + Ok(()) +} diff --git a/programs/mango-v4/tests/program_test/mango_client.rs b/programs/mango-v4/tests/program_test/mango_client.rs index 6fc904022..4c38cd826 100644 --- a/programs/mango-v4/tests/program_test/mango_client.rs +++ b/programs/mango-v4/tests/program_test/mango_client.rs @@ -5169,3 +5169,42 @@ impl ClientInstruction for HealthAccountSkipping { self.inner.signers() } } + +#[derive(Default)] +pub struct SequenceCheckInstruction { + pub account: Pubkey, + pub owner: TestKeypair, + pub expected_sequence_number: u64, +} +#[async_trait::async_trait(?Send)] +impl ClientInstruction for SequenceCheckInstruction { + type Accounts = mango_v4::accounts::SequenceCheck; + type Instruction = mango_v4::instruction::SequenceCheck; + async fn to_instruction( + &self, + account_loader: &(impl ClientAccountLoader + 'async_trait), + ) -> (Self::Accounts, instruction::Instruction) { + let program_id = mango_v4::id(); + let instruction = Self::Instruction { + expected_sequence_number: self.expected_sequence_number, + }; + + let account = account_loader + .load_mango_account(&self.account) + .await + .unwrap(); + + let accounts = Self::Accounts { + group: account.fixed.group, + account: self.account, + owner: self.owner.pubkey(), + }; + + let instruction = make_instruction(program_id, &accounts, &instruction); + (accounts, instruction) + } + + fn signers(&self) -> Vec { + vec![self.owner] + } +} diff --git a/ts/client/src/accounts/mangoAccount.spec.ts b/ts/client/src/accounts/mangoAccount.spec.ts index 929c2e4c6..6f92295b7 100644 --- a/ts/client/src/accounts/mangoAccount.spec.ts +++ b/ts/client/src/accounts/mangoAccount.spec.ts @@ -23,6 +23,7 @@ describe('Mango Account', () => { new BN(0), new BN(0), new BN(0), + new BN(0), 0, [], [], diff --git a/ts/client/src/accounts/mangoAccount.ts b/ts/client/src/accounts/mangoAccount.ts index c8d4dbad2..a0344e521 100644 --- a/ts/client/src/accounts/mangoAccount.ts +++ b/ts/client/src/accounts/mangoAccount.ts @@ -44,6 +44,7 @@ export class MangoAccount { buybackFeesAccruedCurrent: BN; buybackFeesAccruedPrevious: BN; buybackFeesExpiryTimestamp: BN; + sequenceNumber: BN; headerVersion: number; tokens: unknown; serum3: unknown; @@ -68,6 +69,7 @@ export class MangoAccount { obj.buybackFeesAccruedCurrent, obj.buybackFeesAccruedPrevious, obj.buybackFeesExpiryTimestamp, + obj.sequenceNumber, obj.headerVersion, obj.tokens as TokenPositionDto[], obj.serum3 as Serum3PositionDto[], @@ -94,6 +96,7 @@ export class MangoAccount { public buybackFeesAccruedCurrent: BN, public buybackFeesAccruedPrevious: BN, public buybackFeesExpiryTimestamp: BN, + public sequenceNumber: BN, public headerVersion: number, tokens: TokenPositionDto[], serum3: Serum3PositionDto[], diff --git a/ts/client/src/client.ts b/ts/client/src/client.ts index 19c764ee6..4f76931bc 100644 --- a/ts/client/src/client.ts +++ b/ts/client/src/client.ts @@ -1034,6 +1034,20 @@ export class MangoClient { return await this.sendAndConfirmTransactionForGroup(group, [ix]); } + public async sequenceCheckIx( + group: Group, + mangoAccount: MangoAccount, + ): Promise { + return await this.program.methods + .sequenceCheck(mangoAccount.sequenceNumber) + .accounts({ + group: group.publicKey, + account: mangoAccount.publicKey, + owner: (this.program.provider as AnchorProvider).wallet.publicKey, + }) + .instruction(); + } + public async getMangoAccount( mangoAccountPk: PublicKey, loadSerum3Oo = false, diff --git a/ts/client/src/clientIxParamBuilder.ts b/ts/client/src/clientIxParamBuilder.ts index 0074f7aa6..3baa5a1d2 100644 --- a/ts/client/src/clientIxParamBuilder.ts +++ b/ts/client/src/clientIxParamBuilder.ts @@ -310,6 +310,7 @@ export interface IxGateParams { TokenConditionalSwapCreateLinearAuction: boolean; Serum3PlaceOrderV2: boolean; TokenForceWithdraw: boolean; + SequenceCheck: boolean; } // Default with all ixs enabled, use with buildIxGate @@ -390,6 +391,7 @@ export const TrueIxGateParams: IxGateParams = { TokenConditionalSwapCreateLinearAuction: true, Serum3PlaceOrderV2: true, TokenForceWithdraw: true, + SequenceCheck: true, }; // build ix gate e.g. buildIxGate(Builder(TrueIxGateParams).TokenDeposit(false).build()).toNumber(), @@ -480,6 +482,7 @@ export function buildIxGate(p: IxGateParams): BN { toggleIx(ixGate, p, 'TokenConditionalSwapCreateLinearAuction', 70); toggleIx(ixGate, p, 'Serum3PlaceOrderV2', 71); toggleIx(ixGate, p, 'TokenForceWithdraw', 72); + toggleIx(ixGate, p, 'SequenceCheck', 73); return ixGate; } diff --git a/ts/client/src/mango_v4.ts b/ts/client/src/mango_v4.ts index bcce269fb..ad8cdb421 100644 --- a/ts/client/src/mango_v4.ts +++ b/ts/client/src/mango_v4.ts @@ -1760,6 +1760,36 @@ export type MangoV4 = { } ] }, + { + "name": "sequenceCheck", + "accounts": [ + { + "name": "group", + "isMut": false, + "isSigner": false + }, + { + "name": "account", + "isMut": true, + "isSigner": false, + "relations": [ + "group", + "owner" + ] + }, + { + "name": "owner", + "isMut": false, + "isSigner": true + } + ], + "args": [ + { + "name": "expectedSequenceNumber", + "type": "u64" + } + ] + }, { "name": "stubOracleCreate", "accounts": [ @@ -7942,12 +7972,16 @@ export type MangoV4 = { ], "type": "u64" }, + { + "name": "sequenceNumber", + "type": "u64" + }, { "name": "reserved", "type": { "array": [ "u8", - 152 + 144 ] } }, @@ -9721,12 +9755,16 @@ export type MangoV4 = { "name": "lastCollateralFeeCharge", "type": "u64" }, + { + "name": "sequenceNumber", + "type": "u64" + }, { "name": "reserved", "type": { "array": [ "u8", - 152 + 144 ] } } @@ -11008,6 +11046,9 @@ export type MangoV4 = { }, { "name": "TokenForceWithdraw" + }, + { + "name": "SequenceCheck" } ] } @@ -14350,6 +14391,16 @@ export type MangoV4 = { "code": 6069, "name": "TokenAssetLiquidationDisabled", "msg": "the asset does not allow liquidation" + }, + { + "code": 6070, + "name": "BorrowsRequireHealthAccountBank", + "msg": "for borrows the bank must be in the health account list" + }, + { + "code": 6071, + "name": "InvalidSequenceNumber", + "msg": "invalid sequence number" } ] }; @@ -16116,6 +16167,36 @@ export const IDL: MangoV4 = { } ] }, + { + "name": "sequenceCheck", + "accounts": [ + { + "name": "group", + "isMut": false, + "isSigner": false + }, + { + "name": "account", + "isMut": true, + "isSigner": false, + "relations": [ + "group", + "owner" + ] + }, + { + "name": "owner", + "isMut": false, + "isSigner": true + } + ], + "args": [ + { + "name": "expectedSequenceNumber", + "type": "u64" + } + ] + }, { "name": "stubOracleCreate", "accounts": [ @@ -22298,12 +22379,16 @@ export const IDL: MangoV4 = { ], "type": "u64" }, + { + "name": "sequenceNumber", + "type": "u64" + }, { "name": "reserved", "type": { "array": [ "u8", - 152 + 144 ] } }, @@ -24077,12 +24162,16 @@ export const IDL: MangoV4 = { "name": "lastCollateralFeeCharge", "type": "u64" }, + { + "name": "sequenceNumber", + "type": "u64" + }, { "name": "reserved", "type": { "array": [ "u8", - 152 + 144 ] } } @@ -25364,6 +25453,9 @@ export const IDL: MangoV4 = { }, { "name": "TokenForceWithdraw" + }, + { + "name": "SequenceCheck" } ] } @@ -28706,6 +28798,16 @@ export const IDL: MangoV4 = { "code": 6069, "name": "TokenAssetLiquidationDisabled", "msg": "the asset does not allow liquidation" + }, + { + "code": 6070, + "name": "BorrowsRequireHealthAccountBank", + "msg": "for borrows the bank must be in the health account list" + }, + { + "code": 6071, + "name": "InvalidSequenceNumber", + "msg": "invalid sequence number" } ] }; From 0728bb566f6e98d89d730ce64a5dd25f706135e9 Mon Sep 17 00:00:00 2001 From: Serge Farny Date: Mon, 11 Mar 2024 10:45:53 +0100 Subject: [PATCH 17/31] program: sequence check as u8 (#909) * program: sequence check as u8 (reuse existing padding) --- mango_v4.json | 32 ++-------- .../src/instructions/sequence_check.rs | 2 +- programs/mango-v4/src/lib.rs | 5 +- programs/mango-v4/src/state/mango_account.rs | 24 +++---- .../tests/program_test/mango_client.rs | 2 +- ts/client/src/accounts/mangoAccount.spec.ts | 2 +- ts/client/src/accounts/mangoAccount.ts | 4 +- ts/client/src/mango_v4.ts | 64 ++++--------------- 8 files changed, 36 insertions(+), 99 deletions(-) diff --git a/mango_v4.json b/mango_v4.json index b38b3df22..e8f59ae9a 100644 --- a/mango_v4.json +++ b/mango_v4.json @@ -1786,7 +1786,7 @@ "args": [ { "name": "expectedSequenceNumber", - "type": "u64" + "type": "u8" } ] }, @@ -7901,13 +7901,8 @@ "type": "u8" }, { - "name": "padding", - "type": { - "array": [ - "u8", - 1 - ] - } + "name": "sequenceNumber", + "type": "u8" }, { "name": "netDeposits", @@ -7972,16 +7967,12 @@ ], "type": "u64" }, - { - "name": "sequenceNumber", - "type": "u64" - }, { "name": "reserved", "type": { "array": [ "u8", - 144 + 152 ] } }, @@ -9703,13 +9694,8 @@ "type": "u8" }, { - "name": "padding", - "type": { - "array": [ - "u8", - 1 - ] - } + "name": "sequenceNumber", + "type": "u8" }, { "name": "netDeposits", @@ -9755,16 +9741,12 @@ "name": "lastCollateralFeeCharge", "type": "u64" }, - { - "name": "sequenceNumber", - "type": "u64" - }, { "name": "reserved", "type": { "array": [ "u8", - 144 + 152 ] } } diff --git a/programs/mango-v4/src/instructions/sequence_check.rs b/programs/mango-v4/src/instructions/sequence_check.rs index e42d042ac..1f59ca59a 100644 --- a/programs/mango-v4/src/instructions/sequence_check.rs +++ b/programs/mango-v4/src/instructions/sequence_check.rs @@ -4,7 +4,7 @@ use crate::accounts_ix::*; use crate::error::MangoError; use crate::state::*; -pub fn sequence_check(ctx: Context, expected_sequence_number: u64) -> Result<()> { +pub fn sequence_check(ctx: Context, expected_sequence_number: u8) -> Result<()> { let mut account = ctx.accounts.account.load_full_mut()?; require_eq!( diff --git a/programs/mango-v4/src/lib.rs b/programs/mango-v4/src/lib.rs index 933ef1efb..a47969bf7 100644 --- a/programs/mango-v4/src/lib.rs +++ b/programs/mango-v4/src/lib.rs @@ -458,10 +458,7 @@ pub mod mango_v4 { Ok(()) } - pub fn sequence_check( - ctx: Context, - expected_sequence_number: u64, - ) -> Result<()> { + pub fn sequence_check(ctx: Context, expected_sequence_number: u8) -> Result<()> { #[cfg(feature = "enable-gpl")] instructions::sequence_check(ctx, expected_sequence_number)?; Ok(()) diff --git a/programs/mango-v4/src/state/mango_account.rs b/programs/mango-v4/src/state/mango_account.rs index 0f6276491..d5b13c2aa 100644 --- a/programs/mango-v4/src/state/mango_account.rs +++ b/programs/mango-v4/src/state/mango_account.rs @@ -123,8 +123,7 @@ pub struct MangoAccount { pub bump: u8, - #[derivative(Debug = "ignore")] - pub padding: [u8; 1], + pub sequence_number: u8, // (Display only) // Cumulative (deposits - withdraws) @@ -157,10 +156,8 @@ pub struct MangoAccount { /// Time at which the last collateral fee was charged pub last_collateral_fee_charge: u64, - pub sequence_number: u64, - #[derivative(Debug = "ignore")] - pub reserved: [u8; 144], + pub reserved: [u8; 152], // dynamic pub header_version: u8, @@ -202,7 +199,7 @@ impl MangoAccount { in_health_region: 0, account_num: 0, bump: 0, - padding: Default::default(), + sequence_number: 0, net_deposits: 0, perp_spot_transfers: 0, health_region_begin_init_health: 0, @@ -214,8 +211,7 @@ impl MangoAccount { temporary_delegate: Pubkey::default(), temporary_delegate_expiry: 0, last_collateral_fee_charge: 0, - sequence_number: 0, - reserved: [0; 144], + reserved: [0; 152], header_version: DEFAULT_MANGO_ACCOUNT_VERSION, padding3: Default::default(), padding4: Default::default(), @@ -328,7 +324,7 @@ pub struct MangoAccountFixed { being_liquidated: u8, in_health_region: u8, pub bump: u8, - pub padding: [u8; 1], + pub sequence_number: u8, pub net_deposits: i64, pub perp_spot_transfers: i64, pub health_region_begin_init_health: i64, @@ -340,12 +336,11 @@ pub struct MangoAccountFixed { pub temporary_delegate: Pubkey, pub temporary_delegate_expiry: u64, pub last_collateral_fee_charge: u64, - pub sequence_number: u64, - pub reserved: [u8; 144], + pub reserved: [u8; 152], } const_assert_eq!( size_of::(), - 32 * 4 + 8 + 8 * 8 + 32 + 8 + 8 + 8 + 144 + 32 * 4 + 8 + 8 * 8 + 32 + 8 + 8 + 152 ); const_assert_eq!(size_of::(), 400); const_assert_eq!(size_of::() % 8, 0); @@ -2901,7 +2896,7 @@ mod tests { being_liquidated: fixed.being_liquidated, in_health_region: fixed.in_health_region, bump: fixed.bump, - padding: Default::default(), + sequence_number: 0, net_deposits: fixed.net_deposits, perp_spot_transfers: fixed.perp_spot_transfers, health_region_begin_init_health: fixed.health_region_begin_init_health, @@ -2913,8 +2908,7 @@ mod tests { temporary_delegate: fixed.temporary_delegate, temporary_delegate_expiry: fixed.temporary_delegate_expiry, last_collateral_fee_charge: fixed.last_collateral_fee_charge, - sequence_number: 0, - reserved: [0u8; 144], + reserved: [0u8; 152], header_version: *zerocopy_reader.header_version(), padding3: Default::default(), diff --git a/programs/mango-v4/tests/program_test/mango_client.rs b/programs/mango-v4/tests/program_test/mango_client.rs index 4c38cd826..9553af11a 100644 --- a/programs/mango-v4/tests/program_test/mango_client.rs +++ b/programs/mango-v4/tests/program_test/mango_client.rs @@ -5174,7 +5174,7 @@ impl ClientInstruction for HealthAccountSkipping { pub struct SequenceCheckInstruction { pub account: Pubkey, pub owner: TestKeypair, - pub expected_sequence_number: u64, + pub expected_sequence_number: u8, } #[async_trait::async_trait(?Send)] impl ClientInstruction for SequenceCheckInstruction { diff --git a/ts/client/src/accounts/mangoAccount.spec.ts b/ts/client/src/accounts/mangoAccount.spec.ts index 6f92295b7..40510eca1 100644 --- a/ts/client/src/accounts/mangoAccount.spec.ts +++ b/ts/client/src/accounts/mangoAccount.spec.ts @@ -23,7 +23,7 @@ describe('Mango Account', () => { new BN(0), new BN(0), new BN(0), - new BN(0), + 0, 0, [], [], diff --git a/ts/client/src/accounts/mangoAccount.ts b/ts/client/src/accounts/mangoAccount.ts index a0344e521..2b81778f2 100644 --- a/ts/client/src/accounts/mangoAccount.ts +++ b/ts/client/src/accounts/mangoAccount.ts @@ -44,7 +44,7 @@ export class MangoAccount { buybackFeesAccruedCurrent: BN; buybackFeesAccruedPrevious: BN; buybackFeesExpiryTimestamp: BN; - sequenceNumber: BN; + sequenceNumber: number; headerVersion: number; tokens: unknown; serum3: unknown; @@ -96,7 +96,7 @@ export class MangoAccount { public buybackFeesAccruedCurrent: BN, public buybackFeesAccruedPrevious: BN, public buybackFeesExpiryTimestamp: BN, - public sequenceNumber: BN, + public sequenceNumber: number, public headerVersion: number, tokens: TokenPositionDto[], serum3: Serum3PositionDto[], diff --git a/ts/client/src/mango_v4.ts b/ts/client/src/mango_v4.ts index ad8cdb421..dcca074b9 100644 --- a/ts/client/src/mango_v4.ts +++ b/ts/client/src/mango_v4.ts @@ -1786,7 +1786,7 @@ export type MangoV4 = { "args": [ { "name": "expectedSequenceNumber", - "type": "u64" + "type": "u8" } ] }, @@ -7901,13 +7901,8 @@ export type MangoV4 = { "type": "u8" }, { - "name": "padding", - "type": { - "array": [ - "u8", - 1 - ] - } + "name": "sequenceNumber", + "type": "u8" }, { "name": "netDeposits", @@ -7972,16 +7967,12 @@ export type MangoV4 = { ], "type": "u64" }, - { - "name": "sequenceNumber", - "type": "u64" - }, { "name": "reserved", "type": { "array": [ "u8", - 144 + 152 ] } }, @@ -9703,13 +9694,8 @@ export type MangoV4 = { "type": "u8" }, { - "name": "padding", - "type": { - "array": [ - "u8", - 1 - ] - } + "name": "sequenceNumber", + "type": "u8" }, { "name": "netDeposits", @@ -9755,16 +9741,12 @@ export type MangoV4 = { "name": "lastCollateralFeeCharge", "type": "u64" }, - { - "name": "sequenceNumber", - "type": "u64" - }, { "name": "reserved", "type": { "array": [ "u8", - 144 + 152 ] } } @@ -16193,7 +16175,7 @@ export const IDL: MangoV4 = { "args": [ { "name": "expectedSequenceNumber", - "type": "u64" + "type": "u8" } ] }, @@ -22308,13 +22290,8 @@ export const IDL: MangoV4 = { "type": "u8" }, { - "name": "padding", - "type": { - "array": [ - "u8", - 1 - ] - } + "name": "sequenceNumber", + "type": "u8" }, { "name": "netDeposits", @@ -22379,16 +22356,12 @@ export const IDL: MangoV4 = { ], "type": "u64" }, - { - "name": "sequenceNumber", - "type": "u64" - }, { "name": "reserved", "type": { "array": [ "u8", - 144 + 152 ] } }, @@ -24110,13 +24083,8 @@ export const IDL: MangoV4 = { "type": "u8" }, { - "name": "padding", - "type": { - "array": [ - "u8", - 1 - ] - } + "name": "sequenceNumber", + "type": "u8" }, { "name": "netDeposits", @@ -24162,16 +24130,12 @@ export const IDL: MangoV4 = { "name": "lastCollateralFeeCharge", "type": "u64" }, - { - "name": "sequenceNumber", - "type": "u64" - }, { "name": "reserved", "type": { "array": [ "u8", - 144 + 152 ] } } From 61117ccd11cd43ca1488de96a87733851c9ff8d3 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 11 Mar 2024 14:02:54 +0100 Subject: [PATCH 18/31] withdraw: replace overflow with better error (#910) --- programs/mango-v4/src/instructions/token_withdraw.rs | 6 +++--- programs/mango-v4/src/state/mango_account.rs | 7 +++++++ programs/mango-v4/tests/cases/test_basic.rs | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/programs/mango-v4/src/instructions/token_withdraw.rs b/programs/mango-v4/src/instructions/token_withdraw.rs index 4b79760b7..7f32940f5 100644 --- a/programs/mango-v4/src/instructions/token_withdraw.rs +++ b/programs/mango-v4/src/instructions/token_withdraw.rs @@ -175,9 +175,9 @@ pub fn token_withdraw(ctx: Context, amount: u64, allow_borrow: bo // However, if health without it is negative then full health could be negative // and could be made worse by withdrawals. // - // We don't know the true pre_init_health, and substitute MAX. That way the check - // won't pass because post == pre. - account.check_health_post_checks(I80F48::MAX, post_init_health_lower_bound)?; + // We don't know the true pre_init_health: So require that our lower bound on + // post health is strictly good enough. + account.check_health_post_checks_strict(post_init_health_lower_bound)?; } } diff --git a/programs/mango-v4/src/state/mango_account.rs b/programs/mango-v4/src/state/mango_account.rs index d5b13c2aa..c146b2323 100644 --- a/programs/mango-v4/src/state/mango_account.rs +++ b/programs/mango-v4/src/state/mango_account.rs @@ -1457,6 +1457,13 @@ impl< Ok(()) } + /// A stricter version of check_health_post_checks() that requires >=0 health, it not getting + /// worse is not sufficient + pub fn check_health_post_checks_strict(&mut self, post_init_health: I80F48) -> Result<()> { + require!(post_init_health >= 0, MangoError::HealthMustBePositive); + Ok(()) + } + pub fn check_liquidatable(&mut self, health_cache: &HealthCache) -> Result { // Once maint_health falls below 0, we want to start liquidating, // we want to allow liquidation to continue until init_health is positive, diff --git a/programs/mango-v4/tests/cases/test_basic.rs b/programs/mango-v4/tests/cases/test_basic.rs index c20efa8c2..c2ba99091 100644 --- a/programs/mango-v4/tests/cases/test_basic.rs +++ b/programs/mango-v4/tests/cases/test_basic.rs @@ -942,7 +942,7 @@ async fn test_withdraw_skip_bank() -> Result<(), TransportError> { }, skip_banks: vec![tokens[0].bank, tokens[1].bank], }, - MangoError::HealthMustBePositiveOrIncrease + MangoError::HealthMustBePositive ); Ok(()) From 2cd43764662b49c698f1e3aa9f3a079c37524de3 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 11 Mar 2024 15:08:25 +0100 Subject: [PATCH 19/31] cli: save-snapshot also captures alts (#912) --- bin/cli/src/save_snapshot.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bin/cli/src/save_snapshot.rs b/bin/cli/src/save_snapshot.rs index 4c0c375eb..575b900bb 100644 --- a/bin/cli/src/save_snapshot.rs +++ b/bin/cli/src/save_snapshot.rs @@ -28,12 +28,13 @@ pub async fn save_snapshot( let group_context = MangoGroupContext::new_from_rpc(client.rpc_async(), mango_group).await?; - let oracles_and_vaults = group_context + let extra_accounts = group_context .tokens .values() .map(|value| value.oracle) .chain(group_context.perp_markets.values().map(|p| p.oracle)) .chain(group_context.tokens.values().flat_map(|value| value.vaults)) + .chain(group_context.address_lookup_tables.iter().copied()) .unique() .filter(|pk| *pk != Pubkey::default()) .collect::>(); @@ -55,7 +56,7 @@ pub async fn save_snapshot( serum_programs, open_orders_authority: mango_group, }, - oracles_and_vaults.clone(), + extra_accounts.clone(), account_update_sender.clone(), ); @@ -75,7 +76,7 @@ pub async fn save_snapshot( snapshot_interval: Duration::from_secs(6000), min_slot: first_websocket_slot + 10, }, - oracles_and_vaults, + extra_accounts, account_update_sender, ); From 4fcaf09c09c0102732635cd37fcec7cbf253c9bd Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 11 Mar 2024 15:08:58 +0100 Subject: [PATCH 20/31] test: Allow replay of live transaction in program test (#911) --- Cargo.lock | 3 + programs/mango-v4/Cargo.toml | 3 + programs/mango-v4/src/accounts_zerocopy.rs | 30 ++- programs/mango-v4/tests/cases/mod.rs | 1 + programs/mango-v4/tests/cases/test_replay.rs | 215 +++++++++++++++++++ 5 files changed, 246 insertions(+), 6 deletions(-) create mode 100644 programs/mango-v4/tests/cases/test_replay.rs diff --git a/Cargo.lock b/Cargo.lock index bd7a430f7..a54abdb97 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3385,11 +3385,13 @@ version = "0.24.0" dependencies = [ "anchor-lang", "anchor-spl", + "anyhow", "arrayref", "async-trait", "base64 0.13.1", "bincode", "borsh 0.10.3", + "bs58 0.5.0", "bytemuck", "default-env", "derivative", @@ -3405,6 +3407,7 @@ dependencies = [ "rand 0.8.5", "regex", "serde", + "serde_json", "serum_dex 0.5.10 (git+https://github.com/openbook-dex/program.git)", "solana-address-lookup-table-program", "solana-logger", diff --git a/programs/mango-v4/Cargo.toml b/programs/mango-v4/Cargo.toml index 83f3a9491..7bbd5873f 100644 --- a/programs/mango-v4/Cargo.toml +++ b/programs/mango-v4/Cargo.toml @@ -67,3 +67,6 @@ rand = "0.8.4" lazy_static = "1.4.0" num = "0.4.0" regex = "1" +serde_json = "1" +bs58 = "0.5" +anyhow = "1" \ No newline at end of file diff --git a/programs/mango-v4/src/accounts_zerocopy.rs b/programs/mango-v4/src/accounts_zerocopy.rs index 6ec30ae2d..39d4b0e70 100644 --- a/programs/mango-v4/src/accounts_zerocopy.rs +++ b/programs/mango-v4/src/accounts_zerocopy.rs @@ -13,6 +13,10 @@ pub trait AccountReader { fn data(&self) -> &[u8]; } +pub trait AccountDataWriter { + fn data_as_mut_slice(&mut self) -> &mut [u8]; +} + /// Like AccountReader, but can also get the account pubkey pub trait KeyedAccountReader: AccountReader { fn key(&self) -> &Pubkey; @@ -99,6 +103,12 @@ impl<'info, 'a> KeyedAccountReader for AccountInfoRefMut<'info, 'a> { } } +impl<'info, 'a> AccountDataWriter for AccountInfoRefMut<'info, 'a> { + fn data_as_mut_slice(&mut self) -> &mut [u8] { + &mut self.data + } +} + #[cfg(feature = "solana-sdk")] impl AccountReader for T { fn owner(&self) -> &Pubkey { @@ -110,6 +120,13 @@ impl AccountReader for T { } } +#[cfg(feature = "solana-sdk")] +impl AccountDataWriter for T { + fn data_as_mut_slice(&mut self) -> &mut [u8] { + self.data_as_mut_slice() + } +} + #[cfg(feature = "solana-sdk")] #[derive(Clone)] pub struct KeyedAccount { @@ -232,28 +249,29 @@ impl LoadZeroCopy for A { } } -impl<'info, 'a> LoadMutZeroCopy for AccountInfoRefMut<'info, 'a> { +impl LoadMutZeroCopy for A { fn load_mut(&mut self) -> Result<&mut T> { - if self.owner != &T::owner() { + if self.owner() != &T::owner() { return Err(ErrorCode::AccountOwnedByWrongProgram.into()); } - if self.data.len() < 8 { + let data = self.data_as_mut_slice(); + if data.len() < 8 { return Err(ErrorCode::AccountDiscriminatorNotFound.into()); } - let disc_bytes = array_ref![self.data, 0, 8]; + let disc_bytes = array_ref![data, 0, 8]; if disc_bytes != &T::discriminator() { return Err(ErrorCode::AccountDiscriminatorMismatch.into()); } Ok(bytemuck::from_bytes_mut( - &mut self.data[8..mem::size_of::() + 8], + &mut data[8..mem::size_of::() + 8], )) } fn load_mut_fully_unchecked(&mut self) -> Result<&mut T> { Ok(bytemuck::from_bytes_mut( - &mut self.data[8..mem::size_of::() + 8], + &mut self.data_as_mut_slice()[8..mem::size_of::() + 8], )) } } diff --git a/programs/mango-v4/tests/cases/mod.rs b/programs/mango-v4/tests/cases/mod.rs index 79aba39d8..1fe5eb036 100644 --- a/programs/mango-v4/tests/cases/mod.rs +++ b/programs/mango-v4/tests/cases/mod.rs @@ -36,6 +36,7 @@ mod test_perp_settle; mod test_perp_settle_fees; mod test_position_lifetime; mod test_reduce_only; +mod test_replay; mod test_serum; mod test_stale_oracles; mod test_token_conditional_swap; diff --git a/programs/mango-v4/tests/cases/test_replay.rs b/programs/mango-v4/tests/cases/test_replay.rs new file mode 100644 index 000000000..881bbdf97 --- /dev/null +++ b/programs/mango-v4/tests/cases/test_replay.rs @@ -0,0 +1,215 @@ +use super::*; + +use solana_address_lookup_table_program::state::AddressLookupTable; +use solana_program::program_pack::Pack; +use solana_sdk::account::{Account, ReadableAccount}; +use solana_sdk::instruction::AccountMeta; +use solana_sdk::instruction::Instruction; +use solana_sdk::message::v0::LoadedAddresses; +use solana_sdk::message::SanitizedMessage; +use solana_sdk::message::SanitizedVersionedMessage; +use solana_sdk::message::SimpleAddressLoader; +use solana_sdk::transaction::VersionedTransaction; + +use anyhow::Context; +use mango_v4::accounts_zerocopy::LoadMutZeroCopy; +use std::str::FromStr; + +fn read_json_file>(path: P) -> anyhow::Result { + let file_contents = std::fs::read_to_string(path)?; + let json: serde_json::Value = serde_json::from_str(&file_contents)?; + Ok(json) +} + +fn account_from_snapshot(snapshot_path: &str, pk: Pubkey) -> anyhow::Result { + let file_path = format!("{}/{}.json", snapshot_path, pk); + let json = read_json_file(&file_path).with_context(|| format!("reading {file_path}"))?; + let account = json.get("account").unwrap(); + let data = base64::decode( + account.get("data").unwrap().as_array().unwrap()[0] + .as_str() + .unwrap(), + ) + .unwrap(); + let owner = Pubkey::from_str(account.get("owner").unwrap().as_str().unwrap()).unwrap(); + let mut account = Account::new(u64::MAX, data.len(), &owner); + account.data = data; + Ok(account) +} + +fn find_tx(block_file: &str, txsig: &str) -> Option<(u64, i64, Vec)> { + let txsig = bs58::decode(txsig).into_vec().unwrap(); + let block = read_json_file(block_file).unwrap(); + let slot = block.get("parentSlot").unwrap().as_u64().unwrap(); + let time = block.get("blockTime").unwrap().as_i64().unwrap(); + let txs = block.get("transactions").unwrap().as_array().unwrap(); + for tx_obj in txs { + let tx_bytes = base64::decode( + tx_obj.get("transaction").unwrap().as_array().unwrap()[0] + .as_str() + .unwrap(), + ) + .unwrap(); + let sig = &tx_bytes[1..65]; + if sig == txsig { + return Some((slot, time, tx_bytes.to_vec())); + } + } + None +} + +#[tokio::test] +async fn test_replay() -> anyhow::Result<()> { + // Path to a directory generated with cli save-snapshot, containing .json files + let snapshot_path = &"path/to/directory"; + // Path to the block data, retrieved with `solana block 252979760 --output json` + let block_file = &"path/to/block"; + // TX signature in the block that should be looked at + let txsig = &""; + // 0-based index of instuction in the tx to try replaying + let ix_index = 3; + + if txsig.is_empty() { + return Ok(()); + } + + let mut test_builder = TestContextBuilder::new(); + test_builder.test().set_compute_max_units(400_000); + let context = test_builder.start_default().await; + let solana = &context.solana.clone(); + let signer = context.users[0].key; + + let known_accounts = [ + "ComputeBudget111111111111111111111111111111", + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", + "4MangoMjqJ2firMokCjjGgoK8d4MXcrgL7XJaL3w6fVg", + "11111111111111111111111111111111", + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + ] + .iter() + .map(|s| Pubkey::from_str(s).unwrap()) + .collect_vec(); + + // Load block, find tx + let (slot, time, tx_bytes) = find_tx(block_file, txsig).unwrap(); + let tx: VersionedTransaction = bincode::deserialize(&tx_bytes).unwrap(); + + // Lookup ALTs so we can decompile + let loaded_addresses: LoadedAddresses = tx + .message + .address_table_lookups() + .unwrap_or_default() + .iter() + .map(|alt_lookup| { + let alt_account = account_from_snapshot(snapshot_path, alt_lookup.account_key).unwrap(); + let alt = AddressLookupTable::deserialize(&alt_account.data()).unwrap(); + LoadedAddresses { + readonly: alt_lookup + .readonly_indexes + .iter() + .map(|i| alt.addresses[*i as usize]) + .collect_vec(), + writable: alt_lookup + .writable_indexes + .iter() + .map(|i| alt.addresses[*i as usize]) + .collect_vec(), + } + }) + .collect(); + let alt_loader = SimpleAddressLoader::Enabled(loaded_addresses); + + // decompile instructions, looking up alts at the same time + let sv_message = SanitizedVersionedMessage::try_from(tx.message).unwrap(); + let s_message = SanitizedMessage::try_new(sv_message, alt_loader).unwrap(); + let bix = &s_message.decompile_instructions()[ix_index]; + let ix = Instruction { + program_id: *bix.program_id, + accounts: bix + .accounts + .iter() + .map(|m| AccountMeta { + pubkey: *m.pubkey, + is_writable: m.is_writable, + is_signer: m.is_signer, + }) + .collect(), + data: bix.data.to_vec(), + }; + + // since we can't retain the original signer/blockhash, replace it + let mut replaced_signers = vec![]; + let mut replaced_ix = ix.clone(); + for meta in &mut replaced_ix.accounts { + if meta.is_signer { + replaced_signers.push(meta.pubkey); + meta.pubkey = signer.pubkey(); + } + } + + // Load all accounts, reporting missing ones, add found to context + let mut missing_accounts = vec![]; + for pubkey in replaced_ix.accounts.iter().map(|m| m.pubkey) { + if known_accounts.contains(&pubkey) || pubkey == signer.pubkey() { + continue; + } + + let mut account = match account_from_snapshot(snapshot_path, pubkey) { + Ok(a) => a, + Err(e) => { + println!("error reading account from snapshot: {pubkey}, error {e:?}"); + missing_accounts.push(pubkey); + continue; + } + }; + + // Override where the previous signer was an owner + if replaced_signers.contains(&account.owner) { + account.owner = signer.pubkey(); + } + + // Override mango account owners or delegates + if let Ok(mut ma) = account.load_mut::() { + if replaced_signers.contains(&ma.owner) { + ma.owner = signer.pubkey(); + } + if replaced_signers.contains(&ma.delegate) { + ma.delegate = signer.pubkey(); + } + } + + // Override token account owners + if account.owner == spl_token::id() { + if let Ok(mut ta) = spl_token::state::Account::unpack(&account.data) { + if replaced_signers.contains(&ta.owner) { + ta.owner = signer.pubkey(); + } + spl_token::state::Account::pack(ta, &mut account.data).unwrap(); + } + } + + let mut program_test_context = solana.context.borrow_mut(); + program_test_context.set_account(&pubkey, &account.into()); + } + if !missing_accounts.is_empty() { + println!("There were account reading errors, maybe fetch them:"); + for a in &missing_accounts { + println!("solana account {a} --output json -o {snapshot_path}/{a}.json"); + } + anyhow::bail!("accounts were missing"); + } + + // update slot/time to roughly match + let mut clock = solana.clock().await; + clock.slot = slot; + clock.unix_timestamp = time; + solana.set_clock(&clock); + + // Send transaction + solana + .process_transaction(&[replaced_ix], Some(&[signer])) + .await + .unwrap(); + + Ok(()) +} From b3b4cc8223a7d9abb6fea0d04d4a2856a8f21de5 Mon Sep 17 00:00:00 2001 From: Serge Farny Date: Tue, 12 Mar 2024 08:27:40 +0100 Subject: [PATCH 21/31] program: add a min health check (#913) add a min health check --- mango_v4.json | 64 +++++++ .../mango-v4/src/accounts_ix/health_check.rs | 30 +++ programs/mango-v4/src/accounts_ix/mod.rs | 2 + programs/mango-v4/src/error.rs | 2 + .../mango-v4/src/instructions/health_check.rs | 49 +++++ .../mango-v4/src/instructions/ix_gate_set.rs | 1 + programs/mango-v4/src/instructions/mod.rs | 2 + programs/mango-v4/src/lib.rs | 10 + programs/mango-v4/src/state/group.rs | 1 + programs/mango-v4/tests/cases/mod.rs | 1 + .../mango-v4/tests/cases/test_health_check.rs | 178 ++++++++++++++++++ .../tests/program_test/mango_client.rs | 51 ++++- ts/client/src/client.ts | 26 ++- ts/client/src/mango_v4.ts | 128 +++++++++++++ ts/client/src/types.ts | 17 ++ 15 files changed, 560 insertions(+), 2 deletions(-) create mode 100644 programs/mango-v4/src/accounts_ix/health_check.rs create mode 100644 programs/mango-v4/src/instructions/health_check.rs create mode 100644 programs/mango-v4/tests/cases/test_health_check.rs diff --git a/mango_v4.json b/mango_v4.json index e8f59ae9a..cc44fefe8 100644 --- a/mango_v4.json +++ b/mango_v4.json @@ -1790,6 +1790,36 @@ } ] }, + { + "name": "healthCheck", + "accounts": [ + { + "name": "group", + "isMut": false, + "isSigner": false + }, + { + "name": "account", + "isMut": true, + "isSigner": false, + "relations": [ + "group" + ] + } + ], + "args": [ + { + "name": "minHealthValue", + "type": "f64" + }, + { + "name": "checkKind", + "type": { + "defined": "HealthCheckKind" + } + } + ] + }, { "name": "stubOracleCreate", "accounts": [ @@ -10674,6 +10704,32 @@ ] } }, + { + "name": "HealthCheckKind", + "type": { + "kind": "enum", + "variants": [ + { + "name": "Maint" + }, + { + "name": "Init" + }, + { + "name": "LiquidationEnd" + }, + { + "name": "MaintRatio" + }, + { + "name": "InitRatio" + }, + { + "name": "LiquidationEndRatio" + } + ] + } + }, { "name": "Serum3SelfTradeBehavior", "docs": [ @@ -11031,6 +11087,9 @@ }, { "name": "SequenceCheck" + }, + { + "name": "HealthCheck" } ] } @@ -14383,6 +14442,11 @@ "code": 6071, "name": "InvalidSequenceNumber", "msg": "invalid sequence number" + }, + { + "code": 6072, + "name": "InvalidHealth", + "msg": "invalid health" } ] } \ No newline at end of file diff --git a/programs/mango-v4/src/accounts_ix/health_check.rs b/programs/mango-v4/src/accounts_ix/health_check.rs new file mode 100644 index 000000000..c405a4fa3 --- /dev/null +++ b/programs/mango-v4/src/accounts_ix/health_check.rs @@ -0,0 +1,30 @@ +use crate::error::*; +use crate::state::*; +use anchor_lang::prelude::*; +use num_enum::{IntoPrimitive, TryFromPrimitive}; + +#[derive(Clone, Copy, TryFromPrimitive, IntoPrimitive, AnchorSerialize, AnchorDeserialize)] +#[repr(u8)] +pub enum HealthCheckKind { + Maint = 0b0000, + Init = 0b0010, + LiquidationEnd = 0b0100, + MaintRatio = 0b0001, + InitRatio = 0b0011, + LiquidationEndRatio = 0b0101, +} + +#[derive(Accounts)] +pub struct HealthCheck<'info> { + #[account( + constraint = group.load()?.is_ix_enabled(IxGate::SequenceCheck) @ MangoError::IxIsDisabled, + )] + pub group: AccountLoader<'info, Group>, + + #[account( + mut, + has_one = group, + constraint = account.load()?.is_operational() @ MangoError::AccountIsFrozen + )] + pub account: AccountLoader<'info, MangoAccountFixed>, +} diff --git a/programs/mango-v4/src/accounts_ix/mod.rs b/programs/mango-v4/src/accounts_ix/mod.rs index ac5b5639b..4256824a8 100644 --- a/programs/mango-v4/src/accounts_ix/mod.rs +++ b/programs/mango-v4/src/accounts_ix/mod.rs @@ -16,6 +16,7 @@ pub use group_close::*; pub use group_create::*; pub use group_edit::*; pub use group_withdraw_insurance_fund::*; +pub use health_check::*; pub use health_region::*; pub use ix_gate_set::*; pub use openbook_v2_cancel_order::*; @@ -95,6 +96,7 @@ mod group_close; mod group_create; mod group_edit; mod group_withdraw_insurance_fund; +mod health_check; mod health_region; mod ix_gate_set; mod openbook_v2_cancel_order; diff --git a/programs/mango-v4/src/error.rs b/programs/mango-v4/src/error.rs index 0d283f444..bac49d63c 100644 --- a/programs/mango-v4/src/error.rs +++ b/programs/mango-v4/src/error.rs @@ -149,6 +149,8 @@ pub enum MangoError { BorrowsRequireHealthAccountBank, #[msg("invalid sequence number")] InvalidSequenceNumber, + #[msg("invalid health")] + InvalidHealth, } impl MangoError { diff --git a/programs/mango-v4/src/instructions/health_check.rs b/programs/mango-v4/src/instructions/health_check.rs new file mode 100644 index 000000000..e9099a4fa --- /dev/null +++ b/programs/mango-v4/src/instructions/health_check.rs @@ -0,0 +1,49 @@ +use anchor_lang::prelude::*; +use fixed::types::I80F48; + +use crate::accounts_ix::*; +use crate::error::{Contextable, MangoError}; +use crate::health::{ + new_fixed_order_account_retriever_with_optional_banks, + new_health_cache_skipping_missing_banks_and_bad_oracles, HealthType, +}; +use crate::state::*; +use crate::util::clock_now; + +pub fn health_check( + ctx: Context, + min_value: f64, + health_check_kind: HealthCheckKind, +) -> Result<()> { + let account = ctx.accounts.account.load_full_mut()?; + let (now_ts, now_slot) = clock_now(); + + let retriever = new_fixed_order_account_retriever_with_optional_banks( + ctx.remaining_accounts, + &account.borrow(), + now_slot, + )?; + let health_cache = new_health_cache_skipping_missing_banks_and_bad_oracles( + &account.borrow(), + &retriever, + now_ts, + ) + .context("health_check health cache")?; + + let min_value = I80F48::from_num(min_value); + let actual_value = match health_check_kind { + HealthCheckKind::Maint => health_cache.health(HealthType::Maint), + HealthCheckKind::Init => health_cache.health(HealthType::Init), + HealthCheckKind::LiquidationEnd => health_cache.health(HealthType::LiquidationEnd), + HealthCheckKind::MaintRatio => health_cache.health_ratio(HealthType::Maint), + HealthCheckKind::InitRatio => health_cache.health_ratio(HealthType::Init), + HealthCheckKind::LiquidationEndRatio => { + health_cache.health_ratio(HealthType::LiquidationEnd) + } + }; + + // msg!("{}", actual_value); + require_gte!(actual_value, min_value, MangoError::InvalidHealth); + + Ok(()) +} diff --git a/programs/mango-v4/src/instructions/ix_gate_set.rs b/programs/mango-v4/src/instructions/ix_gate_set.rs index 9bae726ce..8fdd0b853 100644 --- a/programs/mango-v4/src/instructions/ix_gate_set.rs +++ b/programs/mango-v4/src/instructions/ix_gate_set.rs @@ -97,6 +97,7 @@ pub fn ix_gate_set(ctx: Context, ix_gate: u128) -> Result<()> { log_if_changed(&group, ix_gate, IxGate::Serum3PlaceOrderV2); log_if_changed(&group, ix_gate, IxGate::TokenForceWithdraw); log_if_changed(&group, ix_gate, IxGate::SequenceCheck); + log_if_changed(&group, ix_gate, IxGate::HealthCheck); group.ix_gate = ix_gate; diff --git a/programs/mango-v4/src/instructions/mod.rs b/programs/mango-v4/src/instructions/mod.rs index 523d1f1f8..1f91a7b53 100644 --- a/programs/mango-v4/src/instructions/mod.rs +++ b/programs/mango-v4/src/instructions/mod.rs @@ -16,6 +16,7 @@ pub use group_close::*; pub use group_create::*; pub use group_edit::*; pub use group_withdraw_insurance_fund::*; +pub use health_check::*; pub use health_region::*; pub use ix_gate_set::*; pub use perp_cancel_all_orders::*; @@ -86,6 +87,7 @@ mod group_close; mod group_create; mod group_edit; mod group_withdraw_insurance_fund; +mod health_check; mod health_region; mod ix_gate_set; mod perp_cancel_all_orders; diff --git a/programs/mango-v4/src/lib.rs b/programs/mango-v4/src/lib.rs index a47969bf7..533434b14 100644 --- a/programs/mango-v4/src/lib.rs +++ b/programs/mango-v4/src/lib.rs @@ -464,6 +464,16 @@ pub mod mango_v4 { Ok(()) } + pub fn health_check( + ctx: Context, + min_health_value: f64, + check_kind: HealthCheckKind, + ) -> Result<()> { + #[cfg(feature = "enable-gpl")] + instructions::health_check(ctx, min_health_value, check_kind)?; + Ok(()) + } + // todo: // ckamm: generally, using an I80F48 arg will make it harder to call // because generic anchor clients won't know how to deal with it diff --git a/programs/mango-v4/src/state/group.rs b/programs/mango-v4/src/state/group.rs index e652a8dab..61f61cde2 100644 --- a/programs/mango-v4/src/state/group.rs +++ b/programs/mango-v4/src/state/group.rs @@ -247,6 +247,7 @@ pub enum IxGate { Serum3PlaceOrderV2 = 71, TokenForceWithdraw = 72, SequenceCheck = 73, + HealthCheck = 74, // NOTE: Adding new variants requires matching changes in ts and the ix_gate_set instruction. } diff --git a/programs/mango-v4/tests/cases/mod.rs b/programs/mango-v4/tests/cases/mod.rs index 1fe5eb036..bf15b1ac0 100644 --- a/programs/mango-v4/tests/cases/mod.rs +++ b/programs/mango-v4/tests/cases/mod.rs @@ -22,6 +22,7 @@ mod test_collateral_fees; mod test_delegate; mod test_fees_buyback_with_mngo; mod test_force_close; +mod test_health_check; mod test_health_compute; mod test_health_region; mod test_ix_gate_set; diff --git a/programs/mango-v4/tests/cases/test_health_check.rs b/programs/mango-v4/tests/cases/test_health_check.rs new file mode 100644 index 000000000..b4624218b --- /dev/null +++ b/programs/mango-v4/tests/cases/test_health_check.rs @@ -0,0 +1,178 @@ +use crate::cases::{ + create_funded_account, mango_setup, send_tx, tokio, HealthAccountSkipping, + HealthCheckInstruction, TestContext, TestKeypair, TokenWithdrawInstruction, +}; +use crate::send_tx_expect_error; +use mango_v4::accounts_ix::{HealthCheck, HealthCheckKind}; +use mango_v4::error::MangoError; +use solana_sdk::transport::TransportError; + +// TODO FAS + +#[tokio::test] +async fn test_health_check() -> Result<(), TransportError> { + let context = TestContext::new().await; + let solana = &context.solana.clone(); + + let admin = TestKeypair::new(); + let owner = context.users[0].key; + let payer = context.users[1].key; + let payer_token_accounts = &context.users[1].token_accounts; + let mints = &context.mints[0..3]; + + let mango_setup::GroupWithTokens { group, tokens, .. } = mango_setup::GroupWithTokensConfig { + admin, + payer, + mints: mints.to_vec(), + zero_token_is_quote: true, + ..mango_setup::GroupWithTokensConfig::default() + } + .create(solana) + .await; + + // Funding to fill the vaults + create_funded_account( + &solana, + group, + owner, + 0, + &context.users[1], + &mints, + 1_000_000, + 0, + ) + .await; + + let account = create_funded_account( + &solana, + group, + owner, + 1, + &context.users[1], + &mints[0..2], + 1000, + 0, + ) + .await; + + send_tx( + solana, + TokenWithdrawInstruction { + amount: 775, + allow_borrow: true, + account, + owner, + token_account: payer_token_accounts[2], + bank_index: 0, + }, + ) + .await + .unwrap(); + + // + // TEST (Health is about 93% with all banks, 7% without banks 1) + // + + send_tx( + solana, + HealthCheckInstruction { + account, + owner, + min_health_value: 20.0, + check_kind: HealthCheckKind::MaintRatio, + }, + ) + .await + .unwrap(); + + send_tx( + solana, + HealthCheckInstruction { + account, + owner, + min_health_value: 500.0, + check_kind: HealthCheckKind::Init, + }, + ) + .await + .unwrap(); + + send_tx_expect_error!( + solana, + HealthCheckInstruction { + owner, + account, + min_health_value: 600.0, + check_kind: HealthCheckKind::Init, + }, + MangoError::InvalidHealth + ); + + send_tx( + solana, + HealthCheckInstruction { + account, + owner, + min_health_value: 800.0, + check_kind: HealthCheckKind::Maint, + }, + ) + .await + .unwrap(); + + send_tx_expect_error!( + solana, + HealthCheckInstruction { + owner, + account, + min_health_value: 100.0, + check_kind: HealthCheckKind::MaintRatio, + }, + MangoError::InvalidHealth + ); + + send_tx( + solana, + HealthAccountSkipping { + inner: HealthCheckInstruction { + owner, + account, + min_health_value: 5.0, + check_kind: HealthCheckKind::MaintRatio, + }, + skip_banks: vec![tokens[1].bank], + }, + ) + .await + .unwrap(); + + send_tx_expect_error!( + solana, + HealthAccountSkipping { + inner: HealthCheckInstruction { + owner, + account, + min_health_value: 10.0, + check_kind: HealthCheckKind::MaintRatio, + }, + skip_banks: vec![tokens[1].bank], + }, + MangoError::InvalidHealth + ); + + send_tx_expect_error!( + solana, + HealthAccountSkipping { + inner: HealthCheckInstruction { + owner, + account, + min_health_value: 10.0, + check_kind: HealthCheckKind::MaintRatio, + }, + skip_banks: vec![tokens[2].bank], + }, + MangoError::InvalidBank + ); + + Ok(()) +} diff --git a/programs/mango-v4/tests/program_test/mango_client.rs b/programs/mango-v4/tests/program_test/mango_client.rs index 9553af11a..2efa8967a 100644 --- a/programs/mango-v4/tests/program_test/mango_client.rs +++ b/programs/mango-v4/tests/program_test/mango_client.rs @@ -7,7 +7,7 @@ use anchor_spl::token::{Token, TokenAccount}; use fixed::types::I80F48; use itertools::Itertools; use mango_v4::accounts_ix::{ - InterestRateParams, Serum3OrderType, Serum3SelfTradeBehavior, Serum3Side, + HealthCheckKind, InterestRateParams, Serum3OrderType, Serum3SelfTradeBehavior, Serum3Side, }; use mango_v4::state::{MangoAccount, MangoAccountValue}; use solana_program::instruction::Instruction; @@ -5208,3 +5208,52 @@ impl ClientInstruction for SequenceCheckInstruction { vec![self.owner] } } + +pub struct HealthCheckInstruction { + pub account: Pubkey, + pub owner: TestKeypair, + pub min_health_value: f64, + pub check_kind: HealthCheckKind, +} +#[async_trait::async_trait(?Send)] +impl ClientInstruction for HealthCheckInstruction { + type Accounts = mango_v4::accounts::HealthCheck; + type Instruction = mango_v4::instruction::HealthCheck; + async fn to_instruction( + &self, + account_loader: &(impl ClientAccountLoader + 'async_trait), + ) -> (Self::Accounts, instruction::Instruction) { + let program_id = mango_v4::id(); + let instruction = Self::Instruction { + min_health_value: self.min_health_value, + check_kind: self.check_kind, + }; + + let account = account_loader + .load_mango_account(&self.account) + .await + .unwrap(); + + let accounts = Self::Accounts { + group: account.fixed.group, + account: self.account, + }; + + let health_check_metas = derive_health_check_remaining_account_metas( + account_loader, + &account, + None, + false, + None, + ) + .await; + + let mut instruction = make_instruction(program_id, &accounts, &instruction); + instruction.accounts.extend(health_check_metas.into_iter()); + (accounts, instruction) + } + + fn signers(&self) -> Vec { + vec![] + } +} diff --git a/ts/client/src/client.ts b/ts/client/src/client.ts index 4f76931bc..f1d6e92d6 100644 --- a/ts/client/src/client.ts +++ b/ts/client/src/client.ts @@ -83,7 +83,7 @@ import { import { Id } from './ids'; import { IDL, MangoV4 } from './mango_v4'; import { I80F48 } from './numbers/I80F48'; -import { FlashLoanType, OracleConfigParams } from './types'; +import { FlashLoanType, HealthCheckKind, OracleConfigParams } from './types'; import { I64_MAX_BN, U64_MAX_BN, @@ -1048,6 +1048,30 @@ export class MangoClient { .instruction(); } + public async healthCheckIx( + group: Group, + mangoAccount: MangoAccount, + minHealthValue: number, + checkKind: HealthCheckKind, + ): Promise { + const healthRemainingAccounts: PublicKey[] = + this.buildHealthRemainingAccounts(group, [mangoAccount], [], [], []); + + return await this.program.methods + .healthCheck(minHealthValue, checkKind) + .accounts({ + group: group.publicKey, + account: mangoAccount.publicKey, + }) + .remainingAccounts( + healthRemainingAccounts.map( + (pk) => + ({ pubkey: pk, isWritable: false, isSigner: false } as AccountMeta), + ), + ) + .instruction(); + } + public async getMangoAccount( mangoAccountPk: PublicKey, loadSerum3Oo = false, diff --git a/ts/client/src/mango_v4.ts b/ts/client/src/mango_v4.ts index dcca074b9..f294f383b 100644 --- a/ts/client/src/mango_v4.ts +++ b/ts/client/src/mango_v4.ts @@ -1790,6 +1790,36 @@ export type MangoV4 = { } ] }, + { + "name": "healthCheck", + "accounts": [ + { + "name": "group", + "isMut": false, + "isSigner": false + }, + { + "name": "account", + "isMut": true, + "isSigner": false, + "relations": [ + "group" + ] + } + ], + "args": [ + { + "name": "minHealthValue", + "type": "f64" + }, + { + "name": "checkKind", + "type": { + "defined": "HealthCheckKind" + } + } + ] + }, { "name": "stubOracleCreate", "accounts": [ @@ -10674,6 +10704,32 @@ export type MangoV4 = { ] } }, + { + "name": "HealthCheckKind", + "type": { + "kind": "enum", + "variants": [ + { + "name": "Maint" + }, + { + "name": "Init" + }, + { + "name": "LiquidationEnd" + }, + { + "name": "MaintRatio" + }, + { + "name": "InitRatio" + }, + { + "name": "LiquidationEndRatio" + } + ] + } + }, { "name": "Serum3SelfTradeBehavior", "docs": [ @@ -11031,6 +11087,9 @@ export type MangoV4 = { }, { "name": "SequenceCheck" + }, + { + "name": "HealthCheck" } ] } @@ -14383,6 +14442,11 @@ export type MangoV4 = { "code": 6071, "name": "InvalidSequenceNumber", "msg": "invalid sequence number" + }, + { + "code": 6072, + "name": "InvalidHealth", + "msg": "invalid health" } ] }; @@ -16179,6 +16243,36 @@ export const IDL: MangoV4 = { } ] }, + { + "name": "healthCheck", + "accounts": [ + { + "name": "group", + "isMut": false, + "isSigner": false + }, + { + "name": "account", + "isMut": true, + "isSigner": false, + "relations": [ + "group" + ] + } + ], + "args": [ + { + "name": "minHealthValue", + "type": "f64" + }, + { + "name": "checkKind", + "type": { + "defined": "HealthCheckKind" + } + } + ] + }, { "name": "stubOracleCreate", "accounts": [ @@ -25063,6 +25157,32 @@ export const IDL: MangoV4 = { ] } }, + { + "name": "HealthCheckKind", + "type": { + "kind": "enum", + "variants": [ + { + "name": "Maint" + }, + { + "name": "Init" + }, + { + "name": "LiquidationEnd" + }, + { + "name": "MaintRatio" + }, + { + "name": "InitRatio" + }, + { + "name": "LiquidationEndRatio" + } + ] + } + }, { "name": "Serum3SelfTradeBehavior", "docs": [ @@ -25420,6 +25540,9 @@ export const IDL: MangoV4 = { }, { "name": "SequenceCheck" + }, + { + "name": "HealthCheck" } ] } @@ -28772,6 +28895,11 @@ export const IDL: MangoV4 = { "code": 6071, "name": "InvalidSequenceNumber", "msg": "invalid sequence number" + }, + { + "code": 6072, + "name": "InvalidHealth", + "msg": "invalid health" } ] }; diff --git a/ts/client/src/types.ts b/ts/client/src/types.ts index 47d378477..cce99ae2c 100644 --- a/ts/client/src/types.ts +++ b/ts/client/src/types.ts @@ -18,6 +18,23 @@ export namespace FlashLoanType { export const swapWithoutFee = { swapWithoutFee: {} }; } +export type HealthCheckKind = + | { maint: Record } + | { init: Record } + | { liquidationEnd: Record } + | { maintRatio: Record } + | { initRatio: Record } + | { liquidationEndRatio: Record }; +// eslint-disable-next-line @typescript-eslint/no-namespace +export namespace HealthCheckKind { + export const maint = { maint: {} }; + export const init = { init: {} }; + export const liquidationEnd = { liquidationEnd: {} }; + export const maintRatio = { maintRatio: {} }; + export const initRatio = { initRatio: {} }; + export const liquidationEndRatio = { liquidationEndRatio: {} }; +} + export class InterestRateParams { util0: number; rate0: number; From 25bf71c6468264d4e25e328d052cd73ec80de0e8 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 14 Mar 2024 08:43:49 +0100 Subject: [PATCH 22/31] Add liqtest test script readme --- ts/client/scripts/liqtest/README.md | 50 +++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 ts/client/scripts/liqtest/README.md diff --git a/ts/client/scripts/liqtest/README.md b/ts/client/scripts/liqtest/README.md new file mode 100644 index 000000000..c8d9dc04b --- /dev/null +++ b/ts/client/scripts/liqtest/README.md @@ -0,0 +1,50 @@ +### Set environment variables + +``` +CLUSTER=devnet +CLUSTER_URL=https://mango.devnet.rpcpool.com/ +PAYER_KEYPAIR=~/.config/solana/mb-liqtest.json +# Adjust this to a free group +GROUP_NUM=200 +``` + +### Create tokens and markets + +This is one-time setup: +``` +yarn ts-node ts/client/scripts/liqtest/liqtest-create-tokens-and-markets.ts +``` +It'll emit some MINTS=... and SERUM_MARKETS=.. env vars, set those, all further +commands will use them. + +### Make a group + +``` +yarn ts-node ts/client/scripts/liqtest/liqtest-create-group.ts +``` + +Groups can be reused a lot, but sometimes closing them may be necessary +``` +yarn ts-node ts/client/scripts/liqtest/liqtest-close-group.ts +``` + +Preferably close all mango accounts first. + +### Create candidate mango accounts + +``` +yarn ts-node ts/client/scripts/liqtest/liqtest-make-candidates.ts +``` + +This creates a bunch of to-be-liquidated accounts as well as a LIQOR account. + +### Liquidate + +Run the liquidator on the group with the liqor account. + +### Settle and close all open mango accounts + +At any point, to reset by closing all accounts: +``` +yarn ts-node ts/client/scripts/liqtest/liqtest-settle-and-close-all.ts +``` From e20052f6e527cd953e0c48ea9a73f14b6c12cb79 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 14 Mar 2024 08:58:04 +0100 Subject: [PATCH 23/31] Fix logging in liqtest scripts --- ts/client/scripts/liqtest/README.md | 4 ++++ ts/client/scripts/liqtest/liqtest-close-group.ts | 12 +++++++----- ts/client/scripts/liqtest/liqtest-create-group.ts | 6 +++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/ts/client/scripts/liqtest/README.md b/ts/client/scripts/liqtest/README.md index c8d9dc04b..60fb19f6b 100644 --- a/ts/client/scripts/liqtest/README.md +++ b/ts/client/scripts/liqtest/README.md @@ -11,9 +11,11 @@ GROUP_NUM=200 ### Create tokens and markets This is one-time setup: + ``` yarn ts-node ts/client/scripts/liqtest/liqtest-create-tokens-and-markets.ts ``` + It'll emit some MINTS=... and SERUM_MARKETS=.. env vars, set those, all further commands will use them. @@ -24,6 +26,7 @@ yarn ts-node ts/client/scripts/liqtest/liqtest-create-group.ts ``` Groups can be reused a lot, but sometimes closing them may be necessary + ``` yarn ts-node ts/client/scripts/liqtest/liqtest-close-group.ts ``` @@ -45,6 +48,7 @@ Run the liquidator on the group with the liqor account. ### Settle and close all open mango accounts At any point, to reset by closing all accounts: + ``` yarn ts-node ts/client/scripts/liqtest/liqtest-settle-and-close-all.ts ``` diff --git a/ts/client/scripts/liqtest/liqtest-close-group.ts b/ts/client/scripts/liqtest/liqtest-close-group.ts index c1d869e7b..457643946 100644 --- a/ts/client/scripts/liqtest/liqtest-close-group.ts +++ b/ts/client/scripts/liqtest/liqtest-close-group.ts @@ -51,7 +51,7 @@ async function main() { market.serumMarketExternal, ); console.log( - `Deregistered serum market ${market.name}, sig https://explorer.solana.com/tx/${sig}`, + `Deregistered serum market ${market.name}, sig https://explorer.solana.com/tx/${sig.signature}`, ); } @@ -59,7 +59,7 @@ async function main() { for (const market of group.perpMarketsMapByMarketIndex.values()) { sig = await client.perpCloseMarket(group, market.perpMarketIndex); console.log( - `Closed perp market ${market.name}, sig https://explorer.solana.com/tx/${sig}`, + `Closed perp market ${market.name}, sig https://explorer.solana.com/tx/${sig.signature}`, ); } @@ -67,7 +67,7 @@ async function main() { for (const banks of group.banksMapByMint.values()) { sig = await client.tokenDeregister(group, banks[0].mint); console.log( - `Removed token ${banks[0].name}, sig https://explorer.solana.com/tx/${sig}`, + `Removed token ${banks[0].name}, sig https://explorer.solana.com/tx/${sig.signature}`, ); } @@ -76,13 +76,15 @@ async function main() { for (const stubOracle of stubOracles) { sig = await client.stubOracleClose(group, stubOracle.publicKey); console.log( - `Closed stub oracle ${stubOracle.publicKey}, sig https://explorer.solana.com/tx/${sig}`, + `Closed stub oracle ${stubOracle.publicKey}, sig https://explorer.solana.com/tx/${sig.signature}`, ); } // finally, close the group sig = await client.groupClose(group); - console.log(`Closed group, sig https://explorer.solana.com/tx/${sig}`); + console.log( + `Closed group, sig https://explorer.solana.com/tx/${sig.signature}`, + ); } process.exit(); diff --git a/ts/client/scripts/liqtest/liqtest-create-group.ts b/ts/client/scripts/liqtest/liqtest-create-group.ts index c91de1080..62f1d230d 100644 --- a/ts/client/scripts/liqtest/liqtest-create-group.ts +++ b/ts/client/scripts/liqtest/liqtest-create-group.ts @@ -330,12 +330,12 @@ async function createAndPopulateAlt( }); let sig = await client.sendAndConfirmTransaction([createIx[0]]); console.log( - `...created ALT ${createIx[1]} https://explorer.solana.com/tx/${sig}`, + `...created ALT ${createIx[1]} https://explorer.solana.com/tx/${sig.signature}`, ); console.log(`ALT: set at index 0 for group...`); sig = await client.altSet(group, createIx[1], 0); - console.log(`...https://explorer.solana.com/tx/${sig}`); + console.log(`...https://explorer.solana.com/tx/${sig.signature}`); group = await client.getGroupForCreator(admin.publicKey, GROUP_NUM); } catch (error) { @@ -366,7 +366,7 @@ async function createAndPopulateAlt( addresses, }); const sig = await client.sendAndConfirmTransaction([extendIx]); - console.log(`https://explorer.solana.com/tx/${sig}`); + console.log(`https://explorer.solana.com/tx/${sig.signature}`); } // Extend using mango v4 relevant pub keys From 4bf45f257672cb7a12953383bf04bd26aeebc287 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 14 Mar 2024 09:53:43 +0100 Subject: [PATCH 24/31] liqtest readme update --- ts/client/scripts/liqtest/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ts/client/scripts/liqtest/README.md b/ts/client/scripts/liqtest/README.md index 60fb19f6b..847fcfdaf 100644 --- a/ts/client/scripts/liqtest/README.md +++ b/ts/client/scripts/liqtest/README.md @@ -8,6 +8,11 @@ PAYER_KEYPAIR=~/.config/solana/mb-liqtest.json GROUP_NUM=200 ``` +### Get devnet SOL + +The scripts need a lot of SOL for mint, market, group and account creation. +There's ample available, best to ask around. + ### Create tokens and markets This is one-time setup: @@ -45,6 +50,13 @@ This creates a bunch of to-be-liquidated accounts as well as a LIQOR account. Run the liquidator on the group with the liqor account. +Since devnet doesn't have any jupiter, run with +``` +JUPITER_VERSION=mock +TCS_MODE=borrow-buy +REBALANCE=false +``` + ### Settle and close all open mango accounts At any point, to reset by closing all accounts: From 769f940a66aed9a6e86688ec7991603b4de1904f Mon Sep 17 00:00:00 2001 From: Serge Farny Date: Mon, 18 Mar 2024 17:52:51 +0100 Subject: [PATCH 25/31] program: fix health check ix (#918) --- programs/mango-v4/src/instructions/health_check.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/programs/mango-v4/src/instructions/health_check.rs b/programs/mango-v4/src/instructions/health_check.rs index e9099a4fa..cbab8169a 100644 --- a/programs/mango-v4/src/instructions/health_check.rs +++ b/programs/mango-v4/src/instructions/health_check.rs @@ -4,8 +4,7 @@ use fixed::types::I80F48; use crate::accounts_ix::*; use crate::error::{Contextable, MangoError}; use crate::health::{ - new_fixed_order_account_retriever_with_optional_banks, - new_health_cache_skipping_missing_banks_and_bad_oracles, HealthType, + new_health_cache_skipping_missing_banks_and_bad_oracles, HealthType, ScanningAccountRetriever, }; use crate::state::*; use crate::util::clock_now; @@ -18,11 +17,11 @@ pub fn health_check( let account = ctx.accounts.account.load_full_mut()?; let (now_ts, now_slot) = clock_now(); - let retriever = new_fixed_order_account_retriever_with_optional_banks( - ctx.remaining_accounts, - &account.borrow(), - now_slot, - )?; + let group_pk = &ctx.accounts.group.key(); + + let retriever = ScanningAccountRetriever::new(ctx.remaining_accounts, group_pk) + .context("create account retriever")?; + let health_cache = new_health_cache_skipping_missing_banks_and_bad_oracles( &account.borrow(), &retriever, From d16def97451034a1dd23ba976ca11093ee5a87e0 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 8 Apr 2024 15:14:52 +0200 Subject: [PATCH 26/31] Audit: Remove unused fn, add comments (#935) (cherry picked from commit 9df73a0dfd1b5baf8a294807cf1fcebc0cef1221) --- .../mango-v4/src/health/account_retriever.rs | 7 ++++ programs/mango-v4/src/health/cache.rs | 34 +++++++------------ 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/programs/mango-v4/src/health/account_retriever.rs b/programs/mango-v4/src/health/account_retriever.rs index 43bffd482..c88764def 100644 --- a/programs/mango-v4/src/health/account_retriever.rs +++ b/programs/mango-v4/src/health/account_retriever.rs @@ -26,6 +26,7 @@ use crate::state::{Bank, MangoAccountRef, PerpMarket, PerpMarketIndex, TokenInde /// are passed because health needs to be computed for different baskets in /// one instruction (such as for liquidation instructions). pub trait AccountRetriever { + /// Returns the token indexes of the available banks. Unordered and may have duplicates. fn available_banks(&self) -> Result>; fn bank_and_oracle( @@ -67,6 +68,9 @@ pub struct FixedOrderAccountRetriever { } /// Creates a FixedOrderAccountRetriever where all banks are present +/// +/// Note that this does not eagerly validate that the right accounts were passed. That +/// validation happens only when banks, perps etc are requested. pub fn new_fixed_order_account_retriever<'a, 'info>( ais: &'a [AccountInfo<'info>], account: &MangoAccountRef, @@ -84,6 +88,9 @@ pub fn new_fixed_order_account_retriever<'a, 'info>( /// A FixedOrderAccountRetriever with n_banks <= active_token_positions().count(), /// depending on which banks were passed. +/// +/// Note that this does not eagerly validate that the right accounts were passed. That +/// validation happens only when banks, perps etc are requested. pub fn new_fixed_order_account_retriever_with_optional_banks<'a, 'info>( ais: &'a [AccountInfo<'info>], account: &MangoAccountRef, diff --git a/programs/mango-v4/src/health/cache.rs b/programs/mango-v4/src/health/cache.rs index 6a105af36..7d0e1ed3b 100644 --- a/programs/mango-v4/src/health/cache.rs +++ b/programs/mango-v4/src/health/cache.rs @@ -1230,45 +1230,37 @@ pub fn new_health_cache( retriever: &impl AccountRetriever, now_ts: u64, ) -> Result { - new_health_cache_impl(account, retriever, now_ts, false, false) + new_health_cache_impl(account, retriever, now_ts, false) } /// Generate a special HealthCache for an account and its health accounts -/// where nonnegative token positions for bad oracles are skipped. +/// where nonnegative token positions for bad oracles are skipped as well as missing banks. /// /// This health cache must be used carefully, since it doesn't provide the actual /// account health, just a value that is guaranteed to be less than it. -pub fn new_health_cache_skipping_bad_oracles( - account: &MangoAccountRef, - retriever: &impl AccountRetriever, - now_ts: u64, -) -> Result { - new_health_cache_impl(account, retriever, now_ts, true, false) -} - pub fn new_health_cache_skipping_missing_banks_and_bad_oracles( account: &MangoAccountRef, retriever: &impl AccountRetriever, now_ts: u64, ) -> Result { - new_health_cache_impl(account, retriever, now_ts, true, true) + new_health_cache_impl(account, retriever, now_ts, true) } +// On `allow_skipping_banks`: +// If (a Bank is not provided or its oracle is stale or inconfident) and the health contribution would +// not be negative, skip it. This decreases health, but many operations are still allowed as long +// as the decreased amount stays positive. fn new_health_cache_impl( account: &MangoAccountRef, retriever: &impl AccountRetriever, now_ts: u64, - // If an oracle is stale or inconfident and the health contribution would - // not be negative, skip it. This decreases health, but maybe overall it's - // still positive? - skip_bad_oracles: bool, - skip_missing_banks: bool, + allow_skipping_banks: bool, ) -> Result { // token contribution from token accounts let mut token_infos = Vec::with_capacity(account.active_token_positions().count()); // As a CU optimization, don't call available_banks() unless necessary - let available_banks_opt = if skip_missing_banks { + let available_banks_opt = if allow_skipping_banks { Some(retriever.available_banks()?) } else { None @@ -1276,7 +1268,7 @@ fn new_health_cache_impl( for (i, position) in account.active_token_positions().enumerate() { // Allow skipping of missing banks only if the account has a nonnegative balance - if skip_missing_banks { + if allow_skipping_banks { let bank_is_available = available_banks_opt .as_ref() .unwrap() @@ -1296,7 +1288,7 @@ fn new_health_cache_impl( retriever.bank_and_oracle(&account.fixed.group, i, position.token_index); // Allow skipping of bad-oracle banks if the account has a nonnegative balance - if skip_bad_oracles + if allow_skipping_banks && bank_oracle_result.is_oracle_error() && position.indexed_position >= 0 { @@ -1345,7 +1337,7 @@ fn new_health_cache_impl( (Ok(base), Ok(quote)) => (base, quote), _ => { require_msg_typed!( - skip_bad_oracles || skip_missing_banks, + allow_skipping_banks, MangoError::InvalidBank, "serum market {} misses health accounts for bank {} or {}", serum_account.market_index, @@ -1382,7 +1374,7 @@ fn new_health_cache_impl( )?; // Ensure the settle token is available in the health cache - if skip_bad_oracles || skip_missing_banks { + if allow_skipping_banks { find_token_info_index(&token_infos, perp_market.settle_token_index)?; } From 5c7502d360089515fc0c1ecef59059bcf6e24f1d Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 8 Apr 2024 16:28:25 +0200 Subject: [PATCH 27/31] token_withdraw: avoid silencing errors with is_ok() (#936) (cherry picked from commit 653cf9f30b03f22c82e78ae15facbdaf85afaa44) --- programs/mango-v4/src/health/cache.rs | 6 ++++++ programs/mango-v4/src/instructions/token_withdraw.rs | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/programs/mango-v4/src/health/cache.rs b/programs/mango-v4/src/health/cache.rs index 7d0e1ed3b..21f8cf289 100644 --- a/programs/mango-v4/src/health/cache.rs +++ b/programs/mango-v4/src/health/cache.rs @@ -820,6 +820,12 @@ impl HealthCache { }) } + pub fn has_token_info(&self, token_index: TokenIndex) -> bool { + self.token_infos + .iter() + .any(|t| t.token_index == token_index) + } + pub fn perp_info(&self, perp_market_index: PerpMarketIndex) -> Result<&PerpInfo> { Ok(&self.perp_infos[self.perp_info_index(perp_market_index)?]) } diff --git a/programs/mango-v4/src/instructions/token_withdraw.rs b/programs/mango-v4/src/instructions/token_withdraw.rs index 7f32940f5..cf0dfbc36 100644 --- a/programs/mango-v4/src/instructions/token_withdraw.rs +++ b/programs/mango-v4/src/instructions/token_withdraw.rs @@ -156,7 +156,7 @@ pub fn token_withdraw(ctx: Context, amount: u64, allow_borrow: bo // Health check // if let Some((mut health_cache, pre_init_health_lower_bound)) = pre_health_opt { - if health_cache.token_info_index(token_index).is_ok() { + if health_cache.has_token_info(token_index) { // This is the normal case: the health cache knows about the token, we can // compute the health for the new state by adjusting its balance health_cache.adjust_token_balance(&bank, native_position_after - native_position)?; From 0dc9d9ab8007f410364b8eaf1502ca25b1b85836 Mon Sep 17 00:00:00 2001 From: Serge Farny Date: Thu, 11 Apr 2024 07:22:29 +0200 Subject: [PATCH 28/31] program; fix health check ix gate (#940) (cherry picked from commit fe86295d3c09db91424f5de3e12a3f66fdffd8d5) --- programs/mango-v4/src/accounts_ix/health_check.rs | 2 +- ts/client/src/clientIxParamBuilder.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/programs/mango-v4/src/accounts_ix/health_check.rs b/programs/mango-v4/src/accounts_ix/health_check.rs index c405a4fa3..677dd0d3d 100644 --- a/programs/mango-v4/src/accounts_ix/health_check.rs +++ b/programs/mango-v4/src/accounts_ix/health_check.rs @@ -17,7 +17,7 @@ pub enum HealthCheckKind { #[derive(Accounts)] pub struct HealthCheck<'info> { #[account( - constraint = group.load()?.is_ix_enabled(IxGate::SequenceCheck) @ MangoError::IxIsDisabled, + constraint = group.load()?.is_ix_enabled(IxGate::HealthCheck) @ MangoError::IxIsDisabled, )] pub group: AccountLoader<'info, Group>, diff --git a/ts/client/src/clientIxParamBuilder.ts b/ts/client/src/clientIxParamBuilder.ts index 3baa5a1d2..ddfb1dd51 100644 --- a/ts/client/src/clientIxParamBuilder.ts +++ b/ts/client/src/clientIxParamBuilder.ts @@ -311,6 +311,7 @@ export interface IxGateParams { Serum3PlaceOrderV2: boolean; TokenForceWithdraw: boolean; SequenceCheck: boolean; + HealthCheck: boolean; } // Default with all ixs enabled, use with buildIxGate @@ -392,6 +393,7 @@ export const TrueIxGateParams: IxGateParams = { Serum3PlaceOrderV2: true, TokenForceWithdraw: true, SequenceCheck: true, + HealthCheck: true, }; // build ix gate e.g. buildIxGate(Builder(TrueIxGateParams).TokenDeposit(false).build()).toNumber(), @@ -483,6 +485,7 @@ export function buildIxGate(p: IxGateParams): BN { toggleIx(ixGate, p, 'Serum3PlaceOrderV2', 71); toggleIx(ixGate, p, 'TokenForceWithdraw', 72); toggleIx(ixGate, p, 'SequenceCheck', 73); + toggleIx(ixGate, p, 'HealthCheck', 74); return ixGate; } From 286eeb60fbc376d0ce2dcd093214a63d1bce6294 Mon Sep 17 00:00:00 2001 From: thibaultosec <146486261+thibaultosec@users.noreply.github.com> Date: Mon, 15 Apr 2024 08:36:10 +0200 Subject: [PATCH 29/31] add audit report for v0.24.0 (#941) Co-authored-by: CanardMandarin (cherry picked from commit ccc479ba21b691aabb7b9c1f43e89b33bc9b0c35) --- audits/Audit_OtterSec_Mango_v0.24.0.pdf | Bin 0 -> 306014 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 audits/Audit_OtterSec_Mango_v0.24.0.pdf diff --git a/audits/Audit_OtterSec_Mango_v0.24.0.pdf b/audits/Audit_OtterSec_Mango_v0.24.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ed32f6018155031c2764a62e082b561e7135469c GIT binary patch literal 306014 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�)`wOX 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

($%IcULsTuvOm)FQ=YPI>Cb_}1#9QbtcKR( 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 Date: Mon, 15 Apr 2024 09:09:37 +0200 Subject: [PATCH 30/31] Changelog for v0.24.0 (#942) (cherry picked from commit 4c3814c466c9935b83bf6ea92b31d8d76a688e67) --- CHANGELOG.md | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 059ff79d3..02dfd0a4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,33 @@ Update this for each program release and mainnet deployment. ## not on mainnet -### v0.23.0, 2024-3- +### v0.24.0, 2024-4- + +- Allow skipping banks and invalid oracles when computing health (#891) + + This is only possible when we know for sure that the operation would not put the account into negative health zone. + +- Add support for Raydium CLMM as oracle fallback (#856) + +- Add a `TokenBalanceLog` when charging collateral fees (#894) + +- Withdraw instruction: remove overflow error and return appropriate error message instead (#910) + +- Banks: add more safety checks (#895) + +- Add a health check instruction (#913) + + Assert in a transaction that operation run on a mango account does not reduce it's health below a specified amount. + +- Add a sequence check instruction (#909) + + Assert that a transaction was emitted and run with a correct view of the current mango state. + +## mainnet + +### v0.23.0, 2024-3-8 + +Deployment: Mar 8, 2024 at 12:10:52 Central European Standard Time, https://explorer.solana.com/tx/6MXGookZoYGMYb7tWrrmgZzVA13HJimHNqwHRVFeqL9YpQD7YasH1pQn4MSQTK1o13ixKTGFxwZsviUzmHzzP9m - Allow disabling asset liquidations for tokens (#867) @@ -26,8 +52,6 @@ Update this for each program release and mainnet deployment. - Flash loan: Add a "swap without flash loan fees" option (#882) - Cleanup, tests and minor (#878, #875, #854, #838, #895) -## mainnet - ### v0.22.0, 2024-3-3 Deployment: Mar 3, 2024 at 23:52:08 Central European Standard Time, https://explorer.solana.com/tx/3MpEMU12Pv7RpSnwfShoM9sbyr41KAEeJFCVx9ypkq8nuK8Q5vm7CRLkdhH3u91yQ4k44a32armZHaoYguX6NqsY From a87be8ece0b1e6305a40857a1da5b5a3a96b465f Mon Sep 17 00:00:00 2001 From: Serge Farny Date: Mon, 15 Apr 2024 09:29:53 +0200 Subject: [PATCH 31/31] TS: Fix formatting --- ts/client/scripts/liqtest/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ts/client/scripts/liqtest/README.md b/ts/client/scripts/liqtest/README.md index 847fcfdaf..f1889404d 100644 --- a/ts/client/scripts/liqtest/README.md +++ b/ts/client/scripts/liqtest/README.md @@ -51,6 +51,7 @@ This creates a bunch of to-be-liquidated accounts as well as a LIQOR account. Run the liquidator on the group with the liqor account. Since devnet doesn't have any jupiter, run with + ``` JUPITER_VERSION=mock TCS_MODE=borrow-buy