From 317878d60b39beb3b356a9bae4f0a387f8643bd1 Mon Sep 17 00:00:00 2001 From: Konsta Purtsi Date: Tue, 18 Feb 2025 21:04:32 +0200 Subject: [PATCH] refactor: Add setup_test_env --- contracts/loan_manager/src/contract.rs | 269 ++++++++++++------------- 1 file changed, 133 insertions(+), 136 deletions(-) diff --git a/contracts/loan_manager/src/contract.rs b/contracts/loan_manager/src/contract.rs index 6a2b540..c0b2b7b 100644 --- a/contracts/loan_manager/src/contract.rs +++ b/contracts/loan_manager/src/contract.rs @@ -485,7 +485,6 @@ impl LoanManager { #[cfg(test)] mod tests { use super::*; - use loan_pool::Currency; use soroban_sdk::{ testutils::{Address as _, Ledger}, token::{Client as TokenClient, StellarAssetClient}, @@ -500,62 +499,91 @@ mod tests { struct TestEnv<'a> { admin: Address, + admin2: Address, + user: Address, manager_addr: Address, manager_client: LoanManagerClient<'a>, - token_xlm_addr: Address, + xlm_token_client: TokenClient<'a>, + usdc_token_client: TokenClient<'a>, pool_xlm_addr: Address, pool_xlm_client: loan_pool::Client<'a>, + pool_usdc_addr: Address, + pool_usdc_client: loan_pool::Client<'a>, } fn setup_test_env(e: &Env) -> TestEnv { - let admin = Address::generate(&e); + let admin = Address::generate(e); + let admin2 = Address::generate(e); + let user = Address::generate(e); // loan manager let manager_addr = e.register(LoanManager, ()); let manager_client = LoanManagerClient::new(e, &manager_addr); manager_client.initialize(&admin); - let wasm_hash = e.deployer().upload_contract_wasm(loan_pool::WASM); - const LIQUIDATION_THRESHOLD: i128 = 8_000_000; // 80% - - // XLM Pool - let token_xlm_ticker = Symbol::new(&e, "XLM"); - let token_xlm_addr = e + // XLM asset + let xlm_ticker = Symbol::new(e, "XLM"); + let xlm_addr = e .register_stellar_asset_contract_v2(admin.clone()) .address(); - let salt = e - .crypto() - .sha256(&token_xlm_addr.clone().to_xdr(&e)) - .to_bytes(); - let pool_xlm_addr = manager_client.deploy_pool( - &wasm_hash, - &salt, - &token_xlm_addr, - &token_xlm_ticker, - &LIQUIDATION_THRESHOLD, - ); - let pool_xlm_client = loan_pool::Client::new(&e, &pool_xlm_addr); + let xlm_asset_client = StellarAssetClient::new(&e, &xlm_addr); + let xlm_token_client = TokenClient::new(e, &xlm_addr); + + // XLM pool + let pool_xlm_addr = deploy_pool(e, &manager_client, &xlm_ticker, &xlm_addr); + let pool_xlm_client = loan_pool::Client::new(e, &pool_xlm_addr); + + // USDC asset + let usdc_ticker = Symbol::new(e, "USDC"); + let usdc_addr = e + .register_stellar_asset_contract_v2(admin2.clone()) + .address(); + let usdc_asset_client = StellarAssetClient::new(&e, &usdc_addr); + let usdc_token_client = TokenClient::new(e, &usdc_addr); + + // USDC pool + let pool_usdc_addr = deploy_pool(e, &manager_client, &usdc_ticker, &usdc_addr); + let pool_usdc_client = loan_pool::Client::new(e, &pool_usdc_addr); + + // Mint the admin and the user some coins + xlm_asset_client.mint(&admin, &1_000_000); + usdc_asset_client.mint(&user, &1000); + + // Setup mock price oracle + let reflector_addr = Address::from_string(&String::from_str(&e, REFLECTOR_ADDRESS)); + e.register_at(&reflector_addr, oracle::WASM, ()); TestEnv { admin, + admin2, + user, manager_addr, manager_client, - token_xlm_addr, + xlm_token_client, + usdc_token_client, pool_xlm_addr, pool_xlm_client, + pool_usdc_addr, + pool_usdc_client, } } - fn deploy_pool(e: &Env, manager_client: &LoanManagerClient, currency: &Currency) -> Address { + fn deploy_pool( + e: &Env, + manager_client: &LoanManagerClient, + ticker: &Symbol, + token_address: &Address, + ) -> Address { + const LIQUIDATION_THRESHOLD: i128 = 8_000_000; // 80% let wasm_hash = e.deployer().upload_contract_wasm(loan_pool::WASM); - let xdr_bytes = currency.token_address.clone().to_xdr(e); + let xdr_bytes = token_address.clone().to_xdr(e); let salt = e.crypto().sha256(&xdr_bytes).to_bytes(); manager_client.deploy_pool( &wasm_hash, &salt, - ¤cy.token_address, - ¤cy.ticker, - &8_000_000, + &token_address, + &ticker, + &LIQUIDATION_THRESHOLD, ) } @@ -623,57 +651,27 @@ mod tests { let e = Env::default(); e.mock_all_auths_allowing_non_root_auth(); - let admin = Address::generate(&e); - let loan_token = e.register_stellar_asset_contract_v2(admin.clone()); - let loan_currency = loan_pool::Currency { - token_address: loan_token.address(), - ticker: Symbol::new(&e, "XLM"), - }; - - let loan_asset = StellarAssetClient::new(&e, &loan_token.address()); - let loan_token_client = TokenClient::new(&e, &loan_token.address()); - loan_asset.mint(&admin, &1000); - - let admin2 = Address::generate(&e); - let collateral_token = e.register_stellar_asset_contract_v2(admin2.clone()); - let collateral_asset = StellarAssetClient::new(&e, &collateral_token.address()); - let collateral_token_client = TokenClient::new(&e, &collateral_token.address()); - let collateral_currency = loan_pool::Currency { - token_address: collateral_token.address(), - ticker: Symbol::new(&e, "USDC"), - }; - - // Register mock Reflector contract. - let reflector_addr = Address::from_string(&String::from_str(&e, REFLECTOR_ADDRESS)); - e.register_at(&reflector_addr, oracle::WASM, ()); - - // Mint the user some coins - let user = Address::generate(&e); - collateral_asset.mint(&user, &1000); - - assert_eq!(collateral_token_client.balance(&user), 1000); - - // Register loan manager contract. - let manager_addr = e.register(LoanManager, ()); - let manager_client = LoanManagerClient::new(&e, &manager_addr); - manager_client.initialize(&admin); - - // Set up a loan pool with funds for borrowing. - let loan_pool_addr = deploy_pool(&e, &manager_client, &loan_currency); - let loan_pool_client = loan_pool::Client::new(&e, &loan_pool_addr); - - // Set up a loan_pool for the collaterals. - let collateral_pool_addr = deploy_pool(&e, &manager_client, &collateral_currency); + let TestEnv { + admin, + user, + manager_client, + pool_xlm_client, + pool_xlm_addr, + pool_usdc_addr, + xlm_token_client, + usdc_token_client, + .. + } = setup_test_env(&e); // ACT // Initialize the loan pool and deposit some of the admin's funds. - loan_pool_client.deposit(&admin, &1000); + pool_xlm_client.deposit(&admin, &1000); - manager_client.create_loan(&user, &10, &loan_pool_addr, &100, &collateral_pool_addr); + manager_client.create_loan(&user, &10, &pool_xlm_addr, &100, &pool_usdc_addr); // ASSERT - assert_eq!(loan_token_client.balance(&user), 10); - assert_eq!(collateral_token_client.balance(&user), 900); + assert_eq!(xlm_token_client.balance(&user), 10); + assert_eq!(usdc_token_client.balance(&user), 900); } #[test] @@ -689,72 +687,31 @@ mod tests { li.max_entry_ttl = 1_000_001; }); - let admin = Address::generate(&e); - let loan_token = e.register_stellar_asset_contract_v2(admin.clone()); - let loan_asset = StellarAssetClient::new(&e, &loan_token.address()); - loan_asset.mint(&admin, &1_000_000); - let loan_currency = loan_pool::Currency { - token_address: loan_token.address(), - ticker: Symbol::new(&e, "XLM"), - }; - - let admin2 = Address::generate(&e); - let collateral_token = e.register_stellar_asset_contract_v2(admin2.clone()); - let collateral_asset = StellarAssetClient::new(&e, &collateral_token.address()); - let collateral_token_client = TokenClient::new(&e, &collateral_token.address()); - let collateral_currency = loan_pool::Currency { - token_address: collateral_token.address(), - ticker: Symbol::new(&e, "USDC"), - }; - - // Register mock Reflector contract. - let reflector_addr = Address::from_string(&String::from_str(&e, REFLECTOR_ADDRESS)); - e.register_at(&reflector_addr, oracle::WASM, ()); - - // Mint the user some coins - let user = Address::generate(&e); - collateral_asset.mint(&user, &1_000_000); - - assert_eq!(collateral_token_client.balance(&user), 1_000_000); - - let manager_addr = e.register(LoanManager, ()); - let manager_client = LoanManagerClient::new(&e, &manager_addr); - manager_client.initialize(&admin); - - // Set up a loan pool with funds for borrowing. - let loan_pool_addr = deploy_pool(&e, &manager_client, &loan_currency); - let loan_pool_client = loan_pool::Client::new(&e, &loan_pool_addr); - - // Set up a loan_pool for the collaterals. - let collateral_pool_addr = deploy_pool(&e, &manager_client, &collateral_currency); - let collateral_pool_client = loan_pool::Client::new(&e, &collateral_pool_addr); + let TestEnv { + admin, + user, + manager_client, + pool_xlm_addr, + pool_xlm_client, + pool_usdc_addr, + pool_usdc_client, + usdc_token_client, + .. + } = setup_test_env(&e); - // Register loan manager contract. // ACT - // Initialize the loan pool and deposit some of the admin's funds. - loan_pool_client.initialize(&manager_addr, &loan_currency, &8_000_000); - loan_pool_client.deposit(&admin, &10_001); - - collateral_pool_client.initialize(&manager_addr, &collateral_currency, &8_000_000); + // deposit some of the admin's funds. + pool_xlm_client.deposit(&admin, &10_001); // Create a loan. - manager_client.create_loan( - &user, - &10_000, - &loan_pool_addr, - &100_000, - &collateral_pool_addr, - ); + manager_client.create_loan(&user, &10_000, &pool_xlm_addr, &100_000, &pool_usdc_addr); let user_loan = manager_client.get_loan(&user).unwrap(); - assert_eq!(user_loan.borrowed_amount, 10_000); - assert_eq!(collateral_token_client.balance(&user), 900_000); - // Here borrowed amount should be the same as time has not moved. add_interest() is only called to store the LastUpdate sequence number. assert_eq!(user_loan.borrowed_amount, 10_000); assert_eq!(user_loan.health_factor, 80_000_000); - assert_eq!(collateral_token_client.balance(&user), 900_000); + assert_eq!(usdc_token_client.balance(&user), 900_000); // Move time e.ledger().with_mut(|li| { @@ -823,11 +780,21 @@ mod tests { manager_client.initialize(&admin); // Set up a loan pool with funds for borrowing. - let loan_pool_addr = deploy_pool(&e, &manager_client, &loan_currency); + let loan_pool_addr = deploy_pool( + &e, + &manager_client, + &loan_currency.ticker, + &loan_currency.token_address, + ); let loan_pool_client = loan_pool::Client::new(&e, &loan_pool_addr); // Set up a loan_pool for the collaterals. - let collateral_pool_addr = deploy_pool(&e, &manager_client, &collateral_currency); + let collateral_pool_addr = deploy_pool( + &e, + &manager_client, + &collateral_currency.ticker, + &collateral_currency.token_address, + ); let collateral_pool_client = loan_pool::Client::new(&e, &collateral_pool_addr); // ACT @@ -923,11 +890,21 @@ mod tests { manager_client.initialize(&admin); // Set up a loan pool with funds for borrowing. - let loan_pool_addr = deploy_pool(&e, &manager_client, &loan_currency); + let loan_pool_addr = deploy_pool( + &e, + &manager_client, + &loan_currency.ticker, + &loan_currency.token_address, + ); let loan_pool_client = loan_pool::Client::new(&e, &loan_pool_addr); // Set up a loan_pool for the collaterals. - let collateral_pool_addr = deploy_pool(&e, &manager_client, &collateral_currency); + let collateral_pool_addr = deploy_pool( + &e, + &manager_client, + &collateral_currency.ticker, + &collateral_currency.token_address, + ); let collateral_pool_client = loan_pool::Client::new(&e, &collateral_pool_addr); // ACT @@ -1016,11 +993,21 @@ mod tests { manager_client.initialize(&admin); // Set up a loan pool with funds for borrowing. - let loan_pool_addr = deploy_pool(&e, &manager_client, &loan_currency); + let loan_pool_addr = deploy_pool( + &e, + &manager_client, + &loan_currency.ticker, + &loan_currency.token_address, + ); let loan_pool_client = loan_pool::Client::new(&e, &loan_pool_addr); // Set up a loan_pool for the collaterals. - let collateral_pool_addr = deploy_pool(&e, &manager_client, &collateral_currency); + let collateral_pool_addr = deploy_pool( + &e, + &manager_client, + &collateral_currency.ticker, + &collateral_currency.token_address, + ); let collateral_pool_client = loan_pool::Client::new(&e, &collateral_pool_addr); // ACT @@ -1088,11 +1075,21 @@ mod tests { manager_client.initialize(&admin); // Set up a loan pool with funds for borrowing. - let loan_pool_addr = deploy_pool(&e, &manager_client, &loan_currency); + let loan_pool_addr = deploy_pool( + &e, + &manager_client, + &loan_currency.ticker, + &loan_currency.token_address, + ); let loan_pool_client = loan_pool::Client::new(&e, &loan_pool_addr); // Set up a loan_pool for the collaterals. - let collateral_pool_addr = deploy_pool(&e, &manager_client, &collateral_currency); + let collateral_pool_addr = deploy_pool( + &e, + &manager_client, + &collateral_currency.ticker, + &collateral_currency.token_address, + ); let collateral_pool_client = loan_pool::Client::new(&e, &collateral_pool_addr); // ACT