diff --git a/Cargo.lock b/Cargo.lock index a091020c..52061aca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -927,7 +927,6 @@ dependencies = [ "inf1-ctl-core", "inf1-pp-core", "inf1-svc-core", - "sanctum-fee-ratio", ] [[package]] @@ -985,6 +984,7 @@ dependencies = [ "jiminy-sysvar-instructions", "jiminy-sysvar-rent", "mollusk-svm", + "mollusk-svm-programs-token", "proptest", "sanctum-ata-jiminy", "sanctum-spl-token-jiminy", diff --git a/controller/core/src/sync_sol_val.rs b/controller/core/src/sync_sol_val.rs index 97bcb915..fb9ce1d9 100644 --- a/controller/core/src/sync_sol_val.rs +++ b/controller/core/src/sync_sol_val.rs @@ -16,7 +16,9 @@ pub struct SyncSolVal { } impl SyncSolVal { - /// Returns new pool total SOL value + /// # Returns + /// New pool total SOL value. + /// `None` on overflow /// /// This is rly just a wrapper for return /// `old_pool_total_sol_value - self.lst_sol_val.old() + self.lst_sol_val.new()` @@ -34,8 +36,6 @@ impl SyncSolVal { impl PoolSvLamports { /// Applies a [`SyncSolVal`] followed by an [`UpdateYield`] based on the changes /// the sync made. - /// - /// Assumes INF mint supply did not change #[inline] pub const fn aft_ssv_uy(self, sync: &SyncSolVal) -> Option { let new_total_sol_value = match sync.exec(*self.total()) { @@ -50,27 +50,7 @@ impl PoolSvLamports { } } -impl PoolSvMutRefs<'_> { - /// Returns None on overflow - #[inline] - pub const fn apply_sync_sol_val(&mut self, sync: &SyncSolVal) -> Option<&mut Self> { - let new_total = match sync.exec(**self.total()) { - None => return None, - Some(nt) => nt, - }; - **self.total_mut() = new_total; - Some(self) - } -} - impl PoolStateV2 { - /// Returns None on overflow - #[inline] - pub fn apply_sync_sol_val(&mut self, sync: &SyncSolVal) -> Option<&mut Self> { - PoolSvMutRefs::from_pool_state_v2(self).apply_sync_sol_val(sync)?; - Some(self) - } - /// Applies a [`SyncSolVal`] followed by an [`UpdateYield`] based on the changes /// the sync made. /// diff --git a/controller/program/Cargo.toml b/controller/program/Cargo.toml index 33f49742..ecc9e2cb 100644 --- a/controller/program/Cargo.toml +++ b/controller/program/Cargo.toml @@ -40,6 +40,7 @@ inf1-pp-core = { workspace = true } inf1-pp-flatslab-std = { workspace = true } inf1-test-utils = { workspace = true } mollusk-svm = { workspace = true } +mollusk-svm-programs-token = { workspace = true } proptest = { workspace = true, features = ["std"] } solana-account = { workspace = true } solana-instruction = { workspace = true } diff --git a/controller/program/src/instructions/admin/set_sol_value_calculator.rs b/controller/program/src/instructions/admin/set_sol_value_calculator.rs index f6ea3d18..543511da 100644 --- a/controller/program/src/instructions/admin/set_sol_value_calculator.rs +++ b/controller/program/src/instructions/admin/set_sol_value_calculator.rs @@ -1,5 +1,8 @@ use inf1_ctl_jiminy::{ - account_utils::{lst_state_list_checked, lst_state_list_checked_mut, pool_state_v2_checked}, + account_utils::{ + lst_state_list_checked, lst_state_list_checked_mut, pool_state_v2_checked, + pool_state_v2_checked_mut, + }, cpi::SetSolValueCalculatorIxPreAccountHandles, err::Inf1CtlErr, instructions::{ @@ -20,9 +23,10 @@ use jiminy_cpi::{ use inf1_core::instructions::admin::set_sol_value_calculator::SetSolValueCalculatorIxAccs; use inf1_core::instructions::sync_sol_value::SyncSolValueIxAccs; +use jiminy_sysvar_clock::Clock; use crate::{ - svc::lst_sync_sol_val, + svc::lst_ssv_uy, utils::split_suf_accs, verify::{ verify_not_rebalancing_and_not_disabled, verify_pks, verify_signers, @@ -94,8 +98,13 @@ pub fn process_set_sol_value_calculator( calc, }: &SetSolValueCalculatorIxAccounts, lst_idx: usize, + clock: &Clock, ) -> Result<(), ProgramError> { - let calc_key = *abr.get(*calc_prog).key(); + pool_state_v2_checked_mut(abr.get_mut(*ix_prefix.pool_state()))? + .release_yield(clock.slot) + .map_err(Inf1CtlCustomProgErr)?; + + let new_calc_prog = *abr.get(*calc_prog).key(); let list = lst_state_list_checked_mut(abr.get_mut(*ix_prefix.lst_state_list()))?; let lst_state = list @@ -103,9 +112,9 @@ pub fn process_set_sol_value_calculator( .get_mut(lst_idx) .ok_or(Inf1CtlCustomProgErr(Inf1CtlErr::InvalidLstIndex))?; - lst_state.sol_value_calculator = calc_key; + lst_state.sol_value_calculator = new_calc_prog; - lst_sync_sol_val( + lst_ssv_uy( abr, cpi, &SyncSolValueIxAccs { @@ -115,7 +124,7 @@ pub fn process_set_sol_value_calculator( .with_lst_state_list(*ix_prefix.lst_state_list()) .with_pool_reserves(*ix_prefix.pool_reserves()) .build(), - calc_prog: *abr.get(*calc_prog).key(), + calc_prog: new_calc_prog, calc, }, lst_idx, diff --git a/controller/program/src/instructions/rebalance/end.rs b/controller/program/src/instructions/rebalance/end.rs index 3c91d530..1c2716cf 100644 --- a/controller/program/src/instructions/rebalance/end.rs +++ b/controller/program/src/instructions/rebalance/end.rs @@ -14,11 +14,16 @@ use inf1_ctl_jiminy::{ keys::{LST_STATE_LIST_ID, POOL_STATE_ID, REBALANCE_RECORD_ID}, pda_onchain::create_raw_pool_reserves_addr, program_err::Inf1CtlCustomProgErr, - typedefs::u8bool::U8BoolMut, + sync_sol_val::SyncSolVal, + typedefs::{ + pool_sv::{PoolSvLamports, PoolSvMutRefs}, + u8bool::U8BoolMut, + }, + yields::update::UpdateYield, }; use jiminy_cpi::{ account::{Abr, AccountHandle}, - program_error::{ProgramError, NOT_ENOUGH_ACCOUNT_KEYS}, + program_error::ProgramError, }; use inf1_core::instructions::{ @@ -26,8 +31,8 @@ use inf1_core::instructions::{ }; use crate::{ - svc::lst_sync_sol_val, - utils::split_suf_accs, + svc::{cpi_lst_reserves_sol_val, update_lst_state_sol_val}, + utils::{accs_split_first_chunk, split_suf_accs}, verify::{verify_is_rebalancing, verify_pks, verify_signers}, Cpi, }; @@ -42,9 +47,7 @@ fn end_rebalance_accs_checked<'a, 'acc>( abr: &Abr, accounts: &'a [AccountHandle<'acc>], ) -> Result, ProgramError> { - let (ix_prefix, suf) = accounts - .split_first_chunk() - .ok_or(NOT_ENOUGH_ACCOUNT_KEYS)?; + let (ix_prefix, suf) = accs_split_first_chunk(accounts)?; let ix_prefix = EndRebalanceIxPreAccs(*ix_prefix); let pool = pool_state_v2_checked(abr.get(*ix_prefix.pool_state()))?; @@ -105,17 +108,14 @@ pub fn process_end_rebalance( inp_calc, } = end_rebalance_accs_checked(abr, accounts)?; - let pool_acc = abr.get_mut(*ix_prefix.pool_state()); - let pool = pool_state_v2_checked_mut(pool_acc)?; - U8BoolMut(&mut pool.is_rebalancing).set_false(); - let (old_total_sol_value, inp_lst_idx) = { let rr = rebalance_record_checked(abr.get(*ix_prefix.rebalance_record()))?; - (rr.old_total_sol_value, rr.inp_lst_index as usize) }; - lst_sync_sol_val( + abr.close(*ix_prefix.rebalance_record(), *ix_prefix.pool_state())?; + + let inp_lst_new = cpi_lst_reserves_sol_val( abr, cpi, &SyncSolValueIxAccs { @@ -128,19 +128,35 @@ pub fn process_end_rebalance( calc_prog: *abr.get(inp_calc_prog).key(), calc: inp_calc, }, - inp_lst_idx, )?; + let inp_sol_val = + update_lst_state_sol_val(abr, *ix_prefix.lst_state_list(), inp_lst_idx, inp_lst_new)?; - let new_total_sol_value = { - let pool = pool_state_v2_checked(abr.get(*ix_prefix.pool_state()))?; - pool.total_sol_value - }; + let pool_acc = abr.get_mut(*ix_prefix.pool_state()); + let pool = pool_state_v2_checked_mut(pool_acc)?; + + U8BoolMut(&mut pool.is_rebalancing).set_false(); + + let new_total_sol_value = SyncSolVal { + lst_sol_val: inp_sol_val, + } + .exec(pool.total_sol_value) + .ok_or(Inf1CtlCustomProgErr(Inf1CtlErr::MathError))?; if new_total_sol_value < old_total_sol_value { return Err(Inf1CtlCustomProgErr(Inf1CtlErr::PoolWouldLoseSolValue).into()); } - abr.close(*ix_prefix.rebalance_record(), *ix_prefix.pool_state())?; + let new = UpdateYield { + new_total_sol_value, + old: PoolSvLamports::from_pool_state_v2(pool) + // compare against val stored in RebalanceRecord + .with_total(old_total_sol_value), + } + .exec() + .ok_or(Inf1CtlCustomProgErr(Inf1CtlErr::MathError))?; + + PoolSvMutRefs::from_pool_state_v2(pool).update(new); Ok(()) } diff --git a/controller/program/src/instructions/rebalance/start.rs b/controller/program/src/instructions/rebalance/start.rs index c60244d8..c3ee5e4b 100644 --- a/controller/program/src/instructions/rebalance/start.rs +++ b/controller/program/src/instructions/rebalance/start.rs @@ -1,3 +1,6 @@ +use core::mem::size_of; + +use inf1_core::instructions::rebalance::start::StartRebalanceIxAccs; use inf1_ctl_jiminy::{ account_utils::{ lst_state_list_checked, pool_state_v2_checked, pool_state_v2_checked_mut, @@ -19,29 +22,22 @@ use inf1_ctl_jiminy::{ keys::{INSTRUCTIONS_SYSVAR_ID, LST_STATE_LIST_ID, POOL_STATE_ID, REBALANCE_RECORD_ID}, pda_onchain::{create_raw_pool_reserves_addr, POOL_STATE_SIGNER, REBALANCE_RECORD_SIGNER}, program_err::Inf1CtlCustomProgErr, + sync_sol_val::SyncSolVal, typedefs::u8bool::U8BoolMut, ID, }; use jiminy_cpi::{ account::{Abr, Account, AccountHandle}, - program_error::{ProgramError, INVALID_ACCOUNT_DATA, NOT_ENOUGH_ACCOUNT_KEYS}, + program_error::{ProgramError, INVALID_ACCOUNT_DATA}, }; +use jiminy_sysvar_clock::Clock; use jiminy_sysvar_instructions::Instructions; - -use inf1_core::instructions::{ - rebalance::start::StartRebalanceIxAccs, sync_sol_value::SyncSolValueIxAccs, -}; - use sanctum_spl_token_jiminy::{ instructions::transfer::transfer_checked_ix_account_handle_perms, - sanctum_spl_token_core::{ - instructions::transfer::{NewTransferCheckedIxAccsBuilder, TransferCheckedIxData}, - state::mint::{Mint, RawMint}, + sanctum_spl_token_core::instructions::transfer::{ + NewTransferCheckedIxAccsBuilder, TransferCheckedIxData, }, }; - -use core::mem::size_of; - use sanctum_system_jiminy::{ instructions::assign::assign_ix_account_handle_perms, sanctum_system_core::{ @@ -51,9 +47,9 @@ use sanctum_system_jiminy::{ }; use crate::{ - svc::lst_sync_sol_val, - token::get_token_account_amount, - utils::split_suf_accs, + svc::{cpi_lst_reserves_sol_val, lst_ssv_uy, update_lst_state_sol_val, SyncSolValIxAccounts}, + token::{checked_mint_of, get_token_account_amount}, + utils::{accs_split_first_chunk, split_suf_accs}, verify::{ verify_not_input_disabled, verify_not_rebalancing_and_not_disabled, verify_pks, verify_signers, @@ -102,51 +98,40 @@ fn verify_end_rebalance_exists( fn start_rebalance_accs_checked<'a, 'acc>( abr: &Abr, accounts: &'a [AccountHandle<'acc>], - args: &StartRebalanceIxArgs, + StartRebalanceIxArgs { + out_lst_value_calc_accs, + out_lst_index, + inp_lst_index, + min_starting_out_lst, + max_starting_inp_lst, + amount: _, + }: &StartRebalanceIxArgs, ) -> Result, ProgramError> { - let (ix_prefix, suf) = accounts - .split_first_chunk() - .ok_or(NOT_ENOUGH_ACCOUNT_KEYS)?; + let (ix_prefix, suf) = accs_split_first_chunk(accounts)?; let ix_prefix = StartRebalanceIxPreAccs(*ix_prefix); let pool = pool_state_v2_checked(abr.get(*ix_prefix.pool_state()))?; let list = lst_state_list_checked(abr.get(*ix_prefix.lst_state_list()))?; - let [Some(out_lst_state), Some(inp_lst_state)] = - [args.out_lst_index, args.inp_lst_index].map(|i| list.0.get(i as usize)) - else { - return Err(Inf1CtlCustomProgErr(Inf1CtlErr::InvalidLstIndex).into()); - }; - - verify_not_input_disabled(inp_lst_state)?; - - let instructions_acc = abr.get(*ix_prefix.instructions()); - - verify_end_rebalance_exists(instructions_acc, abr.get(*ix_prefix.inp_lst_mint()).key())?; - - let out_lst_mint_acc = abr.get(*ix_prefix.out_lst_mint()); - let out_token_prog = out_lst_mint_acc.owner(); - - let inp_lst_mint_acc = abr.get(*ix_prefix.inp_lst_mint()); - let inp_token_prog = inp_lst_mint_acc.owner(); - - let [out_res, inp_res] = [ - (out_token_prog, &out_lst_state), - (inp_token_prog, &inp_lst_state), + let [i, o] = [ + (inp_lst_index, ix_prefix.inp_lst_mint()), + (out_lst_index, ix_prefix.out_lst_mint()), ] - .map(|(token_prog, lst_state)| { - let Some(reserves) = create_raw_pool_reserves_addr( + .map(|(i, mint_handle)| { + let lst_state = list.0.get(*i as usize).ok_or(Inf1CtlErr::InvalidLstIndex)?; + let token_prog = abr.get(*mint_handle).owner(); + let reserves = create_raw_pool_reserves_addr( token_prog, &lst_state.mint, &lst_state.pool_reserves_bump, - ) else { - return Err(Inf1CtlCustomProgErr(Inf1CtlErr::InvalidReserves)); - }; - Ok(reserves) + ) + .ok_or(Inf1CtlErr::InvalidReserves)?; + Ok::<_, Inf1CtlCustomProgErr>((lst_state, token_prog, reserves)) }); + let (inp_lst_state, _inp_token_prog, expected_inp_reserves) = i?; + let (out_lst_state, out_token_prog, expected_out_reserves) = o?; - let expected_out_reserves = out_res?; - let expected_inp_reserves = inp_res?; + verify_not_input_disabled(inp_lst_state)?; let expected_pks = NewStartRebalanceIxPreAccsBuilder::start() .with_rebalance_auth(&pool.rebalance_authority) @@ -170,7 +155,7 @@ fn start_rebalance_accs_checked<'a, 'acc>( verify_not_rebalancing_and_not_disabled(pool)?; let [(out_calc_prog, out_calc), (inp_calc_prog, inp_calc)] = - split_suf_accs(suf, &[args.out_lst_value_calc_accs])?; + split_suf_accs(suf, &[*out_lst_value_calc_accs])?; verify_pks( abr, @@ -182,15 +167,22 @@ fn start_rebalance_accs_checked<'a, 'acc>( )?; let out_reserves_balance = get_token_account_amount(abr.get(*ix_prefix.out_pool_reserves()))?; - if out_reserves_balance < args.min_starting_out_lst { + if out_reserves_balance < *min_starting_out_lst { return Err(Inf1CtlCustomProgErr(Inf1CtlErr::SlippageToleranceExceeded).into()); } let inp_reserves_balance = get_token_account_amount(abr.get(*ix_prefix.inp_pool_reserves()))?; - if inp_reserves_balance > args.max_starting_inp_lst { + if inp_reserves_balance > *max_starting_inp_lst { return Err(Inf1CtlCustomProgErr(Inf1CtlErr::SlippageToleranceExceeded).into()); } + let instructions_acc = abr.get(*ix_prefix.instructions()); + verify_end_rebalance_exists(instructions_acc, &inp_lst_state.mint)?; + + // allow start lst = end lst + // with no additional special case handling + // (e.g. not calling SyncSolVal twice) + Ok(StartRebalanceIxAccounts { ix_prefix, out_calc_prog, @@ -203,9 +195,10 @@ fn start_rebalance_accs_checked<'a, 'acc>( #[inline] pub fn process_start_rebalance( abr: &mut Abr, + cpi: &mut Cpi, accounts: &[AccountHandle], args: StartRebalanceIxArgs, - cpi: &mut Cpi, + clock: &Clock, ) -> Result<(), ProgramError> { let StartRebalanceIxAccounts { ix_prefix, @@ -215,41 +208,43 @@ pub fn process_start_rebalance( inp_calc, } = start_rebalance_accs_checked(abr, accounts, &args)?; - let out_lst_idx = args.out_lst_index as usize; - let inp_lst_idx = args.inp_lst_index as usize; + pool_state_v2_checked_mut(abr.get_mut(*ix_prefix.pool_state()))? + .release_yield(clock.slot) + .map_err(Inf1CtlCustomProgErr)?; - for (mint, reserves, calc_prog, calc, idx) in [ - ( - *ix_prefix.out_lst_mint(), - *ix_prefix.out_pool_reserves(), - out_calc_prog, - out_calc, - out_lst_idx, - ), + // TODO: see if we can factor this common code out with + // `sync_pair_accs` in swap + + let [inp_lst_index, out_lst_index] = + [args.inp_lst_index, args.out_lst_index].map(|x| x as usize); + let [inp_accs, out_accs] = [ ( - *ix_prefix.inp_lst_mint(), - *ix_prefix.inp_pool_reserves(), + ix_prefix.inp_lst_mint(), + ix_prefix.inp_pool_reserves(), inp_calc_prog, inp_calc, - inp_lst_idx, ), - ] { - lst_sync_sol_val( - abr, - cpi, - &SyncSolValueIxAccs { - ix_prefix: NewSyncSolValueIxPreAccsBuilder::start() - .with_lst_mint(mint) - .with_pool_state(*ix_prefix.pool_state()) - .with_lst_state_list(*ix_prefix.lst_state_list()) - .with_pool_reserves(reserves) - .build(), - calc_prog: *abr.get(calc_prog).key(), - calc, - }, - idx, - )?; - } + ( + ix_prefix.out_lst_mint(), + ix_prefix.out_pool_reserves(), + out_calc_prog, + out_calc, + ), + ] + .map(|(mint, reserves, calc_prog, calc)| SyncSolValIxAccounts { + ix_prefix: NewSyncSolValueIxPreAccsBuilder::start() + .with_pool_state(*ix_prefix.pool_state()) + .with_lst_state_list(*ix_prefix.lst_state_list()) + .with_lst_mint(*mint) + .with_pool_reserves(*reserves) + .build(), + calc_prog: *abr.get(calc_prog).key(), + calc, + }); + + [(inp_accs, inp_lst_index), (out_accs, out_lst_index)] + .iter() + .try_for_each(|(accs, idx)| lst_ssv_uy(abr, cpi, accs, *idx))?; let old_total_sol_value = { let pool = pool_state_v2_checked(abr.get(*ix_prefix.pool_state()))?; @@ -257,12 +252,7 @@ pub fn process_start_rebalance( }; // Transfer out_lst tokens from reserves to withdraw_to account. - let out_lst_mint_data = abr.get(*ix_prefix.out_lst_mint()).data(); - let out_lst_mint = RawMint::of_acc_data(out_lst_mint_data) - .and_then(Mint::try_from_raw) - .ok_or(INVALID_ACCOUNT_DATA)?; - let decimals = out_lst_mint.decimals(); - + let decimals = checked_mint_of(abr.get(*ix_prefix.out_lst_mint()))?.decimals(); let transfer_checked_ix_data = TransferCheckedIxData::new(args.amount, decimals); let transfer_checked_accs = NewTransferCheckedIxAccsBuilder::start() .with_src(*ix_prefix.out_pool_reserves()) @@ -270,32 +260,34 @@ pub fn process_start_rebalance( .with_dst(*ix_prefix.withdraw_to()) .with_auth(*ix_prefix.pool_state()) .build(); - let out_lst_token_program_key = *abr.get(*ix_prefix.out_lst_token_program()).key(); - - cpi.invoke_signed( + cpi.invoke_signed_handle( abr, - &out_lst_token_program_key, + *ix_prefix.out_lst_token_program(), transfer_checked_ix_data.as_buf(), transfer_checked_ix_account_handle_perms(transfer_checked_accs), &[POOL_STATE_SIGNER], )?; - // FIXME: replace with variant that doesnt update yield - lst_sync_sol_val( + // sync sol val with new decreased out_pool_reserves balance, + // but dont update_yield + let out_lst_new = cpi_lst_reserves_sol_val(abr, cpi, &out_accs)?; + let out_lst_sol_val = update_lst_state_sol_val( abr, - cpi, - &SyncSolValueIxAccs { - ix_prefix: NewSyncSolValueIxPreAccsBuilder::start() - .with_lst_mint(*ix_prefix.out_lst_mint()) - .with_pool_state(*ix_prefix.pool_state()) - .with_lst_state_list(*ix_prefix.lst_state_list()) - .with_pool_reserves(*ix_prefix.out_pool_reserves()) - .build(), - calc_prog: *abr.get(out_calc_prog).key(), - calc: out_calc, - }, - out_lst_idx, + *out_accs.ix_prefix.lst_state_list(), + out_lst_index, + out_lst_new, )?; + let ps = pool_state_v2_checked_mut(abr.get_mut(*ix_prefix.pool_state()))?; + let new_total = SyncSolVal { + lst_sol_val: out_lst_sol_val, + } + .exec(ps.total_sol_value) + .ok_or(Inf1CtlCustomProgErr(Inf1CtlErr::MathError))?; + ps.total_sol_value = new_total; + + U8BoolMut(&mut ps.is_rebalancing).set_true(); + + // setup RebalanceRecord cpi.invoke_signed( abr, @@ -309,6 +301,7 @@ pub fn process_start_rebalance( &[REBALANCE_RECORD_SIGNER], )?; + // hot potato abr.transfer_direct(*ix_prefix.pool_state(), *ix_prefix.rebalance_record(), 1)?; let rebalance_record_space = size_of::(); @@ -319,9 +312,5 @@ pub fn process_start_rebalance( rr.inp_lst_index = args.inp_lst_index; rr.old_total_sol_value = old_total_sol_value; - let pool_acc = abr.get_mut(*ix_prefix.pool_state()); - let pool = pool_state_v2_checked_mut(pool_acc)?; - U8BoolMut(&mut pool.is_rebalancing).set_true(); - Ok(()) } diff --git a/controller/program/src/instructions/swap/v2/common.rs b/controller/program/src/instructions/swap/v2/common.rs index eaefb1ca..071f286c 100644 --- a/controller/program/src/instructions/swap/v2/common.rs +++ b/controller/program/src/instructions/swap/v2/common.rs @@ -45,9 +45,7 @@ use sanctum_u64_ratio::Ratio; use crate::{ acc_migrations::pool_state, - svc::{ - cpi_lst_reserves_sol_val, lst_sync_sol_val, update_lst_state_sol_val, SyncSolValIxAccounts, - }, + svc::{cpi_lst_reserves_sol_val, lst_ssv_uy, update_lst_state_sol_val, SyncSolValIxAccounts}, token::{checked_mint_of, get_token_account_amount}, utils::{accs_split_first_chunk, split_suf_accs}, verify::{verify_not_rebalancing_and_not_disabled, verify_pks, verify_pks_raw}, @@ -298,9 +296,9 @@ pub fn initial_sync( match accs { SwapV2Ctl::Swap(_) => [(inp_accs, inp_lst_index), (out_accs, out_lst_index)] .into_iter() - .try_for_each(|(a, i)| lst_sync_sol_val(abr, cpi, &a, i)), - SwapV2Ctl::AddLiq(_) => lst_sync_sol_val(abr, cpi, &inp_accs, inp_lst_index), - SwapV2Ctl::RemLiq(_) => lst_sync_sol_val(abr, cpi, &out_accs, out_lst_index), + .try_for_each(|(a, i)| lst_ssv_uy(abr, cpi, &a, i)), + SwapV2Ctl::AddLiq(_) => lst_ssv_uy(abr, cpi, &inp_accs, inp_lst_index), + SwapV2Ctl::RemLiq(_) => lst_ssv_uy(abr, cpi, &out_accs, out_lst_index), } } diff --git a/controller/program/src/instructions/sync_sol_value.rs b/controller/program/src/instructions/sync_sol_value.rs index 3f600620..e8640eb0 100644 --- a/controller/program/src/instructions/sync_sol_value.rs +++ b/controller/program/src/instructions/sync_sol_value.rs @@ -15,7 +15,7 @@ use jiminy_sysvar_clock::Clock; use crate::{ acc_migrations::pool_state, - svc::lst_sync_sol_val, + svc::lst_ssv_uy, utils::split_suf_accs, verify::{verify_not_rebalancing_and_not_disabled, verify_pks}, Cpi, @@ -62,7 +62,7 @@ pub fn process_sync_sol_value( pool.release_yield(clock.slot) .map_err(Inf1CtlCustomProgErr)?; - lst_sync_sol_val( + lst_ssv_uy( abr, cpi, &SyncSolValueIxAccs { diff --git a/controller/program/src/lib.rs b/controller/program/src/lib.rs index a63201a1..45a61358 100644 --- a/controller/program/src/lib.rs +++ b/controller/program/src/lib.rs @@ -214,7 +214,8 @@ fn process_ix( let lst_idx = SetSolValueCalculatorIxData::parse_no_discm(ix_data_as_arr(data)?) as usize; let accs = set_sol_value_calculator_accs_checked(abr, accounts, lst_idx)?; - process_set_sol_value_calculator(abr, cpi, &accs, lst_idx) + let clock = Clock::write_to(&mut clock)?; + process_set_sol_value_calculator(abr, cpi, &accs, lst_idx, clock) } (&SET_ADMIN_IX_DISCM, _) => { sol_log("SetAdmin"); @@ -267,7 +268,8 @@ fn process_ix( (&START_REBALANCE_IX_DISCM, data) => { sol_log("StartRebalance"); let args = StartRebalanceIxData::parse_no_discm(ix_data_as_arr(data)?); - process_start_rebalance(abr, accounts, args, cpi) + let clock = Clock::write_to(&mut clock)?; + process_start_rebalance(abr, cpi, accounts, args, clock) } (&END_REBALANCE_IX_DISCM, _data) => { sol_log("EndRebalance"); diff --git a/controller/program/src/svc.rs b/controller/program/src/svc.rs index 3a3b7b4a..9a573f05 100644 --- a/controller/program/src/svc.rs +++ b/controller/program/src/svc.rs @@ -25,10 +25,15 @@ use crate::{token::get_token_account_amount, Cpi}; pub type SyncSolValIxAccounts<'a, 'acc> = SyncSolValueIxAccs<[u8; 32], SyncSolValueIxPreAccountHandles<'acc>, &'a [AccountHandle<'acc>]>; +/// Subroutine that +/// - CPI lst_to_sol with pool reserves balance to get new sol value of LST +/// - update sol_value on lst state list +/// - update pool_state.total_sol_value +/// - update yield for any observed PnL +/// /// TODO: use return value to create yield update event for self-cpi logging -/// TODO: need variant without UpdateYield for the last sync in StartRebalance #[inline] -pub fn lst_sync_sol_val( +pub fn lst_ssv_uy( abr: &mut Abr, cpi: &mut Cpi, sync_sol_val_accs: &SyncSolValIxAccounts, @@ -74,7 +79,11 @@ pub fn cpi_lst_reserves_sol_val( .start()) } -/// Returns change in SOL value of LST +/// Updates lst_state.sol_value on the lst_state_list acc +/// +/// # Returns +/// +/// Change in SOL value of LST pub fn update_lst_state_sol_val( abr: &mut Abr, lst_state_list: AccountHandle, diff --git a/controller/program/tests/common/derives.rs b/controller/program/tests/common/derives.rs new file mode 100644 index 00000000..3b1a94e9 --- /dev/null +++ b/controller/program/tests/common/derives.rs @@ -0,0 +1,53 @@ +//! Derive data from accounts + +use inf1_svc_ag_core::{ + calc::SvcCalcAg, + inf1_svc_lido_core::{calc::LidoCalc, solido_legacy_core}, + inf1_svc_marinade_core::{calc::MarinadeCalc, sanctum_marinade_liquid_staking_core}, + inf1_svc_spl_core::{ + calc::SplCalc, + instructions::sol_val_calc::{SanctumSplCalcAccs, SanctumSplMultiCalcAccs, SplCalcAccs}, + sanctum_spl_stake_pool_core::StakePool, + }, + inf1_svc_wsol_core::calc::WsolCalc, + instructions::SvcCalcAccsAg, +}; +use inf1_test_utils::AccountMap; + +pub fn derive_svc_no_inf(am: &AccountMap, accs: &SvcCalcAccsAg, curr_epoch: u64) -> SvcCalcAg { + match accs { + SvcCalcAccsAg::Wsol(_) => SvcCalcAg::Wsol(WsolCalc), + SvcCalcAccsAg::SanctumSplMulti(SanctumSplMultiCalcAccs { stake_pool_addr }) + | SvcCalcAccsAg::SanctumSpl(SanctumSplCalcAccs { stake_pool_addr }) + | SvcCalcAccsAg::Spl(SplCalcAccs { stake_pool_addr }) => { + let calc = SplCalc::new( + &StakePool::borsh_de(am[&(*stake_pool_addr).into()].data.as_slice()).unwrap(), + curr_epoch, + ); + match accs { + SvcCalcAccsAg::SanctumSplMulti(_) => SvcCalcAg::SanctumSplMulti(calc), + SvcCalcAccsAg::SanctumSpl(_) => SvcCalcAg::SanctumSpl(calc), + SvcCalcAccsAg::Spl(_) => SvcCalcAg::Spl(calc), + _ => unreachable!(), + } + } + SvcCalcAccsAg::Marinade(_) => SvcCalcAg::Marinade(MarinadeCalc::new( + &sanctum_marinade_liquid_staking_core::State::borsh_de( + am[&sanctum_marinade_liquid_staking_core::STATE_PUBKEY.into()] + .data + .as_slice(), + ) + .unwrap(), + )), + SvcCalcAccsAg::Lido(_) => SvcCalcAg::Lido(LidoCalc::new( + &solido_legacy_core::Lido::borsh_de( + am[&solido_legacy_core::LIDO_STATE_ADDR.into()] + .data + .as_slice(), + ) + .unwrap(), + curr_epoch, + )), + SvcCalcAccsAg::Inf(_) => panic!("INF unsupported"), + } +} diff --git a/controller/program/tests/common/lst_state_list.rs b/controller/program/tests/common/lst_state_list.rs new file mode 100644 index 00000000..2f5c610b --- /dev/null +++ b/controller/program/tests/common/lst_state_list.rs @@ -0,0 +1,9 @@ +use inf1_ctl_jiminy::typedefs::lst_state::LstState; +use inf1_svc_jiminy::traits::SolValCalc; + +/// For use when sol value in LstState `s` is stale +pub fn lst_state_lookahead(mut s: LstState, balance: u64, calc: impl SolValCalc) -> LstState { + let new = *calc.lst_to_sol(balance).unwrap().start(); + s.sol_value = new; + s +} diff --git a/controller/program/tests/common/mod.rs b/controller/program/tests/common/mod.rs index a8d127da..10004628 100644 --- a/controller/program/tests/common/mod.rs +++ b/controller/program/tests/common/mod.rs @@ -1,7 +1,11 @@ mod consts; +mod derives; +mod lst_state_list; mod mollusk; mod pool_state; pub use consts::*; +pub use derives::*; +pub use lst_state_list::*; pub use mollusk::*; pub use pool_state::*; diff --git a/controller/program/tests/tests/admin/remove_lst.rs b/controller/program/tests/tests/admin/remove_lst.rs index ecdf1f6a..5cf89921 100644 --- a/controller/program/tests/tests/admin/remove_lst.rs +++ b/controller/program/tests/tests/admin/remove_lst.rs @@ -67,11 +67,6 @@ fn remove_lst_fixtures_accounts_opt(keys: &RemoveLstIxKeysOwned) -> AccountMap { } fn assert_correct_remove(bef: &AccountMap, aft: &AccountMap, mint: &[u8; 32]) { - // TODO: factor this out into common assert_balanced check - let lamports_bef: u128 = bef.values().map(|acc| acc.lamports as u128).sum(); - let lamports_aft: u128 = aft.values().map(|acc| acc.lamports as u128).sum(); - assert_eq!(lamports_bef, lamports_aft); - let lst_state_lists = acc_bef_aft(&Pubkey::new_from_array(LST_STATE_LIST_ID), bef, aft); let [_, lst_state_list_acc_aft] = lst_state_lists; diff --git a/controller/program/tests/tests/admin/set_sol_value_calculator.rs b/controller/program/tests/tests/admin/set_sol_value_calculator.rs index 5850c022..24670cdd 100644 --- a/controller/program/tests/tests/admin/set_sol_value_calculator.rs +++ b/controller/program/tests/tests/admin/set_sol_value_calculator.rs @@ -421,6 +421,9 @@ proptest! { (pool, wsol_lsd, initial_svc_addr, new_balance) in any_pool_state_v2(PoolStateV2FtaStrat { u8_bools: pool_state_v2_u8_bools_normal_strat(), + // TODO: run on mutable svm with configurable clock to + // test nonzero release case too + u64s: PoolStateV2U64s::default().with_last_release_slot(Some(Just(0).boxed())), ..Default::default() }).prop_flat_map( |pool| ( @@ -463,6 +466,9 @@ proptest! { ( any_pool_state_v2(PoolStateV2FtaStrat { u8_bools: pool_state_v2_u8_bools_normal_strat(), + // TODO: run on mutable svm with configurable clock to + // test nonzero release case too + u64s: PoolStateV2U64s::default().with_last_release_slot(Some(Just(0).boxed())), ..Default::default() }), any_normal_pk(), diff --git a/controller/program/tests/tests/rebalance/chain.rs b/controller/program/tests/tests/rebalance/chain.rs index e0c59353..d5aa4665 100644 --- a/controller/program/tests/tests/rebalance/chain.rs +++ b/controller/program/tests/tests/rebalance/chain.rs @@ -1,153 +1,84 @@ -use crate::{ - common::SVM, - tests::rebalance::test_utils::{ - add_common_accounts, fixture_lst_state_data, jupsol_wsol_builder, rebalance_ixs, - StartRebalanceKeysBuilder, - }, -}; - -use inf1_test_utils::{LstStateData, LstStateListData}; - -use inf1_core::quote::rebalance::{quote_rebalance_exact_out, RebalanceQuoteArgs}; +use std::{iter::once, ops::Neg}; +use expect_test::expect; use inf1_ctl_jiminy::{ - accounts::{ - pool_state::{PoolState, PoolStatePacked}, - rebalance_record::RebalanceRecord, - }, - err::Inf1CtlErr::{ - NoSucceedingEndRebalance, PoolRebalancing, PoolWouldLoseSolValue, SlippageToleranceExceeded, + accounts::pool_state::{PoolStateV2Packed, PoolStateV2U64s}, + err::Inf1CtlErr, + instructions::rebalance::{ + end::{EndRebalanceIxData, EndRebalanceIxPreKeysOwned}, + start::{ + NewStartRebalanceIxPreAccsBuilder, StartRebalanceIxData, StartRebalanceIxPreAccs, + StartRebalanceIxPreKeysOwned, START_REBALANCE_IX_PRE_ACCS_IDX_INP_POOL_RESERVES, + START_REBALANCE_IX_PRE_ACCS_IDX_LST_STATE_LIST, + START_REBALANCE_IX_PRE_ACCS_IDX_OUT_POOL_RESERVES, + START_REBALANCE_IX_PRE_ACCS_IDX_POOL_STATE, + START_REBALANCE_IX_PRE_ACCS_IDX_REBALANCE_AUTH, + START_REBALANCE_IX_PRE_ACCS_IDX_REBALANCE_RECORD, + }, }, - instructions::rebalance::end::END_REBALANCE_IX_PRE_ACCS_IDX_INP_LST_MINT, - keys::{INSTRUCTIONS_SYSVAR_ID, POOL_STATE_ID, REBALANCE_RECORD_ID}, + keys::{INSTRUCTIONS_SYSVAR_ID, REBALANCE_RECORD_ID}, program_err::Inf1CtlCustomProgErr, + typedefs::u8bool::U8Bool, +}; +use inf1_std::{ + instructions::rebalance::{ + end::EndRebalanceIxAccs, + start::{StartRebalanceIxAccs, StartRebalanceIxArgs}, + }, + quote::rebalance::{quote_rebalance_exact_out, RebalanceQuote, RebalanceQuoteArgs}, }; - -use inf1_svc_ag_core::inf1_svc_lido_core::solido_legacy_core::TOKENKEG_PROGRAM; - use inf1_svc_ag_core::{ - inf1_svc_spl_core::{calc::SplCalc, sanctum_spl_stake_pool_core::StakePool}, - inf1_svc_wsol_core::calc::WsolCalc, + calc::SvcCalcAg, + inf1_svc_lido_core::solido_legacy_core::TOKENKEG_PROGRAM, + inf1_svc_wsol_core::{calc::WsolCalc, instructions::sol_val_calc::WsolCalcAccs}, + instructions::SvcCalcAccsAg, + SvcAg, SvcAgTy, }; - use inf1_test_utils::{ - acc_bef_aft, assert_balanced, assert_jiminy_prog_err, fixtures_accounts_opt_cloned, - get_token_account_amount, keys_signer_writable_to_metas, mock_instructions_sysvar, - mock_sys_acc, mock_token_acc, mollusk_exec, raw_token_acc, silence_mollusk_logs, AccountMap, - KeyedUiAccount, -}; - -use jiminy_cpi::program_error::INVALID_ARGUMENT; - -use mollusk_svm::{ - program::keyed_account_for_system_program, - result::{Check, InstructionResult, ProgramResult}, + acc_bef_aft, assert_diffs_lst_state_list, assert_diffs_pool_state_v2, assert_jiminy_prog_err, + assert_token_acc_diffs, fill_mock_prog_accs, get_lst_state_list, get_token_account_amount, + jupsol_fixture_svc_suf_accs, keys_signer_writable_to_metas, mock_instructions_sysvar, + mock_sys_acc, mock_token_acc, mollusk_exec, pool_state_v2_account, raw_token_acc, + token_acc_bal_diff_changed, AccountMap, Diff, DiffsPoolStateV2, KeyedUiAccount, + LstStateListChanges, VerPoolState, JUPSOL_FIXTURE_LST_IDX, WSOL_FIXTURE_LST_IDX, }; - -use sanctum_spl_token_jiminy::sanctum_spl_token_core::instructions::transfer::{ - NewTransferIxAccsBuilder, TransferIxData, TRANSFER_IX_IS_SIGNER, TRANSFER_IX_IS_WRITABLE, +use jiminy_cpi::program_error::{ProgramError, INVALID_ARGUMENT, MISSING_REQUIRED_SIGNATURE}; +use mollusk_svm::{program::keyed_account_for_system_program, Mollusk}; +use sanctum_spl_token_jiminy::sanctum_spl_token_core::{ + instructions::transfer::{ + NewTransferIxAccsBuilder, TransferIxAccs, TransferIxData, TRANSFER_IX_IS_SIGNER, + TRANSFER_IX_IS_WRITABLE, + }, + state::account::RawTokenAccount, }; - use solana_account::Account; use solana_instruction::Instruction; use solana_pubkey::Pubkey; -use proptest::prelude::*; - -struct TestFixture { - pool: PoolState, - lsl: LstStateListData, - out_lsd: LstStateData, - inp_lsd: LstStateData, - builder: StartRebalanceKeysBuilder, - withdraw_to: [u8; 32], - out_idx: u32, - inp_idx: u32, -} +use crate::common::{derive_svc_no_inf, header_lookahead, lst_state_lookahead, Cbs, SVM}; -fn setup_test_fixture() -> TestFixture { - let (pool, mut lsl, mut out_lsd, mut inp_lsd) = fixture_lst_state_data(); - let withdraw_to = Pubkey::new_unique().to_bytes(); - let builder = jupsol_wsol_builder( - pool.rebalance_authority, - out_lsd.lst_state.mint, - inp_lsd.lst_state.mint, - withdraw_to, - ); - out_lsd.lst_state.sol_value_calculator = builder.out_calc_prog; - inp_lsd.lst_state.sol_value_calculator = builder.inp_calc_prog; - let out_idx = lsl.upsert(out_lsd) as u32; - let inp_idx = lsl.upsert(inp_lsd) as u32; - - TestFixture { - pool, - lsl, - out_lsd, - inp_lsd, - builder, - withdraw_to, - out_idx, - inp_idx, - } -} - -struct OwnerAccounts { - owner: [u8; 32], - owner_token_account: [u8; 32], - owner_balance: u64, -} - -fn setup_owner_accounts(balance: u64) -> OwnerAccounts { - OwnerAccounts { - owner: Pubkey::new_unique().to_bytes(), - owner_token_account: Pubkey::new_unique().to_bytes(), - owner_balance: balance, - } -} +type StartAccs = + StartRebalanceIxAccs<[u8; 32], StartRebalanceIxPreKeysOwned, SvcCalcAccsAg, SvcCalcAccsAg>; +type StartArgs = + StartRebalanceIxArgs<[u8; 32], StartRebalanceIxPreKeysOwned, SvcCalcAccsAg, SvcCalcAccsAg>; +type EndAccs = EndRebalanceIxAccs<[u8; 32], EndRebalanceIxPreKeysOwned, SvcCalcAccsAg>; -fn standard_reserves(amount: u64) -> (u64, u64) { - (amount * 2, amount * 2) -} +const DONOR_TOKEN_ACC_ADDR: Pubkey = + Pubkey::from_str_const("9hGZcUjDQ752puJN25Bvmerj6Rt1bjoU31g3D5g8Eztt"); -fn setup_basic_rebalance_test( - fixture: &TestFixture, - amount: u64, - min_starting_out_lst: u64, - max_starting_inp_lst: u64, -) -> (Vec, AccountMap) { - let (out_reserves, inp_reserves) = standard_reserves(amount); - let instructions = rebalance_ixs( - &fixture.builder, - fixture.out_idx, - fixture.inp_idx, - amount, - min_starting_out_lst, - max_starting_inp_lst, - ); - let owner_accs = setup_owner_accounts(0); - let accounts = setup_rebalance_transaction_accounts( - fixture, - &instructions, - out_reserves, - inp_reserves, - &owner_accs, - ); - (instructions, accounts) +fn fill_rebal_prog_accs( + am: &mut AccountMap, + StartAccs { + inp_calc_prog, + out_calc_prog, + .. + }: &StartAccs, +) { + fill_mock_prog_accs(am, [*inp_calc_prog, *out_calc_prog]); } -fn create_transfer_ix( - owner: [u8; 32], - owner_token_account: [u8; 32], - inp_pool_reserves: [u8; 32], - amount: u64, -) -> Instruction { +fn create_transfer_ix(transfer_accs: &TransferIxAccs<[u8; 32]>, amount: u64) -> Instruction { let transfer_ix_data = TransferIxData::new(amount); - let transfer_accs = NewTransferIxAccsBuilder::start() - .with_src(owner_token_account) - .with_dst(inp_pool_reserves) - .with_auth(owner) - .build(); - Instruction { program_id: Pubkey::new_from_array(TOKENKEG_PROGRAM), accounts: keys_signer_writable_to_metas( @@ -159,748 +90,903 @@ fn create_transfer_ix( } } -/// Calculates the input token amount for a JupSOL -> WSOL rebalance -fn calculate_jupsol_wsol_inp_amount( - out_lst_amount: u64, - out_reserves: u64, - inp_reserves: u64, - out_mint: [u8; 32], - inp_mint: [u8; 32], -) -> u64 { - let (_, jupsol_pool_acc) = - KeyedUiAccount::from_test_fixtures_json("jupsol-pool.json").into_keyed_account(); - let jupsol_stakepool = StakePool::borsh_de(jupsol_pool_acc.data.as_slice()).unwrap(); - - let inp_calc = WsolCalc; - let out_calc = SplCalc::new(&jupsol_stakepool, 0); - - let quote = quote_rebalance_exact_out(RebalanceQuoteArgs { - amt: out_lst_amount, - inp_reserves, - out_reserves, - inp_mint, - out_mint, - inp_calc, - out_calc, - }) - .expect("quote should succeed"); - - quote.inp +fn jupsol_o_wsol_i_prefix_fixtures() -> StartRebalanceIxPreAccs<(Pubkey, Account)> { + const MIGRATION_SLOT: u64 = 0; + + let accs = StartRebalanceIxPreAccs( + NewStartRebalanceIxPreAccsBuilder::start() + .with_pool_state("pool-state") + .with_lst_state_list("lst-state-list") + .with_out_lst_mint("jupsol-mint") + .with_out_pool_reserves("jupsol-reserves") + .with_inp_lst_mint("wsol-mint") + .with_inp_pool_reserves("wsol-reserves") + // filler + .with_withdraw_to("wsol-mint") + .with_instructions("wsol-mint") + .with_out_lst_token_program("wsol-mint") + .with_rebalance_auth("wsol-mint") + .with_rebalance_record("wsol-mint") + .with_system_program("wsol-mint") + .build() + .0 + .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()), + ); + + // Rebalance does not perform migration, but our fixtures are PoolStateV1, + // so just patch it into v2 here + let ps = accs.pool_state(); + let ps_addr = ps.0; + let ps_acc = + pool_state_v2_account(VerPoolState::from_acc_data(&ps.1.data).migrated(MIGRATION_SLOT)); + let accs = accs.with_pool_state((ps_addr, ps_acc)); + + replace_fixture_fillers(accs) } -/// Creates the full account set required for StartRebalance → Token Transfer → EndRebalance transaction -fn setup_rebalance_transaction_accounts( - fixture: &TestFixture, - instructions: &[Instruction], - out_balance: u64, - inp_balance: u64, - owner_accs: &OwnerAccounts, -) -> AccountMap { - let mut accounts: AccountMap = - fixtures_accounts_opt_cloned(fixture.builder.keys_owned().seq().copied()); - - add_common_accounts( - &mut accounts, - &fixture.pool, - &fixture.lsl.lst_state_list, - Some(&fixture.lsl.all_pool_reserves), - fixture.pool.rebalance_authority, - fixture.out_lsd.lst_state.mint, - fixture.inp_lsd.lst_state.mint, - fixture.withdraw_to, - out_balance, - inp_balance, - ); - - let (sys_prog_pk, sys_prog_acc) = keyed_account_for_system_program(); - accounts.insert(sys_prog_pk, sys_prog_acc); - - accounts.insert( - Pubkey::new_from_array(owner_accs.owner), - mock_sys_acc(100_000_000_000), - ); - - accounts.insert( - Pubkey::new_from_array(owner_accs.owner_token_account), - mock_token_acc(raw_token_acc( - fixture.inp_lsd.lst_state.mint, - owner_accs.owner, - owner_accs.owner_balance, - )), - ); - - accounts.insert( - Pubkey::new_from_array(INSTRUCTIONS_SYSVAR_ID), - mock_instructions_sysvar(instructions, 0), - ); - - accounts.insert( - Pubkey::new_from_array(REBALANCE_RECORD_ID), - Account::default(), - ); - - accounts +fn jupsol_o_wsol_i_fixture_accs() -> (StartAccs, AccountMap) { + let prefix_am = jupsol_o_wsol_i_prefix_fixtures(); + let ix_prefix = + StartRebalanceIxPreAccs(prefix_am.0.each_ref().map(|(addr, _)| addr.to_bytes())); + let (out_accs, mut out_am) = jupsol_fixture_svc_suf_accs(); + let out_accs = SvcAg::SanctumSplMulti(out_accs); + let inp_accs = SvcAg::Wsol(WsolCalcAccs); + + out_am.extend(prefix_am.0); + + ( + StartAccs { + ix_prefix, + out_calc_prog: *SvcAgTy::SanctumSplMulti(()).svc_program_id(), + out_calc: out_accs, + inp_calc_prog: *SvcAgTy::Wsol(()).svc_program_id(), + inp_calc: inp_accs, + }, + out_am, + ) } -/// Creates an instruction chain with StartRebalance → Token Transfer → EndRebalance instructions. -fn build_rebalance_instruction_chain( - fixture: &TestFixture, - owner_accs: &OwnerAccounts, - out_lst_amount: u64, - owner_transfer_amount: u64, -) -> Vec { - let mut instructions = rebalance_ixs( - &fixture.builder, - fixture.out_idx, - fixture.inp_idx, - out_lst_amount, +/// Replace non-fixture filler accounts: +/// - instructions sysvar is empty and must be set after +/// - rebalance auth set to mock_sys_acc of pool_state fixture +/// - withdraw_to set to empty token acc owned by rebalance auth +fn replace_fixture_fillers( + accs: StartRebalanceIxPreAccs<(Pubkey, Account)>, +) -> StartRebalanceIxPreAccs<(Pubkey, Account)> { + const WITHDRAW_TO_FIXTURE: Pubkey = + Pubkey::from_str_const("HKxhC3j5CfWRLiHkZutR42Q2SUctMjvY49w3n5wLViqC"); + const REBAL_AUTH_LAMPORTS: u64 = 1_000_000_000; + + let rebalance_auth_addr = PoolStateV2Packed::of_acc_data(&accs.pool_state().1.data) + .unwrap() + .into_pool_state_v2() + .rebalance_authority; + let withdraw_to_acc = mock_token_acc(raw_token_acc( + accs.out_lst_mint().0.to_bytes(), + rebalance_auth_addr, 0, - u64::MAX, - ); - - let transfer_ix = create_transfer_ix( - owner_accs.owner, - owner_accs.owner_token_account, - fixture.inp_lsd.pool_reserves, - owner_transfer_amount, - ); - - // Put transfer ix between start and end - instructions.insert(1, transfer_ix); - - instructions -} - -fn execute_rebalance_transaction( - amount: u64, - out_reserves: Option, - inp_reserves: Option, -) -> (AccountMap, InstructionResult, u64) { - silence_mollusk_logs(); - - let fixture = setup_test_fixture(); - - let out_reserves = out_reserves.unwrap_or(amount * 2); - let inp_reserves = inp_reserves.unwrap_or(amount * 2); - - let owner_transfer_amount = calculate_jupsol_wsol_inp_amount( - amount, - out_reserves, - inp_reserves, - fixture.out_lsd.lst_state.mint, - fixture.inp_lsd.lst_state.mint, - ); - - let owner_accs = setup_owner_accounts(owner_transfer_amount); - - let instructions = - build_rebalance_instruction_chain(&fixture, &owner_accs, amount, owner_transfer_amount); - - let accounts = setup_rebalance_transaction_accounts( - &fixture, - &instructions, - out_reserves, - inp_reserves, - &owner_accs, - ); - - let accs_bef = accounts.clone(); - - let mut accs_vec: Vec<_> = accounts.iter().map(|(k, v)| (*k, v.clone())).collect(); - accs_vec.sort_by_key(|(k, _)| *k); - let result = SVM.with(|svm| svm.process_instruction_chain(&instructions, &accs_vec)); - - // Run StartRebalance ix separately to extract old_total_sol_value - // from RebalanceRecord - let (_, start_result) = SVM.with(|svm| mollusk_exec(svm, &instructions[0], &accs_bef)); - let rr_aft = start_result - .resulting_accounts - .iter() - .find(|(pk, _)| pk.to_bytes() == REBALANCE_RECORD_ID) - .map(|(_, acc)| acc) - .expect("rebalance record after start"); - let rebalance_record = - unsafe { RebalanceRecord::of_acc_data(&rr_aft.data) }.expect("rebalance record"); - - (accs_bef, result, rebalance_record.old_total_sol_value) + )); + accs.with_withdraw_to((WITHDRAW_TO_FIXTURE, withdraw_to_acc)) + .with_instructions((INSTRUCTIONS_SYSVAR_ID.into(), Default::default())) + .with_out_lst_token_program(mollusk_svm_programs_token::token::keyed_account()) + .with_rebalance_auth(( + rebalance_auth_addr.into(), + mock_sys_acc(REBAL_AUTH_LAMPORTS), + )) + .with_rebalance_record((REBALANCE_RECORD_ID.into(), Default::default())) + .with_system_program(keyed_account_for_system_program()) } -/// Validate that the transaction succeeded, -/// the pool state is not rebalancing before or after, -/// the pool did not lose SOL value, -/// the RebalanceRecord is properly closed, -/// and lamports are balanced. -fn assert_rebalance_transaction_success( - accs_bef: &AccountMap, - result: &InstructionResult, - old_total_sol_value: u64, -) { - assert_eq!(result.program_result, ProgramResult::Success); - - let aft: AccountMap = result.resulting_accounts.clone().into_iter().collect(); - let [pool_state_bef, pool_state_aft] = - acc_bef_aft(&Pubkey::new_from_array(POOL_STATE_ID), accs_bef, &aft).map(|a| { - PoolStatePacked::of_acc_data(&a.data) - .unwrap() - .into_pool_state() - }); - - assert_eq!(pool_state_bef.is_rebalancing, 0); - assert_eq!(pool_state_aft.is_rebalancing, 0); - assert!(pool_state_aft.total_sol_value >= old_total_sol_value); - - let rr_aft = aft - .iter() - .find(|(pk, _)| pk.to_bytes() == REBALANCE_RECORD_ID); - assert_eq!(rr_aft.unwrap().1.lamports, 0); - - assert_balanced(accs_bef, &aft); +fn to_start_ix(start: &StartArgs) -> Instruction { + Instruction { + program_id: Pubkey::new_from_array(inf1_ctl_jiminy::ID), + accounts: keys_signer_writable_to_metas( + start.accs.keys_owned().seq(), + start.accs.is_signer().seq(), + start.accs.is_writer().seq(), + ), + data: StartRebalanceIxData::new(start.to_full()).as_buf().into(), + } } -#[test] -fn rebalance_transaction_success() { - let (accs_bef, result, old_total_sol_value) = - execute_rebalance_transaction(100_000, None, None); - - assert_rebalance_transaction_success(&accs_bef, &result, old_total_sol_value); - - // Assert all accounts are rent-exempt after transaction - SVM.with(|svm| { - assert!(result.run_checks(&[Check::all_rent_exempt()], &svm.config, svm)); - }); +fn to_end_ix(end: &EndAccs) -> Instruction { + Instruction { + program_id: Pubkey::new_from_array(inf1_ctl_jiminy::ID), + accounts: keys_signer_writable_to_metas( + end.keys_owned().seq(), + end.is_signer().seq(), + end.is_writer().seq(), + ), + data: EndRebalanceIxData::as_buf().into(), + } } -#[test] -fn missing_end_rebalance() { - silence_mollusk_logs(); - - let fixture = setup_test_fixture(); - let (out_reserves, inp_reserves) = standard_reserves(100_000); - - let mut instructions = rebalance_ixs( - &fixture.builder, - fixture.out_idx, - fixture.inp_idx, - 100_000, - 0, - u64::MAX, - ); - // Remove EndRebalance - instructions.pop(); - - let owner_accs = setup_owner_accounts(0); +/// Currently assumes that StartRebalance is the first ix +/// and EndRebalance is the last ix +fn to_inp( + start: &StartArgs, + mid: impl IntoIterator, + end: &Option, + ams: impl IntoIterator, +) -> (Vec, AccountMap) { + let start_ix = to_start_ix(start); + let end_ix_opt = end.as_ref().map(to_end_ix); + let ixs: Vec<_> = once(start_ix).chain(mid).chain(end_ix_opt).collect(); - let accounts = setup_rebalance_transaction_accounts( - &fixture, - &instructions, - out_reserves, - inp_reserves, - &owner_accs, + let mut am = ams.into_iter().flat_map(|am| am.into_iter()).collect(); + fill_rebal_prog_accs(&mut am, &start.accs); + am.insert( + Pubkey::new_from_array(INSTRUCTIONS_SYSVAR_ID), + // curr_ix=0, assumes StartRebalance is first ix + mock_instructions_sysvar(&ixs, 0), ); - let (_, result) = SVM.with(|svm| mollusk_exec(svm, &instructions[0], &accounts)); - - assert_jiminy_prog_err( - &result.program_result, - Inf1CtlCustomProgErr(NoSucceedingEndRebalance), - ); + (ixs, am) } -#[test] -fn wrong_end_mint() { - silence_mollusk_logs(); - - let fixture = setup_test_fixture(); - let (out_reserves, inp_reserves) = standard_reserves(100_000); - - let mut instructions = rebalance_ixs( - &fixture.builder, - fixture.out_idx, - fixture.inp_idx, - 100_000, - 0, - u64::MAX, - ); +fn rebalance_test( + svm: &Mollusk, + bef: &AccountMap, + ixs: &[Instruction], + out_calc: &SvcCalcAg, + inp_calc: &SvcCalcAg, + expected_err: Option>, +) { + let result = mollusk_exec(svm, ixs, bef); - // Change EndRebalance instruction to use wrong inp_lst_mint - if let Some(end_ix) = instructions.get_mut(1) { - if end_ix.accounts.len() > END_REBALANCE_IX_PRE_ACCS_IDX_INP_LST_MINT { - end_ix.accounts[END_REBALANCE_IX_PRE_ACCS_IDX_INP_LST_MINT].pubkey = - Pubkey::new_unique(); + match expected_err { + None => { + let aft = result.unwrap().resulting_accounts; + let clock = &svm.sysvars.clock; + assert_correct_rebalance(bef, &aft, ixs, out_calc, inp_calc, clock.slot); + } + Some(e) => { + assert_jiminy_prog_err(&result.unwrap_err(), e); } } +} - let owner_accs = setup_owner_accounts(0); +fn assert_correct_rebalance( + bef: &AccountMap, + aft: &AccountMap, + ixs: &[Instruction], + out_calc: &SvcCalcAg, + inp_calc: &SvcCalcAg, + slot: u64, +) { + let start_ix = &ixs[0]; - let accounts = setup_rebalance_transaction_accounts( - &fixture, - &instructions, - out_reserves, - inp_reserves, - &owner_accs, + let inf1_ctl_jiminy::instructions::rebalance::start::StartRebalanceIxArgs { + out_lst_index, + inp_lst_index, + amount, + .. + } = StartRebalanceIxData::parse_no_discm( + start_ix.data.split_first().unwrap().1.try_into().unwrap(), ); + let [out_lst_index, inp_lst_index] = [out_lst_index, inp_lst_index].map(|x| x as usize); - let (_, result) = SVM.with(|svm| mollusk_exec(svm, &instructions[0], &accounts)); + // rebalance record should not exist in either bef or aft + let rr_addr = start_ix.accounts[START_REBALANCE_IX_PRE_ACCS_IDX_REBALANCE_RECORD].pubkey; + [bef, aft].into_iter().for_each(|am| { + let rr = &am[&rr_addr]; + assert!(*rr == Default::default(), "{rr:?}"); + }); - assert_jiminy_prog_err( - &result.program_result, - Inf1CtlCustomProgErr(NoSucceedingEndRebalance), - ); -} + let [[out_reserves_bef, out_reserves_aft], [inp_reserves_bef, _inp_reserves_aft]] = [ + START_REBALANCE_IX_PRE_ACCS_IDX_OUT_POOL_RESERVES, + START_REBALANCE_IX_PRE_ACCS_IDX_INP_POOL_RESERVES, + ] + .map(|i| { + acc_bef_aft(&start_ix.accounts[i].pubkey, bef, aft) + .map(|a| RawTokenAccount::of_acc_data(&a.data).unwrap()) + }); -#[test] -fn no_transfer() { - silence_mollusk_logs(); + // out reserves should go down by amount arg + // unless its the same mint + if inp_lst_index != out_lst_index { + assert_token_acc_diffs( + out_reserves_bef, + out_reserves_aft, + &token_acc_bal_diff_changed(out_reserves_bef, i128::from(amount).neg()), + ); + } - let fixture = setup_test_fixture(); - let (instructions, accounts) = setup_basic_rebalance_test(&fixture, 100_000, 0, u64::MAX); + let [ps_addr, list_addr] = [ + START_REBALANCE_IX_PRE_ACCS_IDX_POOL_STATE, + START_REBALANCE_IX_PRE_ACCS_IDX_LST_STATE_LIST, + ] + .map(|i| start_ix.accounts[i].pubkey); + + let [out_reserves_bef, inp_reserves_bef] = + [out_reserves_bef, inp_reserves_bef].map(|a| u64::from_le_bytes(a.amount)); + + let [mut list_bef, list_aft] = + acc_bef_aft(&list_addr, bef, aft).map(|a| get_lst_state_list(&a.data)); + + let cbs = [ + (out_lst_index, out_reserves_bef, out_calc), + (inp_lst_index, inp_reserves_bef, inp_calc), + ] + .map(|(idx, balance, calc)| { + let old_state = list_bef[idx]; + let ret = Cbs { + calc, + balance, + old_sol_val: old_state.sol_value, + }; + + list_bef[idx] = lst_state_lookahead(old_state, balance, calc); + + ret + }); - let mut accs_vec: Vec<_> = accounts.iter().map(|(k, v)| (*k, v.clone())).collect(); - accs_vec.sort_by_key(|(k, _)| *k); - let result = SVM.with(|svm| svm.process_instruction_chain(&instructions, &accs_vec)); + let [ps_bef, ps_aft] = acc_bef_aft(&ps_addr, bef, aft).map(|a| { + PoolStateV2Packed::of_acc_data(&a.data) + .unwrap() + .into_pool_state_v2() + }); + let ps_bef = header_lookahead(ps_bef, cbs, slot); + + // is_rebalancing=false for both before and aft + [ps_bef, ps_aft] + .into_iter() + .for_each(|p| assert!(!U8Bool(&p.is_rebalancing).to_bool())); + + let [tsv_bef, tsv_aft] = [ps_bef, ps_aft].map(|ps| ps.total_sol_value); + assert!(tsv_aft >= tsv_bef, "{tsv_aft} < {tsv_bef}",); + let tsv_inc = ps_aft.total_sol_value - ps_bef.total_sol_value; + + let ps_diffs = DiffsPoolStateV2 { + u64s: PoolStateV2U64s::default() + .with_total_sol_value(Diff::Changed(tsv_bef, tsv_aft)) + // if rebalance resulted in yield, + // it should inc withheld_lamports + .with_withheld_lamports(Diff::Changed( + ps_bef.withheld_lamports, + ps_bef.withheld_lamports + tsv_inc, + )), + ..Default::default() + }; + assert_diffs_pool_state_v2(&ps_diffs, &ps_bef, &ps_aft); + + let (list_diffs, inp_svc) = LstStateListChanges::new(&list_bef) + .with_det_svc_by_mint(&list_aft[inp_lst_index].mint, &list_aft); + let (list_diffs, out_svc) = + list_diffs.with_det_svc_by_mint(&list_aft[out_lst_index].mint, &list_aft); + + // assert everything else other than sol value didnt change + assert_diffs_lst_state_list(list_diffs.build(), list_bef, list_aft); + + assert!(inp_svc >= 0); + assert!(out_svc <= 0); - assert_jiminy_prog_err( - &result.program_result, - Inf1CtlCustomProgErr(PoolWouldLoseSolValue), + assert_eq!( + inp_svc + out_svc, + i128::from(tsv_inc), + "{} - {} != {}", + inp_svc, + out_svc.neg(), + tsv_inc ); } #[test] -fn insufficient_transfer() { - silence_mollusk_logs(); - - let amount = 100_000; - let fixture = setup_test_fixture(); - let (out_reserves, inp_reserves) = standard_reserves(amount); - - let required_amount = calculate_jupsol_wsol_inp_amount( - amount, - out_reserves, +fn rebal_jupsol_o_wsol_i_fixture_basic() { + const AMOUNT: u64 = 100_000; + const CURR_EPOCH: u64 = 0; + + let (start_accs, am) = jupsol_o_wsol_i_fixture_accs(); + + let start_args = StartArgs { + out_lst_index: JUPSOL_FIXTURE_LST_IDX.try_into().unwrap(), + inp_lst_index: WSOL_FIXTURE_LST_IDX.try_into().unwrap(), + amount: AMOUNT, + min_starting_out_lst: 0, + max_starting_inp_lst: u64::MAX, + accs: start_accs, + }; + + let out_calc = derive_svc_no_inf(&am, &start_accs.out_calc, CURR_EPOCH); + let inp_calc = SvcAg::Wsol(WsolCalc); + let [inp_reserves, out_reserves] = [ + start_accs.ix_prefix.inp_pool_reserves(), + start_accs.ix_prefix.out_pool_reserves(), + ] + .map(|a| get_token_account_amount(&am[&(*a).into()].data)); + + let RebalanceQuote { inp, out, .. } = quote_rebalance_exact_out(RebalanceQuoteArgs { + amt: AMOUNT, inp_reserves, - fixture.out_lsd.lst_state.mint, - fixture.inp_lsd.lst_state.mint, - ); - - let insufficient_amount = required_amount / 2; - let owner_accs = setup_owner_accounts(insufficient_amount); - - let instructions = - build_rebalance_instruction_chain(&fixture, &owner_accs, amount, insufficient_amount); - - let accounts = setup_rebalance_transaction_accounts( - &fixture, - &instructions, out_reserves, - inp_reserves, - &owner_accs, - ); - - let mut accs_vec: Vec<_> = accounts.iter().map(|(k, v)| (*k, v.clone())).collect(); - accs_vec.sort_by_key(|(k, _)| *k); - let result = SVM.with(|svm| svm.process_instruction_chain(&instructions, &accs_vec)); - - assert_jiminy_prog_err( - &result.program_result, - Inf1CtlCustomProgErr(PoolWouldLoseSolValue), - ); + inp_mint: *start_accs.ix_prefix.inp_lst_mint(), + out_mint: *start_accs.ix_prefix.out_lst_mint(), + inp_calc, + out_calc, + }) + .unwrap(); + + let (ixs, bef) = to_inp( + &start_args, + [create_transfer_ix( + &NewTransferIxAccsBuilder::start() + .with_auth(*start_accs.ix_prefix.rebalance_auth()) + .with_dst(*start_accs.ix_prefix.inp_pool_reserves()) + .with_src(DONOR_TOKEN_ACC_ADDR.to_bytes()) + .build(), + inp, + )], + &Some(EndAccs::from_start(start_accs)), + [ + am, + once(( + DONOR_TOKEN_ACC_ADDR, + mock_token_acc(raw_token_acc( + *start_accs.ix_prefix.inp_lst_mint(), + *start_accs.ix_prefix.rebalance_auth(), + inp, + )), + )) + .collect(), + ], + ); + + SVM.with(|svm| rebalance_test(svm, &bef, &ixs, &out_calc, &inp_calc, None::)); + + expect![[r#" + ( + 100000, + 111331, + ) + "#]] + .assert_debug_eq(&(out, inp)); } #[test] -fn slippage_min_out_violated() { - silence_mollusk_logs(); - - let fixture = setup_test_fixture(); - - let (instructions, accounts) = - setup_basic_rebalance_test(&fixture, 100_000, u64::MAX, u64::MAX); - - let (_, result) = SVM.with(|svm| mollusk_exec(svm, &instructions[0], &accounts)); - - assert_jiminy_prog_err( - &result.program_result, - Inf1CtlCustomProgErr(SlippageToleranceExceeded), +fn rebal_jupsol_o_wsol_i_fixture_missing_end() { + const AMOUNT: u64 = 100_000; + const INP_AMT: u64 = 111_331; + const CURR_EPOCH: u64 = 0; + + let (start_accs, am) = jupsol_o_wsol_i_fixture_accs(); + + let start_args = StartArgs { + out_lst_index: JUPSOL_FIXTURE_LST_IDX.try_into().unwrap(), + inp_lst_index: WSOL_FIXTURE_LST_IDX.try_into().unwrap(), + amount: AMOUNT, + min_starting_out_lst: 0, + max_starting_inp_lst: u64::MAX, + accs: start_accs, + }; + + let out_calc = derive_svc_no_inf(&am, &start_accs.out_calc, CURR_EPOCH); + let inp_calc = SvcAg::Wsol(WsolCalc); + + let (ixs, bef) = to_inp( + &start_args, + [create_transfer_ix( + &NewTransferIxAccsBuilder::start() + .with_auth(*start_accs.ix_prefix.rebalance_auth()) + .with_dst(*start_accs.ix_prefix.inp_pool_reserves()) + .with_src(DONOR_TOKEN_ACC_ADDR.to_bytes()) + .build(), + INP_AMT, + )], + // No EndRebalance + &None, + [ + am, + once(( + DONOR_TOKEN_ACC_ADDR, + mock_token_acc(raw_token_acc( + *start_accs.ix_prefix.inp_lst_mint(), + *start_accs.ix_prefix.rebalance_auth(), + INP_AMT, + )), + )) + .collect(), + ], ); -} - -#[test] -fn slippage_max_inp_violated() { - silence_mollusk_logs(); - - let fixture = setup_test_fixture(); - let (instructions, accounts) = setup_basic_rebalance_test(&fixture, 100_000, 0, 1); - - let (_, result) = SVM.with(|svm| mollusk_exec(svm, &instructions[0], &accounts)); - - assert_jiminy_prog_err( - &result.program_result, - Inf1CtlCustomProgErr(SlippageToleranceExceeded), - ); + SVM.with(|svm| { + rebalance_test( + svm, + &bef, + &ixs, + &out_calc, + &inp_calc, + Some(Inf1CtlCustomProgErr(Inf1CtlErr::NoSucceedingEndRebalance)), + ) + }); } #[test] -fn multi_instruction_transfer_chain() { - silence_mollusk_logs(); - - let amount = 100_000; - let fixture = setup_test_fixture(); - let (out_reserves, inp_reserves) = standard_reserves(amount); - - let total_transfer = calculate_jupsol_wsol_inp_amount( - amount, - out_reserves, - inp_reserves, - fixture.out_lsd.lst_state.mint, - fixture.inp_lsd.lst_state.mint, - ); - - let owner_accs = setup_owner_accounts(total_transfer); - - let mut instructions = rebalance_ixs( - &fixture.builder, - fixture.out_idx, - fixture.inp_idx, - amount, - 0, - u64::MAX, +fn rebal_jupsol_o_wsol_i_fixture_wrong_end_mint() { + const AMOUNT: u64 = 100_000; + const INP_AMT: u64 = 111_331; + const CURR_EPOCH: u64 = 0; + + let (start_accs, mut am) = jupsol_o_wsol_i_fixture_accs(); + + let start_args = StartArgs { + out_lst_index: JUPSOL_FIXTURE_LST_IDX.try_into().unwrap(), + inp_lst_index: WSOL_FIXTURE_LST_IDX.try_into().unwrap(), + amount: AMOUNT, + min_starting_out_lst: 0, + max_starting_inp_lst: u64::MAX, + accs: start_accs, + }; + + let out_calc = derive_svc_no_inf(&am, &start_accs.out_calc, CURR_EPOCH); + let inp_calc = SvcAg::Wsol(WsolCalc); + + // override end mint for EndAccs + let mut end_accs = EndAccs::from_start(start_accs); + let wrong_inp_lst_mint = Pubkey::new_unique(); + let inp_lst_mint_acc = am[&(*end_accs.ix_prefix.inp_lst_mint()).into()].clone(); + am.insert(wrong_inp_lst_mint, inp_lst_mint_acc); + end_accs + .ix_prefix + .set_inp_lst_mint(wrong_inp_lst_mint.to_bytes()); + + let (ixs, bef) = to_inp( + &start_args, + [create_transfer_ix( + &NewTransferIxAccsBuilder::start() + .with_auth(*start_accs.ix_prefix.rebalance_auth()) + .with_dst(*start_accs.ix_prefix.inp_pool_reserves()) + .with_src(DONOR_TOKEN_ACC_ADDR.to_bytes()) + .build(), + INP_AMT, + )], + &Some(end_accs), + [ + am, + once(( + DONOR_TOKEN_ACC_ADDR, + mock_token_acc(raw_token_acc( + *start_accs.ix_prefix.inp_lst_mint(), + *start_accs.ix_prefix.rebalance_auth(), + INP_AMT, + )), + )) + .collect(), + ], ); - let transfer1 = total_transfer / 3; - let transfer2 = total_transfer / 3; - let transfer3 = total_transfer - transfer1 - transfer2; - - let transfer_ix1 = create_transfer_ix( - owner_accs.owner, - owner_accs.owner_token_account, - fixture.inp_lsd.pool_reserves, - transfer1, - ); - let transfer_ix2 = create_transfer_ix( - owner_accs.owner, - owner_accs.owner_token_account, - fixture.inp_lsd.pool_reserves, - transfer2, - ); - let transfer_ix3 = create_transfer_ix( - owner_accs.owner, - owner_accs.owner_token_account, - fixture.inp_lsd.pool_reserves, - transfer3, - ); - - instructions.insert(1, transfer_ix1); - instructions.insert(2, transfer_ix2); - instructions.insert(3, transfer_ix3); - - let accounts = setup_rebalance_transaction_accounts( - &fixture, - &instructions, - out_reserves, - inp_reserves, - &owner_accs, - ); - - let accs_bef = accounts.clone(); - - let mut accs_vec: Vec<_> = accounts.iter().map(|(k, v)| (*k, v.clone())).collect(); - accs_vec.sort_by_key(|(k, _)| *k); - let result = SVM.with(|svm| svm.process_instruction_chain(&instructions, &accs_vec)); - - let (_, start_result) = SVM.with(|svm| mollusk_exec(svm, &instructions[0], &accs_bef)); - let rr_aft = start_result - .resulting_accounts - .iter() - .find(|(pk, _)| pk.to_bytes() == REBALANCE_RECORD_ID) - .map(|(_, acc)| acc) - .expect("rebalance record after start"); - let rebalance_record = - unsafe { RebalanceRecord::of_acc_data(&rr_aft.data) }.expect("rebalance record"); - - assert_rebalance_transaction_success(&accs_bef, &result, rebalance_record.old_total_sol_value); + SVM.with(|svm| { + rebalance_test( + svm, + &bef, + &ixs, + &out_calc, + &inp_calc, + Some(Inf1CtlCustomProgErr(Inf1CtlErr::NoSucceedingEndRebalance)), + ) + }); } #[test] -fn rebalance_chain_updates_reserves_correctly() { - silence_mollusk_logs(); - - let amount = 100_000; - let fixture = setup_test_fixture(); - let (out_reserves, inp_reserves) = standard_reserves(amount); - - let transfer_amount = calculate_jupsol_wsol_inp_amount( - amount, - out_reserves, +fn rebal_jupsol_o_wsol_i_fixture_insufficient_transfer() { + const AMOUNT: u64 = 100_000; + const CURR_EPOCH: u64 = 0; + + let (start_accs, am) = jupsol_o_wsol_i_fixture_accs(); + + let start_args = StartArgs { + out_lst_index: JUPSOL_FIXTURE_LST_IDX.try_into().unwrap(), + inp_lst_index: WSOL_FIXTURE_LST_IDX.try_into().unwrap(), + amount: AMOUNT, + min_starting_out_lst: 0, + max_starting_inp_lst: u64::MAX, + accs: start_accs, + }; + + let out_calc = derive_svc_no_inf(&am, &start_accs.out_calc, CURR_EPOCH); + let inp_calc = SvcAg::Wsol(WsolCalc); + let [inp_reserves, out_reserves] = [ + start_accs.ix_prefix.inp_pool_reserves(), + start_accs.ix_prefix.out_pool_reserves(), + ] + .map(|a| get_token_account_amount(&am[&(*a).into()].data)); + + let RebalanceQuote { inp, .. } = quote_rebalance_exact_out(RebalanceQuoteArgs { + amt: AMOUNT, inp_reserves, - fixture.out_lsd.lst_state.mint, - fixture.inp_lsd.lst_state.mint, - ); - - let owner_accs = setup_owner_accounts(transfer_amount); - - let instructions = - build_rebalance_instruction_chain(&fixture, &owner_accs, amount, transfer_amount); - - let accounts = setup_rebalance_transaction_accounts( - &fixture, - &instructions, out_reserves, - inp_reserves, - &owner_accs, + inp_mint: *start_accs.ix_prefix.inp_lst_mint(), + out_mint: *start_accs.ix_prefix.out_lst_mint(), + inp_calc, + out_calc, + }) + .unwrap(); + // transfer 1 less than required + let insuff = inp - 1; + + let (ixs, bef) = to_inp( + &start_args, + [create_transfer_ix( + &NewTransferIxAccsBuilder::start() + .with_auth(*start_accs.ix_prefix.rebalance_auth()) + .with_dst(*start_accs.ix_prefix.inp_pool_reserves()) + .with_src(DONOR_TOKEN_ACC_ADDR.to_bytes()) + .build(), + insuff, + )], + &Some(EndAccs::from_start(start_accs)), + [ + am, + once(( + DONOR_TOKEN_ACC_ADDR, + mock_token_acc(raw_token_acc( + *start_accs.ix_prefix.inp_lst_mint(), + *start_accs.ix_prefix.rebalance_auth(), + insuff, + )), + )) + .collect(), + ], ); - let accs_bef = accounts.clone(); - - let mut accs_vec: Vec<_> = accounts.iter().map(|(k, v)| (*k, v.clone())).collect(); - accs_vec.sort_by_key(|(k, _)| *k); - let result = SVM.with(|svm| svm.process_instruction_chain(&instructions, &accs_vec)); - - assert_eq!(result.program_result, ProgramResult::Success); - - let aft: AccountMap = result.resulting_accounts.into_iter().collect(); - let [out_reserves_bef, out_reserves_aft] = acc_bef_aft( - &Pubkey::new_from_array(fixture.out_lsd.pool_reserves), - &accs_bef, - &aft, - ) - .map(|a| get_token_account_amount(&a.data)); - - let [inp_reserves_bef, inp_reserves_aft] = acc_bef_aft( - &Pubkey::new_from_array(fixture.inp_lsd.pool_reserves), - &accs_bef, - &aft, - ) - .map(|a| get_token_account_amount(&a.data)); + SVM.with(|svm| { + rebalance_test( + svm, + &bef, + &ixs, + &out_calc, + &inp_calc, + Some(Inf1CtlCustomProgErr(Inf1CtlErr::PoolWouldLoseSolValue)), + ) + }); +} - let [withdraw_to_bef, withdraw_to_aft] = acc_bef_aft( - &Pubkey::new_from_array(fixture.withdraw_to), - &accs_bef, - &aft, - ) - .map(|a| get_token_account_amount(&a.data)); +enum SlippageDir { + MinOut, + MaxInp, +} - assert_eq!( - out_reserves_aft, - out_reserves_bef - amount, - "out reserves should decrease by withdrawal amount" - ); - assert_eq!( - inp_reserves_aft, - inp_reserves_bef + transfer_amount, - "inp reserves should increase by transfer amount" - ); - assert_eq!( - withdraw_to_aft, - withdraw_to_bef + amount, - "withdraw_to should receive withdrawn LST" +fn rebal_jupsol_o_wsol_i_fixture_slippage_violated(dir: SlippageDir) { + const AMOUNT: u64 = 100_000; + const INP_AMT: u64 = 111_331; + const CURR_EPOCH: u64 = 0; + + let (start_accs, am) = jupsol_o_wsol_i_fixture_accs(); + + let [inp_reserves, out_reserves] = [ + start_accs.ix_prefix.inp_pool_reserves(), + start_accs.ix_prefix.out_pool_reserves(), + ] + .map(|a| get_token_account_amount(&am[&(*a).into()].data)); + + // set just exceeding the slippage limit + let [min_starting_out_lst, max_starting_inp_lst] = match dir { + SlippageDir::MaxInp => [0, inp_reserves - 1], + SlippageDir::MinOut => [out_reserves + 1, u64::MAX], + }; + + let start_args = StartArgs { + out_lst_index: JUPSOL_FIXTURE_LST_IDX.try_into().unwrap(), + inp_lst_index: WSOL_FIXTURE_LST_IDX.try_into().unwrap(), + amount: AMOUNT, + min_starting_out_lst, + max_starting_inp_lst, + accs: start_accs, + }; + + let out_calc = derive_svc_no_inf(&am, &start_accs.out_calc, CURR_EPOCH); + let inp_calc = SvcAg::Wsol(WsolCalc); + + let (ixs, bef) = to_inp( + &start_args, + [create_transfer_ix( + &NewTransferIxAccsBuilder::start() + .with_auth(*start_accs.ix_prefix.rebalance_auth()) + .with_dst(*start_accs.ix_prefix.inp_pool_reserves()) + .with_src(DONOR_TOKEN_ACC_ADDR.to_bytes()) + .build(), + INP_AMT, + )], + &Some(EndAccs::from_start(start_accs)), + [ + am, + once(( + DONOR_TOKEN_ACC_ADDR, + mock_token_acc(raw_token_acc( + *start_accs.ix_prefix.inp_lst_mint(), + *start_accs.ix_prefix.rebalance_auth(), + INP_AMT, + )), + )) + .collect(), + ], ); - assert_balanced(&accs_bef, &aft); + SVM.with(|svm| { + rebalance_test( + svm, + &bef, + &ixs, + &out_calc, + &inp_calc, + Some(Inf1CtlCustomProgErr(Inf1CtlErr::SlippageToleranceExceeded)), + ) + }); } #[test] -fn rebalance_record_lifecycle() { - silence_mollusk_logs(); - - let amount = 100_000; - - let (accs_bef, result, old_total_sol_value) = execute_rebalance_transaction(amount, None, None); - - assert_eq!(result.program_result, ProgramResult::Success); - - let aft: AccountMap = result.resulting_accounts.clone().into_iter().collect(); - let [pool_state_bef, pool_state_aft] = - acc_bef_aft(&Pubkey::new_from_array(POOL_STATE_ID), &accs_bef, &aft).map(|a| { - PoolStatePacked::of_acc_data(&a.data) - .expect("pool state") - .into_pool_state() - }); +fn rebal_jupsol_o_wsol_i_fixture_slippage_min_out_violated() { + rebal_jupsol_o_wsol_i_fixture_slippage_violated(SlippageDir::MinOut); +} - assert_eq!(pool_state_bef.is_rebalancing, 0); +#[test] +fn rebal_jupsol_o_wsol_i_fixture_slippage_max_inp_violated() { + rebal_jupsol_o_wsol_i_fixture_slippage_violated(SlippageDir::MaxInp); +} - let rr_bef = accs_bef - .iter() - .find(|(pk, _)| pk.to_bytes() == REBALANCE_RECORD_ID); - assert_eq!( - rr_bef.map(|(_, acc)| acc.lamports).unwrap(), - 0, - "rebalance record should not exist initially" +#[test] +fn rebal_jupsol_o_wsol_i_fixture_pool_already_rebalancing() { + const AMOUNT: u64 = 100_000; + const INP_AMT: u64 = 111_331; + const CURR_EPOCH: u64 = 0; + + let (start_accs, am) = jupsol_o_wsol_i_fixture_accs(); + + let start_args = StartArgs { + out_lst_index: JUPSOL_FIXTURE_LST_IDX.try_into().unwrap(), + inp_lst_index: WSOL_FIXTURE_LST_IDX.try_into().unwrap(), + amount: AMOUNT, + min_starting_out_lst: 0, + max_starting_inp_lst: u64::MAX, + accs: start_accs, + }; + + let out_calc = derive_svc_no_inf(&am, &start_accs.out_calc, CURR_EPOCH); + let inp_calc = SvcAg::Wsol(WsolCalc); + + let (ixs, bef) = to_inp( + &start_args, + [ + create_transfer_ix( + &NewTransferIxAccsBuilder::start() + .with_auth(*start_accs.ix_prefix.rebalance_auth()) + .with_dst(*start_accs.ix_prefix.inp_pool_reserves()) + .with_src(DONOR_TOKEN_ACC_ADDR.to_bytes()) + .build(), + INP_AMT, + ), + // create another StartRebalanceIx + // in the middle before the end + to_start_ix(&start_args), + ], + &Some(EndAccs::from_start(start_accs)), + [ + am, + once(( + DONOR_TOKEN_ACC_ADDR, + mock_token_acc(raw_token_acc( + *start_accs.ix_prefix.inp_lst_mint(), + *start_accs.ix_prefix.rebalance_auth(), + INP_AMT, + )), + )) + .collect(), + ], ); - assert_eq!(pool_state_bef.is_rebalancing, 0); - assert_eq!(pool_state_aft.is_rebalancing, 0); - - assert!(pool_state_aft.total_sol_value >= old_total_sol_value); - - let rr_aft = aft - .iter() - .find(|(pk, _)| pk.to_bytes() == REBALANCE_RECORD_ID); - assert_eq!(rr_aft.unwrap().1.lamports, 0); - - // Verify RebalanceRecord creation by executing just StartRebalance - let fixture2 = setup_test_fixture(); - let (start_ixs, start_accounts) = setup_basic_rebalance_test(&fixture2, amount, 0, u64::MAX); - - let (_, start_result) = SVM.with(|svm| mollusk_exec(svm, &start_ixs[0], &start_accounts)); - assert_eq!(start_result.program_result, ProgramResult::Success); - - let start_aft: AccountMap = start_result.resulting_accounts.into_iter().collect(); - let [pool_state_bef, pool_state_aft] = acc_bef_aft( - &Pubkey::new_from_array(POOL_STATE_ID), - &start_accounts, - &start_aft, - ) - .map(|a| { - PoolStatePacked::of_acc_data(&a.data) - .expect("pool state") - .into_pool_state() + SVM.with(|svm| { + rebalance_test( + svm, + &bef, + &ixs, + &out_calc, + &inp_calc, + Some(Inf1CtlCustomProgErr(Inf1CtlErr::PoolRebalancing)), + ) }); - - assert_eq!(pool_state_bef.is_rebalancing, 0); - assert_eq!(pool_state_aft.is_rebalancing, 1); - - let rr_aft = start_aft - .iter() - .find(|(pk, _)| pk.to_bytes() == REBALANCE_RECORD_ID) - .map(|(_, acc)| acc) - .expect("rebalance record after start"); - - assert!(rr_aft.lamports > 0); - - let rebalance_record = - unsafe { RebalanceRecord::of_acc_data(&rr_aft.data) }.expect("rebalance record"); - - assert_eq!(rebalance_record.inp_lst_index, fixture2.inp_idx); - - assert!(rebalance_record.old_total_sol_value > 0); - - assert_balanced(&accs_bef, &aft); } #[test] -fn pool_already_rebalancing() { - silence_mollusk_logs(); - - let fixture = setup_test_fixture(); - let owner_accs = setup_owner_accounts(0); - let (out_reserves, inp_reserves) = standard_reserves(100_000); - - let first_instructions = rebalance_ixs( - &fixture.builder, - fixture.out_idx, - fixture.inp_idx, - 100_000, - 0, - u64::MAX, +fn rebal_jupsol_o_wsol_i_fixture_unauthorized() { + const AMOUNT: u64 = 100_000; + const INP_AMT: u64 = 111_331; + const CURR_EPOCH: u64 = 0; + + let (mut start_accs, mut am) = jupsol_o_wsol_i_fixture_accs(); + + // create unauthorized rebalance auth acc + let unauth = Pubkey::new_unique(); + start_accs.ix_prefix.set_rebalance_auth(unauth.to_bytes()); + am.insert(unauth, mock_sys_acc(1_000_000_000)); + + let start_args = StartArgs { + out_lst_index: JUPSOL_FIXTURE_LST_IDX.try_into().unwrap(), + inp_lst_index: WSOL_FIXTURE_LST_IDX.try_into().unwrap(), + amount: AMOUNT, + min_starting_out_lst: 0, + max_starting_inp_lst: u64::MAX, + accs: start_accs, + }; + + let out_calc = derive_svc_no_inf(&am, &start_accs.out_calc, CURR_EPOCH); + let inp_calc = SvcAg::Wsol(WsolCalc); + + let (ixs, bef) = to_inp( + &start_args, + [create_transfer_ix( + &NewTransferIxAccsBuilder::start() + .with_auth(*start_accs.ix_prefix.rebalance_auth()) + .with_dst(*start_accs.ix_prefix.inp_pool_reserves()) + .with_src(DONOR_TOKEN_ACC_ADDR.to_bytes()) + .build(), + INP_AMT, + )], + &Some(EndAccs::from_start(start_accs)), + [ + am, + once(( + DONOR_TOKEN_ACC_ADDR, + mock_token_acc(raw_token_acc( + *start_accs.ix_prefix.inp_lst_mint(), + *start_accs.ix_prefix.rebalance_auth(), + INP_AMT, + )), + )) + .collect(), + ], ); - let accounts = setup_rebalance_transaction_accounts( - &fixture, - &first_instructions, - out_reserves, - inp_reserves, - &owner_accs, - ); + SVM.with(|svm| { + rebalance_test( + svm, + &bef, + &ixs, + &out_calc, + &inp_calc, + Some(INVALID_ARGUMENT), + ) + }); +} - // Execute first StartRebalance instruction to set pool.is_rebalancing = 1 - let (_, result) = SVM.with(|svm| mollusk_exec(svm, &first_instructions[0], &accounts)); - assert_eq!(result.program_result, ProgramResult::Success); - - let pool_state_aft = result - .resulting_accounts - .iter() - .find(|(pk, _)| pk.to_bytes() == POOL_STATE_ID) - .map(|(_, acc)| { - PoolStatePacked::of_acc_data(&acc.data) - .expect("pool state") - .into_pool_state() - }) - .expect("pool state"); - assert_eq!(pool_state_aft.is_rebalancing, 1); - - let second_instructions = rebalance_ixs( - &fixture.builder, - fixture.out_idx, - fixture.inp_idx, - 100_000, - 0, - u64::MAX, - ); +#[test] +fn rebal_jupsol_o_wsol_i_fixture_missing_sig() { + const AMOUNT: u64 = 100_000; + const INP_AMT: u64 = 111_331; + const CURR_EPOCH: u64 = 0; + + let (start_accs, am) = jupsol_o_wsol_i_fixture_accs(); + + let start_args = StartArgs { + out_lst_index: JUPSOL_FIXTURE_LST_IDX.try_into().unwrap(), + inp_lst_index: WSOL_FIXTURE_LST_IDX.try_into().unwrap(), + amount: AMOUNT, + min_starting_out_lst: 0, + max_starting_inp_lst: u64::MAX, + accs: start_accs, + }; + + let out_calc = derive_svc_no_inf(&am, &start_accs.out_calc, CURR_EPOCH); + let inp_calc = SvcAg::Wsol(WsolCalc); + + let (mut ixs, bef) = to_inp( + &start_args, + [create_transfer_ix( + &NewTransferIxAccsBuilder::start() + .with_auth(*start_accs.ix_prefix.rebalance_auth()) + .with_dst(*start_accs.ix_prefix.inp_pool_reserves()) + .with_src(DONOR_TOKEN_ACC_ADDR.to_bytes()) + .build(), + INP_AMT, + )], + &Some(EndAccs::from_start(start_accs)), + [ + am, + once(( + DONOR_TOKEN_ACC_ADDR, + mock_token_acc(raw_token_acc( + *start_accs.ix_prefix.inp_lst_mint(), + *start_accs.ix_prefix.rebalance_auth(), + INP_AMT, + )), + )) + .collect(), + ], + ); + + // set is_signer=false + ixs[0].accounts[START_REBALANCE_IX_PRE_ACCS_IDX_REBALANCE_AUTH].is_signer = false; - let aft: AccountMap = result.resulting_accounts.into_iter().collect(); - let mut accounts_with_second_ix: AccountMap = aft.clone(); - accounts_with_second_ix.insert( - Pubkey::new_from_array(INSTRUCTIONS_SYSVAR_ID), - mock_instructions_sysvar(&second_instructions, 0), - ); + SVM.with(|svm| { + rebalance_test( + svm, + &bef, + &ixs, + &out_calc, + &inp_calc, + Some(MISSING_REQUIRED_SIGNATURE), + ) + }); +} - // Execute another StartRebalance instruction - let (_, result2) = - SVM.with(|svm| mollusk_exec(svm, &second_instructions[0], &accounts_with_second_ix)); +fn wsol_o_wsol_i_prefix_fixtures() -> StartRebalanceIxPreAccs<(Pubkey, Account)> { + const MIGRATION_SLOT: u64 = 0; + + let accs = StartRebalanceIxPreAccs( + NewStartRebalanceIxPreAccsBuilder::start() + .with_pool_state("pool-state") + .with_lst_state_list("lst-state-list") + .with_out_lst_mint("wsol-mint") + .with_out_pool_reserves("wsol-reserves") + .with_inp_lst_mint("wsol-mint") + .with_inp_pool_reserves("wsol-reserves") + // filler + .with_withdraw_to("wsol-mint") + .with_instructions("wsol-mint") + .with_out_lst_token_program("wsol-mint") + .with_rebalance_auth("wsol-mint") + .with_rebalance_record("wsol-mint") + .with_system_program("wsol-mint") + .build() + .0 + .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()), + ); + + // Rebalance does not perform migration, but our fixtures are PoolStateV1, + // so just patch it into v2 here + let ps = accs.pool_state(); + let ps_addr = ps.0; + let ps_acc = + pool_state_v2_account(VerPoolState::from_acc_data(&ps.1.data).migrated(MIGRATION_SLOT)); + let accs = accs.with_pool_state((ps_addr, ps_acc)); + + replace_fixture_fillers(accs) +} - assert_jiminy_prog_err( - &result2.program_result, - Inf1CtlCustomProgErr(PoolRebalancing), - ); +fn wsol_o_wsol_i_fixture_accs() -> (StartAccs, AccountMap) { + let prefix_am = wsol_o_wsol_i_prefix_fixtures(); + let ix_prefix = + StartRebalanceIxPreAccs(prefix_am.0.each_ref().map(|(addr, _)| addr.to_bytes())); + ( + StartAccs { + ix_prefix, + out_calc_prog: *SvcAgTy::Wsol(()).svc_program_id(), + out_calc: SvcAg::Wsol(WsolCalcAccs), + inp_calc_prog: *SvcAgTy::Wsol(()).svc_program_id(), + inp_calc: SvcAg::Wsol(WsolCalcAccs), + }, + prefix_am.0.into_iter().collect(), + ) } #[test] -fn unauthorized_rebalance_authority() { - silence_mollusk_logs(); - - let fixture = setup_test_fixture(); - let owner_accs = setup_owner_accounts(0); - let (out_reserves, inp_reserves) = standard_reserves(100_000); - - let unauthorized_pk = Pubkey::new_unique().to_bytes(); - let unauthorized_builder = jupsol_wsol_builder( - unauthorized_pk, - fixture.out_lsd.lst_state.mint, - fixture.inp_lsd.lst_state.mint, - fixture.withdraw_to, - ); +fn rebal_wsol_o_wsol_i_fixture_noop() { + const AMOUNT: u64 = 100_000; - let instructions = rebalance_ixs( - &unauthorized_builder, - fixture.out_idx, - fixture.inp_idx, - 100_000, - 0, - u64::MAX, - ); + let (mut start_accs, am) = wsol_o_wsol_i_fixture_accs(); - let mut accounts = setup_rebalance_transaction_accounts( - &fixture, - &instructions, - out_reserves, - inp_reserves, - &owner_accs, - ); + // withdraw to the same acc (noop) + start_accs + .ix_prefix + .set_withdraw_to(*start_accs.ix_prefix.inp_pool_reserves()); - accounts.insert( - Pubkey::new_from_array(unauthorized_pk), - mock_sys_acc(100_000_000_000), - ); + let start_args = StartArgs { + out_lst_index: WSOL_FIXTURE_LST_IDX.try_into().unwrap(), + inp_lst_index: WSOL_FIXTURE_LST_IDX.try_into().unwrap(), + amount: AMOUNT, + min_starting_out_lst: 0, + max_starting_inp_lst: u64::MAX, + accs: start_accs, + }; - let mut accs_vec: Vec<_> = accounts.iter().map(|(k, v)| (*k, v.clone())).collect(); - accs_vec.sort_by_key(|(k, _)| *k); - let result = SVM.with(|svm| svm.process_instruction_chain(&instructions, &accs_vec)); + let [out_calc, inp_calc] = core::array::from_fn(|_| SvcAg::Wsol(WsolCalc)); - assert_jiminy_prog_err(&result.program_result, INVALID_ARGUMENT); -} + let (ixs, bef) = to_inp( + &start_args, + // no ixs in between should still work + // bec tokens have not been moved + [], + &Some(EndAccs::from_start(start_accs)), + [am], + ); -proptest! { - #[test] - fn rebalance_transaction_various_amounts_any( - amount in 1u64..=1_000_000_000, - out_reserve_multiplier in 2u64..=100, - inp_reserve_multiplier in 2u64..=100, - ) { - let out_reserves = amount.saturating_mul(out_reserve_multiplier); - let inp_reserves = amount.saturating_mul(inp_reserve_multiplier); - - let (accs_bef, result, old_total_sol_value) = - execute_rebalance_transaction(amount, Some(out_reserves), Some(inp_reserves)); - - assert_rebalance_transaction_success(&accs_bef, &result, old_total_sol_value); - } + SVM.with(|svm| rebalance_test(svm, &bef, &ixs, &out_calc, &inp_calc, None::)); } diff --git a/controller/program/tests/tests/rebalance/mod.rs b/controller/program/tests/tests/rebalance/mod.rs index dac87d61..a200d842 100644 --- a/controller/program/tests/tests/rebalance/mod.rs +++ b/controller/program/tests/tests/rebalance/mod.rs @@ -1,6 +1,3 @@ mod set_rebal_auth; -// TODO: uncomment once v2 fixtures are introduced -// to restore rebalance tests -// mod chain; -// mod test_utils; +mod chain; diff --git a/controller/program/tests/tests/rebalance/test_utils.rs b/controller/program/tests/tests/rebalance/test_utils.rs deleted file mode 100644 index f17474f9..00000000 --- a/controller/program/tests/tests/rebalance/test_utils.rs +++ /dev/null @@ -1,270 +0,0 @@ -use std::collections::HashMap; - -use inf1_core::instructions::rebalance::start::StartRebalanceIxAccs; -use inf1_ctl_jiminy::{ - accounts::{ - lst_state_list::LstStatePackedList, - pool_state::{PoolState, PoolStatePacked}, - }, - instructions::rebalance::{ - end::EndRebalanceIxData, - start::{ - NewStartRebalanceIxPreAccsBuilder, StartRebalanceIxData, StartRebalanceIxPreKeysOwned, - }, - }, - keys::{INSTRUCTIONS_SYSVAR_ID, LST_STATE_LIST_ID, POOL_STATE_ID, REBALANCE_RECORD_ID}, - ID, -}; -use inf1_std::instructions::rebalance::{end::EndRebalanceIxAccs, start::StartRebalanceIxArgs}; -use inf1_svc_ag_core::{ - inf1_svc_lido_core::solido_legacy_core::TOKENKEG_PROGRAM, - inf1_svc_wsol_core::instructions::sol_val_calc::WsolCalcAccs, instructions::SvcCalcAccsAg, - SvcAgTy, -}; -use inf1_test_utils::{ - gen_lst_state, keys_signer_writable_to_metas, lst_state_list_account, mock_mint, - mock_token_acc, pool_state_account, raw_mint, raw_token_acc, u8_to_bool, AccountMap, - GenLstStateArgs, LstStateData, LstStateListData, NewLstStateBumpsBuilder, - NewLstStatePksBuilder, ALL_FIXTURES, JUPSOL_FIXTURE_LST_IDX, WSOL_MINT, -}; -use sanctum_system_jiminy::sanctum_system_core::ID as SYSTEM_PROGRAM_ID; -use solana_account::Account; -use solana_instruction::Instruction; -use solana_pubkey::Pubkey; - -use crate::common::jupsol_fixtures_svc_suf; - -pub fn fixture_pool_and_lsl() -> (PoolState, Vec) { - let pool_pk = Pubkey::new_from_array(POOL_STATE_ID); - let pool_acc = ALL_FIXTURES - .get(&pool_pk) - .expect("missing pool state fixture"); - let pool = PoolStatePacked::of_acc_data(&pool_acc.data) - .expect("pool packed") - .into_pool_state(); - - let lsl_pk = Pubkey::new_from_array(LST_STATE_LIST_ID); - let lsl_acc = ALL_FIXTURES.get(&lsl_pk).expect("missing lsl fixture"); - - (pool, lsl_acc.data.clone()) -} - -pub type StartRebalanceKeysBuilder = - StartRebalanceIxAccs<[u8; 32], StartRebalanceIxPreKeysOwned, SvcCalcAccsAg, SvcCalcAccsAg>; - -pub fn start_rebalance_ix_pre_keys_owned( - rebalance_auth: [u8; 32], - out_token_program: &[u8; 32], - out_mint: [u8; 32], - inp_mint: [u8; 32], - withdraw_to: [u8; 32], -) -> StartRebalanceIxPreKeysOwned { - let rebalance_record_pda = Pubkey::new_from_array(REBALANCE_RECORD_ID); - - NewStartRebalanceIxPreAccsBuilder::start() - .with_rebalance_auth(rebalance_auth) - .with_pool_state(POOL_STATE_ID) - .with_lst_state_list(LST_STATE_LIST_ID) - .with_rebalance_record(rebalance_record_pda.to_bytes()) - .with_out_lst_mint(out_mint) - .with_inp_lst_mint(inp_mint) - .with_out_pool_reserves( - inf1_test_utils::find_pool_reserves_ata(out_token_program, &out_mint) - .0 - .to_bytes(), - ) - .with_inp_pool_reserves( - inf1_test_utils::find_pool_reserves_ata(out_token_program, &inp_mint) - .0 - .to_bytes(), - ) - .with_withdraw_to(withdraw_to) - .with_instructions(INSTRUCTIONS_SYSVAR_ID) - .with_system_program(SYSTEM_PROGRAM_ID) - .with_out_lst_token_program(*out_token_program) - .build() -} - -pub fn rebalance_ixs( - builder: &StartRebalanceKeysBuilder, - out_lst_index: u32, - inp_lst_index: u32, - amount: u64, - min_starting_out_lst: u64, - max_starting_inp_lst: u64, -) -> Vec { - let start_args = StartRebalanceIxArgs { - out_lst_index, - inp_lst_index, - amount, - min_starting_out_lst, - max_starting_inp_lst, - accs: *builder, - }; - - let start_ix = Instruction { - program_id: Pubkey::new_from_array(ID), - accounts: keys_signer_writable_to_metas( - builder.keys_owned().seq(), - builder.is_signer().seq(), - builder.is_writer().seq(), - ), - data: StartRebalanceIxData::new(start_args.to_full()) - .as_buf() - .into(), - }; - - let end_accs = EndRebalanceIxAccs::from_start(*builder); - let end_ix = Instruction { - program_id: Pubkey::new_from_array(ID), - accounts: keys_signer_writable_to_metas( - end_accs.keys_owned().seq(), - end_accs.is_signer().seq(), - end_accs.is_writer().seq(), - ), - data: EndRebalanceIxData::as_buf().into(), - }; - - vec![start_ix, end_ix] -} - -pub fn jupsol_wsol_builder( - rebalance_auth: [u8; 32], - out_mint: [u8; 32], - inp_mint: [u8; 32], - withdraw_to: [u8; 32], -) -> StartRebalanceKeysBuilder { - let ix_prefix = start_rebalance_ix_pre_keys_owned( - rebalance_auth, - &TOKENKEG_PROGRAM, - out_mint, - inp_mint, - withdraw_to, - ); - - StartRebalanceKeysBuilder { - ix_prefix, - out_calc_prog: *SvcAgTy::SanctumSplMulti(()).svc_program_id(), - out_calc: jupsol_fixtures_svc_suf(), - inp_calc_prog: *SvcAgTy::Wsol(()).svc_program_id(), - inp_calc: SvcCalcAccsAg::Wsol(WsolCalcAccs), - } -} - -pub fn fixture_lst_state_data() -> (PoolState, LstStateListData, LstStateData, LstStateData) { - let (pool, lst_state_bytes) = fixture_pool_and_lsl(); - - let packed_list = LstStatePackedList::of_acc_data(&lst_state_bytes).expect("lst packed"); - let packed_states = &packed_list.0; - - let mut out_state = packed_states[JUPSOL_FIXTURE_LST_IDX].into_lst_state(); - out_state.sol_value_calculator = *SvcAgTy::Wsol(()).svc_program_id(); - - let mut inp_state = packed_states - .iter() - .find(|s| s.into_lst_state().mint == WSOL_MINT.to_bytes()) - .expect("wsol fixture available") - .into_lst_state(); - inp_state.sol_value_calculator = *SvcAgTy::Wsol(()).svc_program_id(); - - let out_lsd = gen_lst_state( - GenLstStateArgs { - is_input_disabled: u8_to_bool(out_state.is_input_disabled), - sol_value: out_state.sol_value, - pks: NewLstStatePksBuilder::start() - .with_mint(out_state.mint) - .with_sol_value_calculator(out_state.sol_value_calculator) - .build(), - bumps: NewLstStateBumpsBuilder::start() - .with_pool_reserves_bump(out_state.pool_reserves_bump) - .with_protocol_fee_accumulator_bump(out_state.protocol_fee_accumulator_bump) - .build(), - }, - &TOKENKEG_PROGRAM, - ); - - let inp_lsd = gen_lst_state( - GenLstStateArgs { - is_input_disabled: u8_to_bool(inp_state.is_input_disabled), - sol_value: inp_state.sol_value, - pks: NewLstStatePksBuilder::start() - .with_mint(inp_state.mint) - .with_sol_value_calculator(inp_state.sol_value_calculator) - .build(), - bumps: NewLstStateBumpsBuilder::start() - .with_pool_reserves_bump(inp_state.pool_reserves_bump) - .with_protocol_fee_accumulator_bump(inp_state.protocol_fee_accumulator_bump) - .build(), - }, - &TOKENKEG_PROGRAM, - ); - - let mut lsl_data = LstStateListData { - lst_state_list: lst_state_bytes, - protocol_fee_accumulators: HashMap::new(), - all_pool_reserves: HashMap::new(), - }; - - lsl_data.upsert(out_lsd); - lsl_data.upsert(inp_lsd); - - (pool, lsl_data, out_lsd, inp_lsd) -} - -#[allow(clippy::too_many_arguments)] -pub fn add_common_accounts( - accounts: &mut AccountMap, - pool: &PoolState, - lst_state_list: &[u8], - pool_reserves_map: Option<&HashMap<[u8; 32], [u8; 32]>>, - rebalance_auth: [u8; 32], - out_mint: [u8; 32], - inp_mint: [u8; 32], - withdraw_to: [u8; 32], - out_balance: u64, - inp_balance: u64, -) { - accounts.insert( - LST_STATE_LIST_ID.into(), - lst_state_list_account(lst_state_list.to_vec()), - ); - accounts.insert(POOL_STATE_ID.into(), pool_state_account(*pool)); - accounts.insert( - Pubkey::new_from_array(rebalance_auth), - Account { - lamports: u64::MAX, - owner: Pubkey::new_from_array(SYSTEM_PROGRAM_ID), - ..Default::default() - }, - ); - accounts.insert( - Pubkey::new_from_array(out_mint), - mock_mint(raw_mint(None, None, 0, 9)), - ); - accounts.insert( - Pubkey::new_from_array(inp_mint), - mock_mint(raw_mint(None, None, 0, 9)), - ); - accounts.insert( - pool_reserves_map - .and_then(|m| m.get(&out_mint).copied()) - .map(Pubkey::new_from_array) - .unwrap_or_else(|| { - inf1_test_utils::find_pool_reserves_ata(&TOKENKEG_PROGRAM, &out_mint).0 - }), - mock_token_acc(raw_token_acc(out_mint, POOL_STATE_ID, out_balance)), - ); - accounts.insert( - pool_reserves_map - .and_then(|m| m.get(&inp_mint).copied()) - .map(Pubkey::new_from_array) - .unwrap_or_else(|| { - inf1_test_utils::find_pool_reserves_ata(&TOKENKEG_PROGRAM, &inp_mint).0 - }), - mock_token_acc(raw_token_acc(inp_mint, POOL_STATE_ID, inp_balance)), - ); - accounts.insert( - Pubkey::new_from_array(withdraw_to), - mock_token_acc(raw_token_acc(out_mint, withdraw_to, 0)), - ); -} diff --git a/controller/program/tests/tests/swap/common/accounts.rs b/controller/program/tests/tests/swap/common/accounts.rs index 18f9527a..6c058941 100644 --- a/controller/program/tests/tests/swap/common/accounts.rs +++ b/controller/program/tests/tests/swap/common/accounts.rs @@ -1,7 +1,7 @@ use inf1_core::instructions::swap::IxAccs; use inf1_test_utils::{fill_mock_prog_accs, AccountMap}; -pub fn add_swap_prog_accs( +pub fn fill_swap_prog_accs( am: &mut AccountMap, IxAccs { inp_calc_prog, diff --git a/controller/program/tests/tests/swap/common/asserts.rs b/controller/program/tests/tests/swap/common/asserts.rs index d0e506d3..01798691 100644 --- a/controller/program/tests/tests/swap/common/asserts.rs +++ b/controller/program/tests/tests/swap/common/asserts.rs @@ -4,6 +4,7 @@ use inf1_ctl_jiminy::{ accounts::pool_state::{PoolStateV2, PoolStateV2Packed, PoolStateV2U64s}, instructions::swap::v2::IxPreAccs, typedefs::{ + lst_state::LstState, pool_sv::PoolSvLamports, snap::{Snap, SnapU64}, }, @@ -15,8 +16,9 @@ use inf1_std::quote::{ Quote, }; use inf1_test_utils::{ - acc_bef_aft, assert_diffs_pool_state_v2, assert_token_acc_diffs, get_mint_supply, - token_acc_bal_diff_changed, AccountMap, Diff, DiffsPoolStateV2, + acc_bef_aft, assert_diffs_lst_state_list, assert_diffs_pool_state_v2, assert_token_acc_diffs, + get_lst_state_list, get_mint_supply, token_acc_bal_diff_changed, AccountMap, Diff, + DiffsPoolStateV2, LstStateListChanges, }; use sanctum_spl_token_jiminy::sanctum_spl_token_core::state::account::RawTokenAccount; use sanctum_u64_ratio::Ratio; @@ -36,13 +38,17 @@ pub fn assert_correct_swap_exact_in_v2( curr_epoch: u64, curr_slot: u64, ) -> Quote { - let pricing = derive_pp_exact_in(bef, &args.accs); let ps_aft = PoolStateV2Packed::of_acc_data(&aft[&(*args.accs.ix_prefix.pool_state()).into()].data) .unwrap() .into_pool_state_v2(); - let (qa, aft_header_la) = derive_qa_hla(bef, args, curr_epoch, curr_slot, pricing); + let list_aft = get_lst_state_list(&aft[&(*args.accs.ix_prefix.lst_state_list()).into()].data); + + let pricing = derive_pp_exact_in(bef, &args.accs); + let (qa, ps_aft_header_la, list_aft_header_la) = + derive_qa_hla(bef, args, curr_epoch, curr_slot, pricing); let quote = quote_exact_in(&qa).unwrap(); + if args.inp_lst_index == u32::MAX || args.out_lst_index == u32::MAX { let inf_mint = if args.inp_lst_index == u32::MAX { args.accs.ix_prefix.inp_mint() @@ -52,11 +58,19 @@ pub fn assert_correct_swap_exact_in_v2( let inf_supply_snap = Snap([bef, aft].map(|am| get_mint_supply(&am[&(*inf_mint).into()].data))); assert_swap_token_movements(bef, aft, &args.accs.ix_prefix, "e); - assert_pool_state_liq(&aft_header_la, &ps_aft, quote.fee); - assert_rr_liq(&aft_header_la, &ps_aft, &inf_supply_snap); + assert_accs_liq( + [&ps_aft_header_la, &ps_aft], + [&list_aft_header_la, &list_aft], + "e, + ); + assert_rr_liq(&ps_aft_header_la, &ps_aft, &inf_supply_snap); } else { assert_swap_token_movements(bef, aft, &args.accs.ix_prefix, "e); - assert_pool_state_swap(&aft_header_la, &ps_aft, quote.fee); + assert_accs_swap( + [&ps_aft_header_la, &ps_aft], + [&list_aft_header_la, &list_aft], + "e, + ); } quote } @@ -68,13 +82,17 @@ pub fn assert_correct_swap_exact_out_v2( curr_epoch: u64, curr_slot: u64, ) -> Quote { - let pricing = derive_pp_exact_out(bef, &args.accs); let ps_aft = PoolStateV2Packed::of_acc_data(&aft[&(*args.accs.ix_prefix.pool_state()).into()].data) .unwrap() .into_pool_state_v2(); - let (qa, aft_header_la) = derive_qa_hla(bef, args, curr_epoch, curr_slot, pricing); + let list_aft = get_lst_state_list(&aft[&(*args.accs.ix_prefix.lst_state_list()).into()].data); + + let pricing = derive_pp_exact_out(bef, &args.accs); + let (qa, ps_aft_header_la, list_aft_header_la) = + derive_qa_hla(bef, args, curr_epoch, curr_slot, pricing); let quote = quote_exact_out(&qa).unwrap(); + if args.inp_lst_index == u32::MAX || args.out_lst_index == u32::MAX { let inf_mint = if args.inp_lst_index == u32::MAX { args.accs.ix_prefix.inp_mint() @@ -84,11 +102,19 @@ pub fn assert_correct_swap_exact_out_v2( let inf_supply_snap = Snap([bef, aft].map(|am| get_mint_supply(&am[&(*inf_mint).into()].data))); assert_swap_token_movements(bef, aft, &args.accs.ix_prefix, "e); - assert_pool_state_liq(&aft_header_la, &ps_aft, quote.fee); - assert_rr_liq(&aft_header_la, &ps_aft, &inf_supply_snap); + assert_accs_liq( + [&ps_aft_header_la, &ps_aft], + [&list_aft_header_la, &list_aft], + "e, + ); + assert_rr_liq(&ps_aft_header_la, &ps_aft, &inf_supply_snap); } else { assert_swap_token_movements(bef, aft, &args.accs.ix_prefix, "e); - assert_pool_state_swap(&aft_header_la, &ps_aft, quote.fee); + assert_accs_swap( + [&ps_aft_header_la, &ps_aft], + [&list_aft_header_la, &list_aft], + "e, + ); } quote } @@ -157,24 +183,56 @@ fn assert_pool_token_movements_swap( }); } -fn assert_pool_state_swap(aft_header_lookahead: &PoolStateV2, aft: &PoolStateV2, fee: u64) { - let diffs = DiffsPoolStateV2 { +fn assert_accs_swap( + [ps_aft_hla, ps_aft]: [&PoolStateV2; 2], + [list_aft_hla, list_aft]: [&[LstState]; 2], + Quote { + fee, + inp_mint, + out_mint, + .. + }: &Quote, +) { + // TODO: verify this error bound and verify that its due to rounding. + // Pool's sol val inc is allowed to be greater than the quoted fee by at most this much + const FEE_ERR_BOUND_LAMPORTS: u64 = 3; + + let ps_diffs = DiffsPoolStateV2 { u64s: PoolStateV2U64s::default() // checks below .with_total_sol_value(Diff::Pass) .with_withheld_lamports(Diff::Pass), ..Default::default() }; - let tsv_inc = aft.total_sol_value - aft_header_lookahead.total_sol_value; + let tsv_inc = ps_aft.total_sol_value - ps_aft_hla.total_sol_value; - // might be > due to rounding? - assert!(tsv_inc >= fee); + assert!(tsv_inc >= *fee); + assert!(tsv_inc <= fee + FEE_ERR_BOUND_LAMPORTS); - let withheld_inc = aft.withheld_lamports - aft_header_lookahead.withheld_lamports; + let withheld_inc = ps_aft.withheld_lamports - ps_aft_hla.withheld_lamports; assert_eq!(withheld_inc, tsv_inc); - assert_diffs_pool_state_v2(&diffs, aft_header_lookahead, aft); - assert_lp_solvent_invar(aft); + assert_diffs_pool_state_v2(&ps_diffs, ps_aft_hla, ps_aft); + assert_lp_solvent_invar(ps_aft); + + let (list_diffs, inp_svc) = + LstStateListChanges::new(list_aft_hla).with_det_svc_by_mint(inp_mint, list_aft); + let (list_diffs, out_svc) = list_diffs.with_det_svc_by_mint(out_mint, list_aft); + + // assert everything else other than sol value didnt change + assert_diffs_lst_state_list(list_diffs.build(), list_aft_hla, list_aft); + + assert!(inp_svc >= 0); + assert!(out_svc <= 0); + + assert_eq!( + inp_svc + out_svc, + i128::from(tsv_inc), + "{} - {} != {}", + inp_svc, + out_svc.neg(), + tsv_inc + ); } fn assert_pool_token_movements_add_liq( @@ -215,7 +273,16 @@ fn assert_pool_token_movements_rem_liq( ); } -fn assert_pool_state_liq(aft_header_lookahead: &PoolStateV2, aft: &PoolStateV2, fee: u64) { +fn assert_accs_liq( + [ps_aft_hla, ps_aft]: [&PoolStateV2; 2], + [list_aft_hla, list_aft]: [&[LstState]; 2], + Quote { + fee, + inp_mint, + out_mint, + .. + }: &Quote, +) { let diffs = DiffsPoolStateV2 { u64s: PoolStateV2U64s::default() .with_withheld_lamports(Diff::Pass) @@ -224,11 +291,25 @@ fn assert_pool_state_liq(aft_header_lookahead: &PoolStateV2, aft: &PoolStateV2, ..Default::default() }; - let withheld_inc = aft.withheld_lamports - aft_header_lookahead.withheld_lamports; - assert_eq!(withheld_inc, fee); + let tsv_change = i128::from(ps_aft.total_sol_value) - i128::from(ps_aft_hla.total_sol_value); + + let withheld_inc = ps_aft.withheld_lamports - ps_aft_hla.withheld_lamports; + assert_eq!(withheld_inc, *fee); + + assert_diffs_pool_state_v2(&diffs, ps_aft_hla, ps_aft); + assert_lp_solvent_invar(ps_aft); + + let list_diffs = LstStateListChanges::new(list_aft_hla); + let (list_diffs, lst_svc) = if *inp_mint == ps_aft.lp_token_mint { + list_diffs.with_det_svc_by_mint(out_mint, list_aft) + } else { + list_diffs.with_det_svc_by_mint(inp_mint, list_aft) + }; + + assert_eq!(lst_svc, tsv_change); - assert_diffs_pool_state_v2(&diffs, aft_header_lookahead, aft); - assert_lp_solvent_invar(aft); + // assert everything else other than sol value didnt change + assert_diffs_lst_state_list(list_diffs.build(), list_aft_hla, list_aft); } /// assert redemption rate of INF did not decrease after add/remove liq diff --git a/controller/program/tests/tests/swap/common/derives.rs b/controller/program/tests/tests/swap/common/derives.rs index 0c7b94b3..0501b5f3 100644 --- a/controller/program/tests/tests/swap/common/derives.rs +++ b/controller/program/tests/tests/swap/common/derives.rs @@ -1,5 +1,6 @@ use inf1_ctl_jiminy::{ accounts::pool_state::PoolStateV2, instructions::swap::v2::IxPreAccs, svc::InfCalc, + typedefs::lst_state::LstState, }; use inf1_pp_ag_core::{ instructions::{PriceExactInAccsAg, PriceExactOutAccsAg}, @@ -10,24 +11,13 @@ use inf1_pp_flatslab_std::{ accounts::Slab, instructions::pricing::FlatSlabPpAccs, pricing::FlatSlabSwapPricing, }; use inf1_std::quote::swap::QuoteArgs; -use inf1_svc_ag_core::{ - calc::SvcCalcAg, - inf1_svc_lido_core::{calc::LidoCalc, solido_legacy_core}, - inf1_svc_marinade_core::{calc::MarinadeCalc, sanctum_marinade_liquid_staking_core}, - inf1_svc_spl_core::{ - calc::SplCalc, - instructions::sol_val_calc::{SanctumSplCalcAccs, SanctumSplMultiCalcAccs, SplCalcAccs}, - sanctum_spl_stake_pool_core::StakePool, - }, - inf1_svc_wsol_core::calc::WsolCalc, - instructions::SvcCalcAccsAg, -}; +use inf1_svc_ag_core::calc::SvcCalcAg; use inf1_test_utils::{ get_lst_state_list, get_mint_supply, get_token_account_amount, AccountMap, VerPoolState, }; use solana_pubkey::Pubkey; -use crate::common::{header_lookahead, Cbs}; +use crate::common::{derive_svc_no_inf, header_lookahead, lst_state_lookahead, Cbs}; use super::super::{V2Accs, V2Args}; @@ -40,8 +30,15 @@ pub fn derive_qa_hla( // passthrough to generalize // across both ExactIn and ExactOut pricing: P, -) -> (QuoteArgs, PoolStateV2) { - let ((inp_calc, out_calc, aft_header_la), out_reserves) = if args.inp_lst_index == u32::MAX { +) -> ( + QuoteArgs, + PoolStateV2, + Vec, +) { + let ((inp_calc, out_calc, ps_aft_header_la, list_aft_header_la), out_reserves) = if args + .inp_lst_index + == u32::MAX + { ( derive_rem_liq_cahla(am, args, curr_epoch, curr_slot), get_token_account_amount(&am[&(*args.accs.ix_prefix.out_pool_reserves()).into()].data), @@ -67,7 +64,8 @@ pub fn derive_qa_hla( out_calc, pricing, }, - aft_header_la, + ps_aft_header_la, + list_aft_header_la, ) } @@ -78,7 +76,7 @@ fn derive_swap_cahla

( args: &V2Args

, curr_epoch: u64, curr_slot: u64, -) -> (SvcCalcAg, SvcCalcAg, PoolStateV2) { +) -> (SvcCalcAg, SvcCalcAg, PoolStateV2, Vec) { let [inp_calc, out_calc] = [args.accs.inp_calc, args.accs.out_calc].map(|c| derive_svc_no_inf(am, &c, curr_epoch)); let [inp_reserves_bal, out_reserves_bal] = [ @@ -86,16 +84,21 @@ fn derive_swap_cahla

( args.accs.ix_prefix.out_pool_reserves(), ] .map(|a| get_token_account_amount(&am[&(*a).into()].data)); - let ps = ps_header_lookahead( - am, - &args.accs.ix_prefix, - &[ - (&inp_calc, inp_reserves_bal, args.inp_lst_index as usize), - (&out_calc, out_reserves_bal, args.out_lst_index as usize), - ], - curr_slot, - ); - (inp_calc, out_calc, ps) + let [inp_lst_index, out_lst_index] = + [args.inp_lst_index, args.out_lst_index].map(|x| x as usize); + + let params = [ + (&inp_calc, inp_reserves_bal, inp_lst_index), + (&out_calc, out_reserves_bal, out_lst_index), + ]; + let ps = ps_header_lookahead(am, &args.accs.ix_prefix, ¶ms, curr_slot); + + let mut list = get_lst_state_list(&am[&(*args.accs.ix_prefix.lst_state_list()).into()].data); + params.into_iter().for_each(|(calc, bal, idx)| { + list[idx] = lst_state_lookahead(list[idx], bal, calc); + }); + + (inp_calc, out_calc, ps, list) } fn derive_add_liq_cahla

( @@ -103,21 +106,27 @@ fn derive_add_liq_cahla

( args: &V2Args

, curr_epoch: u64, curr_slot: u64, -) -> (SvcCalcAg, SvcCalcAg, PoolStateV2) { +) -> (SvcCalcAg, SvcCalcAg, PoolStateV2, Vec) { let inp_calc = derive_svc_no_inf(am, &args.accs.inp_calc, curr_epoch); let inp_reserves_balance = get_token_account_amount(&am[&(*args.accs.ix_prefix.inp_pool_reserves()).into()].data); let inf_mint_supply = get_mint_supply(&am[&(*args.accs.ix_prefix.out_mint()).into()].data); + let idx = args.inp_lst_index as usize; let ps = ps_header_lookahead( am, &args.accs.ix_prefix, - &[(&inp_calc, inp_reserves_balance, args.inp_lst_index as usize)], + &[(&inp_calc, inp_reserves_balance, idx)], curr_slot, ); + + let mut list = get_lst_state_list(&am[&(*args.accs.ix_prefix.lst_state_list()).into()].data); + list[idx] = lst_state_lookahead(list[idx], inp_reserves_balance, inp_calc); + ( inp_calc, SvcCalcAg::Inf(InfCalc::new(&ps, inf_mint_supply)), ps, + list, ) } @@ -126,21 +135,28 @@ fn derive_rem_liq_cahla

( args: &V2Args

, curr_epoch: u64, curr_slot: u64, -) -> (SvcCalcAg, SvcCalcAg, PoolStateV2) { +) -> (SvcCalcAg, SvcCalcAg, PoolStateV2, Vec) { let out_calc = derive_svc_no_inf(am, &args.accs.out_calc, curr_epoch); let out_reserves_bal = get_token_account_amount(&am[&(*args.accs.ix_prefix.out_pool_reserves()).into()].data); let inf_mint_supply = get_mint_supply(&am[&(*args.accs.ix_prefix.inp_mint()).into()].data); + let idx = args.out_lst_index as usize; + let ps = ps_header_lookahead( am, &args.accs.ix_prefix, - &[(&out_calc, out_reserves_bal, args.out_lst_index as usize)], + &[(&out_calc, out_reserves_bal, idx)], curr_slot, ); + + let mut list = get_lst_state_list(&am[&(*args.accs.ix_prefix.lst_state_list()).into()].data); + list[idx] = lst_state_lookahead(list[idx], out_reserves_bal, out_calc); + ( SvcCalcAg::Inf(InfCalc::new(&ps, inf_mint_supply)), out_calc, ps, + list, ) } @@ -164,44 +180,6 @@ fn ps_header_lookahead( header_lookahead(ps, calcs, curr_slot) } -fn derive_svc_no_inf(am: &AccountMap, accs: &SvcCalcAccsAg, curr_epoch: u64) -> SvcCalcAg { - match accs { - SvcCalcAccsAg::Wsol(_) => SvcCalcAg::Wsol(WsolCalc), - SvcCalcAccsAg::SanctumSplMulti(SanctumSplMultiCalcAccs { stake_pool_addr }) - | SvcCalcAccsAg::SanctumSpl(SanctumSplCalcAccs { stake_pool_addr }) - | SvcCalcAccsAg::Spl(SplCalcAccs { stake_pool_addr }) => { - let calc = SplCalc::new( - &StakePool::borsh_de(am[&(*stake_pool_addr).into()].data.as_slice()).unwrap(), - curr_epoch, - ); - match accs { - SvcCalcAccsAg::SanctumSplMulti(_) => SvcCalcAg::SanctumSplMulti(calc), - SvcCalcAccsAg::SanctumSpl(_) => SvcCalcAg::SanctumSpl(calc), - SvcCalcAccsAg::Spl(_) => SvcCalcAg::Spl(calc), - _ => unreachable!(), - } - } - SvcCalcAccsAg::Marinade(_) => SvcCalcAg::Marinade(MarinadeCalc::new( - &sanctum_marinade_liquid_staking_core::State::borsh_de( - am[&sanctum_marinade_liquid_staking_core::STATE_PUBKEY.into()] - .data - .as_slice(), - ) - .unwrap(), - )), - SvcCalcAccsAg::Lido(_) => SvcCalcAg::Lido(LidoCalc::new( - &solido_legacy_core::Lido::borsh_de( - am[&solido_legacy_core::LIDO_STATE_ADDR.into()] - .data - .as_slice(), - ) - .unwrap(), - curr_epoch, - )), - SvcCalcAccsAg::Inf(_) => panic!("INF unsupported"), - } -} - pub fn derive_pp_exact_in( am: &AccountMap, accs: &V2Accs, diff --git a/controller/program/tests/tests/swap/v1/add_liq.rs b/controller/program/tests/tests/swap/v1/add_liq.rs index fb0bd30f..b4112207 100644 --- a/controller/program/tests/tests/swap/v1/add_liq.rs +++ b/controller/program/tests/tests/swap/v1/add_liq.rs @@ -123,13 +123,16 @@ fn jupsol_add_liq_fixtures() -> IxPreAccs<(Pubkey, Account)> { .with_pool_reserves("jupsol-reserves") .with_lp_acc("inf-token-acc") .with_lp_token_mint("inf-mint") - .with_lst_token_program("tokenkeg") - .with_lp_token_program("tokenkeg") .with_protocol_fee_accumulator("jupsol-pf-accum") + // filler + .with_lst_token_program("inf-mint") + .with_lp_token_program("inf-mint") .build() .0 .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()), ) + .with_lst_token_program(mollusk_svm_programs_token::token::keyed_account()) + .with_lp_token_program(mollusk_svm_programs_token::token::keyed_account()) } #[test] diff --git a/controller/program/tests/tests/swap/v1/exact_in.rs b/controller/program/tests/tests/swap/v1/exact_in.rs index 21a5780e..5936613c 100644 --- a/controller/program/tests/tests/swap/v1/exact_in.rs +++ b/controller/program/tests/tests/swap/v1/exact_in.rs @@ -21,7 +21,7 @@ use solana_pubkey::Pubkey; use crate::{ common::SVM, tests::swap::{ - common::{add_swap_prog_accs, assert_correct_swap_exact_in_v2}, + common::{assert_correct_swap_exact_in_v2, fill_swap_prog_accs}, v1::{args_to_v2, jupsol_to_msol_prefix_fixtures}, V1Accs, V1Args, }, @@ -106,7 +106,7 @@ fn swap_exact_in_jupsol_to_msol_fixture() { .chain(inp_am) .chain(out_am) .collect(); - add_swap_prog_accs(&mut bef, &accs); + fill_swap_prog_accs(&mut bef, &accs); let Quote { inp, out, fee, .. } = SVM.with(|svm| swap_exact_in_test(svm, &args, &bef, None::).unwrap()); diff --git a/controller/program/tests/tests/swap/v1/exact_out.rs b/controller/program/tests/tests/swap/v1/exact_out.rs index d8916652..915060e8 100644 --- a/controller/program/tests/tests/swap/v1/exact_out.rs +++ b/controller/program/tests/tests/swap/v1/exact_out.rs @@ -21,7 +21,7 @@ use solana_pubkey::Pubkey; use crate::{ common::SVM, tests::swap::{ - common::{add_swap_prog_accs, assert_correct_swap_exact_out_v2}, + common::{assert_correct_swap_exact_out_v2, fill_swap_prog_accs}, v1::{args_to_v2, jupsol_to_msol_prefix_fixtures}, V1Accs, V1Args, }, @@ -106,7 +106,7 @@ fn swap_exact_in_jupsol_to_msol_fixture() { .chain(inp_am) .chain(out_am) .collect(); - add_swap_prog_accs(&mut bef, &accs); + fill_swap_prog_accs(&mut bef, &accs); let Quote { inp, out, fee, .. } = SVM.with(|svm| swap_exact_out_test(svm, &args, &bef, None::).unwrap()); diff --git a/controller/program/tests/tests/swap/v1/mod.rs b/controller/program/tests/tests/swap/v1/mod.rs index 5d4c33c0..f978e351 100644 --- a/controller/program/tests/tests/swap/v1/mod.rs +++ b/controller/program/tests/tests/swap/v1/mod.rs @@ -69,11 +69,14 @@ fn jupsol_to_msol_prefix_fixtures() -> ctl_swap::v1::IxPreAccs<(Pubkey, Account) .with_out_lst_acc("msol-token-acc") .with_out_lst_mint("msol-mint") .with_out_pool_reserves("msol-reserves") - .with_inp_lst_token_program("tokenkeg") - .with_out_lst_token_program("tokenkeg") .with_protocol_fee_accumulator("msol-pf-accum") + // filler + .with_inp_lst_token_program("msol-mint") + .with_out_lst_token_program("msol-mint") .build() .0 .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()), ) + .with_inp_lst_token_program(mollusk_svm_programs_token::token::keyed_account()) + .with_out_lst_token_program(mollusk_svm_programs_token::token::keyed_account()) } diff --git a/controller/program/tests/tests/swap/v1/rem_liq.rs b/controller/program/tests/tests/swap/v1/rem_liq.rs index 25fa1f17..c6da23b1 100644 --- a/controller/program/tests/tests/swap/v1/rem_liq.rs +++ b/controller/program/tests/tests/swap/v1/rem_liq.rs @@ -124,13 +124,16 @@ fn jupsol_rem_liq_fixtures() -> IxPreAccs<(Pubkey, Account)> { .with_pool_reserves("jupsol-reserves") .with_lp_acc("inf-token-acc") .with_lp_token_mint("inf-mint") - .with_lst_token_program("tokenkeg") - .with_lp_token_program("tokenkeg") .with_protocol_fee_accumulator("jupsol-pf-accum") + // filler + .with_lst_token_program("inf-mint") + .with_lp_token_program("inf-mint") .build() .0 .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()), ) + .with_lst_token_program(mollusk_svm_programs_token::token::keyed_account()) + .with_lp_token_program(mollusk_svm_programs_token::token::keyed_account()) } #[test] diff --git a/controller/program/tests/tests/swap/v2/exact_in/add_liq.rs b/controller/program/tests/tests/swap/v2/exact_in/add_liq.rs index c11b4ccb..49e529b7 100644 --- a/controller/program/tests/tests/swap/v2/exact_in/add_liq.rs +++ b/controller/program/tests/tests/swap/v2/exact_in/add_liq.rs @@ -11,29 +11,34 @@ use inf1_test_utils::{ }; use jiminy_cpi::program_error::ProgramError; -use crate::{common::SVM, tests::swap::common::add_swap_prog_accs}; +use crate::{common::SVM, tests::swap::common::fill_swap_prog_accs}; use super::{swap_exact_in_v2_test, Accs, Args}; #[test] fn swap_exact_in_v2_jupsol_add_liq_fixture() { let amount = 12_049; - let prefix_am = NewSwapExactOutV2IxPreAccsBuilder::start() - .with_signer("jupsol-token-acc-owner") - .with_pool_state("pool-state") - .with_lst_state_list("lst-state-list") - .with_inp_acc("jupsol-token-acc") - .with_inp_mint("jupsol-mint") - .with_inp_pool_reserves("jupsol-reserves") - .with_out_acc("inf-token-acc") - .with_out_mint("inf-mint") - .with_out_pool_reserves("inf-mint") - .with_inp_token_program("tokenkeg") - .with_out_token_program("tokenkeg") - .build() - .0 - .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()); - let prefix_keys = IxPreAccs(prefix_am.each_ref().map(|(addr, _)| addr.to_bytes())); + let prefix_am = IxPreAccs( + NewSwapExactOutV2IxPreAccsBuilder::start() + .with_signer("jupsol-token-acc-owner") + .with_pool_state("pool-state") + .with_lst_state_list("lst-state-list") + .with_inp_acc("jupsol-token-acc") + .with_inp_mint("jupsol-mint") + .with_inp_pool_reserves("jupsol-reserves") + .with_out_acc("inf-token-acc") + .with_out_mint("inf-mint") + .with_out_pool_reserves("inf-mint") + // filler + .with_inp_token_program("inf-mint") + .with_out_token_program("inf-mint") + .build() + .0 + .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()), + ) + .with_inp_token_program(mollusk_svm_programs_token::token::keyed_account()) + .with_out_token_program(mollusk_svm_programs_token::token::keyed_account()); + let prefix_keys = IxPreAccs(prefix_am.0.each_ref().map(|(addr, _)| addr.to_bytes())); let (pp_accs, pp_am) = flatslab_fixture_suf_accs(); let (inp_accs, inp_am) = jupsol_fixture_svc_suf_accs(); @@ -54,8 +59,8 @@ fn swap_exact_in_v2_jupsol_add_liq_fixture() { accs, }; - let mut bef = prefix_am.into_iter().chain(pp_am).chain(inp_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + let mut bef = prefix_am.0.into_iter().chain(pp_am).chain(inp_am).collect(); + fill_swap_prog_accs(&mut bef, &accs); let Quote { inp, out, fee, .. } = SVM.with(|svm| swap_exact_in_v2_test(svm, &args, &bef, None::).unwrap()); diff --git a/controller/program/tests/tests/swap/v2/exact_in/errs.rs b/controller/program/tests/tests/swap/v2/exact_in/errs.rs index 38b9f15b..4a7c43be 100644 --- a/controller/program/tests/tests/swap/v2/exact_in/errs.rs +++ b/controller/program/tests/tests/swap/v2/exact_in/errs.rs @@ -18,7 +18,7 @@ use inf1_test_utils::{ use crate::{ common::SVM, tests::swap::{ - common::add_swap_prog_accs, + common::fill_swap_prog_accs, v2::{ exact_in::{swap_exact_in_v2_test, Accs, Args}, jupsol_to_wsol_prefix_fixtures, @@ -61,7 +61,7 @@ fn swap_exact_in_input_disabled_fixture() { }; let mut bef = prefix_am.0.into_iter().chain(pp_am).chain(inp_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + fill_swap_prog_accs(&mut bef, &accs); SVM.with(|svm| { swap_exact_in_v2_test( @@ -103,7 +103,7 @@ fn swap_exact_in_pool_rebalancing_fixture() { }; let mut bef = prefix_am.0.into_iter().chain(pp_am).chain(inp_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + fill_swap_prog_accs(&mut bef, &accs); SVM.with(|svm| { swap_exact_in_v2_test( @@ -145,7 +145,7 @@ fn swap_exact_in_pool_disabled_fixture() { }; let mut bef = prefix_am.0.into_iter().chain(pp_am).chain(inp_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + fill_swap_prog_accs(&mut bef, &accs); SVM.with(|svm| { swap_exact_in_v2_test( @@ -185,7 +185,7 @@ fn swap_exact_in_slippage_tolerance_exceeded_fixture() { }; let mut bef = prefix_am.0.into_iter().chain(pp_am).chain(inp_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + fill_swap_prog_accs(&mut bef, &accs); SVM.with(|svm| { swap_exact_in_v2_test( @@ -212,12 +212,15 @@ fn swap_exact_in_same_lst_fixture() { .with_out_acc("wsol-token-acc") .with_out_mint("wsol-mint") .with_out_pool_reserves("wsol-reserves") - .with_inp_token_program("tokenkeg") - .with_out_token_program("tokenkeg") + // filler + .with_inp_token_program("wsol-mint") + .with_out_token_program("wsol-mint") .build() .0 .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()), - ); + ) + .with_inp_token_program(mollusk_svm_programs_token::token::keyed_account()) + .with_out_token_program(mollusk_svm_programs_token::token::keyed_account()); let prefix_keys = IxPreAccs(prefix_am.0.each_ref().map(|(addr, _)| addr.to_bytes())); let [inp_calc, out_calc] = core::array::from_fn(|_| SvcCalcAccsAg::Wsol(WsolCalcAccs)); let (pp_accs, pp_am) = flatslab_fixture_suf_accs(); @@ -240,7 +243,7 @@ fn swap_exact_in_same_lst_fixture() { }; let mut bef = prefix_am.0.into_iter().chain(pp_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + fill_swap_prog_accs(&mut bef, &accs); SVM.with(|svm| { swap_exact_in_v2_test( diff --git a/controller/program/tests/tests/swap/v2/exact_in/rem_liq.rs b/controller/program/tests/tests/swap/v2/exact_in/rem_liq.rs index 66621a69..5980db88 100644 --- a/controller/program/tests/tests/swap/v2/exact_in/rem_liq.rs +++ b/controller/program/tests/tests/swap/v2/exact_in/rem_liq.rs @@ -11,29 +11,34 @@ use inf1_test_utils::{ }; use jiminy_cpi::program_error::ProgramError; -use crate::{common::SVM, tests::swap::common::add_swap_prog_accs}; +use crate::{common::SVM, tests::swap::common::fill_swap_prog_accs}; use super::{swap_exact_in_v2_test, Accs, Args}; #[test] fn swap_exact_in_v2_jupsol_rem_liq_fixture() { let amount = 8_436; - let prefix_am = NewSwapExactOutV2IxPreAccsBuilder::start() - .with_signer("inf-token-acc-owner") - .with_pool_state("pool-state") - .with_lst_state_list("lst-state-list") - .with_inp_acc("inf-token-acc") - .with_inp_mint("inf-mint") - .with_inp_pool_reserves("inf-mint") - .with_out_acc("jupsol-token-acc") - .with_out_mint("jupsol-mint") - .with_out_pool_reserves("jupsol-reserves") - .with_inp_token_program("tokenkeg") - .with_out_token_program("tokenkeg") - .build() - .0 - .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()); - let prefix_keys = IxPreAccs(prefix_am.each_ref().map(|(addr, _)| addr.to_bytes())); + let prefix_am = IxPreAccs( + NewSwapExactOutV2IxPreAccsBuilder::start() + .with_signer("inf-token-acc-owner") + .with_pool_state("pool-state") + .with_lst_state_list("lst-state-list") + .with_inp_acc("inf-token-acc") + .with_inp_mint("inf-mint") + .with_inp_pool_reserves("inf-mint") + .with_out_acc("jupsol-token-acc") + .with_out_mint("jupsol-mint") + .with_out_pool_reserves("jupsol-reserves") + // filler + .with_inp_token_program("jupsol-mint") + .with_out_token_program("jupsol-mint") + .build() + .0 + .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()), + ) + .with_inp_token_program(mollusk_svm_programs_token::token::keyed_account()) + .with_out_token_program(mollusk_svm_programs_token::token::keyed_account()); + let prefix_keys = IxPreAccs(prefix_am.0.each_ref().map(|(addr, _)| addr.to_bytes())); let (pp_accs, pp_am) = flatslab_fixture_suf_accs(); let (out_accs, out_am) = jupsol_fixture_svc_suf_accs(); @@ -54,8 +59,8 @@ fn swap_exact_in_v2_jupsol_rem_liq_fixture() { accs, }; - let mut bef = prefix_am.into_iter().chain(pp_am).chain(out_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + let mut bef = prefix_am.0.into_iter().chain(pp_am).chain(out_am).collect(); + fill_swap_prog_accs(&mut bef, &accs); let Quote { inp, out, fee, .. } = SVM.with(|svm| swap_exact_in_v2_test(svm, &args, &bef, None::).unwrap()); diff --git a/controller/program/tests/tests/swap/v2/exact_in/swap.rs b/controller/program/tests/tests/swap/v2/exact_in/swap.rs index e24cd313..f9254e22 100644 --- a/controller/program/tests/tests/swap/v2/exact_in/swap.rs +++ b/controller/program/tests/tests/swap/v2/exact_in/swap.rs @@ -14,7 +14,7 @@ use jiminy_cpi::program_error::ProgramError; use crate::{ common::SVM, - tests::swap::{common::add_swap_prog_accs, v2::jupsol_to_wsol_prefix_fixtures}, + tests::swap::{common::fill_swap_prog_accs, v2::jupsol_to_wsol_prefix_fixtures}, }; use super::{swap_exact_in_v2_test, Accs, Args}; @@ -46,7 +46,7 @@ fn swap_exact_in_v2_jupsol_to_wsol_fixture() { }; let mut bef = prefix_am.0.into_iter().chain(pp_am).chain(inp_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + fill_swap_prog_accs(&mut bef, &accs); let Quote { inp, out, fee, .. } = SVM.with(|svm| swap_exact_in_v2_test(svm, &args, &bef, None::).unwrap()); diff --git a/controller/program/tests/tests/swap/v2/exact_out/add_liq.rs b/controller/program/tests/tests/swap/v2/exact_out/add_liq.rs index 7aa2e629..3a488cb0 100644 --- a/controller/program/tests/tests/swap/v2/exact_out/add_liq.rs +++ b/controller/program/tests/tests/swap/v2/exact_out/add_liq.rs @@ -11,29 +11,34 @@ use inf1_test_utils::{ }; use jiminy_cpi::program_error::ProgramError; -use crate::{common::SVM, tests::swap::common::add_swap_prog_accs}; +use crate::{common::SVM, tests::swap::common::fill_swap_prog_accs}; use super::{swap_exact_out_v2_test, Accs, Args}; #[test] fn swap_exact_out_v2_jupsol_add_liq_fixture() { let amount = 10_000; - let prefix_am = NewSwapExactOutV2IxPreAccsBuilder::start() - .with_signer("jupsol-token-acc-owner") - .with_pool_state("pool-state") - .with_lst_state_list("lst-state-list") - .with_inp_acc("jupsol-token-acc") - .with_inp_mint("jupsol-mint") - .with_inp_pool_reserves("jupsol-reserves") - .with_out_acc("inf-token-acc") - .with_out_mint("inf-mint") - .with_out_pool_reserves("inf-mint") - .with_inp_token_program("tokenkeg") - .with_out_token_program("tokenkeg") - .build() - .0 - .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()); - let prefix_keys = IxPreAccs(prefix_am.each_ref().map(|(addr, _)| addr.to_bytes())); + let prefix_am = IxPreAccs( + NewSwapExactOutV2IxPreAccsBuilder::start() + .with_signer("jupsol-token-acc-owner") + .with_pool_state("pool-state") + .with_lst_state_list("lst-state-list") + .with_inp_acc("jupsol-token-acc") + .with_inp_mint("jupsol-mint") + .with_inp_pool_reserves("jupsol-reserves") + .with_out_acc("inf-token-acc") + .with_out_mint("inf-mint") + .with_out_pool_reserves("inf-mint") + // filler + .with_inp_token_program("inf-mint") + .with_out_token_program("inf-mint") + .build() + .0 + .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()), + ) + .with_inp_token_program(mollusk_svm_programs_token::token::keyed_account()) + .with_out_token_program(mollusk_svm_programs_token::token::keyed_account()); + let prefix_keys = IxPreAccs(prefix_am.0.each_ref().map(|(addr, _)| addr.to_bytes())); let (pp_accs, pp_am) = flatslab_fixture_suf_accs(); let (inp_accs, inp_am) = jupsol_fixture_svc_suf_accs(); @@ -46,8 +51,8 @@ fn swap_exact_out_v2_jupsol_add_liq_fixture() { pricing_prog: *PricingAgTy::FlatSlab(()).program_id(), pricing: PricingAg::FlatSlab(pp_accs), }; - let mut bef = prefix_am.into_iter().chain(pp_am).chain(inp_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + let mut bef = prefix_am.0.into_iter().chain(pp_am).chain(inp_am).collect(); + fill_swap_prog_accs(&mut bef, &accs); let args = Args { inp_lst_index: JUPSOL_FIXTURE_LST_IDX.try_into().unwrap(), out_lst_index: u32::MAX, diff --git a/controller/program/tests/tests/swap/v2/exact_out/errs.rs b/controller/program/tests/tests/swap/v2/exact_out/errs.rs index deac2f9b..9d218ec9 100644 --- a/controller/program/tests/tests/swap/v2/exact_out/errs.rs +++ b/controller/program/tests/tests/swap/v2/exact_out/errs.rs @@ -18,7 +18,7 @@ use inf1_test_utils::{ use crate::{ common::SVM, tests::swap::{ - common::add_swap_prog_accs, + common::fill_swap_prog_accs, v2::{ exact_out::{swap_exact_out_v2_test, Accs, Args}, jupsol_to_wsol_prefix_fixtures, @@ -61,7 +61,7 @@ fn swap_exact_out_input_disabled_fixture() { }; let mut bef = prefix_am.0.into_iter().chain(pp_am).chain(inp_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + fill_swap_prog_accs(&mut bef, &accs); SVM.with(|svm| { swap_exact_out_v2_test( @@ -103,7 +103,7 @@ fn swap_exact_out_pool_rebalancing_fixture() { }; let mut bef = prefix_am.0.into_iter().chain(pp_am).chain(inp_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + fill_swap_prog_accs(&mut bef, &accs); SVM.with(|svm| { swap_exact_out_v2_test( @@ -145,7 +145,7 @@ fn swap_exact_out_pool_disabled_fixture() { }; let mut bef = prefix_am.0.into_iter().chain(pp_am).chain(inp_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + fill_swap_prog_accs(&mut bef, &accs); SVM.with(|svm| { swap_exact_out_v2_test( @@ -185,7 +185,7 @@ fn swap_exact_out_slippage_tolerance_exceeded_fixture() { }; let mut bef = prefix_am.0.into_iter().chain(pp_am).chain(inp_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + fill_swap_prog_accs(&mut bef, &accs); SVM.with(|svm| { swap_exact_out_v2_test( @@ -212,12 +212,15 @@ fn swap_exact_out_same_lst_fixture() { .with_out_acc("wsol-token-acc") .with_out_mint("wsol-mint") .with_out_pool_reserves("wsol-reserves") - .with_inp_token_program("tokenkeg") - .with_out_token_program("tokenkeg") + // filler + .with_inp_token_program("wsol-mint") + .with_out_token_program("wsol-mint") .build() .0 .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()), - ); + ) + .with_inp_token_program(mollusk_svm_programs_token::token::keyed_account()) + .with_out_token_program(mollusk_svm_programs_token::token::keyed_account()); let prefix_keys = IxPreAccs(prefix_am.0.each_ref().map(|(addr, _)| addr.to_bytes())); let [inp_calc, out_calc] = core::array::from_fn(|_| SvcCalcAccsAg::Wsol(WsolCalcAccs)); let (pp_accs, pp_am) = flatslab_fixture_suf_accs(); @@ -240,7 +243,7 @@ fn swap_exact_out_same_lst_fixture() { }; let mut bef = prefix_am.0.into_iter().chain(pp_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + fill_swap_prog_accs(&mut bef, &accs); SVM.with(|svm| { swap_exact_out_v2_test( diff --git a/controller/program/tests/tests/swap/v2/exact_out/rem_liq.rs b/controller/program/tests/tests/swap/v2/exact_out/rem_liq.rs index 0977f09b..665d26b0 100644 --- a/controller/program/tests/tests/swap/v2/exact_out/rem_liq.rs +++ b/controller/program/tests/tests/swap/v2/exact_out/rem_liq.rs @@ -11,29 +11,34 @@ use inf1_test_utils::{ }; use jiminy_cpi::program_error::ProgramError; -use crate::{common::SVM, tests::swap::common::add_swap_prog_accs}; +use crate::{common::SVM, tests::swap::common::fill_swap_prog_accs}; use super::{swap_exact_out_v2_test, Accs, Args}; #[test] fn swap_exact_out_v2_jupsol_rem_liq_fixture() { let amount = 10_000; - let prefix_am = NewSwapExactOutV2IxPreAccsBuilder::start() - .with_signer("inf-token-acc-owner") - .with_pool_state("pool-state") - .with_lst_state_list("lst-state-list") - .with_inp_acc("inf-token-acc") - .with_inp_mint("inf-mint") - .with_inp_pool_reserves("inf-mint") - .with_out_acc("jupsol-token-acc") - .with_out_mint("jupsol-mint") - .with_out_pool_reserves("jupsol-reserves") - .with_inp_token_program("tokenkeg") - .with_out_token_program("tokenkeg") - .build() - .0 - .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()); - let prefix_keys = IxPreAccs(prefix_am.each_ref().map(|(addr, _)| addr.to_bytes())); + let prefix_am = IxPreAccs( + NewSwapExactOutV2IxPreAccsBuilder::start() + .with_signer("inf-token-acc-owner") + .with_pool_state("pool-state") + .with_lst_state_list("lst-state-list") + .with_inp_acc("inf-token-acc") + .with_inp_mint("inf-mint") + .with_inp_pool_reserves("inf-mint") + .with_out_acc("jupsol-token-acc") + .with_out_mint("jupsol-mint") + .with_out_pool_reserves("jupsol-reserves") + // filler + .with_inp_token_program("jupsol-mint") + .with_out_token_program("jupsol-mint") + .build() + .0 + .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()), + ) + .with_inp_token_program(mollusk_svm_programs_token::token::keyed_account()) + .with_out_token_program(mollusk_svm_programs_token::token::keyed_account()); + let prefix_keys = IxPreAccs(prefix_am.0.each_ref().map(|(addr, _)| addr.to_bytes())); let (pp_accs, pp_am) = flatslab_fixture_suf_accs(); let (out_accs, out_am) = jupsol_fixture_svc_suf_accs(); @@ -46,8 +51,8 @@ fn swap_exact_out_v2_jupsol_rem_liq_fixture() { pricing_prog: *PricingAgTy::FlatSlab(()).program_id(), pricing: PricingAg::FlatSlab(pp_accs), }; - let mut bef = prefix_am.into_iter().chain(pp_am).chain(out_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + let mut bef = prefix_am.0.into_iter().chain(pp_am).chain(out_am).collect(); + fill_swap_prog_accs(&mut bef, &accs); let args = Args { inp_lst_index: u32::MAX, out_lst_index: JUPSOL_FIXTURE_LST_IDX.try_into().unwrap(), diff --git a/controller/program/tests/tests/swap/v2/exact_out/swap.rs b/controller/program/tests/tests/swap/v2/exact_out/swap.rs index 028d6c3b..41446194 100644 --- a/controller/program/tests/tests/swap/v2/exact_out/swap.rs +++ b/controller/program/tests/tests/swap/v2/exact_out/swap.rs @@ -15,7 +15,7 @@ use jiminy_cpi::program_error::ProgramError; use crate::{ common::SVM, tests::swap::{ - common::add_swap_prog_accs, + common::fill_swap_prog_accs, v2::{exact_out::swap_exact_out_v2_test, jupsol_to_wsol_prefix_fixtures}, }, }; @@ -49,7 +49,7 @@ fn swap_exact_out_v2_jupsol_to_wsol_fixture() { }; let mut bef = prefix_am.0.into_iter().chain(pp_am).chain(inp_am).collect(); - add_swap_prog_accs(&mut bef, &accs); + fill_swap_prog_accs(&mut bef, &accs); let Quote { inp, out, fee, .. } = SVM.with(|svm| swap_exact_out_v2_test(svm, &args, &bef, None::).unwrap()); diff --git a/controller/program/tests/tests/swap/v2/mod.rs b/controller/program/tests/tests/swap/v2/mod.rs index 10a80301..f83157ea 100644 --- a/controller/program/tests/tests/swap/v2/mod.rs +++ b/controller/program/tests/tests/swap/v2/mod.rs @@ -20,11 +20,13 @@ fn jupsol_to_wsol_prefix_fixtures() -> IxPreAccs<(Pubkey, Account)> { .with_out_acc("wsol-token-acc") .with_out_mint("wsol-mint") .with_out_pool_reserves("wsol-reserves") - // TODO: loading these 2 large program accounts might be slow - .with_inp_token_program("tokenkeg") - .with_out_token_program("tokenkeg") + // filler + .with_inp_token_program("wsol-mint") + .with_out_token_program("wsol-mint") .build() .0 .map(|n| KeyedUiAccount::from_test_fixtures_json(n).into_keyed_account()), ) + .with_inp_token_program(mollusk_svm_programs_token::token::keyed_account()) + .with_out_token_program(mollusk_svm_programs_token::token::keyed_account()) } diff --git a/core/Cargo.toml b/core/Cargo.toml index 3b426f3f..319b2988 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -8,4 +8,3 @@ version.workspace = true inf1-ctl-core = { workspace = true } inf1-pp-core = { workspace = true } inf1-svc-core = { workspace = true } -sanctum-fee-ratio = { workspace = true } diff --git a/core/src/lib.rs b/core/src/lib.rs index 87dd9ae5..78405a3d 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -8,4 +8,3 @@ pub use inf1_svc_core; pub mod err; pub mod instructions; pub mod quote; -pub mod typedefs; diff --git a/core/src/typedefs/fee_bps.rs b/core/src/typedefs/fee_bps.rs deleted file mode 100644 index d105fc0a..00000000 --- a/core/src/typedefs/fee_bps.rs +++ /dev/null @@ -1,16 +0,0 @@ -use sanctum_fee_ratio::{ - ratio::{Ceil, Ratio}, - Fee, -}; - -pub const BPS_DENOM: u16 = 10_000; - -pub type FeeBps = Fee>>; - -#[inline] -pub const fn fee_bps(bps: u16) -> Option { - FeeBps::new(Ratio { - n: bps, - d: BPS_DENOM, - }) -} diff --git a/core/src/typedefs/mod.rs b/core/src/typedefs/mod.rs deleted file mode 100644 index 34494ee1..00000000 --- a/core/src/typedefs/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod fee_bps; diff --git a/docs/v2/README.md b/docs/v2/README.md index 1508bf36..d9bbeae2 100644 --- a/docs/v2/README.md +++ b/docs/v2/README.md @@ -66,15 +66,13 @@ These instructions do not run the migration because they are low-frequency non-u ##### `release_yield` -For the following instructions that are affected by yield release events and have write-access to `PoolState` +[All instructions that run `update_yield`](#update_yield) must run `release_yield` prior to the first `update_yield` so that any newly observed yields do not get early-released, with the following exceptions: -- SyncSolValue (not affected, but included so that it can act as a permissionless crank to release yield if needed) -- AddLiquidity -- RemoveLiquidity -- SwapExactIn -- SwapExactOut -- SwapExactInV2 (new) -- SwapExactOutV2 (new) +- EndRebalance, because the prior StartRebalance would've ran it in the same slot already + +Additionally, the following instructions that affect or are affected by yield release events must run it: + +- SetRps (new) - WithdrawProtocolFeesV2 (new) Immediately after verification, before running anything else, the instruction will run a `release_yield` subroutine which: @@ -106,11 +104,13 @@ This is a geometric sequence with `a = y` and `r = 1.0 - k` ##### `update_yield` -For instructions that involve running at least 1 SyncSolValue procedure, apart from `AddLiquidity` and `RemoveLiquidity`: +For instructions that involve running at least 1 SyncSolValue procedure: - SyncSolValue - SwapExactIn - SwapExactOut +- AddLiquidity +- RemoveLiquidity - SetSolValueCalculator - StartRebalance - EndRebalance diff --git a/test-fixtures/tokenkeg.json b/test-fixtures/tokenkeg.json deleted file mode 100644 index c9c481ea..00000000 --- a/test-fixtures/tokenkeg.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", - "account": { - "lamports": 5313144068, - "data": [ - "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cm96ZW5FcnJvcjogVGhpcyB0b2tlbiBtaW50IGNhbm5vdCBmcmVlemUgYWNjb3VudHNFcnJvcjogQWNjb3VudCBkb2VzIG5vdCBzdXBwb3J0IHNwZWNpZmllZCBhdXRob3JpdHkgdHlwZUVycm9yOiBPcGVyYXRpb24gb3ZlcmZsb3dlZEVycm9yOiBJbnZhbGlkIGFjY291bnQgc3RhdGUgZm9yIG9wZXJhdGlvbkVycm9yOiBJbnZhbGlkIGluc3RydWN0aW9uRXJyb3I6IE5vbi1uYXRpdmUgYWNjb3VudCBjYW4gb25seSBiZSBjbG9zZWQgaWYgaXRzIGJhbGFuY2UgaXMgemVyb0Vycm9yOiBJbnN0cnVjdGlvbiBkb2VzIG5vdCBzdXBwb3J0IG5hdGl2ZSB0b2tlbnNFcnJvcjogU3RhdGUgaXMgdW5pbml0aWFsaXplZEVycm9yOiBJbnZhbGlkIG51bWJlciBvZiByZXF1aXJlZCBzaWduZXJzRXJyb3I6IEludmFsaWQgbnVtYmVyIG9mIHByb3ZpZGVkIHNpZ25lcnNFcnJvcjogYWNjb3VudCBvciB0b2tlbiBhbHJlYWR5IGluIHVzZUVycm9yOiB0aGUgdG90YWwgc3VwcGx5IG9mIHRoaXMgdG9rZW4gaXMgZml4ZWRFcnJvcjogb3duZXIgZG9lcyBub3QgbWF0Y2hFcnJvcjogQWNjb3VudCBub3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTWludEVycm9yOiBJbnZhbGlkIE1pbnRFcnJvcjogaW5zdWZmaWNpZW50IGZ1bmRzRXJyb3I6IExhbXBvcnQgYmFsYW5jZSBiZWxvdyByZW50LWV4ZW1wdCB0aHJlc2hvbGRJbnN0cnVjdGlvbjogSW5pdGlhbGl6ZU11bHRpc2lnMkVycm9yOiBBY2NvdW50QWxyZWFkeUluaXRpYWxpemVkdG9rZW4vcHJvZ3JhbS9zcmMvaW5zdHJ1Y3Rpb24ucnNsaWJyYXJ5L2NvcmUvc3JjL3NsaWNlL21lbWNoci5yc2luZGV4IG91dCBvZiBib3VuZHM6IHRoZSBsZW4gaXMgbGlicmFyeS9jb3JlL3NyYy9mbXQvYnVpbGRlcnMucnNpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlAAAAdG9rZW4vcHJvZ3JhbS9zcmMvcHJvY2Vzc29yLnJzUGxlYXNlIHVwZ3JhZGUgdG8gU1BMIFRva2VuIDIwMjIgZm9yIGltbXV0YWJsZSBvd25lciBzdXBwb3J0SW5zdHJ1Y3Rpb246IFVpQW1vdW50VG9BbW91bnRJbnN0cnVjdGlvbjogQW1vdW50VG9VaUFtb3VudEluc3RydWN0aW9uOiBJbml0aWFsaXplSW1tdXRhYmxlT3duZXJJbnN0cnVjdGlvbjogR2V0QWNjb3VudERhdGFTaXplSW5zdHJ1Y3Rpb246IEluaXRpYWxpemVNaW50Mkluc3RydWN0aW9uOiBJbml0aWFsaXplQWNjb3VudDNJbnN0cnVjdGlvbjogU3luY05hdGl2ZUluc3RydWN0aW9uOiBJbml0aWFsaXplQWNjb3VudDJJbnN0cnVjdGlvbjogQnVybkNoZWNrZWRJbnN0cnVjdGlvbjogTWludFRvQ2hlY2tlZEluc3RydWN0aW9uOiBBcHByb3ZlQ2hlY2tlZEluc3RydWN0aW9uOiBUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbjogVGhhd0FjY291bnRJbnN0cnVjdGlvbjogRnJlZXplQWNjb3VudEluc3RydWN0aW9uOiBDbG9zZUFjY291bnRJbnN0cnVjdGlvbjogQnVybkluc3RydWN0aW9uOiBNaW50VG9JbnN0cnVjdGlvbjogU2V0QXV0aG9yaXR5SW5zdHJ1Y3Rpb246IFJldm9rZUluc3RydWN0aW9uOiBBcHByb3ZlSW5zdHJ1Y3Rpb246IFRyYW5zZmVySW5zdHJ1Y3Rpb246IEluaXRpYWxpemVNdWx0aXNpZ0luc3RydWN0aW9uOiBJbml0aWFsaXplQWNjb3VudEluc3RydWN0aW9uOiBJbml0aWFsaXplTWludHRva2VuL3Byb2dyYW0vc3JjL3N0YXRlLnJzAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAACAAAAAIAAAAAwAAAAAAAAB0b2tlbi9wcm9ncmFtL3NyYy9saWIucnMpIHdoZW4gc2xpY2luZyBgYWxyZWFkeSBib3Jyb3dlZHJhbmdlIGVuZCBpbmRleCBFcnJvcjogSW52YWxpZFJlYWxsb2NFcnJvcjogTWF4QWNjb3VudHNEYXRhU2l6ZUV4Y2VlZGVkRXJyb3I6IElsbGVnYWxPd25lckVycm9yOiBVbnN1cHBvcnRlZFN5c3ZhckVycm9yOiBBY2NvdW50Tm90UmVudEV4ZW1wdEVycm9yOiBCb3JzaElvRXJyb3JFcnJvcjogSW52YWxpZFNlZWRzRXJyb3I6IE1heFNlZWRMZW5ndGhFeGNlZWRlZEVycm9yOiBBY2NvdW50Qm9ycm93RmFpbGVkRXJyb3I6IE5vdEVub3VnaEFjY291bnRLZXlzRXJyb3I6IFVuaW5pdGlhbGl6ZWRBY2NvdW50RXJyb3I6IE1pc3NpbmdSZXF1aXJlZFNpZ25hdHVyZUVycm9yOiBJbmNvcnJlY3RQcm9ncmFtSWRFcnJvcjogSW5zdWZmaWNpZW50RnVuZHNFcnJvcjogQWNjb3VudERhdGFUb29TbWFsbEVycm9yOiBJbnZhbGlkQWNjb3VudERhdGFFcnJvcjogSW52YWxpZEluc3RydWN0aW9uRGF0YUVycm9yOiBJbnZhbGlkQXJndW1lbnRFcnJvcjogVW5rbm93bnNyYy9zeXN2YXIvbW9kLnJzYWxyZWFkeSBtdXRhYmx5IGJvcnJvd2VkYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5pc19jaGFyX2JvdW5kYXJ5KGlkeCkvaG9tZS9ydW5uZXIvd29yay9icGYtdG9vbHMvYnBmLXRvb2xzL291dC9ydXN0L2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5yc2EgRGlzcGxheSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB1bmV4cGVjdGVkbHljYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlYXNzZXJ0aW9uIGZhaWxlZDogbWlkIDw9IHNlbGYubGVuKCkvaG9tZS9ydW5uZXIvd29yay9icGYtdG9vbHMvYnBmLXRvb2xzL291dC9ydXN0L2xpYnJhcnkvY29yZS9zcmMvc3RyL3BhdHRlcm4ucnNzcmMvYWNjb3VudF9pbmZvLnJzc3JjL2VudHJ5cG9pbnQucnNzcmMvcHVia2V5LnJzU2xpY2UgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGggYXMgYSBQdWJrZXkAM5ByjTQRYHm9yRG//wDb1E0uzcz3nKbhADjhAAAAAGFscmVhZHkgbXV0YWJseSBib3Jyb3dlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAan1RcZLFxRIYzJTD1K8X9Y2u4Im6H9ROPb2YoAAAAARXJyb3I6IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCwgb3V0IG9mIG1lbW9yeWxpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMucnNjYXBhY2l0eSBvdmVyZmxvd2EgZm9ybWF0dGluZyB0cmFpdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvcmxpYnJhcnkvYWxsb2Mvc3JjL2ZtdC5ycwAALi5Cb3Jyb3dFcnJvckJvcnJvd011dEVycm9yICAgICA8PSBjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlOnBhbmlja2VkIGF0ICcnLCAgYnV0IHRoZSBpbmRleCBpcyBgOiAsCiwgKAooLClsaWJyYXJ5L2NvcmUvc3JjL2ZtdC9udW0ucnMweDAwMDEwMjAzMDQwNTA2MDcwODA5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5KClyYW5nZSBzdGFydCBpbmRleCAgb3V0IG9mIHJhbmdlIGZvciBzbGljZSBvZiBsZW5ndGggc2xpY2UgaW5kZXggc3RhcnRzIGF0ICBidXQgZW5kcyBhdCAgKGJ5dGVzIHNvdXJjZSBzbGljZSBsZW5ndGggKCkgZG9lcyBub3QgbWF0Y2ggZGVzdGluYXRpb24gc2xpY2UgbGVuZ3RoIChsaWJyYXJ5L2NvcmUvc3JjL3N0ci92YWxpZGF0aW9ucy5ycwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB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3b0BACAAAAAAAAAAFQIAACsAAAAAAAAA3b0BACAAAAAAAAAACgIAACsAAAAAAAAA3b0BACAAAAAAAAAA9gEAABoAAAAAAAAAiL4BAB4AAAAAAAAAKwAAAD8AAAAAAAAAiL4BAB4AAAAAAAAAOQAAAC4AAAAAAAAAiL4BAB4AAAAAAAAAZwAAAEwAAAAAAAAAiL4BAB4AAAAAAAAAcwAAADIAAAAAAAAAiL4BAB4AAAAAAAAAiQAAADsAAAAAAAAAiL4BAB4AAAAAAAAAtgAAAEsAAAAAAAAAiL4BAB4AAAAAAAAAyQAAAA0AAAAAAAAAiL4BAB4AAAAAAAAAzQAAADoAAAAAAAAAiL4BAB4AAAAAAAAA8AAAAEwAAAAAAAAAiL4BAB4AAAAAAAAA8QAAAFYAAAAAAAAAiL4BAB4AAAAAAAAAAgEAADUAAAAAAAAAiL4BAB4AAAAAAAAAPgEAACwAAAAAAAAAiL4BAB4AAAAAAAAAQwEAADEAAAAAAAAAiL4BAB4AAAAAAAAASAEAAEUAAAAAAAAAiL4BAB4AAAAAAAAASwEAADAAAAAAAAAAiL4BAB4AAAAAAAAAZAEAAEwAAAAAAAAAiL4BAB4AAAAAAAAAbwEAADUAAAAAAAAAiL4BAB4AAAAAAAAAfwEAAEUAAAAAAAAAiL4BAB4AAAAAAAAAiQEAAEwAAAAAAAAAiL4BAB4AAAAAAAAAmwEAAEUAAAAAAAAAiL4BAB4AAAAAAAAArAEAAEIAAAAAAAAAiL4BAB4AAAAAAAAA1gEAADsAAAAAAAAAiL4BAB4AAAAAAAAA2AEAADwAAAAAAAAAiL4BAB4AAAAAAAAA+gEAADUAAAAAAAAAiL4BAB4AAAAAAAAADgIAAFYAAAAAAAAAiL4BAB4AAAAAAAAAGgIAADUAAAAAAAAAiL4BAB4AAAAAAAAAPAIAADAAAAAAAAAAiL4BAB4AAAAAAAAAPgIAAC4AAAAAAAAAiL4BAB4AAAAAAAAAUAIAAEwAAAAAAAAAiL4BAB4AAAAAAAAAUQIAADUAAAAAAAAAiL4BAB4AAAAAAAAAkgIAAEUAAAAAAAAAiL4BAB4AAAAAAAAAkwIAAC4AAAAAAAAAiL4BAB4AAAAAAAAAowIAAEgAAAAAAAAAiL4BAB4AAAAAAAAAtwIAAC0AAAAAAAAAiL4BAB4AAAAAAAAA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CAAAAAAAAABYAAEAAAAAAAgAAAAAAAAAmAABAAAAAAAIAAAAAAAAANgAAQAAAAAACAAAAAAAAAAYAQEAAAAAAAgAAAAAAAAAWAEBAAAAAAAIAAAAAAAAAHgBAQAAAAAACAAAAAAAAACYAQEAAAAAAAgAAAAAAAAAuAEBAAAAAAAIAAAAAAAAANgBAQAAAAAACAAAAAAAAAD4AQEAAAAAAAgAAAAAAAAAGAIBAAAAAAAIAAAAAAAAADgCAQAAAAAACAAAAAAAAABYAgEAAAAAAAgAAAAAAAAAeAIBAAAAAAAIAAAAAAAAAJgCAQAAAAAACAAAAAAAAAC4AgEAAAAAAAgAAAAAAAAA2AIBAAAAAAAIAAAAAAAAAPgCAQAAAAAACAAAAAAAAABABQEAAAAAAAgAAAAAAAAAWAUBAAAAAAAIAAAAAAAAAIgJAQAAAAAACAAAAAAAAACgCQEAAAAAAAgAAAAAAAAAsAkBAAAAAAAIAAAAAAAAANAMAQAAAAAACAAAAAAAAADoDAEAAAAAAAgAAAAAAAAAYA0BAAAAAAAIAAAAAAAAAHgNAQAAAAAACAAAAAAAAADwDQEAAAAAAAgAAAAAAAAACA4BAAAAAAAIAAAAAAAAAMgSAQAAAAAACAAAAAAAAAAAFAEAAAAAAAgAAAAAAAAA8BgBAAAAAAAIAAAAAAAAAKAZAQAAAAAACAAAAAAAAAC4GQEAAAAAAAgAAAAAAAAAyBkBAAAAAAAIAAAAAAAAAFgaAQAAAAAACAAAAAAAAABwGgEAAAAAAAgAAAAAAAAAgBoBAAAAAAAIAAAAAAAAADAjAQAAAAAACAAAAAAAAADQLgEAAAAAAAgAAAAAAAAA6C4BAAAAAAAIAAAAAAAAAPguAQAAAAAACAAAAAAAAAB4MQEAAAAAAAgAAAAAAAAA0DEBAAAAAAAIAAAAAAAAAFgyAQAAAAAACAAAAAAAAAAwNAEAAAAAAAgAAAAAAAAAwDgBAAAAAAAIAAAAAAAAANg4AQAAAAAACAAAAAAAAAAgOwEAAAAAAAgAAAAAAAAAWDsBAAAAAAAIAAAAAAAAAHA7AQAAAAAACAAAAAAAAACAOwEAAAAAAAgAAAAAAAAAWEABAAAAAAAIAAAAAAAAAOBAAQAAAAAACAAAAAAAAAAQQQEAAAAAAAgAAAAAAAAA6EEBAAAAAAAIAAAA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AAAAAAgAAAAAAAAAyNQBAAAAAAAIAAAAAAAAAODUAQAAAAAACAAAAAAAAAD41AEAAAAAAAgAAAAAAAAAENUBAAAAAAAIAAAAAAAAACjVAQAAAAAACAAAAAAAAABA1QEAAAAAAAgAAAAAAAAAWNUBAAAAAAAIAAAAAAAAAHDVAQAAAAAACAAAAAAAAACI1QEAAAAAAAgAAAAAAAAAoNUBAAAAAAAIAAAAAAAAALjVAQAAAAAACAAAAAAAAADQ1QEAAAAAAAgAAAAAAAAA6NUBAAAAAAAIAAAAAAAAAADWAQAAAAAACAAAAAAAAAAY1gEAAAAAAAgAAAAAAAAAMNYBAAAAAAAIAAAAAAAAAEjWAQAAAAAACAAAAAAAAABg1gEAAAAAAAgAAAAAAAAAeNYBAAAAAAAIAAAAAAAAAJDWAQAAAAAACAAAAAAAAACo1gEAAAAAAAgAAAAAAAAAwNYBAAAAAAAIAAAAAAAAANjWAQAAAAAACAAAAAAAAADw1gEAAAAAAAgAAAAAAAAACNcBAAAAAAAIAAAAAAAAACDXAQAAAAAACAAAAAAAAAA41wEAAAAAAAgAAAAAAAAAUNcBAAAAAAAIAAAAAAAAAGjXAQAAAAAACAAAAAAAAACA1wEAAAAAAAgAAAAAAAAAmNcBAAAAAAAIAAAAAAAAALDXAQAAAAAACAAAAAAAAADI1wEAAAAAAAgAAAAAAAAA4NcBAAAAAAAIAAAAAAAAAPjXAQAAAAAACAAAAAAAAAAQ2AEAAAAAAAgAAAAAAAAAKNgBAAAAAAAIAAAAAAAAAEDYAQAAAAAACAAAAAAAAABY2AEAAAAAAAgAAAAAAAAAcNgBAAAAAAAIAAAAAAAAAIjYAQAAAAAACAAAAAAAAACg2AEAAAAAAAgAAAAAAAAAuNgBAAAAAAAIAAAAAAAAANDYAQAAAAAACAAAAAAAAADo2AEAAAAAAAgAAAAAAAAAANkBAAAAAAAIAAAAAAAAABjZAQAAAAAACAAAAAAAAAAw2QEAAAAAAAgAAAAAAAAAQNkBAAAAAAAIAAAAAAAAAFjZAQAAAAAACAAAAAAAAABw2QEAAAAAAAgAAAAAAAAAiNkBAAAAAAAIAAAAAAAAAKDZAQAAAAAACAAAAAAAAACo2QEAAAAAAAgAAAAAAAAAsNkBAAAAAAAIAAAAAAAAALjZAQAAAAAA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", - "base64" - ], - "owner": "BPFLoader2111111111111111111111111111111111", - "executable": true, - "rentEpoch": 18446744073709551615, - "space": 134080 - } -} diff --git a/test-utils/src/mollusk.rs b/test-utils/src/mollusk.rs index 958a3262..f562a9bb 100644 --- a/test-utils/src/mollusk.rs +++ b/test-utils/src/mollusk.rs @@ -161,8 +161,13 @@ pub fn mollusk_exec( match res.program_result { ProgramResult::Success => { let resulting_accounts: AccountMap = res.resulting_accounts.iter().cloned().collect(); - - assert_balanced(accs_bef, &resulting_accounts); + assert_balanced( + // need to filter out accs in accs_bef that were not involved in the ixs + accs_bef + .iter() + .filter(|(pk, _)| resulting_accounts.contains_key(pk)), + &resulting_accounts, + ); assert!( res.run_checks(&[Check::all_rent_exempt()], &svm.config, svm), "Not all accounts are rent-exempt after execution" @@ -180,6 +185,21 @@ pub fn mollusk_exec( } } +fn assert_balanced<'a>( + bef: impl IntoIterator, + aft: impl IntoIterator, +) { + let lamports_bef = bef + .into_iter() + .map(|(_, a)| u128::from(a.lamports)) + .sum::(); + let lamports_aft = aft + .into_iter() + .map(|(_, a)| u128::from(a.lamports)) + .sum::(); + assert_eq!(lamports_bef, lamports_aft, "lamports not balanced"); +} + /// Returns `[bef, aft]`. /// /// # Params @@ -199,14 +219,3 @@ pub fn assert_jiminy_prog_err>(exec_err: &ExecErr, e } } } - -pub fn assert_balanced(bef: &AccountMap, aft: &AccountMap) { - let [lamports_bef, lamports_aft] = [bef, aft].map(|accounts| { - accounts - .values() - .map(|acc| acc.lamports as u128) - .sum::() - }); - - assert_eq!(lamports_bef, lamports_aft, "lamports not balanced"); -}