From a1a45d392a7bb1b0e7b1d0781825b4600c536f1e Mon Sep 17 00:00:00 2001
From: The3D <emilio@aave.com>
Date: Mon, 21 Sep 2020 15:27:53 +0200
Subject: [PATCH] Updating rebalance rate tests

---
 test/helpers/actions.ts                | 28 +++++++++-
 test/helpers/utils/calculations.ts     | 72 +++++++++++++++-----------
 test/helpers/utils/helpers.ts          |  3 ++
 test/helpers/utils/interfaces/index.ts |  1 +
 test/scenario.spec.ts                  |  2 +-
 5 files changed, 74 insertions(+), 32 deletions(-)

diff --git a/test/helpers/actions.ts b/test/helpers/actions.ts
index c9bf4bcf..44c134eb 100644
--- a/test/helpers/actions.ts
+++ b/test/helpers/actions.ts
@@ -49,7 +49,8 @@ const almostEqualOrEqual = function (
       key === 'marketStableRate' ||
       key === 'symbol' ||
       key === 'aTokenAddress' ||
-      key === 'decimals'
+      key === 'decimals' ||
+      key === 'totalStableDebtLastUpdated'
     ) {
       // skipping consistency check on accessory data
       return;
@@ -369,9 +370,23 @@ export const borrow = async (
       userDataBefore,
       txTimestamp,
       timestamp,
-      txCost
+      onBehalfOf,
+      user.address
     );
 
+    console.log("total debt stable exp ", expectedReserveData.totalStableDebt.toFixed());
+    console.log("total debt stable act ", reserveDataAfter.totalStableDebt.toFixed());
+
+    console.log("total debt variable exp ", expectedReserveData.totalVariableDebt.toFixed());
+    console.log("total debt variable act ", reserveDataAfter.totalVariableDebt.toFixed());
+
+    console.log("avl liquidity exp ", expectedReserveData.availableLiquidity.toFixed());
+    console.log("avl liquidity exp ", reserveDataAfter.availableLiquidity.toFixed());
+
+    console.log("avg borrow rate exp ", expectedReserveData.averageStableBorrowRate.toFixed());
+    console.log("avl borrow rate exp ", reserveDataAfter.averageStableBorrowRate.toFixed());
+
+
     expectEqual(reserveDataAfter, expectedReserveData);
     expectEqual(userDataAfter, expectedUserData);
 
@@ -664,6 +679,15 @@ export const rebalanceStableBorrowRate = async (
       txTimestamp
     );
 
+    console.log("total debt stable exp ", expectedReserveData.totalStableDebt.toFixed());
+    console.log("total debt stable act ", reserveDataAfter.totalStableDebt.toFixed());
+
+    console.log("total debt variable exp ", expectedReserveData.totalVariableDebt.toFixed());
+    console.log("total debt variable act ", reserveDataAfter.totalVariableDebt.toFixed());
+
+    console.log("avl liquidity exp ", expectedReserveData.availableLiquidity.toFixed());
+    console.log("avl liquidity exp ", reserveDataAfter.availableLiquidity.toFixed());
+
     expectEqual(reserveDataAfter, expectedReserveData);
     expectEqual(userDataAfter, expectedUserData);
 
diff --git a/test/helpers/utils/calculations.ts b/test/helpers/utils/calculations.ts
index 8f029d9a..6d76db67 100644
--- a/test/helpers/utils/calculations.ts
+++ b/test/helpers/utils/calculations.ts
@@ -7,7 +7,7 @@ import {
   EXCESS_UTILIZATION_RATE,
   ZERO_ADDRESS,
 } from '../../../helpers/constants';
-import {IReserveParams, iAavePoolAssets, RateMode} from '../../../helpers/types';
+import {IReserveParams, iAavePoolAssets, RateMode, tEthereumAddress} from '../../../helpers/types';
 import './math';
 import {ReserveData, UserReserveData} from './interfaces';
 
@@ -185,7 +185,7 @@ export const calcExpectedReserveDataAfterDeposit = (
   expectedReserveData.totalStableDebt = calcExpectedTotalStableDebt(
     reserveDataBeforeAction.principalStableDebt,
     reserveDataBeforeAction.averageStableBorrowRate,
-    reserveDataBeforeAction.lastUpdateTimestamp,
+    reserveDataBeforeAction.totalStableDebtLastUpdated,
     txTimestamp
   );
   expectedReserveData.totalVariableDebt = calcExpectedTotalVariableDebt(
@@ -253,7 +253,7 @@ export const calcExpectedReserveDataAfterWithdraw = (
   expectedReserveData.totalStableDebt = calcExpectedTotalStableDebt(
     reserveDataBeforeAction.principalStableDebt,
     reserveDataBeforeAction.averageStableBorrowRate,
-    reserveDataBeforeAction.lastUpdateTimestamp,
+    reserveDataBeforeAction.totalStableDebtLastUpdated,
     txTimestamp
   );
   expectedReserveData.totalVariableDebt = expectedReserveData.scaledVariableDebt.rayMul(
@@ -318,6 +318,7 @@ export const calcExpectedReserveDataAfterBorrow = (
   expectedReserveData.lastUpdateTimestamp = txTimestamp;
 
   if (borrowRateMode == RateMode.Stable) {
+    
     expectedReserveData.scaledVariableDebt = reserveDataBeforeAction.scaledVariableDebt;
 
     const expectedVariableDebtAfterTx = expectedReserveData.scaledVariableDebt.rayMul(
@@ -327,7 +328,7 @@ export const calcExpectedReserveDataAfterBorrow = (
     const expectedStableDebtUntilTx = calcExpectedTotalStableDebt(
       reserveDataBeforeAction.principalStableDebt,
       reserveDataBeforeAction.averageStableBorrowRate,
-      reserveDataBeforeAction.lastUpdateTimestamp,
+      reserveDataBeforeAction.totalStableDebtLastUpdated,
       txTimestamp
     );
 
@@ -403,7 +404,7 @@ export const calcExpectedReserveDataAfterBorrow = (
     expectedReserveData.totalStableDebt = calcExpectedTotalStableDebt(
       reserveDataBeforeAction.principalStableDebt,
       reserveDataBeforeAction.averageStableBorrowRate,
-      reserveDataBeforeAction.lastUpdateTimestamp,
+      reserveDataBeforeAction.totalStableDebtLastUpdated,
       currentTimestamp
     );
 
@@ -512,7 +513,7 @@ export const calcExpectedReserveDataAfterRepay = (
     const expectedDebt = calcExpectedTotalStableDebt(
       reserveDataBeforeAction.principalStableDebt,
       reserveDataBeforeAction.averageStableBorrowRate,
-      reserveDataBeforeAction.lastUpdateTimestamp,
+      reserveDataBeforeAction.totalStableDebtLastUpdated,
       txTimestamp
     );
 
@@ -597,13 +598,15 @@ export const calcExpectedUserDataAfterBorrow = (
   userDataBeforeAction: UserReserveData,
   txTimestamp: BigNumber,
   currentTimestamp: BigNumber,
-  txCost: BigNumber
+  user: tEthereumAddress,
+  onBehalfOf: tEthereumAddress
 ): UserReserveData => {
   const expectedUserData = <UserReserveData>{};
 
   const amountBorrowedBN = new BigNumber(amountBorrowed);
 
   if (interestRateMode == RateMode.Stable) {
+    
     const stableDebtUntilTx = calcExpectedStableDebtTokenBalance(
       userDataBeforeAction.principalStableDebt,
       userDataBeforeAction.stableBorrowRate,
@@ -805,7 +808,7 @@ export const calcExpectedReserveDataAfterSwapRateMode = (
   const totalStableDebtUntilTx = calcExpectedTotalStableDebt(
     reserveDataBeforeAction.principalStableDebt,
     reserveDataBeforeAction.averageStableBorrowRate,
-    reserveDataBeforeAction.lastUpdateTimestamp,
+    reserveDataBeforeAction.totalStableDebtLastUpdated,
     txTimestamp
   );
 
@@ -819,7 +822,9 @@ export const calcExpectedReserveDataAfterSwapRateMode = (
       expectedReserveData.variableBorrowIndex
     );
 
-    expectedReserveData.principalStableDebt = expectedReserveData.totalStableDebt = totalStableDebtUntilTx.minus(stableDebt);
+    expectedReserveData.principalStableDebt = expectedReserveData.totalStableDebt = totalStableDebtUntilTx.minus(
+      stableDebt
+    );
 
     expectedReserveData.averageStableBorrowRate = calcExpectedAverageStableBorrowRate(
       reserveDataBeforeAction.averageStableBorrowRate,
@@ -828,7 +833,6 @@ export const calcExpectedReserveDataAfterSwapRateMode = (
       userDataBeforeAction.stableBorrowRate
     );
   } else {
-
     //swap variable to stable
 
     expectedReserveData.principalStableDebt = expectedReserveData.totalStableDebt = totalStableDebtUntilTx.plus(
@@ -953,39 +957,58 @@ export const calcExpectedReserveDataAfterStableRateRebalance = (
 
   expectedReserveData.address = reserveDataBeforeAction.address;
 
-  const stableBorrowBalance = calcExpectedStableDebtTokenBalance(
+  const userStableDebt = calcExpectedStableDebtTokenBalance(
     userDataBeforeAction.principalStableDebt,
     userDataBeforeAction.stableBorrowRate,
     userDataBeforeAction.stableRateLastUpdated,
     txTimestamp
   );
 
-  const debtAccrued = stableBorrowBalance.minus(userDataBeforeAction.principalStableDebt);
+  expectedReserveData.liquidityIndex = calcExpectedLiquidityIndex(
+    reserveDataBeforeAction,
+    txTimestamp
+  );
 
-  expectedReserveData.totalLiquidity = reserveDataBeforeAction.totalLiquidity.plus(debtAccrued);
+  expectedReserveData.variableBorrowIndex = calcExpectedVariableBorrowIndex(
+    reserveDataBeforeAction,
+    txTimestamp
+  );
+
+  expectedReserveData.scaledVariableDebt = reserveDataBeforeAction.scaledVariableDebt;
+  expectedReserveData.totalVariableDebt = expectedReserveData.scaledVariableDebt.rayMul(
+    expectedReserveData.variableBorrowIndex
+  );
+
+  expectedReserveData.principalStableDebt = expectedReserveData.totalStableDebt = calcExpectedTotalStableDebt(
+    reserveDataBeforeAction.principalStableDebt,
+    reserveDataBeforeAction.averageStableBorrowRate,
+    reserveDataBeforeAction.totalStableDebtLastUpdated,
+    txTimestamp
+  );
 
   expectedReserveData.availableLiquidity = reserveDataBeforeAction.availableLiquidity;
 
+  expectedReserveData.totalLiquidity = expectedReserveData.availableLiquidity
+    .plus(expectedReserveData.totalStableDebt)
+    .plus(expectedReserveData.totalVariableDebt);
+
   //removing the stable liquidity at the old rate
 
   const avgRateBefore = calcExpectedAverageStableBorrowRate(
     reserveDataBeforeAction.averageStableBorrowRate,
-    reserveDataBeforeAction.totalStableDebt.plus(debtAccrued),
-    stableBorrowBalance.negated(),
+    expectedReserveData.totalStableDebt,
+    userStableDebt.negated(),
     userDataBeforeAction.stableBorrowRate
   );
   // adding it again at the new rate
 
   expectedReserveData.averageStableBorrowRate = calcExpectedAverageStableBorrowRate(
     avgRateBefore,
-    reserveDataBeforeAction.totalStableDebt.minus(userDataBeforeAction.principalStableDebt),
-    stableBorrowBalance,
+    expectedReserveData.totalStableDebt.minus(userStableDebt),
+    userStableDebt,
     reserveDataBeforeAction.stableBorrowRate
   );
 
-  expectedReserveData.totalVariableDebt = reserveDataBeforeAction.totalVariableDebt;
-  expectedReserveData.totalStableDebt = reserveDataBeforeAction.totalStableDebt.plus(debtAccrued);
-
   expectedReserveData.utilizationRate = calcExpectedUtilizationRate(
     expectedReserveData.totalStableDebt,
     expectedReserveData.totalVariableDebt,
@@ -1007,15 +1030,6 @@ export const calcExpectedReserveDataAfterStableRateRebalance = (
 
   expectedReserveData.variableBorrowRate = rates[2];
 
-  expectedReserveData.liquidityIndex = calcExpectedLiquidityIndex(
-    reserveDataBeforeAction,
-    txTimestamp
-  );
-  expectedReserveData.variableBorrowIndex = calcExpectedVariableBorrowIndex(
-    reserveDataBeforeAction,
-    txTimestamp
-  );
-
   return expectedReserveData;
 };
 
diff --git a/test/helpers/utils/helpers.ts b/test/helpers/utils/helpers.ts
index b98ba688..7c3dbd2a 100644
--- a/test/helpers/utils/helpers.ts
+++ b/test/helpers/utils/helpers.ts
@@ -25,6 +25,8 @@ export const getReserveData = async (
   const variableDebtToken = await getVariableDebtToken(tokenAddresses.variableDebtTokenAddress);
 
   const [principalStableDebt] = await stableDebtToken.getSupplyData();
+  const totalStableDebtLastUpdated = await stableDebtToken.getTotalSupplyLastUpdated();
+
 
   const scaledVariableDebt = await variableDebtToken.scaledTotalSupply();
 
@@ -57,6 +59,7 @@ export const getReserveData = async (
     liquidityIndex: new BigNumber(reserveData.liquidityIndex.toString()),
     variableBorrowIndex: new BigNumber(reserveData.variableBorrowIndex.toString()),
     lastUpdateTimestamp: new BigNumber(reserveData.lastUpdateTimestamp),
+    totalStableDebtLastUpdated: new BigNumber(totalStableDebtLastUpdated),
     principalStableDebt: new BigNumber(principalStableDebt.toString()),
     scaledVariableDebt: new BigNumber(scaledVariableDebt.toString()),
     address: reserve,
diff --git a/test/helpers/utils/interfaces/index.ts b/test/helpers/utils/interfaces/index.ts
index 3162e398..72b30708 100644
--- a/test/helpers/utils/interfaces/index.ts
+++ b/test/helpers/utils/interfaces/index.ts
@@ -34,6 +34,7 @@ export interface ReserveData {
   aTokenAddress: string;
   marketStableRate: BigNumber;
   lastUpdateTimestamp: BigNumber;
+  totalStableDebtLastUpdated: BigNumber;
   liquidityRate: BigNumber;
   [key: string]: BigNumber | string;
 }
diff --git a/test/scenario.spec.ts b/test/scenario.spec.ts
index 8a14d4e2..54fe7433 100644
--- a/test/scenario.spec.ts
+++ b/test/scenario.spec.ts
@@ -10,7 +10,7 @@ import {executeStory} from './helpers/scenario-engine';
 
 const scenarioFolder = './test/helpers/scenarios/';
 
-const selectedScenarios: string[] = ['swap-rate-mode.json'];
+const selectedScenarios: string[] = [];
 
 fs.readdirSync(scenarioFolder).forEach((file) => {
   if (selectedScenarios.length > 0 && !selectedScenarios.includes(file)) return;