diff --git a/contracts/red-bank/tests/files/Red Bank - Dynamic LB & CF test cases v1.1.xlsx b/contracts/red-bank/tests/files/Red Bank - Dynamic LB & CF test cases v1.1.xlsx index 5d50903e1..e649148e7 100644 Binary files a/contracts/red-bank/tests/files/Red Bank - Dynamic LB & CF test cases v1.1.xlsx and b/contracts/red-bank/tests/files/Red Bank - Dynamic LB & CF test cases v1.1.xlsx differ diff --git a/contracts/red-bank/tests/tests/test_liquidate.rs b/contracts/red-bank/tests/tests/test_liquidate.rs index d20976e86..c062fb63d 100644 --- a/contracts/red-bank/tests/tests/test_liquidate.rs +++ b/contracts/red-bank/tests/tests/test_liquidate.rs @@ -226,7 +226,7 @@ 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); @@ -234,7 +234,7 @@ fn target_health_factor_reached_after_max_debt_repayed() { 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); @@ -316,7 +316,7 @@ 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); @@ -324,7 +324,7 @@ fn debt_amt_adjusted_to_total_debt_then_refund() { 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); @@ -405,7 +405,7 @@ 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); @@ -413,7 +413,7 @@ fn debt_amt_adjusted_to_max_allowed_by_requested_coin() { 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); @@ -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); diff --git a/packages/liquidation/src/liquidation.rs b/packages/liquidation/src/liquidation.rs index 0a04a4cf6..5362cd92f 100644 --- a/packages/liquidation/src/liquidation.rs +++ b/packages/liquidation/src/liquidation.rs @@ -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)?; @@ -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;