@@ -30,6 +30,7 @@ abstract contract Spoke is ISpoke, Multicall, NoncesKeyed, AccessManagedUpgradea
3030 using KeyValueList for KeyValueList.List;
3131 using PositionStatusMap for * ;
3232 using MathUtils for * ;
33+ using LiquidationLogic for * ;
3334
3435 /// @inheritdoc ISpoke
3536 uint256 public constant MAX_ALLOWED_ASSET_ID = type (uint16 ).max;
@@ -299,7 +300,7 @@ abstract contract Spoke is ISpoke, Multicall, NoncesKeyed, AccessManagedUpgradea
299300 msg .sender
300301 );
301302
302- _settlePremiumDebt ( userPosition, premiumDelta.realizedDelta);
303+ userPosition. settlePremiumDebt ( premiumDelta.realizedDelta);
303304 userPosition.drawnShares -= restoredShares.toUint128 ();
304305 if (userPosition.drawnShares == 0 ) {
305306 _positionStatus[onBehalfOf].setBorrowing (reserveId, false );
@@ -318,7 +319,8 @@ abstract contract Spoke is ISpoke, Multicall, NoncesKeyed, AccessManagedUpgradea
318319 uint256 collateralReserveId ,
319320 uint256 debtReserveId ,
320321 address user ,
321- uint256 debtToCover
322+ uint256 debtToCover ,
323+ bool receiveShares
322324 ) external {
323325 UserAccountData memory userAccountData = _calculateUserAccountData (user);
324326 LiquidationLogic.LiquidateUserParams memory params = LiquidationLogic.LiquidateUserParams ({
@@ -334,7 +336,8 @@ abstract contract Spoke is ISpoke, Multicall, NoncesKeyed, AccessManagedUpgradea
334336 totalDebtValue: userAccountData.totalDebtValue,
335337 activeCollateralCount: userAccountData.activeCollateralCount,
336338 borrowedCount: userAccountData.borrowedCount,
337- liquidator: msg .sender
339+ liquidator: msg .sender ,
340+ receiveShares: receiveShares
338341 });
339342
340343 (params.drawnDebt, params.premiumDebt, params.accruedPremium) = _getUserDebt (
@@ -350,8 +353,7 @@ abstract contract Spoke is ISpoke, Multicall, NoncesKeyed, AccessManagedUpgradea
350353 bool isUserInDeficit = LiquidationLogic.liquidateUser (
351354 _reserves[collateralReserveId],
352355 _reserves[debtReserveId],
353- _userPositions[user][collateralReserveId],
354- _userPositions[user][debtReserveId],
356+ _userPositions,
355357 _positionStatus[user],
356358 _liquidationConfig,
357359 collateralDynConfig,
@@ -475,11 +477,6 @@ abstract contract Spoke is ISpoke, Multicall, NoncesKeyed, AccessManagedUpgradea
475477 {} catch {}
476478 }
477479
478- /// @inheritdoc ISpoke
479- function getLiquidationLogic () external pure returns (address ) {
480- return address (LiquidationLogic);
481- }
482-
483480 /// @inheritdoc ISpoke
484481 function getLiquidationConfig () external view returns (LiquidationConfig memory ) {
485482 return _liquidationConfig;
@@ -646,6 +643,11 @@ abstract contract Spoke is ISpoke, Multicall, NoncesKeyed, AccessManagedUpgradea
646643 return _domainSeparator ();
647644 }
648645
646+ /// @inheritdoc ISpoke
647+ function getLiquidationLogic () external pure returns (address ) {
648+ return address (LiquidationLogic);
649+ }
650+
649651 function _updateReservePriceSource (uint256 reserveId , address priceSource ) internal {
650652 require (priceSource != address (0 ), InvalidAddress ());
651653 IAaveOracle (ORACLE).setReserveSource (reserveId, priceSource);
@@ -858,31 +860,20 @@ abstract contract Spoke is ISpoke, Multicall, NoncesKeyed, AccessManagedUpgradea
858860 premiumDebtReported,
859861 premiumDelta
860862 );
861- _settlePremiumDebt ( userPosition, premiumDelta.realizedDelta);
863+ userPosition. settlePremiumDebt ( premiumDelta.realizedDelta);
862864 userPosition.drawnShares -= deficitShares.toUint128 ();
863865 positionStatus.setBorrowing (reserveId, false );
864866 }
865867 // non-zero deficit means user ends up with zero total debt
866868 emit UpdateUserRiskPremium (user, 0 );
867869 }
868870
869- /// @notice Settles the premium debt by realizing change in premium and resetting premium shares and offset.
870- function _settlePremiumDebt (UserPosition storage userPosition , int256 realizedDelta ) internal {
871- userPosition.premiumShares = 0 ;
872- userPosition.premiumOffset = 0 ;
873- userPosition.realizedPremium = userPosition.realizedPremium.add (realizedDelta).toUint128 ();
874- }
875-
876871 function _getReserve (uint256 reserveId ) internal view returns (Reserve storage ) {
877872 Reserve storage reserve = _reserves[reserveId];
878873 require (address (reserve.hub) != address (0 ), ReserveNotListed ());
879874 return reserve;
880875 }
881876
882- function _validateReserveConfig (ReserveConfig calldata config ) internal pure {
883- require (config.collateralRisk <= MAX_ALLOWED_COLLATERAL_RISK, InvalidCollateralRisk ());
884- }
885-
886877 /// @dev CollateralFactor of historical config keys cannot be 0, which allows liquidations to proceed.
887878 function _validateUpdateDynamicReserveConfig (
888879 DynamicReserveConfig storage currentConfig ,
@@ -953,6 +944,10 @@ abstract contract Spoke is ISpoke, Multicall, NoncesKeyed, AccessManagedUpgradea
953944 );
954945 }
955946
947+ function _validateReserveConfig (ReserveConfig calldata config ) internal pure {
948+ require (config.collateralRisk <= MAX_ALLOWED_COLLATERAL_RISK, InvalidCollateralRisk ());
949+ }
950+
956951 /// @dev Enforces compatible `maxLiquidationBonus` and `collateralFactor` so at the moment debt is created
957952 /// there is enough collateral to cover liquidation.
958953 function _validateDynamicReserveConfig (DynamicReserveConfig calldata config ) internal pure {
0 commit comments