From 0fe470656e1f5acc7f19ce5f817d6e1c8b1cd4d5 Mon Sep 17 00:00:00 2001
From: The3D <frangellaemilio@gmail.com>
Date: Thu, 1 Jul 2021 16:59:14 +0200
Subject: [PATCH] fix: various fixes and refactorings on the implementation

---
 .../protocol/lendingpool/LendingPool.sol      |  8 ++++---
 .../libraries/logic/ValidationLogic.sol       | 21 ++++++++++---------
 2 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/contracts/protocol/lendingpool/LendingPool.sol b/contracts/protocol/lendingpool/LendingPool.sol
index cb4bf47e..47f1359a 100644
--- a/contracts/protocol/lendingpool/LendingPool.sol
+++ b/contracts/protocol/lendingpool/LendingPool.sol
@@ -282,7 +282,9 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
     DataTypes.ReserveData storage reserve = _reserves[asset];
     DataTypes.ReserveCache memory reserveCache = reserve.cache();
 
-    ValidationLogic.validateSetUseReserveAsCollateral(reserveCache);
+    uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender);
+
+    ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance);
 
     _usersConfig[msg.sender].setUsingAsCollateral(reserve.id, useAsCollateral);
 
@@ -291,7 +293,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
     } else {
       ValidationLogic.validateHFAndExposureCap(
         asset,
-        IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender),
+        userBalance,
         msg.sender,
         _reserves,
         _usersConfig[msg.sender],
@@ -633,7 +635,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
         if (fromConfig.isBorrowingAny()) {
           ValidationLogic.validateHFAndExposureCap(
             asset,
-            0,
+            amount,
             from,
             _reserves,
             _usersConfig[from],
diff --git a/contracts/protocol/libraries/logic/ValidationLogic.sol b/contracts/protocol/libraries/logic/ValidationLogic.sol
index f653ad23..10b7a4f5 100644
--- a/contracts/protocol/libraries/logic/ValidationLogic.sol
+++ b/contracts/protocol/libraries/logic/ValidationLogic.sol
@@ -388,17 +388,16 @@ library ValidationLogic {
    * @dev Validates the action of setting an asset as collateral
    * @param reserveCache The cached data of the reserve
    */
-  function validateSetUseReserveAsCollateral(DataTypes.ReserveCache memory reserveCache)
-    external
-    view
-  {
-    uint256 underlyingBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender);
+  function validateSetUseReserveAsCollateral(
+    DataTypes.ReserveCache memory reserveCache,
+    uint256 userBalance
+  ) external pure {
     (bool isActive, , , , bool isPaused) = reserveCache.reserveConfiguration.getFlagsMemory();
 
     require(isActive, Errors.VL_NO_ACTIVE_RESERVE);
     require(!isPaused, Errors.VL_RESERVE_PAUSED);
 
-    require(underlyingBalance > 0, Errors.VL_UNDERLYING_BALANCE_NOT_GREATER_THAN_0);
+    require(userBalance > 0, Errors.VL_UNDERLYING_BALANCE_NOT_GREATER_THAN_0);
   }
 
   /**
@@ -519,6 +518,8 @@ library ValidationLogic {
 
   /**
    * @dev Validates the health factor of a user and the exposure cap for the asset being withdrawn
+   * @param asset The asset for which the exposure cap will be validated
+   * @param expCapOffset The offset to consider on the total atoken supply of asset when validating the exposure cap
    * @param from The user from which the aTokens are being transferred
    * @param reservesData The state of all the reserves
    * @param userConfig The state of the user for the specific reserve
@@ -527,8 +528,8 @@ library ValidationLogic {
    * @param oracle The price oracle
    */
   function validateHFAndExposureCap(
-    address collateral,
-    uint256 collateralToBeWithdrawn,
+    address asset,
+    uint256 expCapOffset,
     address from,
     mapping(address => DataTypes.ReserveData) storage reservesData,
     DataTypes.UserConfigurationMap storage userConfig,
@@ -537,7 +538,7 @@ library ValidationLogic {
     address oracle
   ) external view {
     validateHFAndExposureCapLocalVars memory vars;
-    DataTypes.ReserveData memory reserve = reservesData[collateral];
+    DataTypes.ReserveData memory reserve = reservesData[asset];
     (, , vars.ltv, , vars.healthFactor, vars.uncappedLtv) = GenericLogic.calculateUserAccountData(
       from,
       reservesData,
@@ -559,7 +560,7 @@ library ValidationLogic {
         vars.totalSupplyAtoken = IERC20(reserve.aTokenAddress).totalSupply();
         (, , , vars.reserveDecimals, ) = reserve.configuration.getParamsMemory();
         bool isAssetCapped =
-          vars.totalSupplyAtoken.sub(collateralToBeWithdrawn).div(10**vars.reserveDecimals) >=
+          vars.totalSupplyAtoken.sub(expCapOffset).div(10**vars.reserveDecimals) >=
             vars.exposureCap;
         require(isAssetCapped, Errors.VL_COLLATERAL_EXPOSURE_CAP_EXCEEDED);
       }