@@ -116,6 +116,19 @@ library LiquidationLogic {
116116 bool receiveShares;
117117 }
118118
119+ struct LiquidateUserVars {
120+ uint256 collateralReserveBalance;
121+ uint256 collateralToLiquidate;
122+ uint256 collateralToLiquidator;
123+ uint256 debtToLiquidate;
124+ bool isCollateralPositionEmpty;
125+ uint256 collateralSharesToLiquidate;
126+ uint256 collateralSharesToLiquidator;
127+ bool isDebtPositionEmpty;
128+ uint256 drawnSharesToLiquidate;
129+ IHubBase.PremiumDelta premiumDelta;
130+ }
131+
119132 // see ISpoke.HEALTH_FACTOR_LIQUIDATION_THRESHOLD docs
120133 uint64 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18 ;
121134
@@ -140,7 +153,9 @@ library LiquidationLogic {
140153 ISpoke.DynamicReserveConfig storage collateralDynConfig ,
141154 LiquidateUserParams memory params
142155 ) external returns (bool ) {
143- uint256 collateralReserveBalance = collateralReserve.hub.previewRemoveByShares (
156+ LiquidateUserVars memory vars;
157+
158+ vars.collateralReserveBalance = collateralReserve.hub.previewRemoveByShares (
144159 collateralReserve.assetId,
145160 positions[params.user][params.collateralReserveId].suppliedShares
146161 );
@@ -158,58 +173,62 @@ library LiquidationLogic {
158173 healthFactor: params.healthFactor,
159174 collateralReserveId: params.collateralReserveId,
160175 collateralFactor: collateralDynConfig.collateralFactor,
161- collateralReserveBalance: collateralReserveBalance,
176+ collateralReserveBalance: vars. collateralReserveBalance,
162177 debtReserveBalance: params.drawnDebt + params.premiumDebt,
163178 receiveShares: params.receiveShares
164179 })
165180 );
166181
167182 (
168- uint256 collateralToLiquidate ,
169- uint256 collateralToLiquidator ,
170- uint256 debtToLiquidate
183+ vars. collateralToLiquidate,
184+ vars. collateralToLiquidator,
185+ vars. debtToLiquidate
171186 ) = _calculateLiquidationAmounts (
172- CalculateLiquidationAmountsParams ({
173- healthFactorForMaxBonus: liquidationConfig.healthFactorForMaxBonus,
174- liquidationBonusFactor: liquidationConfig.liquidationBonusFactor,
175- targetHealthFactor: liquidationConfig.targetHealthFactor,
176- debtReserveBalance: params.drawnDebt + params.premiumDebt,
177- collateralReserveBalance: collateralReserveBalance,
178- debtToCover: params.debtToCover,
179- totalDebtValue: params.totalDebtValue,
180- healthFactor: params.healthFactor,
181- maxLiquidationBonus: collateralDynConfig.maxLiquidationBonus,
182- collateralFactor: collateralDynConfig.collateralFactor,
183- liquidationFee: collateralDynConfig.liquidationFee,
184- debtAssetPrice: IAaveOracle (params.oracle).getReservePrice (params.debtReserveId),
185- debtAssetDecimals: debtReserve.decimals,
186- collateralAssetPrice: IAaveOracle (params.oracle).getReservePrice (
187- params.collateralReserveId
188- ),
189- collateralAssetDecimals: collateralReserve.decimals
190- })
191- );
187+ CalculateLiquidationAmountsParams ({
188+ healthFactorForMaxBonus: liquidationConfig.healthFactorForMaxBonus,
189+ liquidationBonusFactor: liquidationConfig.liquidationBonusFactor,
190+ targetHealthFactor: liquidationConfig.targetHealthFactor,
191+ debtReserveBalance: params.drawnDebt + params.premiumDebt,
192+ collateralReserveBalance: vars. collateralReserveBalance,
193+ debtToCover: params.debtToCover,
194+ totalDebtValue: params.totalDebtValue,
195+ healthFactor: params.healthFactor,
196+ maxLiquidationBonus: collateralDynConfig.maxLiquidationBonus,
197+ collateralFactor: collateralDynConfig.collateralFactor,
198+ liquidationFee: collateralDynConfig.liquidationFee,
199+ debtAssetPrice: IAaveOracle (params.oracle).getReservePrice (params.debtReserveId),
200+ debtAssetDecimals: debtReserve.decimals,
201+ collateralAssetPrice: IAaveOracle (params.oracle).getReservePrice (
202+ params.collateralReserveId
203+ ),
204+ collateralAssetDecimals: collateralReserve.decimals
205+ })
206+ );
192207
193- bool isCollateralPositionEmpty = _liquidateCollateral (
208+ (
209+ vars.collateralSharesToLiquidate,
210+ vars.collateralSharesToLiquidator,
211+ vars.isCollateralPositionEmpty
212+ ) = _liquidateCollateral (
194213 collateralReserve,
195214 positions,
196215 LiquidateCollateralParams ({
197216 collateralReserveId: params.collateralReserveId,
198- collateralToLiquidate: collateralToLiquidate,
199- collateralToLiquidator: collateralToLiquidator,
217+ collateralToLiquidate: vars. collateralToLiquidate,
218+ collateralToLiquidator: vars. collateralToLiquidator,
200219 liquidator: params.liquidator,
201220 user: params.user,
202221 receiveShares: params.receiveShares
203222 })
204223 );
205224
206- bool isDebtPositionEmpty = _liquidateDebt (
225+ (vars.drawnSharesToLiquidate, vars.premiumDelta, vars. isDebtPositionEmpty) = _liquidateDebt (
207226 debtReserve,
208227 positions[params.user][params.debtReserveId],
209228 positionStatus[params.user],
210229 LiquidateDebtParams ({
211230 debtReserveId: params.debtReserveId,
212- debtToLiquidate: debtToLiquidate,
231+ debtToLiquidate: vars. debtToLiquidate,
213232 premiumDebt: params.premiumDebt,
214233 accruedPremium: params.accruedPremium,
215234 liquidator: params.liquidator,
@@ -221,16 +240,20 @@ library LiquidationLogic {
221240 params.collateralReserveId,
222241 params.debtReserveId,
223242 params.user,
224- debtToLiquidate,
225- collateralToLiquidate,
243+ vars.debtToLiquidate,
244+ vars.drawnSharesToLiquidate,
245+ vars.premiumDelta,
246+ vars.collateralToLiquidate,
247+ vars.collateralSharesToLiquidate,
248+ vars.collateralSharesToLiquidator,
226249 params.liquidator,
227250 params.receiveShares
228251 );
229252
230253 return
231254 _evaluateDeficit ({
232- isCollateralPositionEmpty: isCollateralPositionEmpty,
233- isDebtPositionEmpty: isDebtPositionEmpty,
255+ isCollateralPositionEmpty: vars. isCollateralPositionEmpty,
256+ isDebtPositionEmpty: vars. isDebtPositionEmpty,
234257 activeCollateralCount: params.activeCollateralCount,
235258 borrowedCount: params.borrowedCount
236259 });
@@ -277,21 +300,22 @@ library LiquidationLogic {
277300 }
278301
279302 /// @dev Invoked by `liquidateUser` method.
303+ /// @return The total amount of collateral shares to be liquidated.
304+ /// @return The amount of collateral shares that the liquidator receives.
280305 /// @return True if the user collateral position becomes empty after removing.
281306 function _liquidateCollateral (
282307 ISpoke.Reserve storage collateralReserve ,
283308 mapping (address user = > mapping (uint256 reserveId = > ISpoke.UserPosition)) storage positions ,
284309 LiquidateCollateralParams memory params
285- ) internal returns (bool ) {
310+ ) internal returns (uint256 , uint256 , bool ) {
286311 ISpoke.UserPosition storage collateralPosition = positions[params.user][
287312 params.collateralReserveId
288313 ];
289314 IHubBase hub = collateralReserve.hub;
290315 uint256 assetId = collateralReserve.assetId;
291316
292317 uint256 sharesToLiquidate = hub.previewRemoveByAssets (assetId, params.collateralToLiquidate);
293- uint120 suppliedShares = collateralPosition.suppliedShares - sharesToLiquidate.toUint120 ();
294- collateralPosition.suppliedShares = suppliedShares;
318+ uint120 userSuppliedShares = collateralPosition.suppliedShares - sharesToLiquidate.toUint120 ();
295319
296320 uint256 sharesToLiquidator;
297321 if (params.collateralToLiquidator > 0 ) {
@@ -306,52 +330,55 @@ library LiquidationLogic {
306330 }
307331 }
308332
333+ collateralPosition.suppliedShares = userSuppliedShares;
334+
309335 if (sharesToLiquidate > sharesToLiquidator) {
310336 hub.payFeeShares (assetId, sharesToLiquidate.uncheckedSub (sharesToLiquidator));
311337 }
312338
313- return suppliedShares == 0 ;
339+ return (sharesToLiquidate, sharesToLiquidator, userSuppliedShares == 0 ) ;
314340 }
315341
316342 /// @dev Invoked by `liquidateUser` method.
343+ /// @return The amount of drawn shares to be liquidated.
344+ /// @return A struct representing the changes to premium debt after liquidation.
317345 /// @return True if the debt position becomes zero after restoring.
318346 function _liquidateDebt (
319347 ISpoke.Reserve storage debtReserve ,
320348 ISpoke.UserPosition storage debtPosition ,
321349 ISpoke.PositionStatus storage positionStatus ,
322350 LiquidateDebtParams memory params
323- ) internal returns (bool ) {
324- {
325- uint256 premiumDebtToLiquidate = params.premiumDebt.min (params.debtToLiquidate);
326- uint256 drawnDebtToLiquidate = params.debtToLiquidate - premiumDebtToLiquidate;
327-
328- IHubBase.PremiumDelta memory premiumDelta = IHubBase.PremiumDelta ({
329- sharesDelta: - debtPosition.premiumShares.toInt256 (),
330- offsetDelta: - debtPosition.premiumOffset.toInt256 (),
331- realizedDelta: params.accruedPremium.toInt256 () - premiumDebtToLiquidate.toInt256 ()
332- });
351+ ) internal returns (uint256 , IHubBase.PremiumDelta memory , bool ) {
352+ uint256 premiumDebtToLiquidate = params.premiumDebt.min (params.debtToLiquidate);
353+ uint256 drawnDebtToLiquidate = params.debtToLiquidate - premiumDebtToLiquidate;
354+
355+ IHubBase.PremiumDelta memory premiumDelta = IHubBase.PremiumDelta ({
356+ sharesDelta: - debtPosition.premiumShares.toInt256 (),
357+ offsetDelta: - debtPosition.premiumOffset.toInt256 (),
358+ realizedDelta: params.accruedPremium.toInt256 () - premiumDebtToLiquidate.toInt256 ()
359+ });
333360
334- debtReserve.underlying.safeTransferFrom (
335- params.liquidator,
336- address (debtReserve.hub),
337- drawnDebtToLiquidate + premiumDebtToLiquidate
338- );
339- uint256 drawnSharesLiquidated = debtReserve.hub.restore (
340- debtReserve.assetId,
341- drawnDebtToLiquidate,
342- premiumDebtToLiquidate,
343- premiumDelta
344- );
345- debtPosition.settlePremiumDebt (premiumDelta.realizedDelta);
346- debtPosition.drawnShares -= drawnSharesLiquidated.toUint120 ();
347- }
361+ debtReserve.underlying.safeTransferFrom (
362+ params.liquidator,
363+ address (debtReserve.hub),
364+ drawnDebtToLiquidate + premiumDebtToLiquidate
365+ );
366+ uint256 drawnSharesLiquidated = debtReserve.hub.restore (
367+ debtReserve.assetId,
368+ drawnDebtToLiquidate,
369+ premiumDebtToLiquidate,
370+ premiumDelta
371+ );
372+ debtPosition.settlePremiumDebt (premiumDelta.realizedDelta);
373+ debtPosition.drawnShares -= drawnSharesLiquidated.toUint120 ();
348374
375+ bool isDebtPositionEmpty = false ;
349376 if (debtPosition.drawnShares == 0 ) {
350377 positionStatus.setBorrowing (params.debtReserveId, false );
351- return true ;
378+ isDebtPositionEmpty = true ;
352379 }
353380
354- return false ;
381+ return (drawnSharesLiquidated, premiumDelta, isDebtPositionEmpty) ;
355382 }
356383
357384 /// @notice Validates the liquidation call.
0 commit comments