From 4fb43f7aff489aa170ca380a894157467a69aff2 Mon Sep 17 00:00:00 2001
From: Gerardo Nardelli <gerardo.nardelli@altoros.com>
Date: Mon, 9 Nov 2020 15:27:18 -0300
Subject: [PATCH] Remove not used batch capabilities on repay adapter

---
 contracts/adapters/UniswapRepayAdapter.sol |  99 ++-
 helpers/contracts-helpers.ts               |  34 +-
 test/uniswapAdapters.spec.ts               | 671 ++-------------------
 3 files changed, 122 insertions(+), 682 deletions(-)

diff --git a/contracts/adapters/UniswapRepayAdapter.sol b/contracts/adapters/UniswapRepayAdapter.sol
index 46d9c5b0..dba64afd 100644
--- a/contracts/adapters/UniswapRepayAdapter.sol
+++ b/contracts/adapters/UniswapRepayAdapter.sol
@@ -16,11 +16,11 @@ import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol';
 contract UniswapRepayAdapter is BaseUniswapAdapter, IFlashLoanReceiver {
 
   struct RepayParams {
-    address[] assetToSwapToList;
+    address assetToSwapTo;
     LeftoverAction leftOverAction;
-    uint256[] repayAmounts;
-    uint256[] rateModes;
-    PermitParams permitParams;
+    uint256 repayAmount;
+    uint256 rateMode;
+    PermitSignature permitSignature;
   }
 
   constructor(
@@ -41,17 +41,17 @@ contract UniswapRepayAdapter is BaseUniswapAdapter, IFlashLoanReceiver {
    * @param premiums Fee of the flash loan
    * @param initiator Address of the user
    * @param params Additional variadic field to include extra params. Expected parameters:
-   *   address[] assetToSwapToList List of the addresses of the reserve to be swapped to and repay
+   *   address Address of the reserve to be swapped to and repay
    *   uint256 leftOverAction Flag indicating what to do with the left over balance from the swap:
    *     (0) Deposit back
    *     (1) Direct transfer to user
-   *   uint256[] repayAmounts List of amounts of debt to be repaid
-   *   uint256[] rateModes List of the rate modes of the debt to be repaid
-   *   uint256[] permitAmount List of amounts for the permit signature
-   *   uint256[] deadline List of deadlines for the permit signature
-   *   uint8[] v List of v param for the permit signature
-   *   bytes32[] r List of r param for the permit signature
-   *   bytes32[] s List of s param for the permit signature
+   *   uint256 repayAmount Amount of debt to be repaid
+   *   uint256 rateMode Rate modes of the debt to be repaid
+   *   uint256 permitAmount Amount for the permit signature
+   *   uint256 deadline Deadline for the permit signature
+   *   uint8 v V param for the permit signature
+   *   bytes32 r R param for the permit signature
+   *   bytes32 s S param for the permit signature
    */
   function executeOperation(
     address[] calldata assets,
@@ -64,36 +64,17 @@ contract UniswapRepayAdapter is BaseUniswapAdapter, IFlashLoanReceiver {
 
     RepayParams memory decodedParams = _decodeParams(params);
 
-    require(
-      assets.length == decodedParams.assetToSwapToList.length
-      && assets.length == decodedParams.repayAmounts.length
-      && assets.length == decodedParams.rateModes.length
-      && assets.length == decodedParams.permitParams.amount.length
-      && assets.length == decodedParams.permitParams.deadline.length
-      && assets.length == decodedParams.permitParams.v.length
-      && assets.length == decodedParams.permitParams.r.length
-      && assets.length == decodedParams.permitParams.s.length,
-      'INCONSISTENT_PARAMS');
-
-    for (uint256 i = 0; i < assets.length; i++) {
       _swapAndRepay(
-        assets[i],
-        decodedParams.assetToSwapToList[i],
-        amounts[i],
-        decodedParams.repayAmounts[i],
-        decodedParams.rateModes[i],
+        assets[0],
+        decodedParams.assetToSwapTo,
+        amounts[0],
+        decodedParams.repayAmount,
+        decodedParams.rateMode,
         initiator,
         decodedParams.leftOverAction,
-        premiums[i],
-        PermitSignature(
-          decodedParams.permitParams.amount[i],
-          decodedParams.permitParams.deadline[i],
-          decodedParams.permitParams.v[i],
-          decodedParams.permitParams.r[i],
-          decodedParams.permitParams.s[i]
-        )
+        premiums[0],
+        decodedParams.permitSignature
       );
-    }
 
     return true;
   }
@@ -138,38 +119,38 @@ contract UniswapRepayAdapter is BaseUniswapAdapter, IFlashLoanReceiver {
   /**
    * @dev Decodes debt information encoded in flashloan params
    * @param params Additional variadic field to include extra params. Expected parameters:
-   *   address[] assetToSwapToList List of the addresses of the reserve to be swapped to and repay
+   *   address Address of the reserve to be swapped to and repay
    *   uint256 leftOverAction Flag indicating what to do with the left over balance from the swap:
    *     (0) Deposit back
    *     (1) Direct transfer to user
-   *   uint256[] repayAmounts List of amounts of debt to be repaid
-   *   uint256[] rateModes List of the rate modes of the debt to be repaid
-   *   uint256[] permitAmount List of amounts for the permit signature
-   *   uint256[] deadline List of deadlines for the permit signature
-   *   uint8[] v List of v param for the permit signature
-   *   bytes32[] r List of r param for the permit signature
-   *   bytes32[] s List of s param for the permit signature
+   *   uint256 repayAmount Amount of debt to be repaid
+   *   uint256 rateMode Rate modes of the debt to be repaid
+   *   uint256 permitAmount Amount for the permit signature
+   *   uint256 deadline Deadline for the permit signature
+   *   uint8 v V param for the permit signature
+   *   bytes32 r R param for the permit signature
+   *   bytes32 s S param for the permit signature
    * @return RepayParams struct containing decoded params
    */
   function _decodeParams(bytes memory params) internal pure returns (RepayParams memory) {
     (
-      address[] memory assetToSwapToList,
+      address assetToSwapTo,
       LeftoverAction leftOverAction,
-      uint256[] memory repayAmounts,
-      uint256[] memory rateModes,
-      uint256[] memory permitAmount,
-      uint256[] memory deadline,
-      uint8[] memory v,
-      bytes32[] memory r,
-      bytes32[] memory s
-    ) = abi.decode(params, (address[], LeftoverAction, uint256[], uint256[], uint256[], uint256[], uint8[], bytes32[], bytes32[]));
+      uint256 repayAmount,
+      uint256 rateMode,
+      uint256 permitAmount,
+      uint256 deadline,
+      uint8 v,
+      bytes32 r,
+      bytes32 s
+    ) = abi.decode(params, (address, LeftoverAction, uint256, uint256, uint256, uint256, uint8, bytes32, bytes32));
 
     return RepayParams(
-      assetToSwapToList,
+      assetToSwapTo,
       leftOverAction,
-      repayAmounts,
-      rateModes,
-      PermitParams(
+      repayAmount,
+      rateMode,
+      PermitSignature(
         permitAmount,
         deadline,
         v,
diff --git a/helpers/contracts-helpers.ts b/helpers/contracts-helpers.ts
index d3d226af..e2ccf3c8 100644
--- a/helpers/contracts-helpers.ts
+++ b/helpers/contracts-helpers.ts
@@ -240,28 +240,28 @@ export const buildLiquiditySwapParams = (
 };
 
 export const buildRepayAdapterParams = (
-  assetToSwapToList: tEthereumAddress[],
+  assetToSwapTo: tEthereumAddress,
   leftoverAction: BigNumberish,
-  repayAmounts: BigNumberish[],
-  rateModes: BigNumberish[],
-  permitAmounts: BigNumberish[],
-  deadlines: BigNumberish[],
-  v: BigNumberish[],
-  r: (string | Buffer)[],
-  s: (string | Buffer)[]
+  repayAmount: BigNumberish,
+  rateMode: BigNumberish,
+  permitAmount: BigNumberish,
+  deadline: BigNumberish,
+  v: BigNumberish,
+  r: string | Buffer,
+  s: string | Buffer
 ) => {
   return ethers.utils.defaultAbiCoder.encode(
     [
-      'address[]',
+      'address',
       'uint256',
-      'uint256[]',
-      'uint256[]',
-      'uint256[]',
-      'uint256[]',
-      'uint8[]',
-      'bytes32[]',
-      'bytes32[]',
+      'uint256',
+      'uint256',
+      'uint256',
+      'uint256',
+      'uint8',
+      'bytes32',
+      'bytes32',
     ],
-    [assetToSwapToList, leftoverAction, repayAmounts, rateModes, permitAmounts, deadlines, v, r, s]
+    [assetToSwapTo, leftoverAction, repayAmount, rateMode, permitAmount, deadline, v, r, s]
   );
 };
diff --git a/test/uniswapAdapters.spec.ts b/test/uniswapAdapters.spec.ts
index 96ece84e..a3ea4dbe 100644
--- a/test/uniswapAdapters.spec.ts
+++ b/test/uniswapAdapters.spec.ts
@@ -1959,7 +1959,7 @@ makeSuite('Uniswap adapters', (testEnv: TestEnv) => {
     });
   });
 
-  describe('UniswapRepayAdapter', () => {
+  describe.only('UniswapRepayAdapter', () => {
     describe('constructor', () => {
       it('should deploy with correct parameters', async () => {
         const {addressesProvider} = testEnv;
@@ -2055,15 +2055,15 @@ makeSuite('Uniswap adapters', (testEnv: TestEnv) => {
         await mockUniswapRouter.connect(user).setAmountToSwap(weth.address, flashloanAmount);
 
         const params = buildRepayAdapterParams(
-          [dai.address],
+          dai.address,
           0,
-          [expectedDaiAmount],
-          [1],
-          [0],
-          [0],
-          [0],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000'],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000']
+          expectedDaiAmount,
+          1,
+          0,
+          0,
+          0,
+          '0x0000000000000000000000000000000000000000000000000000000000000000',
+          '0x0000000000000000000000000000000000000000000000000000000000000000'
         );
 
         await expect(
@@ -2162,15 +2162,15 @@ makeSuite('Uniswap adapters', (testEnv: TestEnv) => {
         await mockUniswapRouter.connect(user).setAmountToSwap(weth.address, flashloanAmount);
 
         const params = buildRepayAdapterParams(
-          [dai.address],
+          dai.address,
           0,
-          [expectedDaiAmount],
-          [1],
-          [liquidityToSwap],
-          [deadline],
-          [v],
-          [r],
-          [s]
+          expectedDaiAmount,
+          1,
+          liquidityToSwap,
+          deadline,
+          v,
+          r,
+          s
         );
 
         await expect(
@@ -2202,547 +2202,6 @@ makeSuite('Uniswap adapters', (testEnv: TestEnv) => {
         expect(userAEthBalance).to.be.gte(userAEthBalanceBefore.sub(liquidityToSwap));
       });
 
-      it('should correctly swap tokens and repay debt for multiple tokens', async () => {
-        const {
-          users,
-          pool,
-          weth,
-          oracle,
-          dai,
-          uniswapRepayAdapter,
-          aave,
-          usdc,
-          helpersContract,
-          aWETH,
-        } = testEnv;
-        const user = users[0].signer;
-        const userAddress = users[0].address;
-
-        const amountWETHtoSwap = await convertToCurrencyDecimals(weth.address, '10');
-        const amountAaveToSwap = parseEther('1');
-
-        const daiPrice = await oracle.getAssetPrice(dai.address);
-        const expectedDaiAmountForEth = await convertToCurrencyDecimals(
-          dai.address,
-          new BigNumber(amountWETHtoSwap.toString()).div(daiPrice.toString()).toFixed(0)
-        );
-
-        const aavePrice = await oracle.getAssetPrice(aave.address);
-        const usdcPrice = await oracle.getAssetPrice(usdc.address);
-
-        const collateralDecimals = (await aave.decimals()).toString();
-        const principalDecimals = (await usdc.decimals()).toString();
-
-        const expectedUsdcAmountForAave = await convertToCurrencyDecimals(
-          usdc.address,
-          new BigNumber(amountAaveToSwap.toString())
-            .times(
-              new BigNumber(aavePrice.toString()).times(new BigNumber(10).pow(principalDecimals))
-            )
-            .div(
-              new BigNumber(usdcPrice.toString()).times(new BigNumber(10).pow(collateralDecimals))
-            )
-            .toFixed(0)
-        );
-
-        // Open user Debt
-        await pool.connect(user).borrow(dai.address, expectedDaiAmountForEth, 1, 0, userAddress);
-        await pool.connect(user).borrow(usdc.address, expectedUsdcAmountForAave, 1, 0, userAddress);
-
-        const daiStableDebtTokenAddress = (
-          await helpersContract.getReserveTokensAddresses(dai.address)
-        ).stableDebtTokenAddress;
-
-        const daiStableDebtContract = await getContract<StableDebtToken>(
-          eContractid.StableDebtToken,
-          daiStableDebtTokenAddress
-        );
-
-        const usdcStableDebtTokenAddress = (
-          await helpersContract.getReserveTokensAddresses(usdc.address)
-        ).stableDebtTokenAddress;
-
-        const usdcStableDebtContract = await getContract<StableDebtToken>(
-          eContractid.StableDebtToken,
-          usdcStableDebtTokenAddress
-        );
-
-        const userDaiStableDebtAmountBefore = await daiStableDebtContract.balanceOf(userAddress);
-        const userUsdcStableDebtAmountBefore = await usdcStableDebtContract.balanceOf(userAddress);
-
-        // Subtract the FL fee from the amount to be swapped 0,09%
-        const wethFlashloanAmount = new BigNumber(amountWETHtoSwap.toString())
-          .div(1.0009)
-          .toFixed(0);
-        const aaveFlashloanAmount = new BigNumber(amountAaveToSwap.toString())
-          .div(1.0009)
-          .toFixed(0);
-
-        await mockUniswapRouter.connect(user).setAmountToSwap(weth.address, wethFlashloanAmount);
-        await mockUniswapRouter.connect(user).setAmountToSwap(aave.address, aaveFlashloanAmount);
-
-        await aWETH.connect(user).approve(uniswapRepayAdapter.address, amountWETHtoSwap);
-
-        const aaveData = await pool.getReserveData(aave.address);
-        const aAave = await getContract<AToken>(eContractid.AToken, aaveData.aTokenAddress);
-        await aAave.connect(user).approve(uniswapRepayAdapter.address, amountAaveToSwap);
-
-        const aWETHBalanceBefore = await aWETH.balanceOf(userAddress);
-        const aAaveBalanceBefore = await aAave.balanceOf(userAddress);
-
-        const params = buildRepayAdapterParams(
-          [dai.address, usdc.address],
-          0,
-          [expectedDaiAmountForEth, expectedUsdcAmountForAave],
-          [1, 1],
-          [0, 0],
-          [0, 0],
-          [0, 0],
-          [
-            '0x0000000000000000000000000000000000000000000000000000000000000000',
-            '0x0000000000000000000000000000000000000000000000000000000000000000',
-          ],
-          [
-            '0x0000000000000000000000000000000000000000000000000000000000000000',
-            '0x0000000000000000000000000000000000000000000000000000000000000000',
-          ]
-        );
-
-        await pool
-          .connect(user)
-          .flashLoan(
-            uniswapRepayAdapter.address,
-            [weth.address, aave.address],
-            [wethFlashloanAmount.toString(), aaveFlashloanAmount.toString()],
-            [0, 0],
-            userAddress,
-            params,
-            0
-          );
-
-        const adapterWethBalance = await weth.balanceOf(uniswapRepayAdapter.address);
-        const adapterDaiBalance = await dai.balanceOf(uniswapRepayAdapter.address);
-        const userDaiStableDebtAmount = await daiStableDebtContract.balanceOf(userAddress);
-        const userUsdcStableDebtAmount = await usdcStableDebtContract.balanceOf(userAddress);
-        const aWETHBalance = await aWETH.balanceOf(userAddress);
-        const aAaveBalance = await aAave.balanceOf(userAddress);
-
-        expect(adapterWethBalance).to.be.eq(Zero);
-        expect(adapterDaiBalance).to.be.eq(Zero);
-        expect(userDaiStableDebtAmountBefore).to.be.gte(expectedDaiAmountForEth);
-        expect(userDaiStableDebtAmount).to.be.lt(expectedDaiAmountForEth);
-        expect(userUsdcStableDebtAmountBefore).to.be.gte(expectedUsdcAmountForAave);
-        expect(userUsdcStableDebtAmount).to.be.lt(expectedUsdcAmountForAave);
-        expect(aWETHBalance).to.be.lt(aWETHBalanceBefore);
-        expect(aAaveBalance).to.be.lt(aAaveBalanceBefore);
-      });
-
-      it('should swap tokens and repay debt for multiple tokens using permit', async () => {
-        const {
-          users,
-          pool,
-          weth,
-          oracle,
-          dai,
-          uniswapRepayAdapter,
-          aave,
-          usdc,
-          helpersContract,
-          aWETH,
-        } = testEnv;
-        const user = users[0].signer;
-        const userAddress = users[0].address;
-        const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID;
-        const deadline = MAX_UINT_AMOUNT;
-
-        const ownerPrivateKey = require('../test-wallets.js').accounts[1].secretKey;
-        if (!ownerPrivateKey) {
-          throw new Error('INVALID_OWNER_PK');
-        }
-
-        const amountWETHtoSwap = await convertToCurrencyDecimals(weth.address, '10');
-        const amountAaveToSwap = await convertToCurrencyDecimals(aave.address, '1');
-
-        const daiPrice = await oracle.getAssetPrice(dai.address);
-        const expectedDaiAmountForEth = await convertToCurrencyDecimals(
-          dai.address,
-          new BigNumber(amountWETHtoSwap.toString()).div(daiPrice.toString()).toFixed(0)
-        );
-
-        const aavePrice = await oracle.getAssetPrice(aave.address);
-        const usdcPrice = await oracle.getAssetPrice(usdc.address);
-
-        const collateralDecimals = (await aave.decimals()).toString();
-        const principalDecimals = (await usdc.decimals()).toString();
-
-        const expectedUsdcAmountForAave = await convertToCurrencyDecimals(
-          usdc.address,
-          new BigNumber(amountAaveToSwap.toString())
-            .times(
-              new BigNumber(aavePrice.toString()).times(new BigNumber(10).pow(principalDecimals))
-            )
-            .div(
-              new BigNumber(usdcPrice.toString()).times(new BigNumber(10).pow(collateralDecimals))
-            )
-            .toFixed(0)
-        );
-
-        // Open user Debt
-        await pool.connect(user).borrow(dai.address, expectedDaiAmountForEth, 1, 0, userAddress);
-        await pool.connect(user).borrow(usdc.address, expectedUsdcAmountForAave, 1, 0, userAddress);
-
-        const daiStableDebtTokenAddress = (
-          await helpersContract.getReserveTokensAddresses(dai.address)
-        ).stableDebtTokenAddress;
-
-        const daiStableDebtContract = await getContract<StableDebtToken>(
-          eContractid.StableDebtToken,
-          daiStableDebtTokenAddress
-        );
-
-        const usdcStableDebtTokenAddress = (
-          await helpersContract.getReserveTokensAddresses(usdc.address)
-        ).stableDebtTokenAddress;
-
-        const usdcStableDebtContract = await getContract<StableDebtToken>(
-          eContractid.StableDebtToken,
-          usdcStableDebtTokenAddress
-        );
-
-        const userDaiStableDebtAmountBefore = await daiStableDebtContract.balanceOf(userAddress);
-        const userUsdcStableDebtAmountBefore = await usdcStableDebtContract.balanceOf(userAddress);
-
-        const aaveData = await pool.getReserveData(aave.address);
-        const aAave = await getContract<AToken>(eContractid.AToken, aaveData.aTokenAddress);
-
-        const aWETHBalanceBefore = await aWETH.balanceOf(userAddress);
-        const aAaveBalanceBefore = await aAave.balanceOf(userAddress);
-
-        const wethFlashloanAmount = new BigNumber(amountWETHtoSwap.toString())
-          .div(1.0009)
-          .toFixed(0);
-
-        const aaveFlashloanAmount = new BigNumber(amountAaveToSwap.toString())
-          .div(1.0009)
-          .toFixed(0);
-
-        const aWethNonce = (await aWETH._nonces(userAddress)).toNumber();
-        const aWethMsgParams = buildPermitParams(
-          chainId,
-          aWETH.address,
-          '1',
-          await aWETH.name(),
-          userAddress,
-          uniswapRepayAdapter.address,
-          aWethNonce,
-          deadline,
-          amountWETHtoSwap.toString()
-        );
-        const {v: aWETHv, r: aWETHr, s: aWETHs} = getSignatureFromTypedData(
-          ownerPrivateKey,
-          aWethMsgParams
-        );
-
-        const aAaveNonce = (await aAave._nonces(userAddress)).toNumber();
-        const aAaveMsgParams = buildPermitParams(
-          chainId,
-          aAave.address,
-          '1',
-          await aAave.name(),
-          userAddress,
-          uniswapRepayAdapter.address,
-          aAaveNonce,
-          deadline,
-          amountAaveToSwap.toString()
-        );
-        const {v: aAavev, r: aAaver, s: aAaves} = getSignatureFromTypedData(
-          ownerPrivateKey,
-          aAaveMsgParams
-        );
-
-        await mockUniswapRouter.connect(user).setAmountToSwap(weth.address, wethFlashloanAmount);
-        await mockUniswapRouter.connect(user).setAmountToSwap(aave.address, aaveFlashloanAmount);
-
-        const params = buildRepayAdapterParams(
-          [dai.address, usdc.address],
-          0,
-          [expectedDaiAmountForEth, expectedUsdcAmountForAave],
-          [1, 1],
-          [amountWETHtoSwap, amountAaveToSwap],
-          [deadline, deadline],
-          [aWETHv, aAavev],
-          [aWETHr, aAaver],
-          [aWETHs, aAaves]
-        );
-
-        await pool
-          .connect(user)
-          .flashLoan(
-            uniswapRepayAdapter.address,
-            [weth.address, aave.address],
-            [wethFlashloanAmount.toString(), aaveFlashloanAmount.toString()],
-            [0, 0],
-            userAddress,
-            params,
-            0
-          );
-
-        const adapterWethBalance = await weth.balanceOf(uniswapRepayAdapter.address);
-        const adapterDaiBalance = await dai.balanceOf(uniswapRepayAdapter.address);
-        const userDaiStableDebtAmount = await daiStableDebtContract.balanceOf(userAddress);
-        const userUsdcStableDebtAmount = await usdcStableDebtContract.balanceOf(userAddress);
-        const aWETHBalance = await aWETH.balanceOf(userAddress);
-        const aAaveBalance = await aAave.balanceOf(userAddress);
-
-        expect(adapterWethBalance).to.be.eq(Zero);
-        expect(adapterDaiBalance).to.be.eq(Zero);
-        expect(userDaiStableDebtAmountBefore).to.be.gte(expectedDaiAmountForEth);
-        expect(userDaiStableDebtAmount).to.be.lt(expectedDaiAmountForEth);
-        expect(userUsdcStableDebtAmountBefore).to.be.gte(expectedUsdcAmountForAave);
-        expect(userUsdcStableDebtAmount).to.be.lt(expectedUsdcAmountForAave);
-        expect(aWETHBalance).to.be.lt(aWETHBalanceBefore);
-        expect(aAaveBalance).to.be.lt(aAaveBalanceBefore);
-      });
-
-      it('should revert if inconsistent params', async () => {
-        const {users, pool, weth, aWETH, oracle, dai, uniswapRepayAdapter} = testEnv;
-        const user = users[0].signer;
-        const userAddress = users[0].address;
-
-        const amountWETHtoSwap = await convertToCurrencyDecimals(weth.address, '10');
-
-        const daiPrice = await oracle.getAssetPrice(dai.address);
-        const expectedDaiAmount = await convertToCurrencyDecimals(
-          dai.address,
-          new BigNumber(amountWETHtoSwap.toString()).div(daiPrice.toString()).toFixed(0)
-        );
-
-        // Open user Debt
-        await pool.connect(user).borrow(dai.address, expectedDaiAmount, 1, 0, userAddress);
-
-        const liquidityToSwap = amountWETHtoSwap;
-        await aWETH.connect(user).approve(uniswapRepayAdapter.address, liquidityToSwap);
-
-        // Subtract the FL fee from the amount to be swapped 0,09%
-        const flashloanAmount = new BigNumber(liquidityToSwap.toString()).div(1.0009).toFixed(0);
-
-        await mockUniswapRouter.connect(user).setAmountToSwap(weth.address, flashloanAmount);
-
-        const params1 = buildRepayAdapterParams(
-          [dai.address, weth.address],
-          0,
-          [expectedDaiAmount],
-          [1],
-          [0],
-          [0],
-          [0],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000'],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000']
-        );
-
-        await expect(
-          pool
-            .connect(user)
-            .flashLoan(
-              uniswapRepayAdapter.address,
-              [weth.address],
-              [flashloanAmount.toString()],
-              [0],
-              userAddress,
-              params1,
-              0
-            )
-        ).to.be.revertedWith('INCONSISTENT_PARAMS');
-
-        const params2 = buildRepayAdapterParams(
-          [dai.address],
-          0,
-          [expectedDaiAmount, expectedDaiAmount],
-          [1],
-          [0],
-          [0],
-          [0],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000'],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000']
-        );
-
-        await expect(
-          pool
-            .connect(user)
-            .flashLoan(
-              uniswapRepayAdapter.address,
-              [weth.address],
-              [flashloanAmount.toString()],
-              [0],
-              userAddress,
-              params2,
-              0
-            )
-        ).to.be.revertedWith('INCONSISTENT_PARAMS');
-
-        const params3 = buildRepayAdapterParams(
-          [dai.address],
-          0,
-          [expectedDaiAmount],
-          [1, 1],
-          [0],
-          [0],
-          [0],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000'],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000']
-        );
-
-        await expect(
-          pool
-            .connect(user)
-            .flashLoan(
-              uniswapRepayAdapter.address,
-              [weth.address],
-              [flashloanAmount.toString()],
-              [0],
-              userAddress,
-              params3,
-              0
-            )
-        ).to.be.revertedWith('INCONSISTENT_PARAMS');
-
-        const params4 = buildRepayAdapterParams(
-          [dai.address],
-          0,
-          [expectedDaiAmount],
-          [1],
-          [0],
-          [0, 0],
-          [0],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000'],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000']
-        );
-
-        await expect(
-          pool
-            .connect(user)
-            .flashLoan(
-              uniswapRepayAdapter.address,
-              [weth.address],
-              [flashloanAmount.toString()],
-              [0],
-              userAddress,
-              params4,
-              0
-            )
-        ).to.be.revertedWith('INCONSISTENT_PARAMS');
-
-        const params5 = buildRepayAdapterParams(
-          [dai.address],
-          0,
-          [expectedDaiAmount],
-          [1],
-          [0],
-          [0],
-          [0, 0],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000'],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000']
-        );
-
-        await expect(
-          pool
-            .connect(user)
-            .flashLoan(
-              uniswapRepayAdapter.address,
-              [weth.address],
-              [flashloanAmount.toString()],
-              [0],
-              userAddress,
-              params5,
-              0
-            )
-        ).to.be.revertedWith('INCONSISTENT_PARAMS');
-
-        const params6 = buildRepayAdapterParams(
-          [dai.address],
-          0,
-          [expectedDaiAmount],
-          [1],
-          [0],
-          [0],
-          [0],
-          [
-            '0x0000000000000000000000000000000000000000000000000000000000000000',
-            '0x0000000000000000000000000000000000000000000000000000000000000000',
-          ],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000']
-        );
-
-        await expect(
-          pool
-            .connect(user)
-            .flashLoan(
-              uniswapRepayAdapter.address,
-              [weth.address],
-              [flashloanAmount.toString()],
-              [0],
-              userAddress,
-              params6,
-              0
-            )
-        ).to.be.revertedWith('INCONSISTENT_PARAMS');
-
-        const params7 = buildRepayAdapterParams(
-          [dai.address],
-          0,
-          [expectedDaiAmount],
-          [1],
-          [0],
-          [0],
-          [0],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000'],
-          [
-            '0x0000000000000000000000000000000000000000000000000000000000000000',
-            '0x0000000000000000000000000000000000000000000000000000000000000000',
-          ]
-        );
-
-        await expect(
-          pool
-            .connect(user)
-            .flashLoan(
-              uniswapRepayAdapter.address,
-              [weth.address],
-              [flashloanAmount.toString()],
-              [0],
-              userAddress,
-              params7,
-              0
-            )
-        ).to.be.revertedWith('INCONSISTENT_PARAMS');
-
-        const params8 = buildRepayAdapterParams(
-          [dai.address],
-          0,
-          [expectedDaiAmount],
-          [1],
-          [0, 0],
-          [0],
-          [0],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000'],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000']
-        );
-
-        await expect(
-          pool
-            .connect(user)
-            .flashLoan(
-              uniswapRepayAdapter.address,
-              [weth.address],
-              [flashloanAmount.toString()],
-              [0],
-              userAddress,
-              params8,
-              0
-            )
-        ).to.be.revertedWith('INCONSISTENT_PARAMS');
-      });
-
       it('should revert if caller not lending pool', async () => {
         const {users, pool, weth, aWETH, oracle, dai, uniswapRepayAdapter} = testEnv;
         const user = users[0].signer;
@@ -2768,15 +2227,15 @@ makeSuite('Uniswap adapters', (testEnv: TestEnv) => {
         await mockUniswapRouter.connect(user).setAmountToSwap(weth.address, flashloanAmount);
 
         const params = buildRepayAdapterParams(
-          [dai.address],
+          dai.address,
           0,
-          [expectedDaiAmount],
-          [1],
-          [0],
-          [0],
-          [0],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000'],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000']
+          expectedDaiAmount,
+          1,
+          0,
+          0,
+          0,
+          '0x0000000000000000000000000000000000000000000000000000000000000000',
+          '0x0000000000000000000000000000000000000000000000000000000000000000'
         );
 
         await expect(
@@ -2820,15 +2279,15 @@ makeSuite('Uniswap adapters', (testEnv: TestEnv) => {
         await mockUniswapRouter.connect(user).setAmountToSwap(weth.address, flashloanAmount);
 
         const params = buildRepayAdapterParams(
-          [dai.address],
+          dai.address,
           0,
-          [expectedDaiAmount],
-          [1],
-          [0],
-          [0],
-          [0],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000'],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000']
+          expectedDaiAmount,
+          1,
+          0,
+          0,
+          0,
+          '0x0000000000000000000000000000000000000000000000000000000000000000',
+          '0x0000000000000000000000000000000000000000000000000000000000000000'
         );
 
         await expect(
@@ -2871,15 +2330,15 @@ makeSuite('Uniswap adapters', (testEnv: TestEnv) => {
         await mockUniswapRouter.connect(user).setAmountToSwap(weth.address, flashloanAmount);
 
         const params = buildRepayAdapterParams(
-          [dai.address],
+          dai.address,
           0,
-          [expectedDaiAmount],
-          [1],
-          [0],
-          [0],
-          [0],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000'],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000']
+          expectedDaiAmount,
+          1,
+          0,
+          0,
+          0,
+          '0x0000000000000000000000000000000000000000000000000000000000000000',
+          '0x0000000000000000000000000000000000000000000000000000000000000000'
         );
 
         await expect(
@@ -2922,15 +2381,15 @@ makeSuite('Uniswap adapters', (testEnv: TestEnv) => {
         await mockUniswapRouter.connect(user).setAmountToSwap(weth.address, flashloanAmount);
 
         const params = buildRepayAdapterParams(
-          [dai.address],
+          dai.address,
           0,
-          [expectedDaiAmount],
-          [1],
-          [0],
-          [0],
-          [0],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000'],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000']
+          expectedDaiAmount,
+          1,
+          0,
+          0,
+          0,
+          '0x0000000000000000000000000000000000000000000000000000000000000000',
+          '0x0000000000000000000000000000000000000000000000000000000000000000'
         );
 
         await expect(
@@ -3000,15 +2459,15 @@ makeSuite('Uniswap adapters', (testEnv: TestEnv) => {
         await mockUniswapRouter.connect(user).setAmountToSwap(weth.address, actualWEthSwapped);
 
         const params = buildRepayAdapterParams(
-          [dai.address],
+          dai.address,
           0,
-          [expectedDaiAmount],
-          [1],
-          [0],
-          [0],
-          [0],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000'],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000']
+          expectedDaiAmount,
+          1,
+          0,
+          0,
+          0,
+          '0x0000000000000000000000000000000000000000000000000000000000000000',
+          '0x0000000000000000000000000000000000000000000000000000000000000000'
         );
 
         await expect(
@@ -3097,15 +2556,15 @@ makeSuite('Uniswap adapters', (testEnv: TestEnv) => {
         const wethBalanceBefore = await weth.balanceOf(userAddress);
 
         const params = buildRepayAdapterParams(
-          [dai.address],
+          dai.address,
           1,
-          [expectedDaiAmount],
-          [1],
-          [0],
-          [0],
-          [0],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000'],
-          ['0x0000000000000000000000000000000000000000000000000000000000000000']
+          expectedDaiAmount,
+          1,
+          0,
+          0,
+          0,
+          '0x0000000000000000000000000000000000000000000000000000000000000000',
+          '0x0000000000000000000000000000000000000000000000000000000000000000'
         );
 
         await expect(