@@ -15,17 +15,23 @@ use snforge_std::cheatcodes::execution_info::block_timestamp::{
1515use snforge_std :: cheatcodes :: execution_info :: caller_address :: {
1616 start_cheat_caller_address, stop_cheat_caller_address
1717};
18- use spotnet :: constants :: ZK_SCALE_DECIMALS ;
18+ use spotnet :: constants :: { ZK_SCALE_DECIMALS , STRK_ADDRESS } ;
1919use spotnet :: interfaces :: {
2020 IDepositDispatcher , IDepositSafeDispatcher , IDepositSafeDispatcherTrait , IDepositDispatcherTrait
2121};
22- use spotnet :: types :: DepositData ;
22+ use spotnet :: types :: { DepositData , VaultRepayData } ;
2323
2424use starknet :: {ContractAddress , get_block_timestamp};
2525use super :: constants :: {contracts, tokens, HYPOTHETICAL_OWNER_ADDR , pool_key};
2626
2727use super :: interfaces :: {IMarketTestingDispatcher , IMarketTestingDispatcherTrait };
28- use super :: utils :: {deploy_deposit_contract, get_asset_price_pragma, get_slippage_limits};
28+ use super :: utils :: {
29+ deploy_deposit_contract,
30+ get_asset_price_pragma,
31+ get_slippage_limits,
32+ setup_test_suite,
33+ assert_vault_amount_bigger_than_zero
34+ };
2935
3036fn get_deposit_dispatcher (user : ContractAddress ) -> IDepositDispatcher {
3137 IDepositDispatcher { contract_address : deploy_deposit_contract (user ) }
@@ -375,7 +381,8 @@ fn test_close_position_usdc_valid_time_passed() {
375381 get_slippage_limits (pool_key ),
376382 95 ,
377383 pool_price ,
378- quote_token_price
384+ quote_token_price ,
385+ []. span ()
379386 );
380387
381388 stop_cheat_block_timestamp (contracts :: ZKLEND_MARKET . try_into (). unwrap ());
@@ -432,7 +439,8 @@ fn test_close_position_amounts_cleared() {
432439 get_slippage_limits (pool_key ),
433440 95 ,
434441 pool_price . try_into (). unwrap (),
435- quote_token_price
442+ quote_token_price ,
443+ []. span ()
436444 );
437445 stop_cheat_account_contract_address (deposit_disp . contract_address);
438446 let zk_market = IMarketTestingDispatcher {
@@ -506,7 +514,8 @@ fn test_close_position_partial_debt_utilization() {
506514 get_slippage_limits (pool_key ),
507515 95 ,
508516 pool_price ,
509- quote_token_price
517+ quote_token_price ,
518+ []. span ()
510519 );
511520 stop_cheat_account_contract_address (deposit_disp . contract_address);
512521 let zk_market = IMarketTestingDispatcher {
@@ -662,7 +671,8 @@ fn test_extra_deposit_supply_token_close_position_fuzz(extra_amount: u32) {
662671 get_slippage_limits (pool_key ),
663672 95 ,
664673 pool_price ,
665- quote_token_price . try_into (). unwrap ()
674+ quote_token_price . try_into (). unwrap (),
675+ []. span ()
666676 );
667677 stop_cheat_account_contract_address (deposit_disp . contract_address);
668678
@@ -742,7 +752,8 @@ fn test_withdraw_valid_fuzz(amount: u32) {
742752 get_slippage_limits (pool_key ),
743753 95 ,
744754 pool_price ,
745- quote_token_price
755+ quote_token_price ,
756+ []. span ()
746757 );
747758 stop_cheat_account_contract_address (deposit_disp . contract_address);
748759
@@ -920,3 +931,96 @@ fn test_transfer_renounced_ownership() {
920931
921932 assert (ownable_disp . owner () == new_owner , ' Owner did not change' );
922933}
934+
935+ #[test]
936+ #[fork(" MAINNET" )]
937+ fn test_repay_vaults_in_close_position (){
938+ let usdc_addr : ContractAddress = tokens :: USDC . try_into (). unwrap ();
939+ let eth_addr : ContractAddress = tokens :: ETH . try_into (). unwrap ();
940+ let strk_addr : ContractAddress = STRK_ADDRESS . try_into (). unwrap ();
941+ let user : ContractAddress = HYPOTHETICAL_OWNER_ADDR . try_into (). unwrap ();
942+ let amount = 1000000 ;
943+
944+ let repay_vaults = array! [
945+ // First will be skip in repay_vaults, because usdc_addr == supply_token
946+ VaultRepayData {vault : setup_test_suite (user , usdc_addr ). vault. contract_address, amount },
947+ VaultRepayData {vault : setup_test_suite (user , eth_addr ). vault. contract_address, amount },
948+ VaultRepayData {vault : setup_test_suite (user , strk_addr ). vault. contract_address, amount }
949+ ];
950+
951+ let pool_key = PoolKey {
952+ token0 : eth_addr ,
953+ token1 : usdc_addr ,
954+ fee : pool_key :: FEE ,
955+ tick_spacing : pool_key :: TICK_SPACING ,
956+ extension : pool_key :: EXTENSION . try_into (). unwrap ()
957+ };
958+ let quote_token_price = get_asset_price_pragma (' ETH/USD' ). into ();
959+
960+ let usdc_token_disp = ERC20ABIDispatcher { contract_address : usdc_addr };
961+ let eth_token_disp = ERC20ABIDispatcher { contract_address : eth_addr };
962+ let strk_token_disp = ERC20ABIDispatcher { contract_address : strk_addr };
963+
964+ let decimals_sum_power : u128 = fast_power (
965+ 10 ,
966+ (eth_token_disp . decimals () + usdc_token_disp . decimals ())
967+ . into ()
968+ );
969+ let pool_price = ((1
970+ * ZK_SCALE_DECIMALS
971+ * decimals_sum_power . into ()
972+ / get_asset_price_pragma (' ETH/USD' ). into ())
973+ / ZK_SCALE_DECIMALS )
974+ . try_into ()
975+ . unwrap ();
976+
977+ let deposit_disp = get_deposit_dispatcher (user );
978+ let borrow_portion_percent = 90 ;
979+ let multiplier = 35 ;
980+ let limits = get_slippage_limits (pool_key );
981+
982+ start_cheat_caller_address (usdc_addr , user );
983+ usdc_token_disp . approve (deposit_disp . contract_address, amount );
984+ stop_cheat_caller_address (usdc_addr );
985+
986+ start_cheat_caller_address (strk_addr , user );
987+ strk_token_disp . approve (deposit_disp . contract_address, amount );
988+ stop_cheat_caller_address (strk_addr );
989+
990+ start_cheat_caller_address (eth_addr , user );
991+ eth_token_disp . approve (deposit_disp . contract_address, amount );
992+ stop_cheat_caller_address (eth_addr );
993+
994+ start_cheat_account_contract_address (deposit_disp . contract_address, user );
995+ deposit_disp
996+ . loop_liquidity (
997+ DepositData {
998+ token : usdc_addr , amount ,
999+ multiplier , borrow_portion_percent
1000+ },
1001+ pool_key , limits , pool_price
1002+ );
1003+ stop_cheat_account_contract_address (deposit_disp . contract_address);
1004+
1005+ start_cheat_caller_address (deposit_disp . contract_address, user );
1006+ deposit_disp . extra_deposit (strk_addr , amount );
1007+ deposit_disp . extra_deposit (eth_addr , amount );
1008+ stop_cheat_caller_address (deposit_disp . contract_address);
1009+
1010+ start_cheat_account_contract_address (deposit_disp . contract_address, user );
1011+ start_cheat_block_timestamp (
1012+ contracts :: ZKLEND_MARKET . try_into (). unwrap (), get_block_timestamp () + 40000000
1013+ );
1014+ deposit_disp
1015+ . close_position (
1016+ usdc_addr , eth_addr , pool_key , limits ,
1017+ borrow_portion_percent , pool_price , quote_token_price ,
1018+ repay_vaults . span ()
1019+ );
1020+ stop_cheat_block_timestamp (contracts :: ZKLEND_MARKET . try_into (). unwrap ());
1021+ stop_cheat_account_contract_address (deposit_disp . contract_address);
1022+
1023+ for vault in repay_vaults {
1024+ assert_vault_amount_bigger_than_zero (vault . vault, user );
1025+ }
1026+ }
0 commit comments