diff --git a/contracts/red-bank/src/error.rs b/contracts/red-bank/src/error.rs index e7f3d553f..9ee39a74d 100644 --- a/contracts/red-bank/src/error.rs +++ b/contracts/red-bank/src/error.rs @@ -81,6 +81,9 @@ pub enum ContractError { #[error("Amount to repay is greater than total debt")] CannotRepayMoreThanDebt {}, + #[error("User cannot issue liquidation of own account")] + CannotLiquidateSelf {}, + #[error("User has a positive uncollateralized loan limit and thus cannot be liquidated")] CannotLiquidateWhenPositiveUncollateralizedLoanLimit {}, diff --git a/contracts/red-bank/src/execute.rs b/contracts/red-bank/src/execute.rs index 0ea6615a5..0c7829954 100644 --- a/contracts/red-bank/src/execute.rs +++ b/contracts/red-bank/src/execute.rs @@ -701,6 +701,12 @@ pub fn liquidate( let recipient = User(&recipient_addr); // 1. Validate liquidation + + // User cannot liquidate themselves + if info.sender == user_addr { + return Err(ContractError::CannotLiquidateSelf {}); + } + // If user (contract) has a positive uncollateralized limit then the user // cannot be liquidated if !user.uncollateralized_loan_limit(deps.storage, &debt_denom)?.is_zero() { diff --git a/contracts/red-bank/tests/test_liquidate.rs b/contracts/red-bank/tests/test_liquidate.rs index 747488453..b763d3505 100644 --- a/contracts/red-bank/tests/test_liquidate.rs +++ b/contracts/red-bank/tests/test_liquidate.rs @@ -309,6 +309,24 @@ fn liquidate_if_no_coins_sent() { assert_eq!(error_res, PaymentError::NoFunds {}.into()); } +#[test] +fn cannot_self_liquidate() { + let TestSuite { + mut deps, + .. + } = setup_test(); + + let env = mock_env(MockEnvParams::default()); + let info = mock_info("liquidator", &[coin(100, "somecoin1")]); + let msg = ExecuteMsg::Liquidate { + user: "liquidator".to_string(), + collateral_denom: "collateral".to_string(), + recipient: None, + }; + let error_res = execute(deps.as_mut(), env, info, msg).unwrap_err(); + assert_eq!(error_res, ContractError::CannotLiquidateSelf {}.into()); +} + #[test] fn liquidate_if_many_coins_sent() { let TestSuite {