From 37611b3569f64c1bfe26c6e0f4a76d849623018e Mon Sep 17 00:00:00 2001 From: piobab Date: Thu, 20 Jun 2024 15:06:54 +0200 Subject: [PATCH] Fix Oak no. 1 - liquidatees staking rewards. --- .../credit-manager/src/liquidate_astro_lp.rs | 9 +++++++++ .../tests/test_liquidate_staked_astro_lp.rs | 18 +++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/contracts/credit-manager/src/liquidate_astro_lp.rs b/contracts/credit-manager/src/liquidate_astro_lp.rs index 4c600139..fce60c01 100644 --- a/contracts/credit-manager/src/liquidate_astro_lp.rs +++ b/contracts/credit-manager/src/liquidate_astro_lp.rs @@ -38,6 +38,15 @@ pub fn liquidate_astro_lp( total_lp_amount, )?; + // Rewards are not accounted for in the liquidation calculation (health computer includes + // only staked astro lps in HF calculation). + // Rewards could increase the HF (they increase deposit balance - collateral), but the impact + // is minimal and additional complexity is not worth it. + // We only update liquidatee's balance with rewards. + for reward in lp_position.rewards.iter() { + increment_coin_balance(deps.storage, liquidatee_account_id, reward)?; + } + // Liquidator pays down debt on behalf of liquidatee let repay_msg = repay_debt(deps.storage, &env, liquidator_account_id, liquidatee_account_id, &debt)?; diff --git a/contracts/credit-manager/tests/tests/test_liquidate_staked_astro_lp.rs b/contracts/credit-manager/tests/tests/test_liquidate_staked_astro_lp.rs index 3c45ae6d..302b4786 100644 --- a/contracts/credit-manager/tests/tests/test_liquidate_staked_astro_lp.rs +++ b/contracts/credit-manager/tests/tests/test_liquidate_staked_astro_lp.rs @@ -1,4 +1,4 @@ -use cosmwasm_std::{coins, Addr, Decimal, Uint128}; +use cosmwasm_std::{coin, coins, Addr, Decimal, Uint128}; use mars_credit_manager::error::{ContractError, ContractError::NotLiquidatable}; use mars_mock_oracle::msg::CoinPrice; use mars_testing::multitest::helpers::coin_info; @@ -203,6 +203,16 @@ fn staked_lp_position_partially_liquidated() { ) .unwrap(); + // Add rewards + let astro_reward = coin(54, "uastro"); + let atom_reward = coin(4, "uatom"); + mock.add_astro_incentive_reward( + &liquidatee_account_id, + &uosmo_info.denom, + astro_reward.clone(), + ); + mock.add_astro_incentive_reward(&liquidatee_account_id, &uosmo_info.denom, atom_reward.clone()); + mock.price_change(CoinPrice { pricing: ActionKind::Liquidation, denom: uatom_info.denom.clone(), @@ -234,11 +244,13 @@ fn staked_lp_position_partially_liquidated() { // Assert liquidatee's new position let position = mock.query_positions(&liquidatee_account_id); - assert_eq!(position.deposits.len(), 2); + assert_eq!(position.deposits.len(), 3); let osmo_balance = get_coin("uosmo", &position.deposits); assert_eq!(osmo_balance.amount, Uint128::new(600)); let atom_balance = get_coin("uatom", &position.deposits); - assert_eq!(atom_balance.amount, Uint128::new(1000)); + assert_eq!(atom_balance.amount, Uint128::new(1000) + atom_reward.amount); + let astro_balance = get_coin(&astro_reward.denom, &position.deposits); + assert_eq!(astro_balance.amount, astro_reward.amount); assert_eq!(position.debts.len(), 1); let atom_debt = get_debt("uatom", &position.debts);