@@ -7,16 +7,28 @@ use openzeppelin::upgrades::interface::{
77 IUpgradeableSafeDispatcherTrait ,
88};
99use openzeppelin :: upgrades :: upgradeable :: UpgradeableComponent :: Errors as UpgradeableErrors ;
10- use snforge_std :: {DeclareResultTrait , TokenTrait };
10+ use snforge_std :: {DeclareResultTrait , EventSpyTrait , EventsFilterTrait , TokenTrait , spy_events };
1111use starkware_utils :: constants :: MAX_U256 ;
12- use starkware_utils_testing :: test_utils :: {assert_panic_with_felt_error, cheat_caller_address_once};
12+ use starkware_utils :: erc20 :: erc20_errors :: Erc20Error ;
13+ use starkware_utils :: errors :: Describable ;
14+ use starkware_utils_testing :: event_test_utils :: assert_number_of_events;
15+ use starkware_utils_testing :: test_utils :: {
16+ assert_expected_event_emitted, assert_panic_with_error, assert_panic_with_felt_error,
17+ cheat_caller_address_once,
18+ };
19+ use usdc_migration :: events :: USDCMigrationEvents :: USDCMigrated ;
1320use usdc_migration :: interface :: {
1421 IUSDCMigrationConfigDispatcher , IUSDCMigrationConfigDispatcherTrait ,
1522 IUSDCMigrationConfigSafeDispatcher , IUSDCMigrationConfigSafeDispatcherTrait ,
23+ IUSDCMigrationDispatcher , IUSDCMigrationDispatcherTrait , IUSDCMigrationSafeDispatcher ,
24+ IUSDCMigrationSafeDispatcherTrait ,
25+ };
26+ use usdc_migration :: tests :: test_utils :: constants :: {
27+ INITIAL_CONTRACT_SUPPLY , INITIAL_SUPPLY , LEGACY_THRESHOLD ,
28+ };
29+ use usdc_migration :: tests :: test_utils :: {
30+ deploy_usdc_migration, generic_test_fixture, load_contract_address, load_u256 , new_user,
1631};
17- use usdc_migration :: tests :: test_utils :: constants :: LEGACY_THRESHOLD ;
18- use usdc_migration :: tests :: test_utils :: {deploy_usdc_migration, load_contract_address, load_u256 };
19-
2032#[test]
2133fn test_constructor () {
2234 let cfg = deploy_usdc_migration ();
@@ -116,3 +128,78 @@ fn test_upgrade_assertions() {
116128 let result = upgradeable_safe_dispatcher . upgrade (Zero :: zero ());
117129 assert_panic_with_felt_error (result , UpgradeableErrors :: INVALID_CLASS );
118130}
131+
132+ #[test]
133+ fn test_swap_to_new () {
134+ let cfg = generic_test_fixture ();
135+ let amount = INITIAL_CONTRACT_SUPPLY / 10 ;
136+ let user = new_user (: cfg , id : 0 , legacy_supply : amount );
137+ let usdc_migration_contract = cfg . usdc_migration_contract;
138+ let usdc_migration_dispatcher = IUSDCMigrationDispatcher {
139+ contract_address : usdc_migration_contract ,
140+ };
141+ let legacy_token_address = cfg . legacy_token. contract_address ();
142+ let new_token_address = cfg . new_token. contract_address ();
143+ let legacy_dispatcher = IERC20Dispatcher { contract_address : legacy_token_address };
144+ let new_dispatcher = IERC20Dispatcher { contract_address : new_token_address };
145+
146+ // Spy events.
147+ let mut spy = spy_events ();
148+
149+ // Approve and migrate.
150+ cheat_caller_address_once (contract_address : legacy_token_address , caller_address : user );
151+ legacy_dispatcher . approve (spender : usdc_migration_contract , : amount );
152+ cheat_caller_address_once (contract_address : usdc_migration_contract , caller_address : user );
153+ usdc_migration_dispatcher . swap_to_new (: amount );
154+
155+ // Assert user balances are correct.
156+ assert_eq! (legacy_dispatcher . balance_of (account : user ), 0 );
157+ assert_eq! (new_dispatcher . balance_of (account : user ), amount );
158+
159+ // Assert contract balances are correct.
160+ assert_eq! (legacy_dispatcher . balance_of (account : usdc_migration_contract ), amount );
161+ assert_eq! (
162+ new_dispatcher . balance_of (account : usdc_migration_contract ),
163+ INITIAL_CONTRACT_SUPPLY - amount ,
164+ );
165+
166+ // Assert event is emitted.
167+ let events = spy . get_events (). emitted_by (contract_address : usdc_migration_contract ). events;
168+ assert_number_of_events (actual : events . len (), expected : 1 , message : " migrate" );
169+ assert_expected_event_emitted (
170+ spied_event : events [0 ],
171+ expected_event : USDCMigrated {
172+ user , from_token : legacy_token_address , to_token : new_token_address , amount ,
173+ },
174+ expected_event_selector : @ selector! (" USDCMigrated" ),
175+ expected_event_name : " USDCMigrated" ,
176+ );
177+ }
178+
179+ #[test]
180+ #[feature(" safe_dispatcher" )]
181+ fn test_swap_to_new_assertions () {
182+ let cfg = deploy_usdc_migration ();
183+ let amount = INITIAL_SUPPLY / 10 ;
184+ let user = new_user (: cfg , id : 0 , legacy_supply : amount );
185+ let usdc_migration_contract = cfg . usdc_migration_contract;
186+ let usdc_migration_safe_dispatcher = IUSDCMigrationSafeDispatcher {
187+ contract_address : usdc_migration_contract ,
188+ };
189+ let legacy_token_address = cfg . legacy_token. contract_address ();
190+ let legacy_dispatcher = IERC20Dispatcher { contract_address : legacy_token_address };
191+
192+ // Insufficient allowance.
193+ cheat_caller_address_once (contract_address : legacy_token_address , caller_address : user );
194+ legacy_dispatcher . approve (spender : usdc_migration_contract , amount : amount / 2 );
195+ cheat_caller_address_once (contract_address : usdc_migration_contract , caller_address : user );
196+ let res = usdc_migration_safe_dispatcher . swap_to_new (: amount );
197+ assert_panic_with_error (res , Erc20Error :: INSUFFICIENT_ALLOWANCE . describe ());
198+
199+ // Insufficient balance.
200+ cheat_caller_address_once (contract_address : legacy_token_address , caller_address : user );
201+ legacy_dispatcher . approve (spender : usdc_migration_contract , : amount );
202+ cheat_caller_address_once (contract_address : cfg . usdc_migration_contract, caller_address : user );
203+ let res = usdc_migration_safe_dispatcher . swap_to_new (: amount );
204+ assert_panic_with_error (res , Erc20Error :: INSUFFICIENT_BALANCE . describe ());
205+ }
0 commit comments