Skip to content

Commit

Permalink
refactor: Simplify reading & writing loans
Browse files Browse the repository at this point in the history
  • Loading branch information
kovipu committed Feb 17, 2025
1 parent 371a582 commit 07fefc7
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 81 deletions.
41 changes: 16 additions & 25 deletions contracts/loan_manager/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ impl LoanManager {
health_factor: _,
unpaid_interest,
last_accrual,
} = Self::get_loan(e, user.clone());
} = storage::read_loan(e, user.clone()).ok_or(LoanManagerError::LoanNotFound)?;

let borrow_pool_client = loan_pool::Client::new(e, &borrowed_from);
let collateral_pool_client = loan_pool::Client::new(e, &collateral_from);
Expand Down Expand Up @@ -251,14 +251,9 @@ impl LoanManager {
last_accrual: current_accrual,
};

let key = (Symbol::new(e, "Loan"), user.clone());
storage::write_loan(e, user.clone(), updated_loan.clone());

e.storage().persistent().set(&key, &updated_loan);
e.storage().persistent().extend_ttl(
&key,
POSITIONS_LIFETIME_THRESHOLD,
POSITIONS_BUMP_AMOUNT,
);
let key = (Symbol::new(e, "Loan"), user.clone());
e.events()
.publish((key, symbol_short!("updated")), updated_loan);

Expand Down Expand Up @@ -313,12 +308,8 @@ impl LoanManager {
Ok(health_factor)
}

