Skip to content

Commit 3c25afd

Browse files
committedMar 12, 2025·
fix: fix possible div by zero error in deposit for first depositer
1 parent 6cdf361 commit 3c25afd

File tree

2 files changed

+31
-55
lines changed

2 files changed

+31
-55
lines changed
 

‎contracts/loan_manager/src/contract.rs

+10-43
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,7 @@ mod tests {
778778
let positions_new_user = Positions {
779779
collateral: 0,
780780
liabilities: 0,
781-
receivable_shares: 999,
781+
receivable_shares: 998,
782782
};
783783
assert_eq!(
784784
positions_new_user,
@@ -797,54 +797,21 @@ mod tests {
797797
let pool_state = PoolState {
798798
annual_interest_rate: 200887,
799799
available_balance_tokens: 2000,
800-
total_balance_shares: 2000,
800+
total_balance_shares: 1998,
801801
total_balance_tokens: 2002,
802802
};
803803
assert_eq!(pool_state, pool_xlm_client.get_pool_state());
804804

805805
let state_after_first_withdraw = pool_xlm_client.withdraw(&new_user, &1002);
806806
assert_eq!(state_after_first_withdraw, pool_xlm_client.get_pool_state());
807-
// let test_positions_admin = Positions {
808-
// collateral: 0,
809-
// liabilities: 0,
810-
// receivable_shares: 0,
811-
// };
812-
// assert_eq!(
813-
// test_positions_admin,
814-
// pool_xlm_client.get_user_positions(&admin)
815-
// );
816-
//
817-
// let test_positions_user = Positions {
818-
// collateral: 0,
819-
// liabilities: 0,
820-
// receivable_shares: 1000,
821-
// };
822-
// assert_eq!(
823-
// test_positions_user,
824-
// pool_xlm_client.get_user_positions(&new_user)
825-
// );
826-
//
827-
// let test_positions_admin = Positions {
828-
// collateral: 0,
829-
// liabilities: 0,
830-
// receivable_shares: 0,
831-
// };
832-
// assert_eq!(
833-
// test_positions_admin,
834-
// pool_xlm_client.get_user_positions(&admin)
835-
// );
836-
//
837-
// let pool_state = PoolState {
838-
// annual_interest_rate: 201777,
839-
// available_balance_tokens: 998,
840-
// total_balance_shares: 1000,
841-
// total_balance_tokens: 1000,
842-
// };
843-
// assert_eq!(pool_state, pool_xlm_client.get_pool_state());
844-
//
845-
// assert_eq!(1000, pool_xlm_client.get_contract_balance());
846-
// pool_xlm_client.withdraw(&new_user, &998);
847-
// assert_eq!(2, pool_xlm_client.get_contract_balance());
807+
808+
let pool_state = PoolState {
809+
annual_interest_rate: 200887,
810+
available_balance_tokens: 998,
811+
total_balance_shares: 998,
812+
total_balance_tokens: 1000,
813+
};
814+
assert_eq!(pool_state, pool_xlm_client.get_pool_state());
848815
}
849816

850817
#[test]

‎contracts/loan_pool/src/contract.rs

+21-12
Original file line numberDiff line numberDiff line change
@@ -65,20 +65,20 @@ impl LoanPoolContract {
6565
let client = token::Client::new(&e, &token_address);
6666
client.transfer(&user, &e.current_contract_address(), &amount);
6767

68-
storage::adjust_available_balance(&e, amount)?;
69-
storage::adjust_total_shares(&e, amount)?;
70-
storage::adjust_total_balance(&e, amount)?;
71-
7268
let current_shares = Self::get_total_balance_shares(e.clone())?;
7369
let current_contract_balance = Self::get_contract_balance(e.clone())?;
7470

75-
let shares_issued = current_shares
76-
.checked_mul(amount)
77-
.ok_or(LoanPoolError::OverOrUnderFlow)?
78-
.checked_div(current_contract_balance)
79-
.ok_or(LoanPoolError::OverOrUnderFlow)?;
80-
let liabilities: i128 = 0; // temp test param
81-
let collateral: i128 = 0; // temp test param
71+
let shares_issued = if current_contract_balance == 0 {
72+
amount
73+
} else {
74+
current_shares
75+
.checked_mul(amount)
76+
.ok_or(LoanPoolError::OverOrUnderFlow)?
77+
.checked_div(current_contract_balance)
78+
.ok_or(LoanPoolError::OverOrUnderFlow)?
79+
};
80+
let liabilities: i128 = 0;
81+
let collateral: i128 = 0;
8282
positions::increase_positions(
8383
&e,
8484
user.clone(),
@@ -87,6 +87,10 @@ impl LoanPoolContract {
8787
collateral,
8888
)?;
8989

90+
storage::adjust_available_balance(&e, amount)?;
91+
storage::adjust_total_shares(&e, shares_issued)?;
92+
storage::adjust_total_balance(&e, amount)?;
93+
9094
Ok(amount)
9195
}
9296
}
@@ -125,7 +129,12 @@ impl LoanPoolContract {
125129
&e,
126130
amount.checked_neg().ok_or(LoanPoolError::OverOrUnderFlow)?,
127131
)?;
128-
let new_total_balance_shares = storage::adjust_total_shares(&e, shares_to_decrease)?;
132+
let new_total_balance_shares = storage::adjust_total_shares(
133+
&e,
134+
shares_to_decrease
135+
.checked_neg()
136+
.ok_or(LoanPoolError::OverOrUnderFlow)?,
137+
)?;
129138
let liabilities: i128 = 0;
130139
let collateral: i128 = 0;
131140
positions::decrease_positions(

0 commit comments

Comments
 (0)
Please sign in to comment.