src/DSCEngine.sol:
228 */
229: function liquidate(address collateral, address user, uint256 debtToCover)
230: external
231: moreThanZero(debtToCover)
232: nonReentrant
233: {
234:
235: uint256 startingUserHealthFactor = _healthFactor(user);
236: if (startingUserHealthFactor >= MIN_HEALTH_FACTOR) {
237: revert DSCEngine__HealthFactorOk();
238: }
239:
240:
241:
242:
243:
244:
245: uint256 tokenAmountFromDebtCovered = getTokenAmountFromUsd(collateral, debtToCover);
246:
247:
248:
249:
250:
251: uint256 bonusCollateral = (tokenAmountFromDebtCovered * LIQUIDATION_BONUS) / LIQUIDATION_PRECISION;
252: uint256 totalCollateralToRedeem = tokenAmountFromDebtCovered + bonusCollateral;
253: _redeemCollateral(user, msg.sender, collateral, totalCollateralToRedeem);
254:
255: _burnDsc(debtToCover, user, msg.sender);
256:
257: uint256 endingUserHealthFactor = _healthFactor(user);
258: if (endingUserHealthFactor <= startingUserHealthFactor) {
259: revert DSCEngine__HealthFactorNotImproved();
260: }
261: _revertIfHealthFactorIsBroken(msg.sender);
262: }
src/DSCEngine.sol:
228 */
229: function liquidate(address collateral, address user, uint256 debtToCover)
230: external
231: moreThanZero(debtToCover)
232: nonReentrant
233: {
234: // need to check health factor of the user
235: uint256 startingUserHealthFactor = _healthFactor(user);
236: if (startingUserHealthFactor >= MIN_HEALTH_FACTOR) {
237: revert DSCEngine__HealthFactorOk();
238: }
+ require(user == onlyOwner, "owner can't do it");
239: // We want to burn their DSC "debt"
240: // And take their collateral
241: // Bad User: $140 ETH, $100 DSC
242: // debtToCover = $100
243: // $100 of DSC == ??? ETH?
244: // 0.05 ETH
245: uint256 tokenAmountFromDebtCovered = getTokenAmountFromUsd(collateral, debtToCover);
246: // And give them a 10% bonus
247: // So we are giving the liquidator $110 of WETH for 100 DSC
248: // We should implement a feature to liquidate in the event the protocol is insolvent
249: // And sweep extra amounts into a treasury
250: // 0.05 * 0.1 = 0.005. Getting 0.055
251: uint256 bonusCollateral = (tokenAmountFromDebtCovered * LIQUIDATION_BONUS) / LIQUIDATION_PRECISION;
252: uint256 totalCollateralToRedeem = tokenAmountFromDebtCovered + bonusCollateral;
253: _redeemCollateral(user, msg.sender, collateral, totalCollateralToRedeem);
254: // We need to burn the DSC
255: _burnDsc(debtToCover, user, msg.sender);
256:
257: uint256 endingUserHealthFactor = _healthFactor(user);
258: if (endingUserHealthFactor <= startingUserHealthFactor) {
259: revert DSCEngine__HealthFactorNotImproved();
260: }
261: _revertIfHealthFactorIsBroken(msg.sender);
262: }