pub fn get_loan(e: &Env, addr: Address) -> Loan {
if let Some(loan) = storage::read_loan(e, addr) {
loan
} else {
panic!() // TODO: It should be panic_with_error or something and give out detailed error.
}
pub fn get_loan(e: &Env, user: Address) -> Option<Loan> {
storage::read_loan(e, user)
}

pub fn get_price(e: &Env, token: Symbol) -> Result<i128, LoanManagerError> {
Expand Down Expand Up @@ -347,7 +338,7 @@ impl LoanManager {
unpaid_interest,
last_accrual,
..
} = Self::get_loan(e, user.clone());
} = storage::read_loan(e, user.clone()).ok_or(LoanManagerError::LoanNotFound)?;

assert!(
amount <= borrowed_amount,
Expand Down Expand Up @@ -420,7 +411,7 @@ impl LoanManager {
health_factor: _,
unpaid_interest,
last_accrual: _,
} = Self::get_loan(e, user.clone());
} = storage::read_loan(e, user.clone()).ok_or(LoanManagerError::LoanNotFound)?;

let borrow_pool_client = loan_pool::Client::new(e, &borrowed_from);
borrow_pool_client.repay_and_close(
Expand Down Expand Up @@ -457,7 +448,7 @@ impl LoanManager {
health_factor: _,
unpaid_interest,
last_accrual,
} = Self::get_loan(&e, borrower);
} = storage::read_loan(&e, borrower.clone()).ok_or(LoanManagerError::LoanNotFound)?;

let key = (Symbol::new(&e, "Loan"), borrower.clone());

Expand Down Expand Up @@ -766,7 +757,7 @@ mod tests {
// Create a loan.
contract_client.create_loan(&user, &10_000, &loan_pool_id, &100_000, &collateral_pool_id);

let user_loan = contract_client.get_loan(&user);
let user_loan = contract_client.get_loan(&user).unwrap();

assert_eq!(user_loan.borrowed_amount, 10_000);
assert_eq!(collateral_token_client.balance(&user), 900_000);
Expand All @@ -788,7 +779,7 @@ mod tests {

contract_client.add_interest(&user);

let user_loan = contract_client.get_loan(&user);
let user_loan = contract_client.get_loan(&user).unwrap();

assert_eq!(user_loan.borrowed_amount, 12_998);
assert_eq!(user_loan.health_factor, 61_547_930);
Expand Down Expand Up @@ -872,13 +863,13 @@ mod tests {
assert_eq!(loan_token_client.balance(&user), 1_000);
assert_eq!(collateral_token_client.balance(&user), 900_000);

let user_loan = contract_client.get_loan(&user);
let user_loan = contract_client.get_loan(&user).unwrap();

assert_eq!(user_loan.borrowed_amount, 1_000);
assert_eq!(user_loan.collateral_amount, 100_000);

contract_client.repay(&user, &100);
let user_loan = contract_client.get_loan(&user);
let user_loan = contract_client.get_loan(&user).unwrap();
assert_eq!(user_loan.borrowed_amount, 920);

assert_eq!((920, 820), contract_client.repay(&user, &100));
Expand Down Expand Up @@ -966,7 +957,7 @@ mod tests {
assert_eq!(loan_token_client.balance(&user), 1_050);
assert_eq!(collateral_token_client.balance(&user), 900_000);

let user_loan = contract_client.get_loan(&user);
let user_loan = contract_client.get_loan(&user).unwrap();

assert_eq!(user_loan.borrowed_amount, 1_000);
assert_eq!(user_loan.collateral_amount, 100_000);
Expand Down Expand Up @@ -1103,7 +1094,7 @@ mod tests {
// Create a loan.
contract_client.create_loan(&user, &10_000, &loan_pool_id, &12_505, &collateral_pool_id);

let user_loan = contract_client.get_loan(&user);
let user_loan = contract_client.get_loan(&user).unwrap();

assert_eq!(user_loan.borrowed_amount, 10_000);

Expand All @@ -1125,7 +1116,7 @@ mod tests {

contract_client.add_interest(&user);

let user_loan = contract_client.get_loan(&user);
let user_loan = contract_client.get_loan(&user).unwrap();

assert_eq!(user_loan.borrowed_amount, 12_998);
assert_eq!(user_loan.health_factor, 7_696_568);
Expand All @@ -1140,7 +1131,7 @@ mod tests {

contract_client.liquidate(&admin, &user, &5000);

let user_loan = contract_client.get_loan(&user);
let user_loan = contract_client.get_loan(&user).unwrap();

assert_eq!(user_loan.borrowed_amount, 7_998);
assert_eq!(user_loan.health_factor, 7_256_814);
Expand Down
1 change: 1 addition & 0 deletions contracts/loan_manager/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ pub enum LoanManagerError {
OverOrUnderFlow = 4,
NoLastPrice = 5,
AddressNotFound = 6,
LoanNotFound = 7,
}
44 changes: 20 additions & 24 deletions contracts/loan_manager/src/storage.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
use soroban_sdk::{contracttype, Address, Env};

/* Ledger Thresholds */

pub(crate) const DAY_IN_LEDGERS: u32 = 17280; // if ledger takes 5 seconds

pub(crate) const POSITIONS_BUMP_AMOUNT: u32 = 30 * DAY_IN_LEDGERS;
pub(crate) const POSITIONS_LIFETIME_THRESHOLD: u32 = POSITIONS_BUMP_AMOUNT - DAY_IN_LEDGERS;

/* Storage Types */
#[derive(Clone)]
#[contracttype]
pub enum LoanManagerDataKey {
Admin,
PoolAddresses,
Loan(Address),
LastUpdated,
}

#[derive(Clone)]
#[contracttype]
pub struct Loan {
Expand All @@ -21,18 +23,14 @@ pub struct Loan {
pub last_accrual: i128,
}

#[derive(Clone)]
#[contracttype]
pub enum LoanManagerDataKey {
Admin,
PoolAddresses,
// Users positions in the pool
Loan(Address),
LastUpdated,
}
/* Ledger Thresholds */
pub(crate) const DAY_IN_LEDGERS: u32 = 17280; // if ledger takes 5 seconds

pub(crate) const POSITIONS_BUMP_AMOUNT: u32 = 30 * DAY_IN_LEDGERS;
pub(crate) const POSITIONS_LIFETIME_THRESHOLD: u32 = POSITIONS_BUMP_AMOUNT - DAY_IN_LEDGERS;

pub fn write_loan(e: &Env, addr: Address, loan: Loan) {
let key = LoanManagerDataKey::Loan(addr);
pub fn write_loan(e: &Env, user: Address, loan: Loan) {
let key = LoanManagerDataKey::Loan(user);

e.storage().persistent().set(&key, &loan);

Expand All @@ -43,10 +41,8 @@ pub fn write_loan(e: &Env, addr: Address, loan: Loan) {
e.events().publish(("Loan", "created"), key);
}

pub fn read_loan(e: &Env, addr: Address) -> Option<Loan> {
let key = LoanManagerDataKey::Loan(addr);

let value: Option<Loan> = e.storage().persistent().get(&key)?;

value
pub fn read_loan(e: &Env, user: Address) -> Option<Loan> {
e.storage()
.persistent()
.get(&LoanManagerDataKey::Loan(user))
}
32 changes: 0 additions & 32 deletions contracts/loan_manager/src/storage_types.rs

This file was deleted.

0 comments on commit 07fefc7

Please sign in to comment.