Skip to content

Commit 98acb73

Browse files
authored
Merge pull request #42 from EbukaMoses/feat/loan-manager-liquidate
feat(loan_manager): adjust total_outstanding on liquidation
2 parents 71cb0c2 + 86fb5f5 commit 98acb73

3 files changed

Lines changed: 59 additions & 6 deletions

File tree

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ target/
66

77
# Docs
88
plan.md
9-
CLAUDE.md
9+
CLAUDE.md

loan_manager/src/lib.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1576,17 +1576,20 @@ impl LoanManager {
15761576
};
15771577

15781578
Self::apply_debt_recovery(&mut loan, debt_repaid);
1579-
loan.status = LoanStatus::Liquidated;
1580-
loan.collateral_amount = 0;
1581-
env.storage().persistent().set(&loan_key, &loan);
1582-
Self::bump_persistent_ttl(&env, &loan_key);
1583-
Self::decrement_borrower_loan_count(&env, &loan.borrower);
15841579

15851580
let token: Address = env
15861581
.storage()
15871582
.instance()
15881583
.get(&DataKey::Token)
15891584
.expect("token not set");
1585+
Self::adjust_total_outstanding(&env, &token, -loan.amount);
1586+
1587+
loan.status = LoanStatus::Liquidated;
1588+
loan.collateral_amount = 0;
1589+
env.storage().persistent().set(&loan_key, &loan);
1590+
Self::bump_persistent_ttl(&env, &loan_key);
1591+
Self::decrement_borrower_loan_count(&env, &loan.borrower);
1592+
15901593
let lending_pool: Address = env
15911594
.storage()
15921595
.instance()

loan_manager/src/test.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1572,6 +1572,56 @@ fn test_liquidate_under_threshold_transfers_bonus_and_refund() {
15721572
);
15731573
}
15741574

1575+
#[test]
1576+
fn test_liquidation_frees_outstanding_for_approve_loan() {
1577+
let env = Env::default();
1578+
env.mock_all_auths_allowing_non_root_auth();
1579+
1580+
let (manager, nft_client, pool_client, token_id, _token_admin) = setup_test(&env);
1581+
let borrower_one = Address::generate(&env);
1582+
let borrower_two = Address::generate(&env);
1583+
let liquidator = Address::generate(&env);
1584+
1585+
let history_hash = soroban_sdk::BytesN::from_array(&env, &[0u8; 32]);
1586+
nft_client.mint(
1587+
&borrower_one,
1588+
&650,
1589+
&history_hash,
1590+
&String::from_str(&env, "ipfs://QmTest"),
1591+
&None,
1592+
);
1593+
nft_client.mint(
1594+
&borrower_two,
1595+
&650,
1596+
&history_hash,
1597+
&String::from_str(&env, "ipfs://QmTest"),
1598+
&None,
1599+
);
1600+
1601+
let stellar_token = StellarAssetClient::new(&env, &token_id);
1602+
stellar_token.mint(&pool_client, &10_000);
1603+
stellar_token.mint(&borrower_one, &20_000);
1604+
1605+
manager.set_liquidation_threshold(&14_500);
1606+
1607+
let first_loan = manager.request_loan(&borrower_one, &6_000, &17_280);
1608+
let second_loan = manager.request_loan(&borrower_two, &6_000, &17_280);
1609+
manager.approve_loan(&first_loan);
1610+
manager.deposit_collateral(&first_loan, &8_500);
1611+
1612+
let blocked_before_liquidation = manager.try_approve_loan(&second_loan);
1613+
assert_eq!(
1614+
blocked_before_liquidation,
1615+
Err(Ok(LoanError::InsufficientPoolLiquidity))
1616+
);
1617+
1618+
manager.liquidate(&liquidator, &first_loan);
1619+
1620+
assert_eq!(manager.get_loan(&first_loan).status, LoanStatus::Liquidated);
1621+
manager.approve_loan(&second_loan);
1622+
assert_eq!(manager.get_loan(&second_loan).status, LoanStatus::Approved);
1623+
}
1624+
15751625
#[test]
15761626
fn test_liquidate_rejects_healthy_collateral_ratio() {
15771627
let env = Env::default();

0 commit comments

Comments
 (0)