From 6680262262851fe264713417299c8ed9ff0aa688 Mon Sep 17 00:00:00 2001 From: sparqet Date: Thu, 27 Jun 2024 13:51:51 +0200 Subject: [PATCH] refacto short test --- .../integration/test_short_integration.cairo | 682 +----------------- 1 file changed, 1 insertion(+), 681 deletions(-) diff --git a/tests/integration/test_short_integration.cairo b/tests/integration/test_short_integration.cairo index fbd6e7b7..e163f0bf 100644 --- a/tests/integration/test_short_integration.cairo +++ b/tests/integration/test_short_integration.cairo @@ -64,6 +64,7 @@ use satoru::market::{market::{UniqueIdMarketImpl},}; use satoru::exchange::order_handler::{ OrderHandler, IOrderHandlerDispatcher, IOrderHandlerDispatcherTrait }; +use satoru::tests_lib::{setup, create_market, teardown}; const INITIAL_TOKENS_MINTED: felt252 = 1000; #[test] @@ -535,684 +536,3 @@ fn test_short_increase_decrease_close() { // ********************************************************************************************* teardown(data_store, market_factory); } - -fn create_market(market_factory: IMarketFactoryDispatcher) -> ContractAddress { - // Create a market. - let (index_token, short_token) = deploy_tokens(); - let market_type = 'market_type'; - - // Index token is the same as long token here. - market_factory.create_market(index_token, index_token, short_token, market_type) -} - -/// Utility functions to deploy tokens for a market. -fn deploy_tokens() -> (ContractAddress, ContractAddress) { - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let contract = declare('ERC20'); - - let eth_address = contract_address_const::<'ETH'>(); - let constructor_calldata = array!['Ethereum', 'ETH', 1000000, 0, caller_address.into()]; - contract.deploy_at(@constructor_calldata, eth_address).unwrap(); - - let usdc_address = contract_address_const::<'USDC'>(); - let constructor_calldata = array!['usdc', 'USDC', 1000000, 0, caller_address.into()]; - contract.deploy_at(@constructor_calldata, usdc_address).unwrap(); - (eth_address, usdc_address) -} - -/// Utility function to setup the test environment. -fn setup() -> ( - // This caller address will be used with `start_prank` cheatcode to mock the caller address., - ContractAddress, - // Address of the `MarketFactory` contract. - ContractAddress, - // Address of the `RoleStore` contract. - ContractAddress, - // Address of the `DataStore` contract. - ContractAddress, - // The `MarketToken` class hash for the factory. - ContractClass, - // Interface to interact with the `MarketFactory` contract. - IMarketFactoryDispatcher, - // Interface to interact with the `RoleStore` contract. - IRoleStoreDispatcher, - // Interface to interact with the `DataStore` contract. - IDataStoreDispatcher, - // Interface to interact with the `EventEmitter` contract. - IEventEmitterDispatcher, - // Interface to interact with the `ExchangeRouter` contract. - IExchangeRouterDispatcher, - // Interface to interact with the `DepositHandler` contract. - IDepositHandlerDispatcher, - // Interface to interact with the `DepositHandler` contract. - IDepositVaultDispatcher, - IOracleDispatcher, - IOrderHandlerDispatcher, - IOrderVaultDispatcher, - IReaderDispatcher, - IReferralStorageDispatcher, - IWithdrawalHandlerDispatcher, - IWithdrawalVaultDispatcher, - ILiquidationHandlerDispatcher, -) { - let ( - caller_address, - market_factory_address, - role_store_address, - data_store_address, - market_token_class_hash, - market_factory, - role_store, - data_store, - event_emitter, - exchange_router, - deposit_handler, - deposit_vault, - oracle, - order_handler, - order_vault, - reader, - referal_storage, - withdrawal_handler, - withdrawal_vault, - liquidation_handler, - ) = - setup_contracts(); - grant_roles_and_prank(caller_address, role_store, data_store, market_factory); - ( - caller_address, - market_factory.contract_address, - role_store_address, - data_store_address, - market_token_class_hash, - market_factory, - role_store, - data_store, - event_emitter, - exchange_router, - deposit_handler, - deposit_vault, - oracle, - order_handler, - order_vault, - reader, - referal_storage, - withdrawal_handler, - withdrawal_vault, - liquidation_handler, - ) -} - -// Utility function to grant roles and prank the caller address. -/// Grants roles and pranks the caller address. -/// -/// # Arguments -/// -/// * `caller_address` - The address of the caller. -/// * `role_store` - The interface to interact with the `RoleStore` contract. -/// * `data_store` - The interface to interact with the `DataStore` contract. -/// * `market_factory` - The interface to interact with the `MarketFactory` contract. -fn grant_roles_and_prank( - caller_address: ContractAddress, - role_store: IRoleStoreDispatcher, - data_store: IDataStoreDispatcher, - market_factory: IMarketFactoryDispatcher, -) { - start_prank(role_store.contract_address, caller_address); - - // Grant the caller the `CONTROLLER` role. - role_store.grant_role(caller_address, role::CONTROLLER); - - // Grant the call the `MARKET_KEEPER` role. - // This role is required to create a market. - role_store.grant_role(caller_address, role::MARKET_KEEPER); - - // Prank the caller address for calls to `DataStore` contract. - // We need this so that the caller has the CONTROLLER role. - start_prank(data_store.contract_address, caller_address); - - // Start pranking the `MarketFactory` contract. This is necessary to mock the behavior of the contract - // for testing purposes. - start_prank(market_factory.contract_address, caller_address); -} - -/// Utility function to teardown the test environment. -fn teardown(data_store: IDataStoreDispatcher, market_factory: IMarketFactoryDispatcher) { - stop_prank(data_store.contract_address); - stop_prank(market_factory.contract_address); -} - -/// Setup required contracts. -fn setup_contracts() -> ( - // This caller address will be used with `start_prank` cheatcode to mock the caller address., - ContractAddress, - // Address of the `MarketFactory` contract. - ContractAddress, - // Address of the `RoleStore` contract. - ContractAddress, - // Address of the `DataStore` contract. - ContractAddress, - // The `MarketToken` class hash for the factory. - ContractClass, - // Interface to interact with the `MarketFactory` contract. - IMarketFactoryDispatcher, - // Interface to interact with the `RoleStore` contract. - IRoleStoreDispatcher, - // Interface to interact with the `DataStore` contract. - IDataStoreDispatcher, - // Interface to interact with the `EventEmitter` contract. - IEventEmitterDispatcher, - // Interface to interact with the `ExchangeRouter` contract. - IExchangeRouterDispatcher, - // Interface to interact with the `DepositHandler` contract. - IDepositHandlerDispatcher, - // Interface to interact with the `DepositHandler` contract. - IDepositVaultDispatcher, - IOracleDispatcher, - IOrderHandlerDispatcher, - IOrderVaultDispatcher, - IReaderDispatcher, - IReferralStorageDispatcher, - IWithdrawalHandlerDispatcher, - IWithdrawalVaultDispatcher, - ILiquidationHandlerDispatcher, -) { - // Deploy the role store contract. - let role_store_address = deploy_role_store(); - - // Create a role store dispatcher. - let role_store = IRoleStoreDispatcher { contract_address: role_store_address }; - - // Deploy the contract. - let data_store_address = deploy_data_store(role_store_address); - // Create a safe dispatcher to interact with the contract. - let data_store = IDataStoreDispatcher { contract_address: data_store_address }; - - // Declare the `MarketToken` contract. - let market_token_class_hash = declare_market_token(); - - // Deploy the event emitter contract. - let event_emitter_address = deploy_event_emitter(); - // Create a safe dispatcher to interact with the contract. - let event_emitter = IEventEmitterDispatcher { contract_address: event_emitter_address }; - - // Deploy the router contract. - let router_address = deploy_router(role_store_address); - - // Deploy the market factory. - let market_factory_address = deploy_market_factory( - data_store_address, role_store_address, event_emitter_address, market_token_class_hash - ); - // Create a safe dispatcher to interact with the contract. - let market_factory = IMarketFactoryDispatcher { contract_address: market_factory_address }; - - let oracle_store_address = deploy_oracle_store(role_store_address, event_emitter_address); - let oracle_address = deploy_oracle( - role_store_address, oracle_store_address, contract_address_const::<'pragma'>() - ); - - let oracle = IOracleDispatcher { contract_address: oracle_address }; - - let deposit_vault_address = deploy_deposit_vault(role_store_address, data_store_address); - - let deposit_vault = IDepositVaultDispatcher { contract_address: deposit_vault_address }; - let deposit_handler_address = deploy_deposit_handler( - data_store_address, - role_store_address, - event_emitter_address, - deposit_vault_address, - oracle_address - ); - let deposit_handler = IDepositHandlerDispatcher { contract_address: deposit_handler_address }; - - let withdrawal_vault_address = deploy_withdrawal_vault(data_store_address, role_store_address); - let withdrawal_handler_address = deploy_withdrawal_handler( - data_store_address, - role_store_address, - event_emitter_address, - withdrawal_vault_address, - oracle_address - ); - - let order_vault_address = deploy_order_vault( - data_store.contract_address, role_store.contract_address - ); - let order_vault = IOrderVaultDispatcher { contract_address: order_vault_address }; - - let swap_handler_address = deploy_swap_handler_address(role_store_address, data_store_address); - let referral_storage_address = deploy_referral_storage(event_emitter_address); - let increase_order_class_hash = declare_increase_order(); - let decrease_order_class_hash = declare_decrease_order(); - let swap_order_class_hash = declare_swap_order(); - - let order_utils_class_hash = declare_order_utils(); - - let order_handler_address = deploy_order_handler( - data_store_address, - role_store_address, - event_emitter_address, - order_vault_address, - oracle_address, - swap_handler_address, - referral_storage_address, - order_utils_class_hash, - increase_order_class_hash, - decrease_order_class_hash, - swap_order_class_hash - ); - let order_handler = IOrderHandlerDispatcher { contract_address: order_handler_address }; - - let exchange_router_address = deploy_exchange_router( - router_address, - data_store_address, - role_store_address, - event_emitter_address, - deposit_handler_address, - withdrawal_handler_address, - order_handler_address - ); - let exchange_router = IExchangeRouterDispatcher { contract_address: exchange_router_address }; - - let bank_address = deploy_bank(data_store_address, role_store_address); - - //Create a safe dispatcher to interact with the Bank contract. - let bank = IBankDispatcher { contract_address: bank_address }; - - // Deploy the strict bank contract - let strict_bank_address = deploy_strict_bank(data_store_address, role_store_address); - - //Create a safe dispatcher to interact with the StrictBank contract. - let strict_bank = IStrictBankDispatcher { contract_address: strict_bank_address }; - - let reader_address = deploy_reader(); - let reader = IReaderDispatcher { contract_address: reader_address }; - - let referal_storage = IReferralStorageDispatcher { contract_address: referral_storage_address }; - - let withdrawal_handler = IWithdrawalHandlerDispatcher { - contract_address: withdrawal_handler_address - }; - let withdrawal_vault = IWithdrawalVaultDispatcher { - contract_address: withdrawal_vault_address - }; - let liquidation_handler_address = deploy_liquidation_handler( - data_store_address, - role_store_address, - event_emitter_address, - order_vault_address, - oracle_address, - swap_handler_address, - referral_storage_address, - order_utils_class_hash, - increase_order_class_hash, - decrease_order_class_hash, - swap_order_class_hash - ); - - let liquidation_handler = ILiquidationHandlerDispatcher { - contract_address: liquidation_handler_address - }; - ( - contract_address_const::<'caller'>(), - market_factory_address, - role_store_address, - data_store_address, - market_token_class_hash, - market_factory, - role_store, - data_store, - event_emitter, - exchange_router, - deposit_handler, - deposit_vault, - oracle, - order_handler, - order_vault, - reader, - referal_storage, - withdrawal_handler, - withdrawal_vault, - liquidation_handler, - ) -} - -/// Utility function to declare a `MarketToken` contract. -fn declare_market_token() -> ContractClass { - declare('MarketToken') -} - -/// Utility function to deploy a market factory contract and return its address. -fn deploy_market_factory( - data_store_address: ContractAddress, - role_store_address: ContractAddress, - event_emitter_address: ContractAddress, - market_token_class_hash: ContractClass, -) -> ContractAddress { - let contract = declare('MarketFactory'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'market_factory'>(); - start_prank(deployed_contract_address, caller_address); - let mut constructor_calldata = array![]; - constructor_calldata.append(data_store_address.into()); - constructor_calldata.append(role_store_address.into()); - constructor_calldata.append(event_emitter_address.into()); - constructor_calldata.append(market_token_class_hash.class_hash.into()); - contract.deploy_at(@constructor_calldata, deployed_contract_address).unwrap() -} - - -fn deploy_data_store(role_store_address: ContractAddress) -> ContractAddress { - let contract = declare('DataStore'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address: ContractAddress = 0x1.try_into().unwrap(); - start_prank(deployed_contract_address, caller_address); - let constructor_calldata = array![role_store_address.into()]; - contract.deploy_at(@constructor_calldata, deployed_contract_address).unwrap() -} - -fn deploy_role_store() -> ContractAddress { - let contract = declare('RoleStore'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'role_store'>(); - start_prank(deployed_contract_address, caller_address); - contract.deploy_at(@array![caller_address.into()], deployed_contract_address).unwrap() -} - -fn deploy_event_emitter() -> ContractAddress { - let contract = declare('EventEmitter'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'event_emitter'>(); - start_prank(deployed_contract_address, caller_address); - contract.deploy_at(@array![], deployed_contract_address).unwrap() -} - -fn deploy_router(role_store_address: ContractAddress) -> ContractAddress { - let contract = declare('Router'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'router'>(); - start_prank(deployed_contract_address, caller_address); - let constructor_calldata = array![role_store_address.into()]; - contract.deploy_at(@constructor_calldata, deployed_contract_address).unwrap() -} - -fn deploy_deposit_handler( - data_store_address: ContractAddress, - role_store_address: ContractAddress, - event_emitter_address: ContractAddress, - deposit_vault_address: ContractAddress, - oracle_address: ContractAddress -) -> ContractAddress { - let contract = declare('DepositHandler'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'deposit_handler'>(); - start_prank(deployed_contract_address, caller_address); - contract - .deploy_at( - @array![ - data_store_address.into(), - role_store_address.into(), - event_emitter_address.into(), - deposit_vault_address.into(), - oracle_address.into() - ], - deployed_contract_address - ) - .unwrap() -} - -fn deploy_oracle_store( - role_store_address: ContractAddress, event_emitter_address: ContractAddress, -) -> ContractAddress { - let contract = declare('OracleStore'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'oracle_store'>(); - start_prank(deployed_contract_address, caller_address); - contract - .deploy_at( - @array![role_store_address.into(), event_emitter_address.into()], - deployed_contract_address - ) - .unwrap() -} - -fn deploy_oracle( - role_store_address: ContractAddress, - oracle_store_address: ContractAddress, - pragma_address: ContractAddress -) -> ContractAddress { - let contract = declare('Oracle'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'oracle'>(); - start_prank(deployed_contract_address, caller_address); - contract - .deploy_at( - @array![role_store_address.into(), oracle_store_address.into(), pragma_address.into()], - deployed_contract_address - ) - .unwrap() -} - -fn deploy_deposit_vault( - role_store_address: ContractAddress, data_store_address: ContractAddress -) -> ContractAddress { - let contract = declare('DepositVault'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'deposit_vault'>(); - start_prank(deployed_contract_address, caller_address); - contract - .deploy_at( - @array![data_store_address.into(), role_store_address.into()], deployed_contract_address - ) - .unwrap() -} - -fn deploy_withdrawal_handler( - data_store_address: ContractAddress, - role_store_address: ContractAddress, - event_emitter_address: ContractAddress, - withdrawal_vault_address: ContractAddress, - oracle_address: ContractAddress -) -> ContractAddress { - let contract = declare('WithdrawalHandler'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'withdrawal_handler'>(); - start_prank(deployed_contract_address, caller_address); - let constructor_calldata = array![ - data_store_address.into(), - role_store_address.into(), - event_emitter_address.into(), - withdrawal_vault_address.into(), - oracle_address.into() - ]; - contract.deploy_at(@constructor_calldata, deployed_contract_address).unwrap() -} - -fn deploy_withdrawal_vault( - data_store_address: ContractAddress, role_store_address: ContractAddress -) -> ContractAddress { - let contract = declare('WithdrawalVault'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'withdrawal_vault'>(); - start_prank(deployed_contract_address, caller_address); - let constructor_calldata = array![data_store_address.into(), role_store_address.into()]; - contract.deploy_at(@constructor_calldata, deployed_contract_address).unwrap() -} - -fn deploy_order_handler( - data_store_address: ContractAddress, - role_store_address: ContractAddress, - event_emitter_address: ContractAddress, - order_vault_address: ContractAddress, - oracle_address: ContractAddress, - swap_handler_address: ContractAddress, - referral_storage_address: ContractAddress, - order_utils_class_hash: ClassHash, - increase_order_class_hash: ClassHash, - decrease_order_class_hash: ClassHash, - swap_order_class_hash: ClassHash -) -> ContractAddress { - let contract = declare('OrderHandler'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'order_handler'>(); - start_prank(deployed_contract_address, caller_address); - let constructor_calldata = array![ - data_store_address.into(), - role_store_address.into(), - event_emitter_address.into(), - order_vault_address.into(), - oracle_address.into(), - swap_handler_address.into(), - referral_storage_address.into(), - order_utils_class_hash.into(), - increase_order_class_hash.into(), - decrease_order_class_hash.into(), - swap_order_class_hash.into() - ]; - contract.deploy_at(@constructor_calldata, deployed_contract_address).unwrap() -} - -fn deploy_liquidation_handler( - data_store_address: ContractAddress, - role_store_address: ContractAddress, - event_emitter_address: ContractAddress, - order_vault_address: ContractAddress, - oracle_address: ContractAddress, - swap_handler_address: ContractAddress, - referral_storage_address: ContractAddress, - order_utils_class_hash: ClassHash, - increase_order_class_hash: ClassHash, - decrease_order_class_hash: ClassHash, - swap_order_class_hash: ClassHash -) -> ContractAddress { - let contract = declare('LiquidationHandler'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'liquidation_handler'>(); - start_prank(deployed_contract_address, caller_address); - let constructor_calldata = array![ - data_store_address.into(), - role_store_address.into(), - event_emitter_address.into(), - order_vault_address.into(), - oracle_address.into(), - swap_handler_address.into(), - referral_storage_address.into(), - order_utils_class_hash.into(), - increase_order_class_hash.into(), - decrease_order_class_hash.into(), - swap_order_class_hash.into() - ]; - contract.deploy_at(@constructor_calldata, deployed_contract_address).unwrap() -} - -fn deploy_swap_handler_address( - role_store_address: ContractAddress, data_store_address: ContractAddress -) -> ContractAddress { - let contract = declare('SwapHandler'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'swap_handler'>(); - start_prank(deployed_contract_address, caller_address); - let constructor_calldata = array![role_store_address.into()]; - contract.deploy_at(@constructor_calldata, deployed_contract_address).unwrap() -} - -fn deploy_referral_storage(event_emitter_address: ContractAddress) -> ContractAddress { - let contract = declare('ReferralStorage'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'referral_storage'>(); - start_prank(deployed_contract_address, caller_address); - let constructor_calldata = array![event_emitter_address.into()]; - contract.deploy_at(@constructor_calldata, deployed_contract_address).unwrap() -} - -fn deploy_exchange_router( - router_address: ContractAddress, - data_store_address: ContractAddress, - role_store_address: ContractAddress, - event_emitter_address: ContractAddress, - deposit_handler_address: ContractAddress, - withdrawal_handler_address: ContractAddress, - order_handler_address: ContractAddress -) -> ContractAddress { - let contract = declare('ExchangeRouter'); - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let deployed_contract_address = contract_address_const::<'exchange_router'>(); - start_prank(deployed_contract_address, caller_address); - let constructor_calldata = array![ - router_address.into(), - data_store_address.into(), - role_store_address.into(), - event_emitter_address.into(), - deposit_handler_address.into(), - withdrawal_handler_address.into(), - order_handler_address.into() - ]; - contract.deploy_at(@constructor_calldata, deployed_contract_address).unwrap() -} - -fn deploy_order_vault( - data_store_address: ContractAddress, role_store_address: ContractAddress, -) -> ContractAddress { - let contract = declare('OrderVault'); - let mut constructor_calldata = array![]; - constructor_calldata.append(data_store_address.into()); - constructor_calldata.append(role_store_address.into()); - tests_lib::deploy_mock_contract(contract, @constructor_calldata) -} - -fn declare_increase_order() -> ClassHash { - declare('IncreaseOrderUtils').class_hash -} -fn declare_decrease_order() -> ClassHash { - declare('DecreaseOrderUtils').class_hash -} -fn declare_swap_order() -> ClassHash { - declare('SwapOrderUtils').class_hash -} - - -fn declare_order_utils() -> ClassHash { - declare('OrderUtils').class_hash -} - -fn deploy_bank( - data_store_address: ContractAddress, role_store_address: ContractAddress, -) -> ContractAddress { - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let bank_address: ContractAddress = contract_address_const::<'bank'>(); - let contract = declare('Bank'); - let mut constructor_calldata = array![]; - constructor_calldata.append(data_store_address.into()); - constructor_calldata.append(role_store_address.into()); - start_prank(data_store_address, caller_address); - contract.deploy_at(@constructor_calldata, bank_address).unwrap() -} - -fn deploy_strict_bank( - data_store_address: ContractAddress, role_store_address: ContractAddress, -) -> ContractAddress { - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let strict_bank_address: ContractAddress = contract_address_const::<'strict_bank'>(); - let contract = declare('StrictBank'); - let mut constructor_calldata = array![]; - constructor_calldata.append(data_store_address.into()); - constructor_calldata.append(role_store_address.into()); - start_prank(strict_bank_address, caller_address); - contract.deploy_at(@constructor_calldata, strict_bank_address).unwrap() -} - -fn deploy_reader() -> ContractAddress { - let caller_address: ContractAddress = contract_address_const::<'caller'>(); - let reader_address: ContractAddress = contract_address_const::<'reader'>(); - let contract = declare('Reader'); - let mut constructor_calldata = array![]; - start_prank(reader_address, caller_address); - contract.deploy_at(@constructor_calldata, reader_address).unwrap() -} - -fn deploy_erc20_token(deposit_vault_address: ContractAddress) -> ContractAddress { - let erc20_contract = declare('ERC20'); - let constructor_calldata3 = array![ - 'satoru', 'STU', INITIAL_TOKENS_MINTED, 0, deposit_vault_address.into() - ]; - erc20_contract.deploy(@constructor_calldata3).unwrap() -}