From a9470fc576977ba7e226f5d33e64e2c9b9e6eda9 Mon Sep 17 00:00:00 2001 From: 0xlny Date: Fri, 28 Nov 2025 14:35:11 +0100 Subject: [PATCH] :fire: Remove residual token check --- src/exchange.cairo | 42 ------------------ tests/exchange_test.cairo | 91 --------------------------------------- 2 files changed, 133 deletions(-) diff --git a/src/exchange.cairo b/src/exchange.cairo index a7f288c..aa42beb 100644 --- a/src/exchange.cairo +++ b/src/exchange.cairo @@ -63,7 +63,6 @@ pub mod Exchange { use avnu_lib::components::upgradable::UpgradableComponent; use avnu_lib::interfaces::erc20::{IERC20Dispatcher, IERC20DispatcherTrait}; use avnu_lib::math::muldiv::muldiv; - use core::dict::Felt252Dict; use core::num::traits::Zero; use starknet::storage::{Map, StorageMapReadAccess, StorageMapWriteAccess}; use starknet::{ClassHash, ContractAddress, get_caller_address, get_contract_address}; @@ -247,12 +246,6 @@ pub mod Exchange { assert(buy_token_min_amount <= buy_token_final_amount, 'Insufficient tokens received'); buy_token.transfer(beneficiary, buy_token_final_amount); - // Dict of bools are supported yet - let mut checked_tokens: Felt252Dict = Default::default(); - // Token to has already been checked - checked_tokens.insert(buy_token_address.into(), 1); - self.assert_no_remaining_tokens(contract_address, routes_span, checked_tokens); - // Emit event self .emit( @@ -355,11 +348,6 @@ pub mod Exchange { }, ); - // Dict of bools are supported yet - let mut checked_tokens: Felt252Dict = Default::default(); - // Token to has already been checked - checked_tokens.insert(buy_token_address.into(), 1); - self.assert_no_remaining_tokens(contract_address, routes_span, checked_tokens); true } @@ -489,36 +477,6 @@ pub mod Exchange { (sell_token_amount_used, buy_token_amount_received) } - fn assert_no_remaining_tokens( - ref self: ContractState, contract_address: ContractAddress, mut routes: Span, mut checked_tokens: Felt252Dict, - ) { - if routes.len() == 0 { - return; - } - - // Retrieve current route - let route: @Route = routes.pop_front().unwrap(); - - // Transfer residual tokens - self.assert_no_remaining_token(contract_address, *route.sell_token, ref checked_tokens); - self.assert_no_remaining_token(contract_address, *route.buy_token, ref checked_tokens); - - self.assert_no_remaining_tokens(contract_address, routes, checked_tokens); - } - - fn assert_no_remaining_token( - ref self: ContractState, contract_address: ContractAddress, token_address: ContractAddress, ref checked_tokens: Felt252Dict, - ) { - // Only do the check when token balance has not already been checked - if checked_tokens.get(token_address.into()) == 0 { - // Check balance and transfer tokens if necessary - let token = IERC20Dispatcher { contract_address: token_address }; - let token_balance = token.balanceOf(contract_address); - assert(token_balance == 0, 'Residual tokens'); - checked_tokens.insert(token_address.into(), 1); - } - } - fn apply_routes(ref self: ContractState, mut routes: Array, contract_address: ContractAddress) { if (routes.len() == 0) { return; diff --git a/tests/exchange_test.cairo b/tests/exchange_test.cairo index 278df8b..c854293 100644 --- a/tests/exchange_test.cairo +++ b/tests/exchange_test.cairo @@ -205,49 +205,6 @@ mod MultiRouteSwap { assert(pop_log_raw(sell_token_address).is_none(), 'no more sell_token events'); } - #[test] - #[available_gas(20000000)] - #[should_panic(expected: ('Residual tokens', 'ENTRYPOINT_FAILED'))] - fn should_throw_error_when_residual_tokens() { - // Given - let (exchange, _, _) = deploy_exchange(); - let beneficiary = contract_address_const::<0x12345>(); - let sell_token = deploy_mock_token(beneficiary, 10, 1); - let sell_token_address = sell_token.contract_address; - let buy_token = deploy_mock_token(beneficiary, 0, 2); - let buy_token_address = buy_token.contract_address; - let sell_token_amount = u256 { low: 10, high: 0 }; - let buy_token_min_amount = u256 { low: 1, high: 0 }; - let buy_token_amount = u256 { low: 1, high: 0 }; - let mut routes = ArrayTrait::new(); - routes - .append( - Route { - sell_token: sell_token_address, - buy_token: buy_token_address, - exchange_address: contract_address_const::<0x12>(), - percent: 40 * ROUTE_PERCENT_FACTOR, - additional_swap_params: ArrayTrait::new(), - }, - ); - set_contract_address(beneficiary); - sell_token.approve(exchange.contract_address, sell_token_amount); - - // When - exchange - .multi_route_swap( - sell_token_address, - sell_token_amount, - buy_token_address, - buy_token_amount, - buy_token_min_amount, - beneficiary, - 0, - contract_address_const::<0x0>(), - routes, - ); - } - #[test] #[available_gas(20000000)] #[should_panic(expected: ('Token from amount is 0', 'ENTRYPOINT_FAILED'))] @@ -1836,54 +1793,6 @@ mod SwapExactTokenTo { assert(balance == 0_u256, 'Invalid integrator sell balance'); } - #[test] - #[available_gas(20000000)] - #[should_panic(expected: ('Residual tokens', 'ENTRYPOINT_FAILED'))] - fn should_throw_error_when_residual_tokens() { - // Given - let (exchange, ownable, fee) = deploy_exchange(); - let beneficiary = contract_address_const::<0x12345>(); - let sell_token = deploy_mock_token(beneficiary, 10, 1); - let sell_token_address = sell_token.contract_address; - let buy_token = deploy_mock_token(beneficiary, 0, 2); - let buy_token_address = buy_token.contract_address; - let sell_token_max_amount = u256 { low: 10, high: 0 }; - let sell_token_amount = u256 { low: 9, high: 0 }; - set_contract_address(ownable.get_owner()); - let fees_recipient = contract_address_const::<0x1111>(); - fee.set_fees_recipient(fees_recipient); - let buy_token_amount = u256 { low: 1, high: 0 }; - let mut routes = ArrayTrait::new(); - routes - .append( - Route { - sell_token: sell_token_address, - buy_token: buy_token_address, - exchange_address: contract_address_const::<0x12>(), - percent: 40 * ROUTE_PERCENT_FACTOR, - additional_swap_params: ArrayTrait::new(), - }, - ); - set_contract_address(beneficiary); - sell_token.approve(exchange.contract_address, sell_token_max_amount); - let integrator_fee_recipient = contract_address_const::<0x0>(); - let integrator_fee = 0_u128; - - // When - exchange - .swap_exact_token_to( - sell_token_address, - sell_token_amount, - sell_token_max_amount, - buy_token_address, - buy_token_amount, - beneficiary, - integrator_fee, - integrator_fee_recipient, - routes, - ); - } - #[test] #[available_gas(20000000)] #[should_panic(expected: ('Token from amount is 0', 'ENTRYPOINT_FAILED'))]