mirror of
				https://github.com/Instadapp/aave-protocol-v2.git
				synced 2024-07-29 21:47:30 +00:00 
			
		
		
		
	- Finished migration of basic structure of scenarios and deposit story.
This commit is contained in:
		
							parent
							
								
									0b17abc6eb
								
							
						
					
					
						commit
						ef3e5b2cbb
					
				| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
import {Contract, Signer, utils} from "ethers";
 | 
			
		||||
import {Contract, Signer, utils, ethers} from "ethers";
 | 
			
		||||
 | 
			
		||||
import {getDb, BRE} from "./misc-utils";
 | 
			
		||||
import {
 | 
			
		||||
| 
						 | 
				
			
			@ -415,7 +415,7 @@ export const getAToken = async (address?: tEthereumAddress) => {
 | 
			
		|||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const getMintableErc20 = async (address?: tEthereumAddress) => {
 | 
			
		||||
export const getMintableErc20 = async (address: tEthereumAddress) => {
 | 
			
		||||
  return await getContract<MintableErc20>(
 | 
			
		||||
    eContractid.MintableERC20,
 | 
			
		||||
    address ||
 | 
			
		||||
| 
						 | 
				
			
			@ -427,7 +427,7 @@ export const getMintableErc20 = async (address?: tEthereumAddress) => {
 | 
			
		|||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const getIErc20Detailed = async (address?: tEthereumAddress) => {
 | 
			
		||||
export const getIErc20Detailed = async (address: tEthereumAddress) => {
 | 
			
		||||
  return await getContract<Ierc20Detailed>(
 | 
			
		||||
    eContractid.IERC20Detailed,
 | 
			
		||||
    address ||
 | 
			
		||||
| 
						 | 
				
			
			@ -491,6 +491,18 @@ export const getTokenDistributor = async (address?: tEthereumAddress) => {
 | 
			
		|||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const getLendingRateOracle = async (address?: tEthereumAddress) => {
 | 
			
		||||
  return await getContract<LendingRateOracle>(
 | 
			
		||||
    eContractid.LendingRateOracle,
 | 
			
		||||
    address ||
 | 
			
		||||
      (
 | 
			
		||||
        await getDb()
 | 
			
		||||
          .get(`${eContractid.LendingRateOracle}.${BRE.network.name}`)
 | 
			
		||||
          .value()
 | 
			
		||||
      ).address
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const linkBytecode = (artifact: Artifact, libraries: any) => {
 | 
			
		||||
  let bytecode = artifact.bytecode;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -551,18 +563,14 @@ export const convertToCurrencyDecimals = async (
 | 
			
		|||
  amount: string
 | 
			
		||||
) => {
 | 
			
		||||
  const isEth = tokenAddress === MOCK_ETH_ADDRESS;
 | 
			
		||||
  let decimals = new BigNumber(18);
 | 
			
		||||
  let decimals = "18";
 | 
			
		||||
 | 
			
		||||
  if (!isEth) {
 | 
			
		||||
    const token = await getIErc20Detailed(tokenAddress);
 | 
			
		||||
    decimals = new BigNumber(await token.decimals());
 | 
			
		||||
    decimals = (await token.decimals()).toString();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const currencyUnit = new BigNumber(10).pow(decimals);
 | 
			
		||||
  const amountInCurrencyDecimals = new BigNumber(amount).multipliedBy(
 | 
			
		||||
    currencyUnit
 | 
			
		||||
  );
 | 
			
		||||
  return amountInCurrencyDecimals.toFixed();
 | 
			
		||||
  return ethers.utils.parseUnits(amount, decimals);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const convertToCurrencyUnits = async (
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,6 +31,7 @@ import {
 | 
			
		|||
  insertContractAddressInDb,
 | 
			
		||||
  deployAaveProtocolTestHelpers,
 | 
			
		||||
  getEthersSigners,
 | 
			
		||||
  registerContractInJsonDb,
 | 
			
		||||
} from "../helpers/contracts-helpers";
 | 
			
		||||
import {LendingPoolAddressesProvider} from "../types/LendingPoolAddressesProvider";
 | 
			
		||||
import {Wallet, ContractTransaction, ethers, Signer} from "ethers";
 | 
			
		||||
| 
						 | 
				
			
			@ -58,8 +59,6 @@ import {
 | 
			
		|||
  ZERO_ADDRESS,
 | 
			
		||||
} from "../helpers/constants";
 | 
			
		||||
import {PriceOracle} from "../types/PriceOracle";
 | 
			
		||||
// @ts-ignore
 | 
			
		||||
import {accounts} from "../test-wallets.js";
 | 
			
		||||
import {MockAggregator} from "../types/MockAggregator";
 | 
			
		||||
import {LendingRateOracle} from "../types/LendingRateOracle";
 | 
			
		||||
import {LendingPoolCore} from "../types/LendingPoolCore";
 | 
			
		||||
| 
						 | 
				
			
			@ -75,6 +74,10 @@ const deployAllMockTokens = async (deployer: Signer) => {
 | 
			
		|||
        tokenSymbol,
 | 
			
		||||
        18,
 | 
			
		||||
      ]);
 | 
			
		||||
      await registerContractInJsonDb(
 | 
			
		||||
        tokenSymbol.toUpperCase(),
 | 
			
		||||
        tokens[tokenSymbol]
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -345,7 +348,7 @@ const enableReservesAsCollateral = async (
 | 
			
		|||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const waitForTx = async (tx: ContractTransaction) => await tx.wait();
 | 
			
		||||
export const waitForTx = async (tx: ContractTransaction) => await tx.wait();
 | 
			
		||||
 | 
			
		||||
const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => {
 | 
			
		||||
  console.time("setup");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,248 +1,254 @@
 | 
			
		|||
// import {convertToCurrencyDecimals} from '../../utils/misc-utils';
 | 
			
		||||
// import {
 | 
			
		||||
//   LendingPoolInstance,
 | 
			
		||||
//   LendingPoolCoreInstance,
 | 
			
		||||
//   ATokenContract,
 | 
			
		||||
//   ATokenInstance,
 | 
			
		||||
//   ERC20Instance,
 | 
			
		||||
//   ERC20DetailedInstance,
 | 
			
		||||
//   MintableERC20Instance,
 | 
			
		||||
// } from '../../utils/typechain-types/truffle-contracts';
 | 
			
		||||
// import BigNumber from 'bignumber.js';
 | 
			
		||||
// import {getTruffleContractInstance} from '../../utils/truffle/truffle-core-utils';
 | 
			
		||||
// import {ContractId} from '../../utils/types';
 | 
			
		||||
// import {
 | 
			
		||||
//   calcExpectedReserveDataAfterDeposit,
 | 
			
		||||
//   calcExpectedReserveDataAfterRedeem,
 | 
			
		||||
//   calcExpectedUserDataAfterDeposit,
 | 
			
		||||
//   calcExpectedUserDataAfterRedeem,
 | 
			
		||||
//   calcExpectedReserveDataAfterBorrow,
 | 
			
		||||
//   calcExpectedUserDataAfterBorrow,
 | 
			
		||||
//   calcExpectedReserveDataAfterRepay,
 | 
			
		||||
//   calcExpectedUserDataAfterRepay,
 | 
			
		||||
//   calcExpectedUserDataAfterSetUseAsCollateral,
 | 
			
		||||
//   calcExpectedUserDataAfterSwapRateMode,
 | 
			
		||||
//   calcExpectedReserveDataAfterSwapRateMode,
 | 
			
		||||
//   calcExpectedReserveDataAfterStableRateRebalance,
 | 
			
		||||
//   calcExpectedUserDataAfterStableRateRebalance,
 | 
			
		||||
//   calcExpectedUsersDataAfterRedirectInterest,
 | 
			
		||||
// } from '../utils/calculations';
 | 
			
		||||
// import {getReserveAddressFromSymbol, getReserveData, getUserData} from '../utils/helpers';
 | 
			
		||||
// import {UserReserveData, ReserveData} from '../utils/interfaces';
 | 
			
		||||
// import {ONE_YEAR, MAX_UINT_AMOUNT, NIL_ADDRESS} from '../../utils/constants';
 | 
			
		||||
// import {TransactionObject} from 'web3/eth/types';
 | 
			
		||||
import BigNumber from "bignumber.js";
 | 
			
		||||
 | 
			
		||||
// const {time, expectRevert} = require('@openzeppelin/test-helpers');
 | 
			
		||||
import {
 | 
			
		||||
  calcExpectedReserveDataAfterDeposit,
 | 
			
		||||
  calcExpectedReserveDataAfterRedeem,
 | 
			
		||||
  calcExpectedUserDataAfterDeposit,
 | 
			
		||||
  calcExpectedUserDataAfterRedeem,
 | 
			
		||||
  calcExpectedReserveDataAfterBorrow,
 | 
			
		||||
  calcExpectedUserDataAfterBorrow,
 | 
			
		||||
  calcExpectedReserveDataAfterRepay,
 | 
			
		||||
  calcExpectedUserDataAfterRepay,
 | 
			
		||||
  calcExpectedUserDataAfterSetUseAsCollateral,
 | 
			
		||||
  calcExpectedUserDataAfterSwapRateMode,
 | 
			
		||||
  calcExpectedReserveDataAfterSwapRateMode,
 | 
			
		||||
  calcExpectedReserveDataAfterStableRateRebalance,
 | 
			
		||||
  calcExpectedUserDataAfterStableRateRebalance,
 | 
			
		||||
  calcExpectedUsersDataAfterRedirectInterest,
 | 
			
		||||
} from "./utils/calculations";
 | 
			
		||||
import {
 | 
			
		||||
  getReserveAddressFromSymbol,
 | 
			
		||||
  getReserveData,
 | 
			
		||||
  getUserData,
 | 
			
		||||
} from "./utils/helpers";
 | 
			
		||||
 | 
			
		||||
// const truffleAssert = require('truffle-assertions');
 | 
			
		||||
import {
 | 
			
		||||
  getMintableErc20,
 | 
			
		||||
  convertToCurrencyDecimals,
 | 
			
		||||
} from "../../helpers/contracts-helpers";
 | 
			
		||||
import {MOCK_ETH_ADDRESS} from "../../helpers/constants";
 | 
			
		||||
import {TestEnv, SignerWithAddress} from "./make-suite";
 | 
			
		||||
import {BRE} from "../../helpers/misc-utils";
 | 
			
		||||
 | 
			
		||||
// const chai = require('chai');
 | 
			
		||||
import chai from "chai";
 | 
			
		||||
import {ReserveData, UserReserveData} from "./utils/interfaces";
 | 
			
		||||
import {waitForTx} from "../__setup.spec";
 | 
			
		||||
import {ContractReceipt} from "ethers/contract";
 | 
			
		||||
import {ethers} from "ethers";
 | 
			
		||||
 | 
			
		||||
// const {expect} = chai;
 | 
			
		||||
const {expect} = chai;
 | 
			
		||||
 | 
			
		||||
// const almostEqualOrEqual = function(
 | 
			
		||||
//   this: any,
 | 
			
		||||
//   expected: ReserveData | UserReserveData,
 | 
			
		||||
//   actual: ReserveData | UserReserveData
 | 
			
		||||
// ) {
 | 
			
		||||
//   const keys = Object.keys(actual);
 | 
			
		||||
const timeLatest = async () => {
 | 
			
		||||
  const block = await BRE.ethers.provider.getBlock("latest");
 | 
			
		||||
  return new BigNumber(block.timestamp);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//   keys.forEach(key => {
 | 
			
		||||
//     if (
 | 
			
		||||
//       key === 'lastUpdateTimestamp' ||
 | 
			
		||||
//       key === 'marketStableRate' ||
 | 
			
		||||
//       key === 'symbol' ||
 | 
			
		||||
//       key === 'aTokenAddress' ||
 | 
			
		||||
//       key === 'initialATokenExchangeRate' ||
 | 
			
		||||
//       key === 'decimals'
 | 
			
		||||
//     ) {
 | 
			
		||||
//       //skipping consistency check on accessory data
 | 
			
		||||
//       return;
 | 
			
		||||
//     }
 | 
			
		||||
const almostEqualOrEqual = function (
 | 
			
		||||
  this: any,
 | 
			
		||||
  expected: ReserveData | UserReserveData,
 | 
			
		||||
  actual: ReserveData | UserReserveData
 | 
			
		||||
) {
 | 
			
		||||
  const keys = Object.keys(actual);
 | 
			
		||||
 | 
			
		||||
//     this.assert(actual[key] != undefined, `Property ${key} is undefined in the actual data`);
 | 
			
		||||
//     expect(expected[key] != undefined, `Property ${key} is undefined in the expected data`);
 | 
			
		||||
  keys.forEach((key) => {
 | 
			
		||||
    if (
 | 
			
		||||
      key === "lastUpdateTimestamp" ||
 | 
			
		||||
      key === "marketStableRate" ||
 | 
			
		||||
      key === "symbol" ||
 | 
			
		||||
      key === "aTokenAddress" ||
 | 
			
		||||
      key === "initialATokenExchangeRate" ||
 | 
			
		||||
      key === "decimals"
 | 
			
		||||
    ) {
 | 
			
		||||
      // skipping consistency check on accessory data
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
//     if (actual[key] instanceof BigNumber) {
 | 
			
		||||
//       const actualValue = (<BigNumber>actual[key]).decimalPlaces(0, BigNumber.ROUND_DOWN);
 | 
			
		||||
//       const expectedValue = (<BigNumber>expected[key]).decimalPlaces(0, BigNumber.ROUND_DOWN);
 | 
			
		||||
    this.assert(
 | 
			
		||||
      actual[key] != undefined,
 | 
			
		||||
      `Property ${key} is undefined in the actual data`
 | 
			
		||||
    );
 | 
			
		||||
    expect(
 | 
			
		||||
      expected[key] != undefined,
 | 
			
		||||
      `Property ${key} is undefined in the expected data`
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
//       this.assert(
 | 
			
		||||
//         actualValue.eq(expectedValue) ||
 | 
			
		||||
//           actualValue.plus(1).eq(expectedValue) ||
 | 
			
		||||
//           actualValue.eq(expectedValue.plus(1)) ||
 | 
			
		||||
//           actualValue.plus(2).eq(expectedValue) ||
 | 
			
		||||
//           actualValue.eq(expectedValue.plus(2)) ||
 | 
			
		||||
//           actualValue.plus(3).eq(expectedValue) ||
 | 
			
		||||
//           actualValue.eq(expectedValue.plus(3)),
 | 
			
		||||
//         `expected #{act} to be almost equal or equal #{exp} for property ${key}`,
 | 
			
		||||
//         `expected #{act} to be almost equal or equal #{exp} for property ${key}`,
 | 
			
		||||
//         expectedValue.toFixed(0),
 | 
			
		||||
//         actualValue.toFixed(0)
 | 
			
		||||
//       );
 | 
			
		||||
//     } else {
 | 
			
		||||
//       this.assert(
 | 
			
		||||
//         actual[key] !== null &&
 | 
			
		||||
//           expected[key] !== null &&
 | 
			
		||||
//           actual[key].toString() === expected[key].toString(),
 | 
			
		||||
//         `expected #{act} to be equal #{exp} for property ${key}`,
 | 
			
		||||
//         `expected #{act} to be equal #{exp} for property ${key}`,
 | 
			
		||||
//         expected[key],
 | 
			
		||||
//         actual[key]
 | 
			
		||||
//       );
 | 
			
		||||
//     }
 | 
			
		||||
//   });
 | 
			
		||||
// };
 | 
			
		||||
    if (actual[key] instanceof BigNumber) {
 | 
			
		||||
      const actualValue = (<BigNumber>actual[key]).decimalPlaces(
 | 
			
		||||
        0,
 | 
			
		||||
        BigNumber.ROUND_DOWN
 | 
			
		||||
      );
 | 
			
		||||
      const expectedValue = (<BigNumber>expected[key]).decimalPlaces(
 | 
			
		||||
        0,
 | 
			
		||||
        BigNumber.ROUND_DOWN
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
// chai.use(function(chai: any, utils: any) {
 | 
			
		||||
//   chai.Assertion.overwriteMethod('almostEqualOrEqual', function(original: any) {
 | 
			
		||||
//     return function(this: any, expected: ReserveData | UserReserveData) {
 | 
			
		||||
//       const actual = (expected as ReserveData)
 | 
			
		||||
//         ? <ReserveData>this._obj
 | 
			
		||||
//         : <UserReserveData>this._obj;
 | 
			
		||||
      this.assert(
 | 
			
		||||
        actualValue.eq(expectedValue) ||
 | 
			
		||||
          actualValue.plus(1).eq(expectedValue) ||
 | 
			
		||||
          actualValue.eq(expectedValue.plus(1)) ||
 | 
			
		||||
          actualValue.plus(2).eq(expectedValue) ||
 | 
			
		||||
          actualValue.eq(expectedValue.plus(2)) ||
 | 
			
		||||
          actualValue.plus(3).eq(expectedValue) ||
 | 
			
		||||
          actualValue.eq(expectedValue.plus(3)),
 | 
			
		||||
        `expected #{act} to be almost equal or equal #{exp} for property ${key}`,
 | 
			
		||||
        `expected #{act} to be almost equal or equal #{exp} for property ${key}`,
 | 
			
		||||
        expectedValue.toFixed(0),
 | 
			
		||||
        actualValue.toFixed(0)
 | 
			
		||||
      );
 | 
			
		||||
    } else {
 | 
			
		||||
      this.assert(
 | 
			
		||||
        actual[key] !== null &&
 | 
			
		||||
          expected[key] !== null &&
 | 
			
		||||
          actual[key].toString() === expected[key].toString(),
 | 
			
		||||
        `expected #{act} to be equal #{exp} for property ${key}`,
 | 
			
		||||
        `expected #{act} to be equal #{exp} for property ${key}`,
 | 
			
		||||
        expected[key],
 | 
			
		||||
        actual[key]
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//       almostEqualOrEqual.apply(this, [expected, actual]);
 | 
			
		||||
//     };
 | 
			
		||||
//   });
 | 
			
		||||
// });
 | 
			
		||||
chai.use(function (chai: any, utils: any) {
 | 
			
		||||
  chai.Assertion.overwriteMethod("almostEqualOrEqual", function (
 | 
			
		||||
    original: any
 | 
			
		||||
  ) {
 | 
			
		||||
    return function (this: any, expected: ReserveData | UserReserveData) {
 | 
			
		||||
      const actual = (expected as ReserveData)
 | 
			
		||||
        ? <ReserveData>this._obj
 | 
			
		||||
        : <UserReserveData>this._obj;
 | 
			
		||||
 | 
			
		||||
// interface ActionsConfig {
 | 
			
		||||
//   lendingPoolInstance: LendingPoolInstance;
 | 
			
		||||
//   lendingPoolCoreInstance: LendingPoolCoreInstance;
 | 
			
		||||
//   ethereumAddress: string;
 | 
			
		||||
//   artifacts: Truffle.Artifacts;
 | 
			
		||||
//   web3: Web3;
 | 
			
		||||
//   skipIntegrityCheck: boolean;
 | 
			
		||||
// }
 | 
			
		||||
      almostEqualOrEqual.apply(this, [expected, actual]);
 | 
			
		||||
    };
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// export const configuration: ActionsConfig = <ActionsConfig>{};
 | 
			
		||||
interface ActionsConfig {
 | 
			
		||||
  skipIntegrityCheck: boolean;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// export const mint = async (reserveSymbol: string, amount: string, user: string) => {
 | 
			
		||||
//   const {ethereumAddress, artifacts} = configuration;
 | 
			
		||||
export const configuration: ActionsConfig = <ActionsConfig>{};
 | 
			
		||||
 | 
			
		||||
//   const reserve = await getReserveAddressFromSymbol(reserveSymbol, artifacts);
 | 
			
		||||
export const mint = async (
 | 
			
		||||
  reserveSymbol: string,
 | 
			
		||||
  amount: string,
 | 
			
		||||
  user: SignerWithAddress
 | 
			
		||||
) => {
 | 
			
		||||
  const reserve = await getReserveAddressFromSymbol(reserveSymbol);
 | 
			
		||||
 | 
			
		||||
//   if (ethereumAddress === reserve.toLowerCase()) {
 | 
			
		||||
//     throw 'Cannot mint ethereum. Mint action is most likely not needed in this story';
 | 
			
		||||
//   }
 | 
			
		||||
  if (MOCK_ETH_ADDRESS.toLowerCase() === reserve.toLowerCase()) {
 | 
			
		||||
    throw "Cannot mint ethereum. Mint action is most likely not needed in this story";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
//   const tokenInstance: MintableERC20Instance = await getTruffleContractInstance(
 | 
			
		||||
//     artifacts,
 | 
			
		||||
//     ContractId.MintableERC20,
 | 
			
		||||
//     reserve
 | 
			
		||||
//   );
 | 
			
		||||
  const token = await getMintableErc20(reserve);
 | 
			
		||||
 | 
			
		||||
//   const tokensToMint = await convertToCurrencyDecimals(reserve, amount);
 | 
			
		||||
  await waitForTx(
 | 
			
		||||
    await token
 | 
			
		||||
      .connect(user.signer)
 | 
			
		||||
      .mint(await convertToCurrencyDecimals(reserve, amount))
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//   const txOptions: any = {
 | 
			
		||||
//     from: user,
 | 
			
		||||
//   };
 | 
			
		||||
//   await tokenInstance.mint(tokensToMint, txOptions);
 | 
			
		||||
// };
 | 
			
		||||
export const approve = async (
 | 
			
		||||
  reserveSymbol: string,
 | 
			
		||||
  user: SignerWithAddress,
 | 
			
		||||
  testEnv: TestEnv
 | 
			
		||||
) => {
 | 
			
		||||
  const {core} = testEnv;
 | 
			
		||||
  const reserve = await getReserveAddressFromSymbol(reserveSymbol);
 | 
			
		||||
 | 
			
		||||
// export const approve = async (reserveSymbol: string, user: string) => {
 | 
			
		||||
//   const {ethereumAddress, artifacts} = configuration;
 | 
			
		||||
  if (MOCK_ETH_ADDRESS.toLowerCase() === reserve.toLowerCase()) {
 | 
			
		||||
    throw "Cannot mint ethereum. Mint action is most likely not needed in this story";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
//   const reserve = await getReserveAddressFromSymbol(reserveSymbol, artifacts);
 | 
			
		||||
  const token = await getMintableErc20(reserve);
 | 
			
		||||
 | 
			
		||||
//   if (ethereumAddress === reserve) {
 | 
			
		||||
//     throw 'Cannot mint ethereum. Mint action is most likely not needed in this story';
 | 
			
		||||
//   }
 | 
			
		||||
  await token
 | 
			
		||||
    .connect(user.signer)
 | 
			
		||||
    .approve(core.address, "100000000000000000000000000000");
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//   const tokenInstance: ERC20Instance = await getTruffleContractInstance(
 | 
			
		||||
//     artifacts,
 | 
			
		||||
//     ContractId.ERC20,
 | 
			
		||||
//     reserve
 | 
			
		||||
//   );
 | 
			
		||||
export const deposit = async (
 | 
			
		||||
  reserveSymbol: string,
 | 
			
		||||
  amount: string,
 | 
			
		||||
  user: SignerWithAddress,
 | 
			
		||||
  sendValue: string,
 | 
			
		||||
  expectedResult: string,
 | 
			
		||||
  testEnv: TestEnv,
 | 
			
		||||
  revertMessage?: string
 | 
			
		||||
) => {
 | 
			
		||||
  const {pool} = testEnv;
 | 
			
		||||
 | 
			
		||||
//   const txOptions: any = {
 | 
			
		||||
//     from: user,
 | 
			
		||||
//   };
 | 
			
		||||
//   await tokenInstance.approve(
 | 
			
		||||
//     configuration.lendingPoolCoreInstance.address,
 | 
			
		||||
//     '100000000000000000000000000000',
 | 
			
		||||
//     txOptions
 | 
			
		||||
//   );
 | 
			
		||||
// };
 | 
			
		||||
  const reserve = await getReserveAddressFromSymbol(reserveSymbol);
 | 
			
		||||
 | 
			
		||||
// export const deposit = async (
 | 
			
		||||
//   reserveSymbol: string,
 | 
			
		||||
//   amount: string,
 | 
			
		||||
//   user: string,
 | 
			
		||||
//   sendValue: string,
 | 
			
		||||
//   expectedResult: string,
 | 
			
		||||
//   revertMessage?: string
 | 
			
		||||
// ) => {
 | 
			
		||||
//   const {ethereumAddress, lendingPoolInstance, artifacts} = configuration;
 | 
			
		||||
  const amountToDeposit = await convertToCurrencyDecimals(reserve, amount);
 | 
			
		||||
 | 
			
		||||
//   const reserve = await getReserveAddressFromSymbol(reserveSymbol, artifacts);
 | 
			
		||||
  const txOptions: any = {};
 | 
			
		||||
 | 
			
		||||
  const {
 | 
			
		||||
    reserveData: reserveDataBefore,
 | 
			
		||||
    userData: userDataBefore,
 | 
			
		||||
  } = await getContractsData(reserve, user.address, testEnv);
 | 
			
		||||
 | 
			
		||||
//   const amountToDeposit = await convertToCurrencyDecimals(reserve, amount);
 | 
			
		||||
  if (MOCK_ETH_ADDRESS === reserve) {
 | 
			
		||||
    if (sendValue) {
 | 
			
		||||
      const valueToSend = await convertToCurrencyDecimals(reserve, sendValue);
 | 
			
		||||
      txOptions.value = valueToSend;
 | 
			
		||||
    } else {
 | 
			
		||||
      txOptions.value = amountToDeposit;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (expectedResult === "success") {
 | 
			
		||||
    const txResult = await waitForTx(
 | 
			
		||||
      await await pool
 | 
			
		||||
        .connect(user.signer)
 | 
			
		||||
        .deposit(reserve, amountToDeposit, "0", txOptions)
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
//   const txOptions: any = {
 | 
			
		||||
//     from: user,
 | 
			
		||||
//   };
 | 
			
		||||
    const {
 | 
			
		||||
      reserveData: reserveDataAfter,
 | 
			
		||||
      userData: userDataAfter,
 | 
			
		||||
      timestamp,
 | 
			
		||||
    } = await getContractsData(reserve, user.address, testEnv);
 | 
			
		||||
 | 
			
		||||
//   const {reserveData: reserveDataBefore, userData: userDataBefore} = await getContractsData(
 | 
			
		||||
//     reserve,
 | 
			
		||||
//     user
 | 
			
		||||
//   );
 | 
			
		||||
    const {txCost, txTimestamp} = await getTxCostAndTimestamp(txResult);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
//   if (ethereumAddress === reserve) {
 | 
			
		||||
//     if (sendValue) {
 | 
			
		||||
//       const valueToSend = await convertToCurrencyDecimals(reserve, sendValue);
 | 
			
		||||
//       txOptions.value = valueToSend;
 | 
			
		||||
//     } else {
 | 
			
		||||
//       txOptions.value = amountToDeposit;
 | 
			
		||||
//     }
 | 
			
		||||
//   }
 | 
			
		||||
//   if (expectedResult === 'success') {
 | 
			
		||||
//     const txResult = await lendingPoolInstance.deposit(reserve, amountToDeposit, '0', txOptions);
 | 
			
		||||
    const expectedReserveData = calcExpectedReserveDataAfterDeposit(
 | 
			
		||||
      amountToDeposit.toString(),
 | 
			
		||||
      reserveDataBefore,
 | 
			
		||||
      txTimestamp
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
//     const {
 | 
			
		||||
//       reserveData: reserveDataAfter,
 | 
			
		||||
//       userData: userDataAfter,
 | 
			
		||||
//       timestamp,
 | 
			
		||||
//     } = await getContractsData(reserve, user);
 | 
			
		||||
    const expectedUserReserveData = calcExpectedUserDataAfterDeposit(
 | 
			
		||||
      amountToDeposit.toString(),
 | 
			
		||||
      reserveDataBefore,
 | 
			
		||||
      expectedReserveData,
 | 
			
		||||
      userDataBefore,
 | 
			
		||||
      txTimestamp,
 | 
			
		||||
      timestamp,
 | 
			
		||||
      txCost
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
//     const {txCost, txTimestamp} = await getTxCostAndTimestamp(txResult);
 | 
			
		||||
    expectEqual(reserveDataAfter, expectedReserveData);
 | 
			
		||||
    expectEqual(userDataAfter, expectedUserReserveData);
 | 
			
		||||
 | 
			
		||||
//     const expectedReserveData = calcExpectedReserveDataAfterDeposit(
 | 
			
		||||
//       amountToDeposit,
 | 
			
		||||
//       reserveDataBefore,
 | 
			
		||||
//       txTimestamp
 | 
			
		||||
//     );
 | 
			
		||||
 | 
			
		||||
//     const expectedUserReserveData = calcExpectedUserDataAfterDeposit(
 | 
			
		||||
//       amountToDeposit,
 | 
			
		||||
//       reserveDataBefore,
 | 
			
		||||
//       expectedReserveData,
 | 
			
		||||
//       userDataBefore,
 | 
			
		||||
//       txTimestamp,
 | 
			
		||||
//       timestamp,
 | 
			
		||||
//       txCost
 | 
			
		||||
//     );
 | 
			
		||||
 | 
			
		||||
//     expectEqual(reserveDataAfter, expectedReserveData);
 | 
			
		||||
//     expectEqual(userDataAfter, expectedUserReserveData);
 | 
			
		||||
 | 
			
		||||
//     truffleAssert.eventEmitted(txResult, 'Deposit', (ev: any) => {
 | 
			
		||||
//       const {_reserve, _user, _amount} = ev;
 | 
			
		||||
//       return (
 | 
			
		||||
//         _reserve === reserve &&
 | 
			
		||||
//         _user === user &&
 | 
			
		||||
//         new BigNumber(_amount).isEqualTo(new BigNumber(amountToDeposit))
 | 
			
		||||
//       );
 | 
			
		||||
//     });
 | 
			
		||||
//   } else if (expectedResult === 'revert') {
 | 
			
		||||
//     await expectRevert(
 | 
			
		||||
//       lendingPoolInstance.deposit(reserve, amountToDeposit, '0', txOptions),
 | 
			
		||||
//       revertMessage
 | 
			
		||||
//     );
 | 
			
		||||
//   }
 | 
			
		||||
// };
 | 
			
		||||
    // truffleAssert.eventEmitted(txResult, "Deposit", (ev: any) => {
 | 
			
		||||
    //   const {_reserve, _user, _amount} = ev;
 | 
			
		||||
    //   return (
 | 
			
		||||
    //     _reserve === reserve &&
 | 
			
		||||
    //     _user === user &&
 | 
			
		||||
    //     new BigNumber(_amount).isEqualTo(new BigNumber(amountToDeposit))
 | 
			
		||||
    //   );
 | 
			
		||||
    // });
 | 
			
		||||
  } else if (expectedResult === "revert") {
 | 
			
		||||
    await expect(
 | 
			
		||||
      pool
 | 
			
		||||
        .connect(user.signer)
 | 
			
		||||
        .deposit(reserve, amountToDeposit, "0", txOptions),
 | 
			
		||||
      revertMessage
 | 
			
		||||
    ).to.be.reverted;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// export const redeem = async (
 | 
			
		||||
//   reserveSymbol: string,
 | 
			
		||||
| 
						 | 
				
			
			@ -266,7 +272,7 @@
 | 
			
		|||
//     amountToRedeem = await convertToCurrencyDecimals(reserve, amount);
 | 
			
		||||
//   } else {
 | 
			
		||||
//     amountToRedeem = MAX_UINT_AMOUNT;
 | 
			
		||||
//   }  
 | 
			
		||||
//   }
 | 
			
		||||
 | 
			
		||||
//   if (expectedResult === 'success') {
 | 
			
		||||
//     const txResult = await aTokenInstance.redeem(amountToRedeem, txOptions);
 | 
			
		||||
| 
						 | 
				
			
			@ -724,13 +730,13 @@
 | 
			
		|||
//       txCost,
 | 
			
		||||
//       txTimestamp
 | 
			
		||||
//     );
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
//     expectEqual(fromDataAfter, expectedFromData);
 | 
			
		||||
//     expectEqual(toDataAfter, expectedToData);
 | 
			
		||||
 | 
			
		||||
//     truffleAssert.eventEmitted(txResult, 'InterestStreamRedirected', (ev: any) => {
 | 
			
		||||
//       const {_from, _to} = ev;
 | 
			
		||||
//       return _from === user 
 | 
			
		||||
//       return _from === user
 | 
			
		||||
//       && _to === (to === user ? NIL_ADDRESS : to);
 | 
			
		||||
//     });
 | 
			
		||||
//   } else if (expectedResult === 'revert') {
 | 
			
		||||
| 
						 | 
				
			
			@ -809,14 +815,15 @@
 | 
			
		|||
//   }
 | 
			
		||||
// };
 | 
			
		||||
 | 
			
		||||
// const expectEqual = (
 | 
			
		||||
//   actual: UserReserveData | ReserveData,
 | 
			
		||||
//   expected: UserReserveData | ReserveData
 | 
			
		||||
// ) => {
 | 
			
		||||
//   if (!configuration.skipIntegrityCheck) {
 | 
			
		||||
//     expect(actual).to.be.almostEqualOrEqual(expected);
 | 
			
		||||
//   }
 | 
			
		||||
// };
 | 
			
		||||
const expectEqual = (
 | 
			
		||||
  actual: UserReserveData | ReserveData,
 | 
			
		||||
  expected: UserReserveData | ReserveData
 | 
			
		||||
) => {
 | 
			
		||||
  if (!configuration.skipIntegrityCheck) {
 | 
			
		||||
    // @ts-ignore
 | 
			
		||||
    expect(actual).to.be.almostEqualOrEqual(expected);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// interface ActionData {
 | 
			
		||||
//   reserve: string;
 | 
			
		||||
| 
						 | 
				
			
			@ -854,31 +861,35 @@
 | 
			
		|||
//   };
 | 
			
		||||
// };
 | 
			
		||||
 | 
			
		||||
// const getTxCostAndTimestamp = async (tx: any) => {
 | 
			
		||||
//   const txTimestamp = new BigNumber((await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp);
 | 
			
		||||
const getTxCostAndTimestamp = async (tx: ContractReceipt) => {
 | 
			
		||||
  if (!tx.blockNumber || !tx.transactionHash || !tx.cumulativeGasUsed) {
 | 
			
		||||
    throw new Error("No tx blocknumber");
 | 
			
		||||
  }
 | 
			
		||||
  const txTimestamp = new BigNumber(
 | 
			
		||||
    (await BRE.ethers.provider.getBlock(tx.blockNumber)).timestamp
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
//   const txInfo = await configuration.web3.eth.getTransaction(tx.receipt.transactionHash);
 | 
			
		||||
//   const txCost = new BigNumber(tx.receipt.gasUsed).multipliedBy(txInfo.gasPrice);
 | 
			
		||||
  const txInfo = await BRE.ethers.provider.getTransaction(tx.transactionHash);
 | 
			
		||||
  const txCost = new BigNumber(tx.cumulativeGasUsed.toString()).multipliedBy(
 | 
			
		||||
    txInfo.gasPrice.toString()
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
//   return {txCost, txTimestamp};
 | 
			
		||||
// };
 | 
			
		||||
  return {txCost, txTimestamp};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// const getContractsData = async (reserve: string, user: string) => {
 | 
			
		||||
//   const [reserveData, userData, timestamp] = await Promise.all([
 | 
			
		||||
//     getReserveData(configuration.lendingPoolInstance, reserve, artifacts),
 | 
			
		||||
//     getUserData(
 | 
			
		||||
//       configuration.lendingPoolInstance,
 | 
			
		||||
//       configuration.lendingPoolCoreInstance,
 | 
			
		||||
//       reserve,
 | 
			
		||||
//       user,
 | 
			
		||||
//       artifacts
 | 
			
		||||
//     ),
 | 
			
		||||
//     time.latest(),
 | 
			
		||||
//   ]);
 | 
			
		||||
const getContractsData = async (
 | 
			
		||||
  reserve: string,
 | 
			
		||||
  user: string,
 | 
			
		||||
  testEnv: TestEnv
 | 
			
		||||
) => {
 | 
			
		||||
  const {pool, core} = testEnv;
 | 
			
		||||
  const reserveData = await getReserveData(pool, reserve);
 | 
			
		||||
  const userData = await getUserData(pool, core, reserve, user);
 | 
			
		||||
  const timestamp = await timeLatest();
 | 
			
		||||
 | 
			
		||||
//   return {
 | 
			
		||||
//     reserveData,
 | 
			
		||||
//     userData,
 | 
			
		||||
//     timestamp: new BigNumber(timestamp),
 | 
			
		||||
//   };
 | 
			
		||||
// };
 | 
			
		||||
  return {
 | 
			
		||||
    reserveData,
 | 
			
		||||
    userData,
 | 
			
		||||
    timestamp: new BigNumber(timestamp),
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,233 +1,266 @@
 | 
			
		|||
// import {
 | 
			
		||||
//   deposit,
 | 
			
		||||
//   mint,
 | 
			
		||||
//   approve,
 | 
			
		||||
//   redeem,
 | 
			
		||||
//   borrow,
 | 
			
		||||
//   repay,
 | 
			
		||||
//   setUseAsCollateral,
 | 
			
		||||
//   swapBorrowRateMode,
 | 
			
		||||
//   rebalanceStableBorrowRate,
 | 
			
		||||
//   allowInterestRedirectionTo,
 | 
			
		||||
//   redirectInterestStream,
 | 
			
		||||
//   redirectInterestStreamOf,
 | 
			
		||||
// } from '../actions';
 | 
			
		||||
// import {on} from 'cluster';
 | 
			
		||||
// import { RateMode } from '../../utils/types';
 | 
			
		||||
import {TestEnv, SignerWithAddress} from "./make-suite";
 | 
			
		||||
import {mint, approve, deposit} from "./actions";
 | 
			
		||||
 | 
			
		||||
// export interface Action {
 | 
			
		||||
//   name: string;
 | 
			
		||||
//   args?: any;
 | 
			
		||||
//   expected: string;
 | 
			
		||||
//   revertMessage?: string;
 | 
			
		||||
// }
 | 
			
		||||
export interface Action {
 | 
			
		||||
  name: string;
 | 
			
		||||
  args?: any;
 | 
			
		||||
  expected: string;
 | 
			
		||||
  revertMessage?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// export interface Story {
 | 
			
		||||
//   description: string;
 | 
			
		||||
//   actions: Action[];
 | 
			
		||||
// }
 | 
			
		||||
export interface Story {
 | 
			
		||||
  description: string;
 | 
			
		||||
  actions: Action[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// export interface Scenario {
 | 
			
		||||
//   title: string;
 | 
			
		||||
//   description: string;
 | 
			
		||||
//   stories: Story[];
 | 
			
		||||
// }
 | 
			
		||||
export interface Scenario {
 | 
			
		||||
  title: string;
 | 
			
		||||
  description: string;
 | 
			
		||||
  stories: Story[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// export const executeStory = async (story: Story, users: string[]) => {
 | 
			
		||||
//   for (const action of story.actions) {
 | 
			
		||||
//     await executeAction(action, users);
 | 
			
		||||
//   }
 | 
			
		||||
// };
 | 
			
		||||
export const executeStory = async (story: Story, testEnv: TestEnv) => {
 | 
			
		||||
  for (const action of story.actions) {
 | 
			
		||||
    const {users} = testEnv;
 | 
			
		||||
    await executeAction(action, users, testEnv);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// const executeAction = async (action: Action, users: string[]) => {
 | 
			
		||||
//   const {reserve, user} = action.args;
 | 
			
		||||
//   const {name, expected, revertMessage} = action;
 | 
			
		||||
const executeAction = async (
 | 
			
		||||
  action: Action,
 | 
			
		||||
  users: SignerWithAddress[],
 | 
			
		||||
  testEnv: TestEnv
 | 
			
		||||
) => {
 | 
			
		||||
  const {reserve, user} = action.args;
 | 
			
		||||
  const {name, expected, revertMessage} = action;
 | 
			
		||||
 | 
			
		||||
//   if (!name || name === '') {
 | 
			
		||||
//     throw 'Action name is missing';
 | 
			
		||||
//   }
 | 
			
		||||
//   if (!reserve || reserve === '') {
 | 
			
		||||
//     throw 'Invalid reserve selected for deposit';
 | 
			
		||||
//   }
 | 
			
		||||
//   if (!user || user === '') {
 | 
			
		||||
//     throw `Invalid user selected to deposit into the ${reserve} reserve`;
 | 
			
		||||
//   }
 | 
			
		||||
  if (!name || name === "") {
 | 
			
		||||
    throw "Action name is missing";
 | 
			
		||||
  }
 | 
			
		||||
  if (!reserve || reserve === "") {
 | 
			
		||||
    throw "Invalid reserve selected for deposit";
 | 
			
		||||
  }
 | 
			
		||||
  if (!user || user === "") {
 | 
			
		||||
    throw `Invalid user selected to deposit into the ${reserve} reserve`;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
//   if (!expected || expected === '') {
 | 
			
		||||
//     throw `An expected resut for action ${name} is required`;
 | 
			
		||||
//   }
 | 
			
		||||
  if (!expected || expected === "") {
 | 
			
		||||
    throw `An expected resut for action ${name} is required`;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
//   const userAddress = users[parseInt(user)];
 | 
			
		||||
  const userAddress = users[parseInt(user)];
 | 
			
		||||
 | 
			
		||||
//   switch (name) {
 | 
			
		||||
//     case 'mint':
 | 
			
		||||
//       const {amount} = action.args;
 | 
			
		||||
  switch (name) {
 | 
			
		||||
    case "mint":
 | 
			
		||||
      const {amount} = action.args;
 | 
			
		||||
 | 
			
		||||
//       if (!amount || amount === '') {
 | 
			
		||||
//         throw `Invalid amount of ${reserve} to mint`;
 | 
			
		||||
//       }
 | 
			
		||||
      if (!amount || amount === "") {
 | 
			
		||||
        throw `Invalid amount of ${reserve} to mint`;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
//       await mint(reserve, amount, userAddress);
 | 
			
		||||
//       break;
 | 
			
		||||
      await mint(reserve, amount, userAddress);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
//     case 'approve':
 | 
			
		||||
//       await approve(reserve, userAddress);
 | 
			
		||||
//       break;
 | 
			
		||||
    case "approve":
 | 
			
		||||
      await approve(reserve, userAddress, testEnv);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
//     case 'deposit':
 | 
			
		||||
//       {
 | 
			
		||||
//         const {amount, sendValue} = action.args;
 | 
			
		||||
    case "deposit":
 | 
			
		||||
      {
 | 
			
		||||
        const {amount, sendValue} = action.args;
 | 
			
		||||
 | 
			
		||||
//         if (!amount || amount === '') {
 | 
			
		||||
//           throw `Invalid amount to deposit into the ${reserve} reserve`;
 | 
			
		||||
//         }
 | 
			
		||||
        if (!amount || amount === "") {
 | 
			
		||||
          throw `Invalid amount to deposit into the ${reserve} reserve`;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
//         await deposit(reserve, amount, userAddress, sendValue, expected, revertMessage);
 | 
			
		||||
//       }
 | 
			
		||||
//       break;
 | 
			
		||||
        await deposit(
 | 
			
		||||
          reserve,
 | 
			
		||||
          amount,
 | 
			
		||||
          userAddress,
 | 
			
		||||
          sendValue,
 | 
			
		||||
          expected,
 | 
			
		||||
          testEnv,
 | 
			
		||||
          revertMessage
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
//     case 'redeem':
 | 
			
		||||
//       {
 | 
			
		||||
//         const {amount} = action.args;
 | 
			
		||||
    // case "redeem":
 | 
			
		||||
    //   {
 | 
			
		||||
    //     const {amount} = action.args;
 | 
			
		||||
 | 
			
		||||
//         if (!amount || amount === '') {
 | 
			
		||||
//           throw `Invalid amount to redeem from the ${reserve} reserve`;
 | 
			
		||||
//         }
 | 
			
		||||
    //     if (!amount || amount === "") {
 | 
			
		||||
    //       throw `Invalid amount to redeem from the ${reserve} reserve`;
 | 
			
		||||
    //     }
 | 
			
		||||
 | 
			
		||||
//         await redeem(reserve, amount, userAddress, expected, revertMessage);
 | 
			
		||||
//       }
 | 
			
		||||
//       break;
 | 
			
		||||
//     case 'borrow':
 | 
			
		||||
//       {
 | 
			
		||||
//         const {amount, borrowRateMode, timeTravel} = action.args;
 | 
			
		||||
    //     await redeem(reserve, amount, userAddress, expected, revertMessage);
 | 
			
		||||
    //   }
 | 
			
		||||
    //   break;
 | 
			
		||||
    // case "borrow":
 | 
			
		||||
    //   {
 | 
			
		||||
    //     const {amount, borrowRateMode, timeTravel} = action.args;
 | 
			
		||||
 | 
			
		||||
//         if (!amount || amount === '') {
 | 
			
		||||
//           throw `Invalid amount to borrow from the ${reserve} reserve`;
 | 
			
		||||
//         }
 | 
			
		||||
    //     if (!amount || amount === "") {
 | 
			
		||||
    //       throw `Invalid amount to borrow from the ${reserve} reserve`;
 | 
			
		||||
    //     }
 | 
			
		||||
 | 
			
		||||
//         let rateMode: string = RateMode.None;
 | 
			
		||||
    //     let rateMode: string = RateMode.None;
 | 
			
		||||
 | 
			
		||||
//         if (borrowRateMode === 'none') {
 | 
			
		||||
//           RateMode.None;
 | 
			
		||||
//         } else if (borrowRateMode === 'stable') {
 | 
			
		||||
//           rateMode = RateMode.Stable;
 | 
			
		||||
//         } else if (borrowRateMode === 'variable') {
 | 
			
		||||
//           rateMode = RateMode.Variable;
 | 
			
		||||
//         } else {
 | 
			
		||||
//           //random value, to test improper selection of the parameter
 | 
			
		||||
//           rateMode = '4';
 | 
			
		||||
//         }
 | 
			
		||||
    //     if (borrowRateMode === "none") {
 | 
			
		||||
    //       RateMode.None;
 | 
			
		||||
    //     } else if (borrowRateMode === "stable") {
 | 
			
		||||
    //       rateMode = RateMode.Stable;
 | 
			
		||||
    //     } else if (borrowRateMode === "variable") {
 | 
			
		||||
    //       rateMode = RateMode.Variable;
 | 
			
		||||
    //     } else {
 | 
			
		||||
    //       //random value, to test improper selection of the parameter
 | 
			
		||||
    //       rateMode = "4";
 | 
			
		||||
    //     }
 | 
			
		||||
 | 
			
		||||
//         await borrow(reserve, amount, rateMode, userAddress, timeTravel, expected, revertMessage);
 | 
			
		||||
//       }
 | 
			
		||||
//       break;
 | 
			
		||||
    //     await borrow(
 | 
			
		||||
    //       reserve,
 | 
			
		||||
    //       amount,
 | 
			
		||||
    //       rateMode,
 | 
			
		||||
    //       userAddress,
 | 
			
		||||
    //       timeTravel,
 | 
			
		||||
    //       expected,
 | 
			
		||||
    //       revertMessage
 | 
			
		||||
    //     );
 | 
			
		||||
    //   }
 | 
			
		||||
    //   break;
 | 
			
		||||
 | 
			
		||||
//     case 'repay':
 | 
			
		||||
//       {
 | 
			
		||||
//         const {amount, sendValue} = action.args;
 | 
			
		||||
//         let {onBehalfOf} = action.args;
 | 
			
		||||
    // case "repay":
 | 
			
		||||
    //   {
 | 
			
		||||
    //     const {amount, sendValue} = action.args;
 | 
			
		||||
    //     let {onBehalfOf} = action.args;
 | 
			
		||||
 | 
			
		||||
//         if (!amount || amount === '') {
 | 
			
		||||
//           throw `Invalid amount to repay into the ${reserve} reserve`;
 | 
			
		||||
//         }
 | 
			
		||||
    //     if (!amount || amount === "") {
 | 
			
		||||
    //       throw `Invalid amount to repay into the ${reserve} reserve`;
 | 
			
		||||
    //     }
 | 
			
		||||
 | 
			
		||||
//         if (!onBehalfOf || onBehalfOf === '') {
 | 
			
		||||
//           console.log(
 | 
			
		||||
//             'WARNING: No onBehalfOf specified for a repay action. Defaulting to the repayer address'
 | 
			
		||||
//           );
 | 
			
		||||
//           onBehalfOf = userAddress;
 | 
			
		||||
//         } else {
 | 
			
		||||
//           onBehalfOf = users[parseInt(onBehalfOf)];
 | 
			
		||||
//         }
 | 
			
		||||
    //     if (!onBehalfOf || onBehalfOf === "") {
 | 
			
		||||
    //       console.log(
 | 
			
		||||
    //         "WARNING: No onBehalfOf specified for a repay action. Defaulting to the repayer address"
 | 
			
		||||
    //       );
 | 
			
		||||
    //       onBehalfOf = userAddress;
 | 
			
		||||
    //     } else {
 | 
			
		||||
    //       onBehalfOf = users[parseInt(onBehalfOf)];
 | 
			
		||||
    //     }
 | 
			
		||||
 | 
			
		||||
//         await repay(reserve, amount, userAddress, onBehalfOf, sendValue, expected, revertMessage);
 | 
			
		||||
//       }
 | 
			
		||||
//       break;
 | 
			
		||||
    //     await repay(
 | 
			
		||||
    //       reserve,
 | 
			
		||||
    //       amount,
 | 
			
		||||
    //       userAddress,
 | 
			
		||||
    //       onBehalfOf,
 | 
			
		||||
    //       sendValue,
 | 
			
		||||
    //       expected,
 | 
			
		||||
    //       revertMessage
 | 
			
		||||
    //     );
 | 
			
		||||
    //   }
 | 
			
		||||
    //   break;
 | 
			
		||||
 | 
			
		||||
//     case 'setUseAsCollateral':
 | 
			
		||||
//       {
 | 
			
		||||
//         const {useAsCollateral} = action.args;
 | 
			
		||||
    // case "setUseAsCollateral":
 | 
			
		||||
    //   {
 | 
			
		||||
    //     const {useAsCollateral} = action.args;
 | 
			
		||||
 | 
			
		||||
//         if (!useAsCollateral || useAsCollateral === '') {
 | 
			
		||||
//           throw `A valid value for useAsCollateral needs to be set when calling setUseReserveAsCollateral on reserve ${reserve}`;
 | 
			
		||||
//         }
 | 
			
		||||
//         await setUseAsCollateral(reserve, userAddress, useAsCollateral, expected, revertMessage);
 | 
			
		||||
//       }
 | 
			
		||||
//       break;
 | 
			
		||||
    //     if (!useAsCollateral || useAsCollateral === "") {
 | 
			
		||||
    //       throw `A valid value for useAsCollateral needs to be set when calling setUseReserveAsCollateral on reserve ${reserve}`;
 | 
			
		||||
    //     }
 | 
			
		||||
    //     await setUseAsCollateral(
 | 
			
		||||
    //       reserve,
 | 
			
		||||
    //       userAddress,
 | 
			
		||||
    //       useAsCollateral,
 | 
			
		||||
    //       expected,
 | 
			
		||||
    //       revertMessage
 | 
			
		||||
    //     );
 | 
			
		||||
    //   }
 | 
			
		||||
    //   break;
 | 
			
		||||
 | 
			
		||||
//     case 'swapBorrowRateMode':
 | 
			
		||||
//       await swapBorrowRateMode(reserve, userAddress, expected, revertMessage);
 | 
			
		||||
//       break;
 | 
			
		||||
    // case "swapBorrowRateMode":
 | 
			
		||||
    //   await swapBorrowRateMode(reserve, userAddress, expected, revertMessage);
 | 
			
		||||
    //   break;
 | 
			
		||||
 | 
			
		||||
//     case 'rebalanceStableBorrowRate':
 | 
			
		||||
//       {
 | 
			
		||||
//         const {target} = action.args;
 | 
			
		||||
    // case "rebalanceStableBorrowRate":
 | 
			
		||||
    //   {
 | 
			
		||||
    //     const {target} = action.args;
 | 
			
		||||
 | 
			
		||||
//         if (!target || target === '') {
 | 
			
		||||
//           throw `A target must be selected when trying to rebalance a stable rate`;
 | 
			
		||||
//         }
 | 
			
		||||
//         const targetAddress = users[parseInt(target)];
 | 
			
		||||
    //     if (!target || target === "") {
 | 
			
		||||
    //       throw `A target must be selected when trying to rebalance a stable rate`;
 | 
			
		||||
    //     }
 | 
			
		||||
    //     const targetAddress = users[parseInt(target)];
 | 
			
		||||
 | 
			
		||||
//         await rebalanceStableBorrowRate(
 | 
			
		||||
//           reserve,
 | 
			
		||||
//           userAddress,
 | 
			
		||||
//           targetAddress,
 | 
			
		||||
//           expected,
 | 
			
		||||
//           revertMessage
 | 
			
		||||
//         );
 | 
			
		||||
//       }
 | 
			
		||||
//       break;
 | 
			
		||||
    //     await rebalanceStableBorrowRate(
 | 
			
		||||
    //       reserve,
 | 
			
		||||
    //       userAddress,
 | 
			
		||||
    //       targetAddress,
 | 
			
		||||
    //       expected,
 | 
			
		||||
    //       revertMessage
 | 
			
		||||
    //     );
 | 
			
		||||
    //   }
 | 
			
		||||
    //   break;
 | 
			
		||||
 | 
			
		||||
//     case 'redirectInterestStream':
 | 
			
		||||
//       {
 | 
			
		||||
//         const {to} = action.args;
 | 
			
		||||
    // case "redirectInterestStream":
 | 
			
		||||
    //   {
 | 
			
		||||
    //     const {to} = action.args;
 | 
			
		||||
 | 
			
		||||
//         if (!to || to === '') {
 | 
			
		||||
//           throw `A target must be selected when trying to redirect the interest`;
 | 
			
		||||
//         }
 | 
			
		||||
//         const toAddress = users[parseInt(to)];
 | 
			
		||||
    //     if (!to || to === "") {
 | 
			
		||||
    //       throw `A target must be selected when trying to redirect the interest`;
 | 
			
		||||
    //     }
 | 
			
		||||
    //     const toAddress = users[parseInt(to)];
 | 
			
		||||
 | 
			
		||||
//         await redirectInterestStream(reserve, userAddress, toAddress, expected, revertMessage);
 | 
			
		||||
//       }
 | 
			
		||||
//       break;
 | 
			
		||||
    //     await redirectInterestStream(
 | 
			
		||||
    //       reserve,
 | 
			
		||||
    //       userAddress,
 | 
			
		||||
    //       toAddress,
 | 
			
		||||
    //       expected,
 | 
			
		||||
    //       revertMessage
 | 
			
		||||
    //     );
 | 
			
		||||
    //   }
 | 
			
		||||
    //   break;
 | 
			
		||||
 | 
			
		||||
//     case 'redirectInterestStreamOf':
 | 
			
		||||
//       {
 | 
			
		||||
//         const {from, to} = action.args;
 | 
			
		||||
    // case "redirectInterestStreamOf":
 | 
			
		||||
    //   {
 | 
			
		||||
    //     const {from, to} = action.args;
 | 
			
		||||
 | 
			
		||||
//         if (!from || from === '') {
 | 
			
		||||
//           throw `A from address must be specified when trying to redirect the interest`;
 | 
			
		||||
//         }
 | 
			
		||||
//         if (!to || to === '') {
 | 
			
		||||
//           throw `A target must be selected when trying to redirect the interest`;
 | 
			
		||||
//         }
 | 
			
		||||
//         const toAddress = users[parseInt(to)];
 | 
			
		||||
//         const fromAddress = users[parseInt(from)];
 | 
			
		||||
    //     if (!from || from === "") {
 | 
			
		||||
    //       throw `A from address must be specified when trying to redirect the interest`;
 | 
			
		||||
    //     }
 | 
			
		||||
    //     if (!to || to === "") {
 | 
			
		||||
    //       throw `A target must be selected when trying to redirect the interest`;
 | 
			
		||||
    //     }
 | 
			
		||||
    //     const toAddress = users[parseInt(to)];
 | 
			
		||||
    //     const fromAddress = users[parseInt(from)];
 | 
			
		||||
 | 
			
		||||
//         await redirectInterestStreamOf(
 | 
			
		||||
//           reserve,
 | 
			
		||||
//           userAddress,
 | 
			
		||||
//           fromAddress,
 | 
			
		||||
//           toAddress,
 | 
			
		||||
//           expected,
 | 
			
		||||
//           revertMessage
 | 
			
		||||
//         );
 | 
			
		||||
//       }
 | 
			
		||||
//       break;
 | 
			
		||||
    //     await redirectInterestStreamOf(
 | 
			
		||||
    //       reserve,
 | 
			
		||||
    //       userAddress,
 | 
			
		||||
    //       fromAddress,
 | 
			
		||||
    //       toAddress,
 | 
			
		||||
    //       expected,
 | 
			
		||||
    //       revertMessage
 | 
			
		||||
    //     );
 | 
			
		||||
    //   }
 | 
			
		||||
    //   break;
 | 
			
		||||
 | 
			
		||||
//     case 'allowInterestRedirectionTo':
 | 
			
		||||
//       {
 | 
			
		||||
//         const {to} = action.args;
 | 
			
		||||
    // case "allowInterestRedirectionTo":
 | 
			
		||||
    //   {
 | 
			
		||||
    //     const {to} = action.args;
 | 
			
		||||
 | 
			
		||||
//         if (!to || to === '') {
 | 
			
		||||
//           throw `A target must be selected when trying to redirect the interest`;
 | 
			
		||||
//         }
 | 
			
		||||
//         const toAddress = users[parseInt(to)];
 | 
			
		||||
    //     if (!to || to === "") {
 | 
			
		||||
    //       throw `A target must be selected when trying to redirect the interest`;
 | 
			
		||||
    //     }
 | 
			
		||||
    //     const toAddress = users[parseInt(to)];
 | 
			
		||||
 | 
			
		||||
//         await allowInterestRedirectionTo(reserve, userAddress, toAddress, expected, revertMessage);
 | 
			
		||||
//       }
 | 
			
		||||
//       break;
 | 
			
		||||
//     default:
 | 
			
		||||
//       throw `Invalid action requested: ${name}`;
 | 
			
		||||
//   }
 | 
			
		||||
// };
 | 
			
		||||
    //     await allowInterestRedirectionTo(
 | 
			
		||||
    //       reserve,
 | 
			
		||||
    //       userAddress,
 | 
			
		||||
    //       toAddress,
 | 
			
		||||
    //       expected,
 | 
			
		||||
    //       revertMessage
 | 
			
		||||
    //     );
 | 
			
		||||
    //   }
 | 
			
		||||
    //   break;
 | 
			
		||||
    default:
 | 
			
		||||
      throw `Invalid action requested: ${name}`;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -1,172 +1,159 @@
 | 
			
		|||
// import {
 | 
			
		||||
//   ERC20DetailedInstance,
 | 
			
		||||
//   LendingPoolInstance,
 | 
			
		||||
//   LendingRateOracleInstance,
 | 
			
		||||
//   ATokenInstance,
 | 
			
		||||
//   LendingPoolCoreInstance,
 | 
			
		||||
// } from '../../utils/typechain-types/truffle-contracts';
 | 
			
		||||
// import {getTruffleContractInstance} from '../../utils/truffle/truffle-core-utils';
 | 
			
		||||
// import {ContractId} from '../../utils/types';
 | 
			
		||||
// import {ReserveData, UserReserveData} from './interfaces';
 | 
			
		||||
// import BigNumber from 'bignumber.js';
 | 
			
		||||
// import {configuration} from '../actions';
 | 
			
		||||
// import {NIL_ADDRESS, ETHEREUM_ADDRESS} from '../../utils/constants';
 | 
			
		||||
import {LendingPool} from "../../../types/LendingPool";
 | 
			
		||||
import {ReserveData, UserReserveData} from "./interfaces";
 | 
			
		||||
import {
 | 
			
		||||
  getLendingRateOracle,
 | 
			
		||||
  getIErc20Detailed,
 | 
			
		||||
  getMintableErc20,
 | 
			
		||||
  getAToken,
 | 
			
		||||
} from "../../../helpers/contracts-helpers";
 | 
			
		||||
import {MOCK_ETH_ADDRESS, ZERO_ADDRESS} from "../../../helpers/constants";
 | 
			
		||||
import {tEthereumAddress} from "../../../helpers/types";
 | 
			
		||||
import BigNumber from "bignumber.js";
 | 
			
		||||
import {getDb, BRE} from "../../../helpers/misc-utils";
 | 
			
		||||
import {LendingPoolCore} from "../../../types/LendingPoolCore";
 | 
			
		||||
 | 
			
		||||
// export const getReserveData = async (
 | 
			
		||||
//   poolInstance: LendingPoolInstance,
 | 
			
		||||
//   reserve: string,
 | 
			
		||||
//   artifacts: Truffle.Artifacts
 | 
			
		||||
// ): Promise<ReserveData> => {
 | 
			
		||||
//   const data: any = await poolInstance.getReserveData(reserve);
 | 
			
		||||
//   const rateOracle: LendingRateOracleInstance = await getTruffleContractInstance(
 | 
			
		||||
//     artifacts,
 | 
			
		||||
//     ContractId.LendingRateOracle
 | 
			
		||||
//   );
 | 
			
		||||
export const getReserveData = async (
 | 
			
		||||
  pool: LendingPool,
 | 
			
		||||
  reserve: tEthereumAddress
 | 
			
		||||
): Promise<ReserveData> => {
 | 
			
		||||
  const data: any = await pool.getReserveData(reserve);
 | 
			
		||||
  const rateOracle = await getLendingRateOracle();
 | 
			
		||||
 | 
			
		||||
//   const rate = await rateOracle.getMarketBorrowRate(reserve);
 | 
			
		||||
  const rate = (await rateOracle.getMarketBorrowRate(reserve)).toString();
 | 
			
		||||
 | 
			
		||||
//   const isEthReserve = reserve === ETHEREUM_ADDRESS;
 | 
			
		||||
//   let symbol = 'ETH';
 | 
			
		||||
//   let decimals = new BigNumber(18);
 | 
			
		||||
//   if (!isEthReserve) {
 | 
			
		||||
//     const contractInstance: ERC20DetailedInstance = await getTruffleContractInstance(
 | 
			
		||||
//       artifacts,
 | 
			
		||||
//       ContractId.ERC20Detailed,
 | 
			
		||||
//       reserve
 | 
			
		||||
//     );
 | 
			
		||||
//     symbol = await contractInstance.symbol();
 | 
			
		||||
//     decimals = new BigNumber(await contractInstance.decimals());
 | 
			
		||||
//   }
 | 
			
		||||
  const isEthReserve = reserve === MOCK_ETH_ADDRESS;
 | 
			
		||||
  let symbol = "ETH";
 | 
			
		||||
  let decimals = new BigNumber(18);
 | 
			
		||||
  if (!isEthReserve) {
 | 
			
		||||
    const token = await getIErc20Detailed(reserve);
 | 
			
		||||
    symbol = await token.symbol();
 | 
			
		||||
    decimals = new BigNumber(await token.decimals());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
//   return {
 | 
			
		||||
//     totalLiquidity: new BigNumber(data.totalLiquidity),
 | 
			
		||||
//     availableLiquidity: new BigNumber(data.availableLiquidity),
 | 
			
		||||
//     totalBorrowsStable: new BigNumber(data.totalBorrowsStable),
 | 
			
		||||
//     totalBorrowsVariable: new BigNumber(data.totalBorrowsVariable),
 | 
			
		||||
//     liquidityRate: new BigNumber(data.liquidityRate),
 | 
			
		||||
//     variableBorrowRate: new BigNumber(data.variableBorrowRate),
 | 
			
		||||
//     stableBorrowRate: new BigNumber(data.stableBorrowRate),
 | 
			
		||||
//     averageStableBorrowRate: new BigNumber(data.averageStableBorrowRate),
 | 
			
		||||
//     utilizationRate: new BigNumber(data.utilizationRate),
 | 
			
		||||
//     liquidityIndex: new BigNumber(data.liquidityIndex),
 | 
			
		||||
//     variableBorrowIndex: new BigNumber(data.variableBorrowIndex),
 | 
			
		||||
//     lastUpdateTimestamp: new BigNumber(data.lastUpdateTimestamp),
 | 
			
		||||
//     address: reserve,
 | 
			
		||||
//     aTokenAddress: data.aTokenAddress,
 | 
			
		||||
//     symbol,
 | 
			
		||||
//     decimals,
 | 
			
		||||
//     marketStableRate: new BigNumber(rate),
 | 
			
		||||
//   };
 | 
			
		||||
// };
 | 
			
		||||
  return {
 | 
			
		||||
    totalLiquidity: new BigNumber(data.totalLiquidity),
 | 
			
		||||
    availableLiquidity: new BigNumber(data.availableLiquidity),
 | 
			
		||||
    totalBorrowsStable: new BigNumber(data.totalBorrowsStable),
 | 
			
		||||
    totalBorrowsVariable: new BigNumber(data.totalBorrowsVariable),
 | 
			
		||||
    liquidityRate: new BigNumber(data.liquidityRate),
 | 
			
		||||
    variableBorrowRate: new BigNumber(data.variableBorrowRate),
 | 
			
		||||
    stableBorrowRate: new BigNumber(data.stableBorrowRate),
 | 
			
		||||
    averageStableBorrowRate: new BigNumber(data.averageStableBorrowRate),
 | 
			
		||||
    utilizationRate: new BigNumber(data.utilizationRate),
 | 
			
		||||
    liquidityIndex: new BigNumber(data.liquidityIndex),
 | 
			
		||||
    variableBorrowIndex: new BigNumber(data.variableBorrowIndex),
 | 
			
		||||
    lastUpdateTimestamp: new BigNumber(data.lastUpdateTimestamp),
 | 
			
		||||
    address: reserve,
 | 
			
		||||
    aTokenAddress: data.aTokenAddress,
 | 
			
		||||
    symbol,
 | 
			
		||||
    decimals,
 | 
			
		||||
    marketStableRate: new BigNumber(rate),
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// export const getUserData = async (
 | 
			
		||||
//   poolInstance: LendingPoolInstance,
 | 
			
		||||
//   coreInstance: LendingPoolCoreInstance,
 | 
			
		||||
//   reserve: string,
 | 
			
		||||
//   user: string,
 | 
			
		||||
//   artifacts: Truffle.Artifacts
 | 
			
		||||
// ): Promise<UserReserveData> => {
 | 
			
		||||
//   const {web3} = configuration;
 | 
			
		||||
export const getUserData = async (
 | 
			
		||||
  pool: LendingPool,
 | 
			
		||||
  core: LendingPoolCore,
 | 
			
		||||
  reserve: string,
 | 
			
		||||
  user: string
 | 
			
		||||
): Promise<UserReserveData> => {
 | 
			
		||||
  const [data, aTokenData] = await Promise.all([
 | 
			
		||||
    pool.getUserReserveData(reserve, user),
 | 
			
		||||
    getATokenUserData(reserve, user, core),
 | 
			
		||||
  ]);
 | 
			
		||||
 | 
			
		||||
//   const [data, aTokenData] = await Promise.all([
 | 
			
		||||
//     poolInstance.getUserReserveData(reserve, user),
 | 
			
		||||
//     getATokenUserData(reserve, user, coreInstance),
 | 
			
		||||
//   ]);
 | 
			
		||||
  const [
 | 
			
		||||
    userIndex,
 | 
			
		||||
    redirectedBalance,
 | 
			
		||||
    principalATokenBalance,
 | 
			
		||||
    redirectionAddressRedirectedBalance,
 | 
			
		||||
    interestRedirectionAddress,
 | 
			
		||||
  ] = aTokenData;
 | 
			
		||||
 | 
			
		||||
//   const [
 | 
			
		||||
//     userIndex,
 | 
			
		||||
//     redirectedBalance,
 | 
			
		||||
//     principalATokenBalance,
 | 
			
		||||
//     redirectionAddressRedirectedBalance,
 | 
			
		||||
//     interestRedirectionAddress,
 | 
			
		||||
//   ] = aTokenData;
 | 
			
		||||
  let walletBalance;
 | 
			
		||||
 | 
			
		||||
//   let walletBalance;
 | 
			
		||||
  if (reserve === MOCK_ETH_ADDRESS) {
 | 
			
		||||
    walletBalance = new BigNumber(
 | 
			
		||||
      (await BRE.ethers.provider.getBalance(user)).toString()
 | 
			
		||||
    );
 | 
			
		||||
  } else {
 | 
			
		||||
    const token = await getMintableErc20(reserve);
 | 
			
		||||
    walletBalance = new BigNumber((await token.balanceOf(user)).toString());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
//   if (reserve === ETHEREUM_ADDRESS) {
 | 
			
		||||
//     walletBalance = new BigNumber(await web3.eth.getBalance(user));
 | 
			
		||||
//   } else {
 | 
			
		||||
//     const reserveInstance: ERC20DetailedInstance = await getTruffleContractInstance(
 | 
			
		||||
//       artifacts,
 | 
			
		||||
//       ContractId.ERC20Detailed,
 | 
			
		||||
//       reserve
 | 
			
		||||
//     );
 | 
			
		||||
//     walletBalance = new BigNumber(await reserveInstance.balanceOf(user));
 | 
			
		||||
//   }
 | 
			
		||||
  const userData: any = data;
 | 
			
		||||
 | 
			
		||||
//   const userData : any = data
 | 
			
		||||
  
 | 
			
		||||
//   return {
 | 
			
		||||
//     principalATokenBalance: new BigNumber(principalATokenBalance),
 | 
			
		||||
//     interestRedirectionAddress,
 | 
			
		||||
//     redirectionAddressRedirectedBalance: new BigNumber(redirectionAddressRedirectedBalance),
 | 
			
		||||
//     redirectedBalance: new BigNumber(redirectedBalance),
 | 
			
		||||
//     currentATokenUserIndex: new BigNumber(userIndex),
 | 
			
		||||
//     currentATokenBalance: new BigNumber(userData.currentATokenBalance),
 | 
			
		||||
//     currentBorrowBalance: new BigNumber(userData.currentBorrowBalance),
 | 
			
		||||
//     principalBorrowBalance: new BigNumber(userData.principalBorrowBalance),
 | 
			
		||||
//     borrowRateMode: userData.borrowRateMode.toString(),
 | 
			
		||||
//     borrowRate: new BigNumber(userData.borrowRate),
 | 
			
		||||
//     liquidityRate: new BigNumber(userData.liquidityRate),
 | 
			
		||||
//     originationFee: new BigNumber(userData.originationFee),
 | 
			
		||||
//     variableBorrowIndex: new BigNumber(userData.variableBorrowIndex),
 | 
			
		||||
//     lastUpdateTimestamp: new BigNumber(userData.lastUpdateTimestamp),
 | 
			
		||||
//     usageAsCollateralEnabled: userData.usageAsCollateralEnabled,
 | 
			
		||||
//     walletBalance,
 | 
			
		||||
//   };
 | 
			
		||||
// };
 | 
			
		||||
  return {
 | 
			
		||||
    principalATokenBalance: new BigNumber(principalATokenBalance),
 | 
			
		||||
    interestRedirectionAddress,
 | 
			
		||||
    redirectionAddressRedirectedBalance: new BigNumber(
 | 
			
		||||
      redirectionAddressRedirectedBalance
 | 
			
		||||
    ),
 | 
			
		||||
    redirectedBalance: new BigNumber(redirectedBalance),
 | 
			
		||||
    currentATokenUserIndex: new BigNumber(userIndex),
 | 
			
		||||
    currentATokenBalance: new BigNumber(userData.currentATokenBalance),
 | 
			
		||||
    currentBorrowBalance: new BigNumber(userData.currentBorrowBalance),
 | 
			
		||||
    principalBorrowBalance: new BigNumber(userData.principalBorrowBalance),
 | 
			
		||||
    borrowRateMode: userData.borrowRateMode.toString(),
 | 
			
		||||
    borrowRate: new BigNumber(userData.borrowRate),
 | 
			
		||||
    liquidityRate: new BigNumber(userData.liquidityRate),
 | 
			
		||||
    originationFee: new BigNumber(userData.originationFee),
 | 
			
		||||
    variableBorrowIndex: new BigNumber(userData.variableBorrowIndex),
 | 
			
		||||
    lastUpdateTimestamp: new BigNumber(userData.lastUpdateTimestamp),
 | 
			
		||||
    usageAsCollateralEnabled: userData.usageAsCollateralEnabled,
 | 
			
		||||
    walletBalance,
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// export const getReserveAddressFromSymbol = async (symbol: string, artifacts: Truffle.Artifacts) => {
 | 
			
		||||
//   if (symbol.toUpperCase() === 'ETH') {
 | 
			
		||||
//     return ETHEREUM_ADDRESS;
 | 
			
		||||
//   }
 | 
			
		||||
export const getReserveAddressFromSymbol = async (symbol: string) => {
 | 
			
		||||
  if (symbol.toUpperCase() === "ETH") {
 | 
			
		||||
    return MOCK_ETH_ADDRESS;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
//   const contractName: string = 'Mock' + symbol.toUpperCase();
 | 
			
		||||
  const token = await getMintableErc20(
 | 
			
		||||
    (await getDb().get(`${symbol}.${BRE.network.name}`).value()).address
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
//   const contractInstance: ERC20DetailedInstance = await getTruffleContractInstance(artifacts, <
 | 
			
		||||
//     ContractId
 | 
			
		||||
//   >contractName);
 | 
			
		||||
  if (!token) {
 | 
			
		||||
    throw `Could not find instance for contract ${symbol}`;
 | 
			
		||||
  }
 | 
			
		||||
  return token.address;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//   if (!contractInstance) {
 | 
			
		||||
//     throw `Could not find instance for contract ${contractName}`;
 | 
			
		||||
//   }
 | 
			
		||||
//   return contractInstance.address;
 | 
			
		||||
// };
 | 
			
		||||
const getATokenUserData = async (
 | 
			
		||||
  reserve: string,
 | 
			
		||||
  user: string,
 | 
			
		||||
  core: LendingPoolCore
 | 
			
		||||
) => {
 | 
			
		||||
  const aTokenAddress: string = await core.getReserveATokenAddress(reserve);
 | 
			
		||||
 | 
			
		||||
// const getATokenUserData = async (
 | 
			
		||||
//   reserve: string,
 | 
			
		||||
//   user: string,
 | 
			
		||||
//   coreInstance: LendingPoolCoreInstance
 | 
			
		||||
// ) => {
 | 
			
		||||
//   const aTokenAddress: string = await coreInstance.getReserveATokenAddress(reserve);
 | 
			
		||||
  const aToken = await getAToken(aTokenAddress);
 | 
			
		||||
  const [
 | 
			
		||||
    userIndex,
 | 
			
		||||
    interestRedirectionAddress,
 | 
			
		||||
    redirectedBalance,
 | 
			
		||||
    principalTokenBalance,
 | 
			
		||||
  ] = await Promise.all([
 | 
			
		||||
    aToken.getUserIndex(user),
 | 
			
		||||
    aToken.getInterestRedirectionAddress(user),
 | 
			
		||||
    aToken.getRedirectedBalance(user),
 | 
			
		||||
    aToken.principalBalanceOf(user),
 | 
			
		||||
  ]);
 | 
			
		||||
 | 
			
		||||
//   const aTokenInstance: ATokenInstance = await getTruffleContractInstance(
 | 
			
		||||
//     artifacts,
 | 
			
		||||
//     ContractId.AToken,
 | 
			
		||||
//     aTokenAddress
 | 
			
		||||
//   );
 | 
			
		||||
//   const [
 | 
			
		||||
//     userIndex,
 | 
			
		||||
//     interestRedirectionAddress,
 | 
			
		||||
//     redirectedBalance,
 | 
			
		||||
//     principalTokenBalance,
 | 
			
		||||
//   ] = await Promise.all([
 | 
			
		||||
//     aTokenInstance.getUserIndex(user),
 | 
			
		||||
//     aTokenInstance.getInterestRedirectionAddress(user),
 | 
			
		||||
//     aTokenInstance.getRedirectedBalance(user),
 | 
			
		||||
//     aTokenInstance.principalBalanceOf(user),
 | 
			
		||||
//   ]);
 | 
			
		||||
  const redirectionAddressRedirectedBalance =
 | 
			
		||||
    interestRedirectionAddress !== ZERO_ADDRESS
 | 
			
		||||
      ? new BigNumber(
 | 
			
		||||
          (
 | 
			
		||||
            await aToken.getRedirectedBalance(interestRedirectionAddress)
 | 
			
		||||
          ).toString()
 | 
			
		||||
        )
 | 
			
		||||
      : new BigNumber("0");
 | 
			
		||||
 | 
			
		||||
//   const redirectionAddressRedirectedBalance =
 | 
			
		||||
//     interestRedirectionAddress !== NIL_ADDRESS
 | 
			
		||||
//       ? new BigNumber(await aTokenInstance.getRedirectedBalance(interestRedirectionAddress))
 | 
			
		||||
//       : new BigNumber('0');
 | 
			
		||||
 | 
			
		||||
//   return [
 | 
			
		||||
//     userIndex.toString(),
 | 
			
		||||
//     redirectedBalance.toString(),
 | 
			
		||||
//     principalTokenBalance.toString(),
 | 
			
		||||
//     redirectionAddressRedirectedBalance.toString(),
 | 
			
		||||
//     interestRedirectionAddress,
 | 
			
		||||
//   ];
 | 
			
		||||
// };
 | 
			
		||||
  return [
 | 
			
		||||
    userIndex.toString(),
 | 
			
		||||
    redirectedBalance.toString(),
 | 
			
		||||
    principalTokenBalance.toString(),
 | 
			
		||||
    redirectionAddressRedirectedBalance.toString(),
 | 
			
		||||
    interestRedirectionAddress,
 | 
			
		||||
  ];
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,80 +1,102 @@
 | 
			
		|||
// import {RAY, WAD, HALF_RAY, HALF_WAD, WAD_RAY_RATIO} from "../../utils/constants"
 | 
			
		||||
// import BigNumber from "bignumber.js"
 | 
			
		||||
import BigNumber from "bignumber.js";
 | 
			
		||||
import {
 | 
			
		||||
  RAY,
 | 
			
		||||
  WAD,
 | 
			
		||||
  HALF_RAY,
 | 
			
		||||
  HALF_WAD,
 | 
			
		||||
  WAD_RAY_RATIO,
 | 
			
		||||
} from "../../../helpers/constants";
 | 
			
		||||
 | 
			
		||||
declare module "bignumber.js" {
 | 
			
		||||
  interface BigNumber {
 | 
			
		||||
    ray: () => BigNumber;
 | 
			
		||||
    wad: () => BigNumber;
 | 
			
		||||
    halfRay: () => BigNumber;
 | 
			
		||||
    halfWad: () => BigNumber;
 | 
			
		||||
    wadMul: (a: BigNumber) => BigNumber;
 | 
			
		||||
    wadDiv: (a: BigNumber) => BigNumber;
 | 
			
		||||
    rayMul: (a: BigNumber) => BigNumber;
 | 
			
		||||
    rayDiv: (a: BigNumber) => BigNumber;
 | 
			
		||||
    rayToWad: () => BigNumber;
 | 
			
		||||
    wadToRay: () => BigNumber;
 | 
			
		||||
    rayPow: (n: BigNumber) => BigNumber;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// declare module "bignumber.js" {
 | 
			
		||||
//   interface BigNumber {
 | 
			
		||||
//     ray: () => BigNumber
 | 
			
		||||
//     wad: () => BigNumber
 | 
			
		||||
//     halfRay: () => BigNumber
 | 
			
		||||
//     halfWad: () => BigNumber
 | 
			
		||||
//     wadMul: (a: BigNumber) => BigNumber
 | 
			
		||||
//     wadDiv: (a: BigNumber) => BigNumber
 | 
			
		||||
//     rayMul: (a: BigNumber) => BigNumber
 | 
			
		||||
//     rayDiv: (a: BigNumber) => BigNumber
 | 
			
		||||
//     rayToWad: () => BigNumber
 | 
			
		||||
//     wadToRay: () => BigNumber
 | 
			
		||||
//     rayPow: (n: BigNumber) => BigNumber
 | 
			
		||||
//   }
 | 
			
		||||
// }
 | 
			
		||||
BigNumber.prototype.ray = (): BigNumber => {
 | 
			
		||||
  return new BigNumber(RAY).decimalPlaces(0);
 | 
			
		||||
};
 | 
			
		||||
BigNumber.prototype.wad = (): BigNumber => {
 | 
			
		||||
  return new BigNumber(WAD).decimalPlaces(0);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// BigNumber.prototype.ray = (): BigNumber => {
 | 
			
		||||
//   return new BigNumber(RAY).decimalPlaces(0)
 | 
			
		||||
// }
 | 
			
		||||
// BigNumber.prototype.wad = (): BigNumber => {
 | 
			
		||||
//   return new BigNumber(WAD).decimalPlaces(0)
 | 
			
		||||
// }
 | 
			
		||||
BigNumber.prototype.halfRay = (): BigNumber => {
 | 
			
		||||
  return new BigNumber(HALF_RAY).decimalPlaces(0, BigNumber.ROUND_DOWN);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// BigNumber.prototype.halfRay = (): BigNumber => {
 | 
			
		||||
//   return new BigNumber(HALF_RAY).decimalPlaces(0, BigNumber.ROUND_DOWN)
 | 
			
		||||
// }
 | 
			
		||||
BigNumber.prototype.halfWad = (): BigNumber => {
 | 
			
		||||
  return new BigNumber(HALF_WAD).decimalPlaces(0, BigNumber.ROUND_DOWN);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// BigNumber.prototype.halfWad = (): BigNumber => {
 | 
			
		||||
//   return new BigNumber(HALF_WAD).decimalPlaces(0, BigNumber.ROUND_DOWN)
 | 
			
		||||
// }
 | 
			
		||||
BigNumber.prototype.wadMul = function (b: BigNumber): BigNumber {
 | 
			
		||||
  return this.halfWad()
 | 
			
		||||
    .plus(this.multipliedBy(b))
 | 
			
		||||
    .div(WAD)
 | 
			
		||||
    .decimalPlaces(0, BigNumber.ROUND_DOWN);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// BigNumber.prototype.wadMul = function(b: BigNumber): BigNumber {
 | 
			
		||||
//   return this.halfWad().plus(this.multipliedBy(b)).div(WAD).decimalPlaces(0,BigNumber.ROUND_DOWN)
 | 
			
		||||
// }
 | 
			
		||||
BigNumber.prototype.wadDiv = function (a: BigNumber): BigNumber {
 | 
			
		||||
  const halfA = a.div(2).decimalPlaces(0, BigNumber.ROUND_DOWN);
 | 
			
		||||
 | 
			
		||||
// BigNumber.prototype.wadDiv = function(a: BigNumber) : BigNumber {
 | 
			
		||||
//   const halfA = a.div(2).decimalPlaces(0,BigNumber.ROUND_DOWN)
 | 
			
		||||
  return halfA
 | 
			
		||||
    .plus(this.multipliedBy(WAD))
 | 
			
		||||
    .div(a)
 | 
			
		||||
    .decimalPlaces(0, BigNumber.ROUND_DOWN);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//   return halfA.plus(this.multipliedBy(WAD)).div(a).decimalPlaces(0, BigNumber.ROUND_DOWN)
 | 
			
		||||
// }
 | 
			
		||||
BigNumber.prototype.rayMul = function (a: BigNumber): BigNumber {
 | 
			
		||||
  return this.halfRay()
 | 
			
		||||
    .plus(this.multipliedBy(a))
 | 
			
		||||
    .div(RAY)
 | 
			
		||||
    .decimalPlaces(0, BigNumber.ROUND_DOWN);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// BigNumber.prototype.rayMul = function(a: BigNumber) : BigNumber {
 | 
			
		||||
//   return this.halfRay().plus(this.multipliedBy(a)).div(RAY).decimalPlaces(0, BigNumber.ROUND_DOWN)
 | 
			
		||||
// }
 | 
			
		||||
BigNumber.prototype.rayDiv = function (a: BigNumber): BigNumber {
 | 
			
		||||
  const halfA = a.div(2).decimalPlaces(0, BigNumber.ROUND_DOWN);
 | 
			
		||||
 | 
			
		||||
// BigNumber.prototype.rayDiv = function(a: BigNumber) : BigNumber{
 | 
			
		||||
//   const halfA = a.div(2).decimalPlaces(0,BigNumber.ROUND_DOWN)
 | 
			
		||||
  return halfA
 | 
			
		||||
    .plus(this.multipliedBy(RAY))
 | 
			
		||||
    .decimalPlaces(0, BigNumber.ROUND_DOWN)
 | 
			
		||||
    .div(a)
 | 
			
		||||
    .decimalPlaces(0, BigNumber.ROUND_DOWN);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//   return halfA.plus(this.multipliedBy(RAY)).decimalPlaces(0,BigNumber.ROUND_DOWN).div(a).decimalPlaces(0,BigNumber.ROUND_DOWN)
 | 
			
		||||
// }
 | 
			
		||||
BigNumber.prototype.rayToWad = function (): BigNumber {
 | 
			
		||||
  const halfRatio = new BigNumber(WAD_RAY_RATIO).div(2);
 | 
			
		||||
 | 
			
		||||
// BigNumber.prototype.rayToWad = function(): BigNumber{
 | 
			
		||||
//   const halfRatio = new BigNumber(WAD_RAY_RATIO).div(2);
 | 
			
		||||
  return halfRatio
 | 
			
		||||
    .plus(this)
 | 
			
		||||
    .div(WAD_RAY_RATIO)
 | 
			
		||||
    .decimalPlaces(0, BigNumber.ROUND_DOWN);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//   return halfRatio.plus(this).div(WAD_RAY_RATIO).decimalPlaces(0, BigNumber.ROUND_DOWN)
 | 
			
		||||
// }
 | 
			
		||||
BigNumber.prototype.wadToRay = function (): BigNumber {
 | 
			
		||||
  return this.multipliedBy(WAD_RAY_RATIO).decimalPlaces(
 | 
			
		||||
    0,
 | 
			
		||||
    BigNumber.ROUND_DOWN
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// BigNumber.prototype.wadToRay = function() : BigNumber {
 | 
			
		||||
//   return this.multipliedBy(WAD_RAY_RATIO).decimalPlaces(0, BigNumber.ROUND_DOWN)
 | 
			
		||||
// }
 | 
			
		||||
BigNumber.prototype.rayPow = function (n: BigNumber): BigNumber {
 | 
			
		||||
  let z = !n.modulo(2).eq(0) ? this : new BigNumber(RAY);
 | 
			
		||||
  let x = new BigNumber(this);
 | 
			
		||||
 | 
			
		||||
  for (n = n.div(2); !n.eq(0); n = n.div(2)) {
 | 
			
		||||
    x = x.rayMul(x);
 | 
			
		||||
 | 
			
		||||
// BigNumber.prototype.rayPow = function(n: BigNumber) : BigNumber {
 | 
			
		||||
 | 
			
		||||
//     let z = !n.modulo(2).eq(0) ? this : new BigNumber(RAY);
 | 
			
		||||
//     let x = new BigNumber(this)
 | 
			
		||||
    
 | 
			
		||||
//     for (n = n.div(2); !n.eq(0); n = n.div(2)) {
 | 
			
		||||
//         x = x.rayMul(x);
 | 
			
		||||
 | 
			
		||||
//         if (!n.modulo(2).eq(0)) {
 | 
			
		||||
//             z = z.rayMul(x);
 | 
			
		||||
//         }
 | 
			
		||||
//     }
 | 
			
		||||
//     return z;
 | 
			
		||||
//   }
 | 
			
		||||
    if (!n.modulo(2).eq(0)) {
 | 
			
		||||
      z = z.rayMul(x);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return z;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,56 +1,36 @@
 | 
			
		|||
// import {ITestEnvWithoutInstances} from '../utils/types';
 | 
			
		||||
import {configuration as actionsConfiguration} from "./helpers/actions";
 | 
			
		||||
import {configuration as calculationsConfiguration} from "./helpers/utils/calculations";
 | 
			
		||||
 | 
			
		||||
// import {testEnvProviderWithoutInstances} from '../utils/truffle/dlp-tests-env';
 | 
			
		||||
// import {configuration as actionsConfiguration, deposit} from './actions';
 | 
			
		||||
// import {configuration as calculationsConfiguration} from './utils/calculations';
 | 
			
		||||
// import {executeStory} from './engine/scenario-engine';
 | 
			
		||||
// import fs from 'fs';
 | 
			
		||||
// import BigNumber from 'bignumber.js';
 | 
			
		||||
// import {ETHEREUM_ADDRESS} from '../utils/constants';
 | 
			
		||||
import fs from "fs";
 | 
			
		||||
import BigNumber from "bignumber.js";
 | 
			
		||||
import {makeSuite} from "./helpers/make-suite";
 | 
			
		||||
import {MOCK_ETH_ADDRESS, getReservesConfigByPool} from "../helpers/constants";
 | 
			
		||||
import {AavePools, iAavePoolAssets, IReserveParams} from "../helpers/types";
 | 
			
		||||
import {executeStory} from "./helpers/scenario-engine";
 | 
			
		||||
 | 
			
		||||
// BigNumber.config({DECIMAL_PLACES: 0, ROUNDING_MODE: BigNumber.ROUND_DOWN});
 | 
			
		||||
BigNumber.config({DECIMAL_PLACES: 0, ROUNDING_MODE: BigNumber.ROUND_DOWN});
 | 
			
		||||
 | 
			
		||||
// const scenarioFolder = './test/scenarios/';
 | 
			
		||||
const scenarioFolder = "./test/helpers/scenarios/";
 | 
			
		||||
 | 
			
		||||
// fs.readdirSync(scenarioFolder).forEach(file => {
 | 
			
		||||
//   //  if (file !== "interest-redirection-negatives.json"  &&
 | 
			
		||||
//   //      file !== "interest-redirection.json" ) return
 | 
			
		||||
fs.readdirSync(scenarioFolder).forEach((file) => {
 | 
			
		||||
  if (file !== "deposit.json") return;
 | 
			
		||||
 | 
			
		||||
//   const scenario = require(`./scenarios/${file}`);
 | 
			
		||||
  const scenario = require(`./helpers/scenarios/${file}`);
 | 
			
		||||
 | 
			
		||||
//   contract(scenario.title, async ([deployer, ...users]) => {
 | 
			
		||||
//     let _testEnvProvider: ITestEnvWithoutInstances;
 | 
			
		||||
  makeSuite(scenario.title, async (testEnv) => {
 | 
			
		||||
    before("Initializing configuration", async () => {
 | 
			
		||||
      actionsConfiguration.skipIntegrityCheck = false; //set this to true to execute solidity-coverage
 | 
			
		||||
 | 
			
		||||
//     before('Initializing configuration', async () => {
 | 
			
		||||
//       console.time('setup-test');
 | 
			
		||||
//       _testEnvProvider = await testEnvProviderWithoutInstances(artifacts, [deployer, ...users]);
 | 
			
		||||
      calculationsConfiguration.reservesParams = <
 | 
			
		||||
        iAavePoolAssets<IReserveParams>
 | 
			
		||||
      >getReservesConfigByPool(AavePools.proto);
 | 
			
		||||
      calculationsConfiguration.ethereumAddress = MOCK_ETH_ADDRESS;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
//       const {
 | 
			
		||||
//         getWeb3,
 | 
			
		||||
//         getAavePoolReservesParams,
 | 
			
		||||
//         getLendingPoolInstance,
 | 
			
		||||
//         getLendingPoolCoreInstance,
 | 
			
		||||
//       } = _testEnvProvider;
 | 
			
		||||
 | 
			
		||||
//       const instances = await Promise.all([getLendingPoolInstance(), getLendingPoolCoreInstance()]);
 | 
			
		||||
 | 
			
		||||
//       actionsConfiguration.lendingPoolInstance = instances[0];
 | 
			
		||||
//       actionsConfiguration.lendingPoolCoreInstance = instances[1];
 | 
			
		||||
//       actionsConfiguration.ethereumAddress = ETHEREUM_ADDRESS;
 | 
			
		||||
//       actionsConfiguration.artifacts = artifacts;
 | 
			
		||||
//       actionsConfiguration.web3 = await getWeb3();
 | 
			
		||||
//       actionsConfiguration.skipIntegrityCheck = false; //set this to true to execute solidity-coverage
 | 
			
		||||
 | 
			
		||||
//       calculationsConfiguration.reservesParams = await getAavePoolReservesParams();
 | 
			
		||||
//       calculationsConfiguration.web3 = actionsConfiguration.web3;
 | 
			
		||||
//       calculationsConfiguration.ethereumAddress = actionsConfiguration.ethereumAddress;
 | 
			
		||||
//       console.time('setup-test');
 | 
			
		||||
//     });
 | 
			
		||||
 | 
			
		||||
//     for (const story of scenario.stories) {
 | 
			
		||||
//       it(story.description, async () => {
 | 
			
		||||
//         await executeStory(story, users);
 | 
			
		||||
//       });
 | 
			
		||||
//     }
 | 
			
		||||
//   });
 | 
			
		||||
// });
 | 
			
		||||
    for (const story of scenario.stories) {
 | 
			
		||||
      it(story.description, async () => {
 | 
			
		||||
        await executeStory(story, testEnv);
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user