From c22377ec4ee80d18bcb26a7fd428b50eb4dec178 Mon Sep 17 00:00:00 2001 From: Christian Krueger Date: Fri, 6 Dec 2024 16:35:51 -0800 Subject: [PATCH] some tests added --- .../tests/fixtures/tip_router_client.rs | 23 +- integration_tests/tests/tip_router/mod.rs | 1 + .../tests/tip_router/set_config_fees.rs | 276 ++++++++++-------- .../set_tracked_mint_ncn_fee_group.rs | 208 +++++++++++++ 4 files changed, 380 insertions(+), 128 deletions(-) create mode 100644 integration_tests/tests/tip_router/set_tracked_mint_ncn_fee_group.rs diff --git a/integration_tests/tests/fixtures/tip_router_client.rs b/integration_tests/tests/fixtures/tip_router_client.rs index b604262..b5bc5f7 100644 --- a/integration_tests/tests/fixtures/tip_router_client.rs +++ b/integration_tests/tests/fixtures/tip_router_client.rs @@ -290,10 +290,10 @@ impl TipRouterClient { pub async fn do_set_config_fees( &mut self, new_block_engine_fee_bps: Option, - base_fee_group: BaseFeeGroup, + base_fee_group: Option, new_base_fee_wallet: Option, new_base_fee_bps: Option, - ncn_fee_group: NcnFeeGroup, + ncn_fee_group: Option, new_ncn_fee_bps: Option, ncn_root: &NcnRoot, ) -> TestResult<()> { @@ -317,10 +317,10 @@ impl TipRouterClient { &mut self, config_pda: Pubkey, new_block_engine_fee_bps: Option, - base_fee_group: BaseFeeGroup, + base_fee_group: Option, new_base_fee_wallet: Option, new_base_fee_bps: Option, - ncn_fee_group: NcnFeeGroup, + ncn_fee_group: Option, new_ncn_fee_bps: Option, ncn_root: &NcnRoot, ) -> TestResult<()> { @@ -333,14 +333,16 @@ impl TipRouterClient { .config(config_pda) .ncn(ncn_root.ncn_pubkey) .ncn_admin(ncn_root.ncn_admin.pubkey()) - .restaking_program(jito_restaking_program::id()) - .base_fee_group(base_fee_group.group) - .ncn_fee_group(ncn_fee_group.group); + .restaking_program(jito_restaking_program::id()); if let Some(new_block_engine_fee_bps) = new_block_engine_fee_bps { builder.new_block_engine_fee_bps(new_block_engine_fee_bps); } + if let Some(base_fee_group) = base_fee_group { + builder.base_fee_group(base_fee_group.group); + } + if let Some(new_base_fee_wallet) = new_base_fee_wallet { builder.new_base_fee_wallet(new_base_fee_wallet); } @@ -349,6 +351,10 @@ impl TipRouterClient { builder.new_base_fee_bps(new_base_fee_bps); } + if let Some(ncn_fee_group) = ncn_fee_group { + builder.ncn_fee_group(ncn_fee_group.group); + } + if let Some(new_ncn_fee_bps) = new_ncn_fee_bps { builder.new_ncn_fee_bps(new_ncn_fee_bps); } @@ -619,9 +625,6 @@ impl TipRouterClient { let (ncn_config, _, _) = NcnConfig::find_program_address(&jito_tip_router_program::id(), &ncn); - let (base_reward_router, _, _) = - BaseRewardRouter::find_program_address(&jito_tip_router_program::id(), &ncn, ncn_epoch); - //TODO: Check admin is correct let admin = self.payer.pubkey(); diff --git a/integration_tests/tests/tip_router/mod.rs b/integration_tests/tests/tip_router/mod.rs index f9f24c8..854ba4a 100644 --- a/integration_tests/tests/tip_router/mod.rs +++ b/integration_tests/tests/tip_router/mod.rs @@ -12,4 +12,5 @@ mod register_mint; mod set_config_fees; mod set_new_admin; mod set_tie_breaker; +mod set_tracked_mint_ncn_fee_group; mod snapshot_vault_operator_delegation; diff --git a/integration_tests/tests/tip_router/set_config_fees.rs b/integration_tests/tests/tip_router/set_config_fees.rs index a601699..6742948 100644 --- a/integration_tests/tests/tip_router/set_config_fees.rs +++ b/integration_tests/tests/tip_router/set_config_fees.rs @@ -1,121 +1,161 @@ #[cfg(test)] mod tests { - // use jito_tip_router_core::{error::TipRouterError, ncn_fee_group::NcnFeeGroup}; - // use solana_sdk::{ - // clock::DEFAULT_SLOTS_PER_EPOCH, - // signature::{Keypair, Signer}, - // }; - - // use crate::fixtures::{ - // test_builder::TestBuilder, tip_router_client::assert_tip_router_error, TestResult, - // }; - - // #[tokio::test] - // async fn test_set_config_fees_ok() -> TestResult<()> { - // let mut fixture = TestBuilder::new().await; - // let mut tip_router_client = fixture.tip_router_client(); - // let ncn_root = fixture.setup_ncn().await?; - - // // Initialize config first - note that ncn_admin is now required as signer - // tip_router_client - // .do_initialize_config(ncn_root.ncn_pubkey, &ncn_root.ncn_admin) - // .await?; - - // // Change fees and fee wallet - // let new_fee_wallet = Keypair::new(); - // tip_router_client - // .do_set_config_fees( - // 100, // dao_fee_bps - // 200, // ncn_fee_bps - // 300, // block_engine_fee_bps - // new_fee_wallet.pubkey(), - // &ncn_root, - // ) - // .await?; - - // Ok(()) - // } - - // #[tokio::test] - // async fn test_set_config_fees_exceed_max_fails() -> TestResult<()> { - // let mut fixture = TestBuilder::new().await; - // let mut tip_router_client = fixture.tip_router_client(); - // let ncn_root = fixture.setup_ncn().await?; - - // // Initialize config first - // tip_router_client - // .do_initialize_config(ncn_root.ncn_pubkey, &ncn_root.ncn_admin) - // .await?; - - // // Try to set fees above max - // let transaction_error = tip_router_client - // .do_set_config_fees(10_001, 0, 0, ncn_root.ncn_admin.pubkey(), &ncn_root) - // .await; - - // assert_tip_router_error(transaction_error, TipRouterError::FeeCapExceeded); - // Ok(()) - // } - - // #[tokio::test] - // async fn test_set_config_fees_wrong_admin_fails() -> TestResult<()> { - // let mut fixture = TestBuilder::new().await; - // let mut tip_router_client = fixture.tip_router_client(); - // let mut ncn_root = fixture.setup_ncn().await?; - - // tip_router_client - // .do_initialize_config(ncn_root.ncn_pubkey, &ncn_root.ncn_admin) - // .await?; - - // let wrong_admin = Keypair::new(); - // ncn_root.ncn_admin = wrong_admin; - // let transaction_error = tip_router_client - // .do_set_config_fees(100, 200, 300, ncn_root.ncn_admin.pubkey(), &ncn_root) - // .await; - - // assert_tip_router_error(transaction_error, TipRouterError::IncorrectFeeAdmin); - // Ok(()) - // } - - // #[tokio::test] - // async fn test_set_config_fees_across_epoch() -> TestResult<()> { - // let mut fixture = TestBuilder::new().await; - // let mut tip_router_client = fixture.tip_router_client(); - // let ncn_root = fixture.setup_ncn().await?; - - // // Initialize config first - // tip_router_client - // .do_initialize_config(ncn_root.ncn_pubkey, &ncn_root.ncn_admin) - // .await?; - - // // Set new fees - // let new_fee_wallet = Keypair::new(); - // tip_router_client - // .do_set_config_fees(100, 200, 0, new_fee_wallet.pubkey(), &ncn_root) - // .await?; - - // // Advance epoch - // fixture - // .warp_slot_incremental(2 * DEFAULT_SLOTS_PER_EPOCH) - // .await?; - - // let config = tip_router_client - // .get_ncn_config(ncn_root.ncn_pubkey) - // .await?; - // let clock = fixture.clock().await; - // assert_eq!(config.fee_config.dao_fee_bps(clock.epoch as u64), 100); - // assert_eq!( - // config - // .fee_config - // .ncn_fee_bps(NcnFeeGroup::default(), clock.epoch as u64) - // .unwrap(), - // 200 - // ); - // assert_eq!( - // config.fee_config.block_engine_fee_bps(clock.epoch as u64), - // 0 - // ); - // assert_eq!(config.fee_config.fee_wallet(), new_fee_wallet.pubkey()); - - // Ok(()) - // } + use std::u64; + + use jito_tip_router_core::{base_fee_group::BaseFeeGroup, ncn_fee_group::NcnFeeGroup}; + use solana_sdk::pubkey::Pubkey; + + use crate::fixtures::{test_builder::TestBuilder, TestResult}; + + #[tokio::test] + async fn test_set_config_fees_ok() -> TestResult<()> { + let mut fixture = TestBuilder::new().await; + let mut tip_router_client = fixture.tip_router_client(); + let ncn_root = fixture.setup_ncn().await?; + + const NEW_BLOCK_ENGINE_FEE: u16 = 500; + const NEW_BASE_FEE: u16 = 600; + const NEW_NCN_FEE: u16 = 700; + + let new_base_fee_wallet = Pubkey::new_unique(); + + // Initialize config first - note that ncn_admin is now required as signer + tip_router_client + .do_initialize_config(ncn_root.ncn_pubkey, &ncn_root.ncn_admin) + .await?; + + let base_fee_group = BaseFeeGroup::default(); + let ncn_fee_group = NcnFeeGroup::default(); + + // Change fees and fee wallet + tip_router_client + .do_set_config_fees( + Some(NEW_BLOCK_ENGINE_FEE), + Some(base_fee_group), + Some(new_base_fee_wallet), + Some(NEW_BASE_FEE), + Some(ncn_fee_group), + Some(NEW_NCN_FEE), + &ncn_root, + ) + .await?; + + let ncn_config = tip_router_client + .get_ncn_config(ncn_root.ncn_pubkey) + .await?; + + assert_eq!( + ncn_config.fee_config.block_engine_fee_bps(), + NEW_BLOCK_ENGINE_FEE + ); + + assert_eq!( + ncn_config + .fee_config + .base_fee_wallet(base_fee_group) + .unwrap(), + new_base_fee_wallet + ); + + let current_fees = ncn_config.fee_config.current_fees(u64::MAX); + + assert_eq!( + current_fees.base_fee_bps(base_fee_group).unwrap(), + NEW_BASE_FEE + ); + + assert_eq!( + current_fees.ncn_fee_bps(ncn_fee_group).unwrap(), + NEW_NCN_FEE + ); + + Ok(()) + } + + #[tokio::test] + async fn test_set_config_all_fees_ok() -> TestResult<()> { + let mut fixture = TestBuilder::new().await; + let mut tip_router_client = fixture.tip_router_client(); + let ncn_root = fixture.setup_ncn().await?; + + const NEW_BLOCK_ENGINE_FEE: u16 = 500; + const NEW_BASE_FEE: u16 = 600; + const NEW_NCN_FEE: u16 = 700; + + let new_base_fee_wallet = Pubkey::new_unique(); + + // Initialize config first - note that ncn_admin is now required as signer + tip_router_client + .do_initialize_config(ncn_root.ncn_pubkey, &ncn_root.ncn_admin) + .await?; + + // Change fees and fee wallet + tip_router_client + .do_set_config_fees( + Some(NEW_BLOCK_ENGINE_FEE), + None, + None, + None, + None, + None, + &ncn_root, + ) + .await?; + + for group in BaseFeeGroup::all_groups().iter() { + // Change fees and fee wallet + tip_router_client + .do_set_config_fees( + None, + Some(*group), + Some(new_base_fee_wallet), + Some(NEW_BASE_FEE), + None, + None, + &ncn_root, + ) + .await?; + } + + for group in NcnFeeGroup::all_groups().iter() { + // Change fees and fee wallet + tip_router_client + .do_set_config_fees( + None, + None, + None, + None, + Some(*group), + Some(NEW_NCN_FEE), + &ncn_root, + ) + .await?; + } + + let ncn_config = tip_router_client + .get_ncn_config(ncn_root.ncn_pubkey) + .await?; + + assert_eq!( + ncn_config.fee_config.block_engine_fee_bps(), + NEW_BLOCK_ENGINE_FEE + ); + + let current_fees = ncn_config.fee_config.current_fees(u64::MAX); + + for group in BaseFeeGroup::all_groups().iter() { + assert_eq!( + ncn_config.fee_config.base_fee_wallet(*group).unwrap(), + new_base_fee_wallet + ); + + assert_eq!(current_fees.base_fee_bps(*group).unwrap(), NEW_BASE_FEE); + } + + for group in NcnFeeGroup::all_groups().iter() { + assert_eq!(current_fees.ncn_fee_bps(*group).unwrap(), NEW_NCN_FEE); + } + + Ok(()) + } } diff --git a/integration_tests/tests/tip_router/set_tracked_mint_ncn_fee_group.rs b/integration_tests/tests/tip_router/set_tracked_mint_ncn_fee_group.rs new file mode 100644 index 0000000..ec789ce --- /dev/null +++ b/integration_tests/tests/tip_router/set_tracked_mint_ncn_fee_group.rs @@ -0,0 +1,208 @@ +#[cfg(test)] +mod tests { + + use jito_restaking_core::{config::Config, ncn_vault_ticket::NcnVaultTicket}; + use jito_tip_router_core::ncn_fee_group::{NcnFeeGroup, NcnFeeGroupType}; + use jito_vault_core::vault_ncn_ticket::VaultNcnTicket; + + use crate::fixtures::{test_builder::TestBuilder, TestResult}; + + #[tokio::test] + async fn test_set_tracked_mint_ncn_fee_group_ok() -> TestResult<()> { + let mut fixture = TestBuilder::new().await; + let mut tip_router_client = fixture.tip_router_client(); + let mut vault_client = fixture.vault_client(); + let mut restaking_client = fixture.restaking_program_client(); + let ncn_root = fixture.setup_ncn().await?; + // // Setup initial state + tip_router_client.setup_tip_router(&ncn_root).await?; + + // // Setup vault and tickets + let vault_root = vault_client + .do_initialize_vault(0, 0, 0, 9, &ncn_root.ncn_pubkey) + .await?; + restaking_client + .do_initialize_ncn_vault_ticket(&ncn_root, &vault_root.vault_pubkey) + .await?; + vault_client + .do_initialize_vault_ncn_ticket(&vault_root, &ncn_root.ncn_pubkey) + .await?; + + let vault = vault_root.vault_pubkey; + let vault_ncn_ticket = VaultNcnTicket::find_program_address( + &jito_vault_program::id(), + &vault_root.vault_pubkey, + &ncn_root.ncn_pubkey, + ) + .0; + let ncn_vault_ticket = NcnVaultTicket::find_program_address( + &jito_restaking_program::id(), + &ncn_root.ncn_pubkey, + &vault_root.vault_pubkey, + ) + .0; + + fixture.warp_slot_incremental(2).await?; + + vault_client + .do_warmup_vault_ncn_ticket(&vault_root, &ncn_root.ncn_pubkey) + .await?; + restaking_client + .do_warmup_ncn_vault_ticket(&ncn_root, &vault_root.vault_pubkey) + .await?; + let restaking_config_pubkey = Config::find_program_address(&jito_restaking_program::id()).0; + let epoch_length = restaking_client + .get_config(&restaking_config_pubkey) + .await? + .epoch_length(); + fixture.warp_slot_incremental(2 * epoch_length).await?; + + // Register mint + tip_router_client + .do_register_mint( + ncn_root.ncn_pubkey, + vault, + vault_ncn_ticket, + ncn_vault_ticket, + ) + .await?; + + let tracked_mints = tip_router_client + .get_tracked_mints(ncn_root.ncn_pubkey) + .await?; + assert_eq!(tracked_mints.mint_count(), 1); + let current_slot = fixture.clock().await.slot; + + let new_ncn_fee_group = NcnFeeGroup::new(NcnFeeGroupType::Reserved7); + + tip_router_client + .do_set_tracked_mint_ncn_fee_group( + ncn_root.ncn_pubkey, + 0, + new_ncn_fee_group, + current_slot, + ) + .await?; + + let tracked_mints = tip_router_client + .get_tracked_mints(ncn_root.ncn_pubkey) + .await?; + + assert_eq!(tracked_mints.mint_count(), 1); + assert_eq!( + tracked_mints.st_mint_list[0].ncn_fee_group(), + new_ncn_fee_group + ); + + Ok(()) + } + + #[tokio::test] + async fn test_set_tracked_mint_ncn_fee_group_fails_with_weight_table() -> TestResult<()> { + let mut fixture = TestBuilder::new().await; + let mut tip_router_client = fixture.tip_router_client(); + let mut vault_client = fixture.vault_client(); + let mut restaking_client = fixture.restaking_program_client(); + let ncn_root = fixture.setup_ncn().await?; + + tip_router_client.setup_tip_router(&ncn_root).await?; + + let vault_root = vault_client + .do_initialize_vault(0, 0, 0, 9, &ncn_root.ncn_pubkey) + .await?; + restaking_client + .do_initialize_ncn_vault_ticket(&ncn_root, &vault_root.vault_pubkey) + .await?; + vault_client + .do_initialize_vault_ncn_ticket(&vault_root, &ncn_root.ncn_pubkey) + .await?; + + let vault = vault_root.vault_pubkey; + let vault_ncn_ticket = VaultNcnTicket::find_program_address( + &jito_vault_program::id(), + &vault_root.vault_pubkey, + &ncn_root.ncn_pubkey, + ) + .0; + let ncn_vault_ticket = NcnVaultTicket::find_program_address( + &jito_restaking_program::id(), + &ncn_root.ncn_pubkey, + &vault_root.vault_pubkey, + ) + .0; + + fixture.warp_slot_incremental(2).await?; + + vault_client + .do_warmup_vault_ncn_ticket(&vault_root, &ncn_root.ncn_pubkey) + .await?; + restaking_client + .do_warmup_ncn_vault_ticket(&ncn_root, &vault_root.vault_pubkey) + .await?; + let restaking_config_pubkey = Config::find_program_address(&jito_restaking_program::id()).0; + let epoch_length = restaking_client + .get_config(&restaking_config_pubkey) + .await? + .epoch_length(); + fixture.warp_slot_incremental(2 * epoch_length).await?; + + tip_router_client + .do_register_mint( + ncn_root.ncn_pubkey, + vault, + vault_ncn_ticket, + ncn_vault_ticket, + ) + .await?; + + // Is Okay + { + let current_slot = fixture.clock().await.slot; + + let new_ncn_fee_group = NcnFeeGroup::new(NcnFeeGroupType::Reserved7); + + tip_router_client + .do_set_tracked_mint_ncn_fee_group( + ncn_root.ncn_pubkey, + 0, + new_ncn_fee_group, + current_slot, + ) + .await?; + + let tracked_mints = tip_router_client + .get_tracked_mints(ncn_root.ncn_pubkey) + .await?; + + assert_eq!(tracked_mints.mint_count(), 1); + assert_eq!( + tracked_mints.st_mint_list[0].ncn_fee_group(), + new_ncn_fee_group + ); + } + + tip_router_client + .initialize_weight_table(ncn_root.ncn_pubkey, fixture.clock().await.slot) + .await?; + + // Should fail + { + let current_slot = fixture.clock().await.slot; + + let new_ncn_fee_group = NcnFeeGroup::new(NcnFeeGroupType::Reserved5); + + let result = tip_router_client + .do_set_tracked_mint_ncn_fee_group( + ncn_root.ncn_pubkey, + 0, + new_ncn_fee_group, + current_slot, + ) + .await; + + assert!(result.is_err()); + } + + Ok(()) + } +}