diff --git a/contracts/loan_manager/src/contract.rs b/contracts/loan_manager/src/contract.rs index 256e93e6..110e3dbd 100644 --- a/contracts/loan_manager/src/contract.rs +++ b/contracts/loan_manager/src/contract.rs @@ -169,6 +169,7 @@ impl LoanManager { Ok(()) } + /// Add interest to loan pub fn add_interest(e: &Env, user: Address) -> Result<(), LoanManagerError> { const DECIMAL: i128 = 10000000; let Loan { @@ -235,6 +236,7 @@ impl LoanManager { Ok(()) } + /// Calculate health factor of a given token ratio pub fn calculate_health_factor( e: &Env, token_ticker: Symbol, @@ -283,22 +285,7 @@ impl LoanManager { Ok(health_factor) } - pub fn get_loan(e: &Env, user: Address) -> Result { - storage::read_loan(e, user).ok_or(LoanManagerError::LoanNotFound) - } - - pub fn get_price(e: &Env, token: Symbol) -> Result { - let reflector_address = Address::from_string(&String::from_str(e, REFLECTOR_ADDRESS)); - let reflector_contract = oracle::Client::new(e, &reflector_address); - - let asset = Asset::Other(token); - - let asset_pricedata = reflector_contract - .lastprice(&asset) - .ok_or(LoanManagerError::NoLastPrice)?; - Ok(asset_pricedata.price) - } - + /// Repay part of a loan pub fn repay(e: &Env, user: Address, amount: i128) -> Result<(i128, i128), LoanManagerError> { user.require_auth(); @@ -361,6 +348,7 @@ impl LoanManager { Ok((borrowed_amount, new_borrowed_amount)) } + /// Repay fully and close a loan pub fn repay_and_close_manager( e: &Env, user: Address, @@ -394,6 +382,7 @@ impl LoanManager { Ok(borrowed_amount) } + /// Liquidate a given users loan pub fn liquidate( e: Env, user: Address, @@ -494,6 +483,22 @@ impl LoanManager { Ok((new_borrowed_amount, new_collateral_amount)) } + + pub fn get_loan(e: &Env, user: Address) -> Result { + storage::read_loan(e, user).ok_or(LoanManagerError::LoanNotFound) + } + + pub fn get_price(e: &Env, token: Symbol) -> Result { + let reflector_address = Address::from_string(&String::from_str(e, REFLECTOR_ADDRESS)); + let reflector_contract = oracle::Client::new(e, &reflector_address); + + let asset = Asset::Other(token); + + let asset_pricedata = reflector_contract + .lastprice(&asset) + .ok_or(LoanManagerError::NoLastPrice)?; + Ok(asset_pricedata.price) + } } #[cfg(test)] diff --git a/contracts/loan_pool/src/contract.rs b/contracts/loan_pool/src/contract.rs index 20e9a58d..5772e40a 100644 --- a/contracts/loan_pool/src/contract.rs +++ b/contracts/loan_pool/src/contract.rs @@ -278,57 +278,6 @@ impl LoanPoolContract { Ok(()) } - pub fn get_accrual(e: &Env) -> Result { - storage::read_accrual(e) - } - - pub fn get_collateral_factor(e: &Env) -> Result { - storage::read_collateral_factor(e) - } - - /// Get user's positions in the storage - pub fn get_user_positions(e: Env, user: Address) -> Positions { - storage::read_positions(&e, &user) - } - - /// Get contract data entries - pub fn get_contract_balance(e: Env) -> Result { - storage::read_total_balance(&e) - } - - pub fn get_total_balance_shares(e: Env) -> Result { - storage::read_total_shares(&e) - } - - pub fn get_available_balance(e: Env) -> Result { - storage::read_available_balance(&e) - } - - pub fn get_currency(e: Env) -> Result { - storage::read_currency(&e) - } - - pub fn get_interest(e: Env) -> Result { - interest::get_interest(e) - } - - pub fn get_pool_state(e: Env) -> Result { - Ok(PoolState { - total_balance_tokens: storage::read_total_balance(&e)?, - available_balance_tokens: storage::read_available_balance(&e)?, - total_balance_shares: storage::read_total_shares(&e)?, - annual_interest_rate: interest::get_interest(e)?, - }) - } - - pub fn increase_liabilities(e: Env, user: Address, amount: i128) -> Result<(), LoanPoolError> { - let loan_manager_addr = storage::read_loan_manager_addr(&e)?; - loan_manager_addr.require_auth(); - - positions::increase_positions(&e, user.clone(), 0, amount, 0)?; - Ok(()) - } - pub fn repay( e: Env, user: Address, @@ -445,6 +394,57 @@ impl LoanPoolContract { positions::decrease_positions(&e, loan_owner, 0, 0, amount_collateral)?; Ok(()) } + + pub fn get_accrual(e: &Env) -> Result { + storage::read_accrual(e) + } + + pub fn get_collateral_factor(e: &Env) -> Result { + storage::read_collateral_factor(e) + } + + /// Get user's positions in the storage + pub fn get_user_positions(e: Env, user: Address) -> Positions { + storage::read_positions(&e, &user) + } + + /// Get contract data entries + pub fn get_contract_balance(e: Env) -> Result { + storage::read_total_balance(&e) + } + + pub fn get_total_balance_shares(e: Env) -> Result { + storage::read_total_shares(&e) + } + + pub fn get_available_balance(e: Env) -> Result { + storage::read_available_balance(&e) + } + + pub fn get_currency(e: Env) -> Result { + storage::read_currency(&e) + } + + pub fn get_interest(e: Env) -> Result { + interest::get_interest(e) + } + + pub fn get_pool_state(e: Env) -> Result { + Ok(PoolState { + total_balance_tokens: storage::read_total_balance(&e)?, + available_balance_tokens: storage::read_available_balance(&e)?, + total_balance_shares: storage::read_total_shares(&e)?, + annual_interest_rate: interest::get_interest(e)?, + }) + } + + pub fn increase_liabilities(e: Env, user: Address, amount: i128) -> Result<(), LoanPoolError> { + let loan_manager_addr = storage::read_loan_manager_addr(&e)?; + loan_manager_addr.require_auth(); + + positions::increase_positions(&e, user.clone(), 0, amount, 0)?; + Ok(()) + } } #[cfg(test)] diff --git a/currencies.ts b/currencies.ts index d3a56868..c8aa71ac 100644 --- a/currencies.ts +++ b/currencies.ts @@ -27,18 +27,18 @@ export const CURRENCY_USDC: Currency = { name: 'USD Coin', ticker: 'USDC', issuerName: 'centre.io', - tokenContractAddress: 'CAHMBFPE4BNP26VUFRYBJ43GWENCAS2JAGQ7VPBV23CUFL4ZWZQGNBGO', + tokenContractAddress: 'CCFOGKTM7CC33YW2H5XSGJN5DLNXG2GUKA3XMRYRWZSY2G5QGW2V3PSO', loanPoolName: 'pool_usdc', - issuer: 'GBE3CPBXTOGG75G7GETO5QZBYB4WCDTX6XWUEVZMXFP6Q66OR4MSLIPU', + issuer: 'GCAZVAXHZDFF25GIKG3XMUJKMB2IRFUD3N35GUQZMZA5GT66NYHRXBHO', } as const; export const CURRENCY_EURC: Currency = { name: 'Euro Coin', ticker: 'EURC', issuerName: 'centre.io', - tokenContractAddress: 'CDR3UKQ3L5K2JV2OINPVLB6NIOLSROAKMWPEML4CMXBN5NBAUGWFBNYZ', + tokenContractAddress: 'CCH2DZNCAG72ARUIMYBAEWM7TXVCB4O32GG3RHULN5GRAP4HE5M4H4XP', loanPoolName: 'pool_eurc', - issuer: 'GBE3CPBXTOGG75G7GETO5QZBYB4WCDTX6XWUEVZMXFP6Q66OR4MSLIPU', + issuer: 'GCAZVAXHZDFF25GIKG3XMUJKMB2IRFUD3N35GUQZMZA5GT66NYHRXBHO', } as const; export const CURRENCIES: Currency[] = [CURRENCY_XLM, CURRENCY_USDC, CURRENCY_EURC] as const; diff --git a/scripts/initialize.ts b/scripts/initialize.ts index c4ed073c..6d363353 100644 --- a/scripts/initialize.ts +++ b/scripts/initialize.ts @@ -1,7 +1,7 @@ import 'dotenv/config'; -import { mkdirSync } from 'fs'; -import crypto from 'crypto'; -import { CURRENCIES, type Currency } from '../currencies'; +import { mkdirSync } from 'node:fs'; +import crypto from 'node:crypto'; +import { CURRENCIES } from '../currencies'; import { loadAccount, buildContracts, @@ -28,10 +28,10 @@ const deploy = (wasm: string) => { * Loan_manager is used as a factory for the loan_pools. */ const deployLoanManager = () => { - const contractsDir = `.stellar/contract-ids`; + const contractsDir = '.stellar/contract-ids'; mkdirSync(contractsDir, { recursive: true }); - deploy(`./target/wasm32-unknown-unknown/release/loan_manager.wasm`); + deploy('./target/wasm32-unknown-unknown/release/loan_manager.wasm'); exe(`stellar contract invoke \ --id ${loanManagerAddress()} \ @@ -45,7 +45,7 @@ const deployLoanManager = () => { const deployLoanPools = () => { const wasmHash = readTextFile('./.stellar/contract-wasm-hash/loan_pool.txt'); - CURRENCIES.forEach(({ tokenContractAddress, ticker, loanPoolName }: Currency) => { + for (const { tokenContractAddress, ticker, loanPoolName } of CURRENCIES) { const salt = crypto.randomBytes(32).toString('hex'); exe( `stellar contract invoke \ @@ -60,7 +60,7 @@ const deployLoanPools = () => { --liquidation_threshold 8000000 \ | tr -d '"' > ./.stellar/contract-ids/${loanPoolName}.txt`, ); - }); + } }; // Calling the functions (equivalent to the last part of your bash script) diff --git a/scripts/util.ts b/scripts/util.ts index 9a32ce1c..5324b88d 100644 --- a/scripts/util.ts +++ b/scripts/util.ts @@ -1,6 +1,6 @@ -import { execSync } from 'child_process'; -import { mkdirSync, readFileSync, writeFileSync } from 'fs'; -import path from 'path'; +import { execSync } from 'node:child_process'; +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; // Load environment variables starting with PUBLIC_ into the environment, // so we don't need to specify duplicate variables in .env @@ -35,24 +35,24 @@ export const exe = (command: string) => { }; export const buildContracts = () => { - exe(`rm -f ./target/wasm32-unknown-unknown/release/*.wasm`); - exe(`rm -f ./target/wasm32-unknown-unknown/release/*.d`); - exe(`make build`); + exe('rm -f ./target/wasm32-unknown-unknown/release/*.wasm'); + exe('rm -f ./target/wasm32-unknown-unknown/release/*.d'); + exe('make build'); }; /** Install all contracts and save their wasm hashes to .stellar */ export const installContracts = () => { - const contractsDir = `./.stellar/contract-wasm-hash`; + const contractsDir = './.stellar/contract-wasm-hash'; mkdirSync(contractsDir, { recursive: true }); - install('loan_manager'); - install('loan_pool'); + upload('loan_manager'); + upload('loan_pool'); }; /* Install a contract */ -const install = (contractName: string) => { +const upload = (contractName: string) => { exe( - `stellar contract install \ + `stellar contract upload \ --wasm ./target/wasm32-unknown-unknown/release/${contractName}.wasm \ --ignore-checks \ > ./.stellar/contract-wasm-hash/${contractName}.txt`, @@ -90,7 +90,7 @@ export const createContractImports = () => { }; const importContract = (contractName: string) => { - const outputDir = `./src/contracts/`; + const outputDir = './src/contracts/'; mkdirSync(outputDir, { recursive: true }); /* eslint-disable quotes */