Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
17 changes: 8 additions & 9 deletions contracts/red-bank/tests/tests/test_liquidate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -226,15 +226,15 @@ fn target_health_factor_reached_after_max_debt_repayed() {
// check liquidator positions
let liquidator_collaterals = red_bank.query_user_collaterals(&mut mock_env, &liquidator);
assert_eq!(liquidator_collaterals.len(), 1);
assert_eq!(liquidator_collaterals.get("uosmo").unwrap().amount.u128(), 7180);
assert_eq!(liquidator_collaterals.get("uosmo").unwrap().amount.u128(), 7182);
let liquidator_debts = red_bank.query_user_debts(&mut mock_env, &liquidator);
assert_eq!(liquidator_debts.len(), 0);

// check rewards-collector positions (protocol fee)
let rc_collaterals =
red_bank.query_user_collaterals(&mut mock_env, &rewards_collector.contract_addr);
assert_eq!(rc_collaterals.len(), 1);
assert_eq!(rc_collaterals.get("uosmo").unwrap().amount.u128(), 11);
assert_eq!(rc_collaterals.get("uosmo").unwrap().amount.u128(), 9);
let rc_debts = red_bank.query_user_debts(&mut mock_env, &rewards_collector.contract_addr);
assert_eq!(rc_debts.len(), 0);

Expand Down Expand Up @@ -316,15 +316,15 @@ fn debt_amt_adjusted_to_total_debt_then_refund() {
// check liquidator positions
let liquidator_collaterals = red_bank.query_user_collaterals(&mut mock_env, &liquidator);
assert_eq!(liquidator_collaterals.len(), 1);
assert_eq!(liquidator_collaterals.get("uosmo").unwrap().amount.u128(), 9946);
assert_eq!(liquidator_collaterals.get("uosmo").unwrap().amount.u128(), 9948);
let liquidator_debts = red_bank.query_user_debts(&mut mock_env, &liquidator);
assert_eq!(liquidator_debts.len(), 0);

// check rewards-collector positions (protocol fee)
let rc_collaterals =
red_bank.query_user_collaterals(&mut mock_env, &rewards_collector.contract_addr);
assert_eq!(rc_collaterals.len(), 1);
assert_eq!(rc_collaterals.get("uosmo").unwrap().amount.u128(), 20);
assert_eq!(rc_collaterals.get("uosmo").unwrap().amount.u128(), 18);
let rc_debts = red_bank.query_user_debts(&mut mock_env, &rewards_collector.contract_addr);
assert_eq!(rc_debts.len(), 0);

Expand Down Expand Up @@ -405,15 +405,15 @@ fn debt_amt_adjusted_to_max_allowed_by_requested_coin() {
// check liquidator positions
let liquidator_collaterals = red_bank.query_user_collaterals(&mut mock_env, &liquidator);
assert_eq!(liquidator_collaterals.len(), 1);
assert_eq!(liquidator_collaterals.get("uosmo").unwrap().amount.u128(), 9976);
assert_eq!(liquidator_collaterals.get("uosmo").unwrap().amount.u128(), 9978);
let liquidator_debts = red_bank.query_user_debts(&mut mock_env, &liquidator);
assert_eq!(liquidator_debts.len(), 0);

// check rewards-collector positions (protocol fee)
let rc_collaterals =
red_bank.query_user_collaterals(&mut mock_env, &rewards_collector.contract_addr);
assert_eq!(rc_collaterals.len(), 1);
assert_eq!(rc_collaterals.get("uosmo").unwrap().amount.u128(), 20);
assert_eq!(rc_collaterals.get("uosmo").unwrap().amount.u128(), 18);
let rc_debts = red_bank.query_user_debts(&mut mock_env, &rewards_collector.contract_addr);
assert_eq!(rc_debts.len(), 0);

Expand Down Expand Up @@ -501,15 +501,14 @@ fn debt_amt_no_adjustment_with_different_recipient() {
// check recipient positions
let recipient_collaterals = red_bank.query_user_collaterals(&mut mock_env, &recipient);
assert_eq!(recipient_collaterals.len(), 1);
assert_eq!(recipient_collaterals.get("uosmo").unwrap().amount.u128(), 406);
assert_eq!(recipient_collaterals.get("uosmo").unwrap().amount.u128(), 407);
let recipient_debts = red_bank.query_user_debts(&mut mock_env, &recipient);
assert_eq!(recipient_debts.len(), 0);

// check rewards-collector positions (protocol fee)
let rc_collaterals =
red_bank.query_user_collaterals(&mut mock_env, &rewards_collector.contract_addr);
assert_eq!(rc_collaterals.len(), 1);
assert_eq!(rc_collaterals.get("uosmo").unwrap().amount.u128(), 1);
assert_eq!(rc_collaterals.len(), 0);
let rc_debts = red_bank.query_user_debts(&mut mock_env, &rewards_collector.contract_addr);
assert_eq!(rc_debts.len(), 0);

Expand Down
12 changes: 7 additions & 5 deletions packages/liquidation/src/liquidation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,9 @@ pub fn calculate_liquidation_amounts(
.min()
.ok_or_else(|| StdError::generic_err("Minimum not found"))?;

let collateral_amount_to_liquidate = debt_amount_to_repay
.checked_mul_floor(debt_price)?
let debt_value_to_repay = debt_amount_to_repay.checked_mul_floor(debt_price)?;

let collateral_amount_to_liquidate = debt_value_to_repay
.checked_mul_floor(liquidation_bonus.add(Decimal::one()))?
.checked_div_floor(collateral_price)?;

Expand All @@ -97,11 +98,12 @@ pub fn calculate_liquidation_amounts(
)));
}

let lb_amount = collateral_amount_to_liquidate.checked_mul_floor(liquidation_bonus)?;
let lb_value = debt_value_to_repay.checked_mul_floor(liquidation_bonus)?;

// Use ceiling in favour of protocol
let protocol_fee_amount =
lb_amount.checked_mul_ceil(collateral_params.protocol_liquidation_fee)?;
let protocol_fee_value =
lb_value.checked_mul_ceil(collateral_params.protocol_liquidation_fee)?;
let protocol_fee_amount = protocol_fee_value.checked_div_floor(collateral_price)?;

let collateral_amount_received_by_liquidator =
collateral_amount_to_liquidate - protocol_fee_amount;
Expand Down