mirror of
				https://github.com/Instadapp/aave-protocol-v2.git
				synced 2024-07-29 21:47:30 +00:00 
			
		
		
		
	- Finished migration of flashloan.spec.ts.
- Fixed issue with buidlerevm snapshotting.
This commit is contained in:
		
							parent
							
								
									99cbb5f0a4
								
							
						
					
					
						commit
						0b17abc6eb
					
				| 
						 | 
				
			
			@ -61,7 +61,7 @@ const config: BuidlerConfig = {
 | 
			
		|||
    url: "https://api-kovan.etherscan.io/api",
 | 
			
		||||
    apiKey: ETHERSCAN_KEY,
 | 
			
		||||
  },
 | 
			
		||||
  defaultNetwork: "ganache",
 | 
			
		||||
  defaultNetwork: "buidlerevm",
 | 
			
		||||
  mocha: {
 | 
			
		||||
    timeout: 0,
 | 
			
		||||
  },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -467,6 +467,30 @@ export const getInterestRateStrategy = async (address?: tEthereumAddress) => {
 | 
			
		|||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const getMockFlashLoanReceiver = async (address?: tEthereumAddress) => {
 | 
			
		||||
  return await getContract<MockFlashLoanReceiver>(
 | 
			
		||||
    eContractid.MockFlashLoanReceiver,
 | 
			
		||||
    address ||
 | 
			
		||||
      (
 | 
			
		||||
        await getDb()
 | 
			
		||||
          .get(`${eContractid.MockFlashLoanReceiver}.${BRE.network.name}`)
 | 
			
		||||
          .value()
 | 
			
		||||
      ).address
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const getTokenDistributor = async (address?: tEthereumAddress) => {
 | 
			
		||||
  return await getContract<TokenDistributor>(
 | 
			
		||||
    eContractid.TokenDistributor,
 | 
			
		||||
    address ||
 | 
			
		||||
      (
 | 
			
		||||
        await getDb()
 | 
			
		||||
          .get(`${eContractid.TokenDistributor}.${BRE.network.name}`)
 | 
			
		||||
          .value()
 | 
			
		||||
      ).address
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const linkBytecode = (artifact: Artifact, libraries: any) => {
 | 
			
		||||
  let bytecode = artifact.bytecode;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,8 @@ export const sleep = (milliseconds: number) => {
 | 
			
		|||
 | 
			
		||||
export const createRandomAddress = () => Wallet.createRandom().address;
 | 
			
		||||
 | 
			
		||||
export const evmSnapshot = () => BRE.ethereum.send("evm_snapshot", []);
 | 
			
		||||
export const evmSnapshot = async () =>
 | 
			
		||||
  await BRE.ethereum.send("evm_snapshot", []);
 | 
			
		||||
 | 
			
		||||
export const evmRevert = async (id: string) =>
 | 
			
		||||
  BRE.ethereum.send("evm_revert", [id]);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,6 +55,9 @@ export enum ProtocolErrors {
 | 
			
		|||
  INVALID_REDIRECTION_ADDRESS = "Invalid redirection address",
 | 
			
		||||
  TRANSFERRED_AMOUNT_GT_ZERO = "Transferred amount needs to be greater than zero",
 | 
			
		||||
  ZERO_COLLATERAL = "The collateral balance is 0",
 | 
			
		||||
  INCONSISTENT_PROTOCOL_BALANCE = "The actual balance of the protocol is inconsistent",
 | 
			
		||||
  TOO_SMALL_FLASH_LOAN = "The requested amount is too small for a flashLoan.",
 | 
			
		||||
  NOT_ENOUGH_LIQUIDITY_TO_BORROW = "There is not enough liquidity available to borrow",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type tEthereumAddress = string;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -607,7 +607,18 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => {
 | 
			
		|||
    await addressesProvider.setTokenDistributor(tokenDistributorProxy.address)
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  await deployMockFlashLoanReceiver(addressesProvider.address);
 | 
			
		||||
  await insertContractAddressInDb(
 | 
			
		||||
    eContractid.TokenDistributor,
 | 
			
		||||
    tokenDistributorProxy.address
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  const mockFlashLoanReceiver = await deployMockFlashLoanReceiver(
 | 
			
		||||
    addressesProvider.address
 | 
			
		||||
  );
 | 
			
		||||
  await insertContractAddressInDb(
 | 
			
		||||
    eContractid.MockFlashLoanReceiver,
 | 
			
		||||
    mockFlashLoanReceiver.address
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  await deployWalletBalancerProvider(addressesProvider.address);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -626,7 +637,7 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => {
 | 
			
		|||
before(async () => {
 | 
			
		||||
  await rawBRE.run("set-bre");
 | 
			
		||||
  const [deployer, secondaryWallet] = await getEthersSigners();
 | 
			
		||||
  console.log("-> Deploying test environment...")
 | 
			
		||||
  console.log("-> Deploying test environment...");
 | 
			
		||||
  await buildTestEnv(deployer, secondaryWallet);
 | 
			
		||||
  console.log("\n***************");
 | 
			
		||||
  console.log("Setup and snapshot finished");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,111 +0,0 @@
 | 
			
		|||
// import { ITestEnv, ContractsInstancesOrigin } from "../utils/types";
 | 
			
		||||
// import { LendingPoolCoreInstance, LendingPoolAddressesProviderInstance } from "../utils/typechain-types/truffle-contracts";
 | 
			
		||||
// import { testEnvProvider } from "../utils/truffle/dlp-tests-env";
 | 
			
		||||
// import { RAY, WAD, ETHEREUM_ADDRESS } from "../utils/constants";
 | 
			
		||||
// import BigNumber from "bignumber.js";
 | 
			
		||||
 | 
			
		||||
// /*contract("LendingPoolCore", async ([deployer, ...users]) => {
 | 
			
		||||
//   let _testEnvProvider: ITestEnv
 | 
			
		||||
//   let _addressesProviderInstance: LendingPoolAddressesProviderInstance
 | 
			
		||||
//   let _lendingPoolCoreInstance: LendingPoolCoreInstance;
 | 
			
		||||
//   let _lendAddress: string;
 | 
			
		||||
 | 
			
		||||
//   before("Initializing LendingPoolCore test variables", async () => {
 | 
			
		||||
//     _testEnvProvider = await testEnvProvider(artifacts, [deployer, ...users], ContractsInstancesOrigin.TruffleArtifacts)
 | 
			
		||||
 | 
			
		||||
//     const {
 | 
			
		||||
//       deployedInstances: {
 | 
			
		||||
//         lendingPoolAddressesProviderInstance,
 | 
			
		||||
//         lendingPoolCoreInstance,
 | 
			
		||||
//       },
 | 
			
		||||
//       getAllAssetsAddresses
 | 
			
		||||
//     } = _testEnvProvider
 | 
			
		||||
//     _addressesProviderInstance = lendingPoolAddressesProviderInstance
 | 
			
		||||
//     _lendingPoolCoreInstance = lendingPoolCoreInstance
 | 
			
		||||
//     _lendAddress = (await getAllAssetsAddresses()).LEND
 | 
			
		||||
//   })
 | 
			
		||||
 | 
			
		||||
//   it("Configure the lending pool address to the owner address to allow invocation of the methods", async () => {
 | 
			
		||||
//     await _addressesProviderInstance.setLendingPoolConfiguratorImpl(deployer)
 | 
			
		||||
//     await _addressesProviderInstance.setLendingPoolImpl(deployer)
 | 
			
		||||
//     await _lendingPoolCoreInstance.refreshConfiguration()
 | 
			
		||||
//     const providerAddress = await _addressesProviderInstance.getLendingPoolConfigurator()
 | 
			
		||||
//     expect(providerAddress).to.be.equal(deployer)
 | 
			
		||||
//     const poolAddress = await _addressesProviderInstance.getLendingPool()
 | 
			
		||||
//     expect(poolAddress).to.be.equal(deployer)
 | 
			
		||||
//   })
 | 
			
		||||
 | 
			
		||||
//   it("Increases the stable total borrows of a reserve", async () => {
 | 
			
		||||
//     await _lendingPoolCoreInstance.increaseReserveTotalBorrowsStableAndUpdateAverageRate(
 | 
			
		||||
//       ETHEREUM_ADDRESS,
 | 
			
		||||
//       WAD,
 | 
			
		||||
//       new BigNumber(RAY).multipliedBy(10).toFixed(),
 | 
			
		||||
//     ) //10% interest
 | 
			
		||||
 | 
			
		||||
//     const totalBorrows = await _lendingPoolCoreInstance.getReserveTotalBorrowsStable(ETHEREUM_ADDRESS)
 | 
			
		||||
 | 
			
		||||
//     expect(totalBorrows.toString()).to.be.equal(WAD)
 | 
			
		||||
//   })
 | 
			
		||||
 | 
			
		||||
//   it("Increases the variable total borrows of a reserve", async () => {
 | 
			
		||||
//     await _lendingPoolCoreInstance.increaseReserveTotalBorrowsVariable(ETHEREUM_ADDRESS, WAD) //10% interest
 | 
			
		||||
 | 
			
		||||
//     const totalBorrows = await _lendingPoolCoreInstance.getReserveTotalBorrowsVariable(ETHEREUM_ADDRESS)
 | 
			
		||||
 | 
			
		||||
//     expect(totalBorrows.toString()).to.be.equal(WAD)
 | 
			
		||||
//   })
 | 
			
		||||
 | 
			
		||||
//   it("Decreases the stable total borrows of a reserve", async () => {
 | 
			
		||||
//     await _lendingPoolCoreInstance.decreaseReserveTotalBorrowsStableAndUpdateAverageRate(
 | 
			
		||||
//       ETHEREUM_ADDRESS,
 | 
			
		||||
//       WAD,
 | 
			
		||||
//       new BigNumber(RAY).multipliedBy(10).toFixed(),
 | 
			
		||||
//     )
 | 
			
		||||
 | 
			
		||||
//     const totalBorrows = await _lendingPoolCoreInstance.getReserveTotalBorrowsStable(ETHEREUM_ADDRESS)
 | 
			
		||||
 | 
			
		||||
//     expect(totalBorrows.toString()).to.be.equal("0")
 | 
			
		||||
//   })
 | 
			
		||||
 | 
			
		||||
//   it("Decreases the variable total borrows of a reserve", async () => {
 | 
			
		||||
//     await _lendingPoolCoreInstance.decreaseReserveTotalBorrowsVariable(ETHEREUM_ADDRESS, WAD)
 | 
			
		||||
 | 
			
		||||
//     const totalBorrows = await _lendingPoolCoreInstance.getReserveTotalBorrowsVariable(ETHEREUM_ADDRESS)
 | 
			
		||||
 | 
			
		||||
//     expect(totalBorrows.toString()).to.be.equal("0")
 | 
			
		||||
//   })
 | 
			
		||||
 | 
			
		||||
//   it("Updates the variable borrow index, checks that is equal to 1 as there are no borrows from the user", async () => {
 | 
			
		||||
//     await _lendingPoolCoreInstance.updateUserLastVariableBorrowCumulativeIndex(_lendAddress, deployer)
 | 
			
		||||
//     await _lendingPoolCoreInstance.updateUserLastVariableBorrowCumulativeIndex(ETHEREUM_ADDRESS, deployer)
 | 
			
		||||
 | 
			
		||||
//     const indexLEND = await _lendingPoolCoreInstance.getUserVariableBorrowCumulativeIndex(
 | 
			
		||||
//       _lendAddress,
 | 
			
		||||
//       deployer,
 | 
			
		||||
//     )
 | 
			
		||||
//     const indexETH = await _lendingPoolCoreInstance.getUserVariableBorrowCumulativeIndex(ETHEREUM_ADDRESS, deployer)
 | 
			
		||||
 | 
			
		||||
//     expect(indexLEND.toString()).to.be.equal(RAY, "Invalid user borrow index for LEND")
 | 
			
		||||
//     expect(indexETH.toString()).to.be.equal(RAY, "Invalid user borrow index for ETH")
 | 
			
		||||
//   })
 | 
			
		||||
 | 
			
		||||
//   it("Disables the LEND collateral", async () => {
 | 
			
		||||
//     await _lendingPoolCoreInstance.disableReserveAsCollateral(_lendAddress)
 | 
			
		||||
 | 
			
		||||
//     const collateralEnabled = await _lendingPoolCoreInstance.isReserveUsageAsCollateralEnabled(
 | 
			
		||||
//       _lendAddress,
 | 
			
		||||
//     )
 | 
			
		||||
 | 
			
		||||
//     expect(collateralEnabled).to.be.equal(false)
 | 
			
		||||
//   })
 | 
			
		||||
 | 
			
		||||
//   it("Deactivates the ETH reserve", async () => {
 | 
			
		||||
//     await _lendingPoolCoreInstance.disableBorrowingOnReserve(ETHEREUM_ADDRESS)
 | 
			
		||||
 | 
			
		||||
//     const isEnabled = await _lendingPoolCoreInstance.isReserveBorrowingEnabled(ETHEREUM_ADDRESS)
 | 
			
		||||
 | 
			
		||||
//     expect(isEnabled).to.be.equal(false)
 | 
			
		||||
//   })
 | 
			
		||||
 | 
			
		||||
// })
 | 
			
		||||
// */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,278 +1,256 @@
 | 
			
		|||
// import {
 | 
			
		||||
//   LendingPoolInstance,
 | 
			
		||||
//   LendingPoolCoreInstance,
 | 
			
		||||
//   IPriceOracleInstance,
 | 
			
		||||
//   MockFlashLoanReceiverInstance,
 | 
			
		||||
//   TokenDistributorInstance,
 | 
			
		||||
//   MintableERC20Instance,
 | 
			
		||||
//   ATokenInstance,
 | 
			
		||||
// } from '../utils/typechain-types/truffle-contracts';
 | 
			
		||||
// import {iATokenBase, iAssetsWithoutETH, ITestEnvWithoutInstances} from '../utils/types';
 | 
			
		||||
// import BigNumber from 'bignumber.js';
 | 
			
		||||
// import {
 | 
			
		||||
//   APPROVAL_AMOUNT_LENDING_POOL_CORE,
 | 
			
		||||
//   oneEther,
 | 
			
		||||
//   oneRay,
 | 
			
		||||
//   ETHEREUM_ADDRESS,
 | 
			
		||||
// } from '../utils/constants';
 | 
			
		||||
// import {testEnvProviderWithoutInstances} from '../utils/truffle/dlp-tests-env';
 | 
			
		||||
// import {convertToCurrencyDecimals} from '../utils/misc-utils';
 | 
			
		||||
import {TestEnv, makeSuite} from "./helpers/make-suite";
 | 
			
		||||
import {
 | 
			
		||||
  MOCK_ETH_ADDRESS,
 | 
			
		||||
  APPROVAL_AMOUNT_LENDING_POOL_CORE,
 | 
			
		||||
  oneRay,
 | 
			
		||||
} from "../helpers/constants";
 | 
			
		||||
import {
 | 
			
		||||
  convertToCurrencyDecimals,
 | 
			
		||||
  getMockFlashLoanReceiver,
 | 
			
		||||
  getTokenDistributor,
 | 
			
		||||
} from "../helpers/contracts-helpers";
 | 
			
		||||
import {ethers} from "ethers";
 | 
			
		||||
import {MockFlashLoanReceiver} from "../types/MockFlashLoanReceiver";
 | 
			
		||||
import {TokenDistributor} from "../types/TokenDistributor";
 | 
			
		||||
import {BRE} from "../helpers/misc-utils";
 | 
			
		||||
import {ProtocolErrors} from "../helpers/types";
 | 
			
		||||
import BigNumber from "bignumber.js";
 | 
			
		||||
 | 
			
		||||
// const expectRevert = require('@openzeppelin/test-helpers').expectRevert;
 | 
			
		||||
const {expect} = require("chai");
 | 
			
		||||
 | 
			
		||||
// const {expect} = require('chai');
 | 
			
		||||
makeSuite("LendingPool FlashLoan function", (testEnv: TestEnv) => {
 | 
			
		||||
  let _mockFlashLoanReceiver = {} as MockFlashLoanReceiver;
 | 
			
		||||
  let _tokenDistributor = {} as TokenDistributor;
 | 
			
		||||
  const {
 | 
			
		||||
    INCONSISTENT_PROTOCOL_BALANCE,
 | 
			
		||||
    TOO_SMALL_FLASH_LOAN,
 | 
			
		||||
    NOT_ENOUGH_LIQUIDITY_TO_BORROW,
 | 
			
		||||
  } = ProtocolErrors;
 | 
			
		||||
 | 
			
		||||
// contract('LendingPool FlashLoan function', async ([deployer, ...users]) => {
 | 
			
		||||
//   let _testEnvProvider: ITestEnvWithoutInstances;
 | 
			
		||||
//   let _lendingPoolInstance: LendingPoolInstance;
 | 
			
		||||
//   let _lendingPoolCoreInstance: LendingPoolCoreInstance;
 | 
			
		||||
//   let _mockFlashLoanReceiverInstance: MockFlashLoanReceiverInstance;
 | 
			
		||||
//   let _priceOracleInstance: IPriceOracleInstance;
 | 
			
		||||
//   let _aTokenInstances: iATokenBase<ATokenInstance>;
 | 
			
		||||
//   let _tokenInstances: iAssetsWithoutETH<MintableERC20Instance>;
 | 
			
		||||
//   let _tokenDistributor: TokenDistributorInstance;
 | 
			
		||||
//   let _daiAddress: string;
 | 
			
		||||
//   let _depositorAddress: string;
 | 
			
		||||
//   let _web3: Web3;
 | 
			
		||||
//   let _initialDepositorETHBalance: string;
 | 
			
		||||
  before(async () => {
 | 
			
		||||
    _mockFlashLoanReceiver = await getMockFlashLoanReceiver();
 | 
			
		||||
    _tokenDistributor = await getTokenDistributor();
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
//   before('Initializing LendingPool test variables', async () => {
 | 
			
		||||
//     console.time('setup-test');
 | 
			
		||||
//     _testEnvProvider = await testEnvProviderWithoutInstances(artifacts, [deployer, ...users]);
 | 
			
		||||
  it("Deposits ETH into the reserve", async () => {
 | 
			
		||||
    const {pool} = testEnv;
 | 
			
		||||
    const amountToDeposit = ethers.utils.parseEther("1");
 | 
			
		||||
 | 
			
		||||
//     const {
 | 
			
		||||
//       getWeb3,
 | 
			
		||||
//       getAllAssetsInstances,
 | 
			
		||||
//       getFirstDepositorAddressOnTests,
 | 
			
		||||
//       getLendingPoolInstance,
 | 
			
		||||
//       getLendingPoolCoreInstance,
 | 
			
		||||
//       getPriceOracleInstance,
 | 
			
		||||
//       getATokenInstances,
 | 
			
		||||
//       getMockFlashLoanReceiverInstance,
 | 
			
		||||
//       getTokenDistributorInstance,
 | 
			
		||||
//     } = _testEnvProvider;
 | 
			
		||||
    await pool.deposit(MOCK_ETH_ADDRESS, amountToDeposit, "0", {
 | 
			
		||||
      value: amountToDeposit,
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
//     const instances = await Promise.all([
 | 
			
		||||
//       getLendingPoolInstance(),
 | 
			
		||||
//       getLendingPoolCoreInstance(),
 | 
			
		||||
//       getPriceOracleInstance(),
 | 
			
		||||
//       getATokenInstances(),
 | 
			
		||||
//       getMockFlashLoanReceiverInstance(),
 | 
			
		||||
//       getAllAssetsInstances(),
 | 
			
		||||
//       getTokenDistributorInstance(),
 | 
			
		||||
//     ]);
 | 
			
		||||
  it("Takes ETH flashloan, returns the funds correctly", async () => {
 | 
			
		||||
    const {pool, deployer} = testEnv;
 | 
			
		||||
 | 
			
		||||
//     _lendingPoolInstance = instances[0];
 | 
			
		||||
//     _lendingPoolCoreInstance = instances[1];
 | 
			
		||||
//     _priceOracleInstance = instances[2];
 | 
			
		||||
//     _aTokenInstances = instances[3];
 | 
			
		||||
//     _mockFlashLoanReceiverInstance = instances[4];
 | 
			
		||||
//     _tokenInstances = instances[5];
 | 
			
		||||
//     _daiAddress = _tokenInstances.DAI.address;
 | 
			
		||||
//     _depositorAddress = await getFirstDepositorAddressOnTests();
 | 
			
		||||
//     _tokenDistributor = instances[6];
 | 
			
		||||
    // move funds to the MockFlashLoanReceiver contract to pay the fee
 | 
			
		||||
    await deployer.signer.sendTransaction({
 | 
			
		||||
      value: ethers.utils.parseEther("0.5"),
 | 
			
		||||
      to: _mockFlashLoanReceiver.address,
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
//     _web3 = await getWeb3();
 | 
			
		||||
//     _initialDepositorETHBalance = await _web3.eth.getBalance(_depositorAddress);
 | 
			
		||||
    await pool.flashLoan(
 | 
			
		||||
      _mockFlashLoanReceiver.address,
 | 
			
		||||
      MOCK_ETH_ADDRESS,
 | 
			
		||||
      ethers.utils.parseEther("0.8"),
 | 
			
		||||
      "0x10"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
//     console.timeEnd('setup-test');
 | 
			
		||||
//   });
 | 
			
		||||
    ethers.utils.parseUnits("10000");
 | 
			
		||||
 | 
			
		||||
//   it('Deposits ETH into the reserve', async () => {
 | 
			
		||||
//     const amountToDeposit = await convertToCurrencyDecimals(ETHEREUM_ADDRESS, '1');
 | 
			
		||||
    const reserveData: any = await pool.getReserveData(MOCK_ETH_ADDRESS);
 | 
			
		||||
    const tokenDistributorBalance = await BRE.ethers.provider.getBalance(
 | 
			
		||||
      _tokenDistributor.address
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
//     await _lendingPoolInstance.deposit(ETHEREUM_ADDRESS, amountToDeposit, '0', {
 | 
			
		||||
//       from: _depositorAddress,
 | 
			
		||||
//       value: amountToDeposit,
 | 
			
		||||
//     });
 | 
			
		||||
//   });
 | 
			
		||||
    const currentLiquidityRate = reserveData.liquidityRate;
 | 
			
		||||
    const currentLiquidityIndex = reserveData.liquidityIndex;
 | 
			
		||||
 | 
			
		||||
//   it('Takes ETH flashloan, returns the funds correctly', async () => {
 | 
			
		||||
//     //move funds to the MockFlashLoanReceiver contract
 | 
			
		||||
    expect(reserveData.totalLiquidity).to.be.bignumber.equal(
 | 
			
		||||
      "1000504000000000000"
 | 
			
		||||
    );
 | 
			
		||||
    expect(currentLiquidityRate).to.be.bignumber.equal("0");
 | 
			
		||||
    expect(currentLiquidityIndex).to.be.bignumber.equal(
 | 
			
		||||
      "1000504000000000000000000000"
 | 
			
		||||
    );
 | 
			
		||||
    expect(tokenDistributorBalance).to.be.bignumber.equal("216000000000000");
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
//     let send = web3.eth.sendTransaction({
 | 
			
		||||
//       from: deployer,
 | 
			
		||||
//       to: _mockFlashLoanReceiverInstance.address,
 | 
			
		||||
//       value: web3.utils.toWei('0.5', 'ether'),
 | 
			
		||||
//     });
 | 
			
		||||
  it("Takes an ETH flashloan as big as the available liquidity", async () => {
 | 
			
		||||
    const {pool, deployer} = testEnv;
 | 
			
		||||
 | 
			
		||||
//     const txResult = await _lendingPoolInstance.flashLoan(
 | 
			
		||||
//       _mockFlashLoanReceiverInstance.address,
 | 
			
		||||
//       ETHEREUM_ADDRESS,
 | 
			
		||||
//       new BigNumber(0.8).multipliedBy(oneEther),
 | 
			
		||||
//       '0x10'
 | 
			
		||||
//     );
 | 
			
		||||
    // move funds to the MockFlashLoanReceiver contract to pay the fee
 | 
			
		||||
    await deployer.signer.sendTransaction({
 | 
			
		||||
      value: ethers.utils.parseEther("0.5"),
 | 
			
		||||
      to: _mockFlashLoanReceiver.address,
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
//     const reserveData: any = await _lendingPoolInstance.getReserveData(ETHEREUM_ADDRESS);
 | 
			
		||||
//     const tokenDistributorBalance = await _web3.eth.getBalance(_tokenDistributor.address);
 | 
			
		||||
    const txResult = await pool.flashLoan(
 | 
			
		||||
      _mockFlashLoanReceiver.address,
 | 
			
		||||
      MOCK_ETH_ADDRESS,
 | 
			
		||||
      "1000504000000000000",
 | 
			
		||||
      "0x10"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
//     const currentLiquidityRate = reserveData.liquidityRate;
 | 
			
		||||
//     const currentLiquidityIndex = reserveData.liquidityIndex;
 | 
			
		||||
    const reserveData: any = await pool.getReserveData(MOCK_ETH_ADDRESS);
 | 
			
		||||
    const tokenDistributorBalance = await BRE.ethers.provider.getBalance(
 | 
			
		||||
      _tokenDistributor.address
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
//     expect(reserveData.totalLiquidity.toString()).to.be.equal('1000504000000000000');
 | 
			
		||||
//     expect(currentLiquidityRate.toString()).to.be.equal('0');
 | 
			
		||||
//     expect(currentLiquidityIndex.toString()).to.be.equal('1000504000000000000000000000');
 | 
			
		||||
//     expect(tokenDistributorBalance.toString()).to.be.equal('216000000000000');
 | 
			
		||||
//   });
 | 
			
		||||
    const currentLiqudityRate = reserveData.liquidityRate;
 | 
			
		||||
    const currentLiquidityIndex = reserveData.liquidityIndex;
 | 
			
		||||
 | 
			
		||||
//   it('Takes an ETH flashloan as big as the available liquidity', async () => {
 | 
			
		||||
//     //move funds to the MockFlashLoanReceiver contract
 | 
			
		||||
    expect(reserveData.totalLiquidity).to.be.bignumber.equal(
 | 
			
		||||
      "1001134317520000000"
 | 
			
		||||
    );
 | 
			
		||||
    expect(currentLiqudityRate).to.be.bignumber.equal("0");
 | 
			
		||||
    expect(currentLiquidityIndex).to.be.bignumber.equal(
 | 
			
		||||
      "1001134317520000000000000000"
 | 
			
		||||
    );
 | 
			
		||||
    expect(tokenDistributorBalance).to.be.bignumber.equal("486136080000000");
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
//     let send = web3.eth.sendTransaction({
 | 
			
		||||
//       from: deployer,
 | 
			
		||||
//       to: _mockFlashLoanReceiverInstance.address,
 | 
			
		||||
//       value: web3.utils.toWei('0.5', 'ether'),
 | 
			
		||||
//     });
 | 
			
		||||
  it("Takes ETH flashloan, does not return the funds (revert expected)", async () => {
 | 
			
		||||
    const {pool, deployer} = testEnv;
 | 
			
		||||
 | 
			
		||||
//     const txResult = await _lendingPoolInstance.flashLoan(
 | 
			
		||||
//       _mockFlashLoanReceiverInstance.address,
 | 
			
		||||
//       ETHEREUM_ADDRESS,
 | 
			
		||||
//       '1000504000000000000',
 | 
			
		||||
//       '0x10'
 | 
			
		||||
//     );
 | 
			
		||||
    // move funds to the MockFlashLoanReceiver contract to pay the fee
 | 
			
		||||
    await deployer.signer.sendTransaction({
 | 
			
		||||
      value: ethers.utils.parseEther("0.5"),
 | 
			
		||||
      to: _mockFlashLoanReceiver.address,
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
//     const reserveData: any = await _lendingPoolInstance.getReserveData(ETHEREUM_ADDRESS);
 | 
			
		||||
//     const tokenDistributorBalance = await _web3.eth.getBalance(_tokenDistributor.address);
 | 
			
		||||
    await _mockFlashLoanReceiver.setFailExecutionTransfer(true);
 | 
			
		||||
 | 
			
		||||
//     const currentLiqudityRate = reserveData.liquidityRate;
 | 
			
		||||
//     const currentLiquidityIndex = reserveData.liquidityIndex;
 | 
			
		||||
    await expect(
 | 
			
		||||
      pool.flashLoan(
 | 
			
		||||
        _mockFlashLoanReceiver.address,
 | 
			
		||||
        MOCK_ETH_ADDRESS,
 | 
			
		||||
        ethers.utils.parseEther("0.8"),
 | 
			
		||||
        "0x10"
 | 
			
		||||
      ),
 | 
			
		||||
      INCONSISTENT_PROTOCOL_BALANCE
 | 
			
		||||
    ).to.be.revertedWith(INCONSISTENT_PROTOCOL_BALANCE);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
//     expect(reserveData.totalLiquidity.toString()).to.be.equal('1001134317520000000');
 | 
			
		||||
//     expect(currentLiqudityRate.toString()).to.be.equal('0');
 | 
			
		||||
//     expect(currentLiquidityIndex.toString()).to.be.equal('1001134317520000000000000000');
 | 
			
		||||
//     expect(tokenDistributorBalance.toString()).to.be.equal('486136080000000');
 | 
			
		||||
//   });
 | 
			
		||||
  it("tries to take a very small flashloan, which would result in 0 fees (revert expected)", async () => {
 | 
			
		||||
    const {pool} = testEnv;
 | 
			
		||||
 | 
			
		||||
//   it('Takes ETH flashloan, does not return the funds (revert expected)', async () => {
 | 
			
		||||
//     //move funds to the MockFlashLoanReceiver contract
 | 
			
		||||
    await expect(
 | 
			
		||||
      pool.flashLoan(
 | 
			
		||||
        _mockFlashLoanReceiver.address,
 | 
			
		||||
        MOCK_ETH_ADDRESS,
 | 
			
		||||
        "1", //1 wei loan
 | 
			
		||||
        "0x10"
 | 
			
		||||
      ),
 | 
			
		||||
      TOO_SMALL_FLASH_LOAN
 | 
			
		||||
    ).to.be.revertedWith(TOO_SMALL_FLASH_LOAN);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
//     let send = web3.eth.sendTransaction({
 | 
			
		||||
//       from: deployer,
 | 
			
		||||
//       to: _mockFlashLoanReceiverInstance.address,
 | 
			
		||||
//       value: web3.utils.toWei('0.5', 'ether'),
 | 
			
		||||
//     });
 | 
			
		||||
  it("tries to take a flashloan that is bigger than the available liquidity (revert expected)", async () => {
 | 
			
		||||
    const {pool} = testEnv;
 | 
			
		||||
 | 
			
		||||
//     await _mockFlashLoanReceiverInstance.setFailExecutionTransfer(true);
 | 
			
		||||
    await expect(
 | 
			
		||||
      pool.flashLoan(
 | 
			
		||||
        _mockFlashLoanReceiver.address,
 | 
			
		||||
        MOCK_ETH_ADDRESS,
 | 
			
		||||
        "1004415000000000000", //slightly higher than the available liquidity
 | 
			
		||||
        "0x10"
 | 
			
		||||
      ),
 | 
			
		||||
      NOT_ENOUGH_LIQUIDITY_TO_BORROW
 | 
			
		||||
    ).to.be.revertedWith(NOT_ENOUGH_LIQUIDITY_TO_BORROW);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
//     await expectRevert(
 | 
			
		||||
//       _lendingPoolInstance.flashLoan(
 | 
			
		||||
//         _mockFlashLoanReceiverInstance.address,
 | 
			
		||||
//         ETHEREUM_ADDRESS,
 | 
			
		||||
//         new BigNumber(0.8).multipliedBy(oneEther),
 | 
			
		||||
//         '0x10'
 | 
			
		||||
//       ),
 | 
			
		||||
//       'The actual balance of the protocol is inconsistent'
 | 
			
		||||
//     );
 | 
			
		||||
//   });
 | 
			
		||||
  it("tries to take a flashloan using a non contract address as receiver (revert expected)", async () => {
 | 
			
		||||
    const {pool, deployer} = testEnv;
 | 
			
		||||
 | 
			
		||||
//   it('tries to take a very small flashloan, which would result in 0 fees (revert expected)', async () => {
 | 
			
		||||
//     //move funds to the MockFlashLoanReceiver contract
 | 
			
		||||
    await expect(
 | 
			
		||||
      pool.flashLoan(
 | 
			
		||||
        deployer.address,
 | 
			
		||||
        MOCK_ETH_ADDRESS,
 | 
			
		||||
        "1000000000000000000",
 | 
			
		||||
        "0x10"
 | 
			
		||||
      )
 | 
			
		||||
    ).to.be.reverted;
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
//     await expectRevert(
 | 
			
		||||
//       _lendingPoolInstance.flashLoan(
 | 
			
		||||
//         _mockFlashLoanReceiverInstance.address,
 | 
			
		||||
//         ETHEREUM_ADDRESS,
 | 
			
		||||
//         '1', //1 wei loan
 | 
			
		||||
//         '0x10'
 | 
			
		||||
//       ),
 | 
			
		||||
//       'The requested amount is too small for a flashLoan.'
 | 
			
		||||
//     );
 | 
			
		||||
//   });
 | 
			
		||||
  it("Deposits DAI into the reserve", async () => {
 | 
			
		||||
    const {dai, core, pool} = testEnv;
 | 
			
		||||
 | 
			
		||||
//   it('tries to take a flashloan that is bigger than the available liquidity (revert expected)', async () => {
 | 
			
		||||
//     //move funds to the MockFlashLoanReceiver contract
 | 
			
		||||
    await dai.mint(await convertToCurrencyDecimals(dai.address, "1000"));
 | 
			
		||||
 | 
			
		||||
//     await expectRevert(
 | 
			
		||||
//       _lendingPoolInstance.flashLoan(
 | 
			
		||||
//         _mockFlashLoanReceiverInstance.address,
 | 
			
		||||
//         ETHEREUM_ADDRESS,
 | 
			
		||||
//         '1004415000000000000', //slightly higher than the available liquidity
 | 
			
		||||
//         '0x10'
 | 
			
		||||
//       ),
 | 
			
		||||
//       'There is not enough liquidity available to borrow'
 | 
			
		||||
//     );
 | 
			
		||||
//   });
 | 
			
		||||
    await dai.approve(core.address, APPROVAL_AMOUNT_LENDING_POOL_CORE);
 | 
			
		||||
 | 
			
		||||
//   it('tries to take a flashloan using a non contract address as receiver (revert expected)', async () => {
 | 
			
		||||
//     //move funds to the MockFlashLoanReceiver contract
 | 
			
		||||
    const amountToDeposit = await convertToCurrencyDecimals(
 | 
			
		||||
      dai.address,
 | 
			
		||||
      "1000"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
//     await expectRevert(
 | 
			
		||||
//       _lendingPoolInstance.flashLoan(deployer, ETHEREUM_ADDRESS, '1000000000000000000', '0x10'),
 | 
			
		||||
//       'revert'
 | 
			
		||||
//     );
 | 
			
		||||
//   });
 | 
			
		||||
    await pool.deposit(dai.address, amountToDeposit, "0");
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
//   it('Deposits DAI into the reserve', async () => {
 | 
			
		||||
//     const {DAI: daiInstance} = _tokenInstances;
 | 
			
		||||
  it("Takes out a 500 DAI flashloan, returns the funds correctly", async () => {
 | 
			
		||||
    const {dai, pool, deployer: depositor} = testEnv;
 | 
			
		||||
 | 
			
		||||
//     //mints DAI to depositor
 | 
			
		||||
//     await daiInstance.mint(await convertToCurrencyDecimals(daiInstance.address, '1000'), {
 | 
			
		||||
//       from: _depositorAddress,
 | 
			
		||||
//     });
 | 
			
		||||
    await _mockFlashLoanReceiver.setFailExecutionTransfer(false);
 | 
			
		||||
 | 
			
		||||
//     //approve protocol to access depositor wallet
 | 
			
		||||
//     await daiInstance.approve(_lendingPoolCoreInstance.address, APPROVAL_AMOUNT_LENDING_POOL_CORE, {
 | 
			
		||||
//       from: _depositorAddress,
 | 
			
		||||
//     });
 | 
			
		||||
    await pool.flashLoan(
 | 
			
		||||
      _mockFlashLoanReceiver.address,
 | 
			
		||||
      dai.address,
 | 
			
		||||
      ethers.utils.parseEther("500"),
 | 
			
		||||
      "0x10"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
//     const amountToDeposit = await convertToCurrencyDecimals(_daiAddress, '1000');
 | 
			
		||||
    const reserveData = await pool.getReserveData(dai.address);
 | 
			
		||||
    const userData = await pool.getUserReserveData(
 | 
			
		||||
      dai.address,
 | 
			
		||||
      depositor.address
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
//     await _lendingPoolInstance.deposit(daiInstance.address, amountToDeposit, '0', {
 | 
			
		||||
//       from: _depositorAddress,
 | 
			
		||||
//     });
 | 
			
		||||
//   });
 | 
			
		||||
    const totalLiquidity = reserveData.totalLiquidity.toString();
 | 
			
		||||
    const currentLiqudityRate = reserveData.liquidityRate.toString();
 | 
			
		||||
    const currentLiquidityIndex = reserveData.liquidityIndex.toString();
 | 
			
		||||
    const currentUserBalance = userData.currentATokenBalance.toString();
 | 
			
		||||
 | 
			
		||||
//   it('Takes out a 500 DAI flashloan, returns the funds correctly', async () => {
 | 
			
		||||
//     const {DAI: daiInstance} = _tokenInstances;
 | 
			
		||||
    const expectedLiquidity = ethers.utils.parseEther("1000.315");
 | 
			
		||||
 | 
			
		||||
//     await _mockFlashLoanReceiverInstance.setFailExecutionTransfer(false);
 | 
			
		||||
    const tokenDistributorBalance = await dai.balanceOf(
 | 
			
		||||
      _tokenDistributor.address
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
//     await _lendingPoolInstance.flashLoan(
 | 
			
		||||
//       _mockFlashLoanReceiverInstance.address,
 | 
			
		||||
//       _daiAddress,
 | 
			
		||||
//       new BigNumber(500).multipliedBy(oneEther),
 | 
			
		||||
//       '0x10'
 | 
			
		||||
//     );
 | 
			
		||||
    expect(totalLiquidity).to.be.equal(
 | 
			
		||||
      expectedLiquidity,
 | 
			
		||||
      "Invalid total liquidity"
 | 
			
		||||
    );
 | 
			
		||||
    expect(currentLiqudityRate).to.be.equal("0", "Invalid liquidity rate");
 | 
			
		||||
    expect(currentLiquidityIndex).to.be.equal(
 | 
			
		||||
      new BigNumber("1.000315").multipliedBy(oneRay).toFixed(),
 | 
			
		||||
      "Invalid liquidity index"
 | 
			
		||||
    );
 | 
			
		||||
    expect(currentUserBalance.toString()).to.be.equal(
 | 
			
		||||
      expectedLiquidity,
 | 
			
		||||
      "Invalid user balance"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
//     const reserveData: any = await _lendingPoolInstance.getReserveData(_daiAddress);
 | 
			
		||||
//     const userData: any = await _lendingPoolInstance.getUserReserveData(_daiAddress, deployer);
 | 
			
		||||
    expect(tokenDistributorBalance.toString()).to.be.equal(
 | 
			
		||||
      ethers.utils.parseEther("0.135"),
 | 
			
		||||
      "Invalid token distributor balance"
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
//     const totalLiquidity = reserveData.totalLiquidity.toString();
 | 
			
		||||
//     const currentLiqudityRate = reserveData.liquidityRate.toString();
 | 
			
		||||
//     const currentLiquidityIndex = reserveData.liquidityIndex.toString();
 | 
			
		||||
//     const currentUserBalance = userData.currentATokenBalance.toString();
 | 
			
		||||
  it("Takes out a 500 DAI flashloan, does not return the funds (revert expected)", async () => {
 | 
			
		||||
    const {dai, pool} = testEnv;
 | 
			
		||||
 | 
			
		||||
//     const expectedLiquidity = new BigNumber('1000.315').multipliedBy(oneEther).toFixed();
 | 
			
		||||
    await _mockFlashLoanReceiver.setFailExecutionTransfer(true);
 | 
			
		||||
 | 
			
		||||
//     const tokenDistributorBalance = await daiInstance.balanceOf(_tokenDistributor.address);
 | 
			
		||||
 | 
			
		||||
//     expect(totalLiquidity).to.be.equal(expectedLiquidity, 'Invalid total liquidity');
 | 
			
		||||
//     expect(currentLiqudityRate).to.be.equal('0', 'Invalid liquidity rate');
 | 
			
		||||
//     expect(currentLiquidityIndex).to.be.equal(
 | 
			
		||||
//       new BigNumber('1.000315').multipliedBy(oneRay).toFixed(),
 | 
			
		||||
//       'Invalid liquidity index'
 | 
			
		||||
//     );
 | 
			
		||||
//     expect(currentUserBalance.toString()).to.be.equal(expectedLiquidity, 'Invalid user balance');
 | 
			
		||||
 | 
			
		||||
//     expect(tokenDistributorBalance.toString()).to.be.equal(
 | 
			
		||||
//       new BigNumber('0.135').multipliedBy(oneEther).toFixed(),
 | 
			
		||||
//       'Invalid token distributor balance'
 | 
			
		||||
//     );
 | 
			
		||||
//   });
 | 
			
		||||
 | 
			
		||||
//   it('Takes out a 500 DAI flashloan, does not return the funds (revert expected)', async () => {
 | 
			
		||||
//     //move funds to the MockFlashLoanReceiver contract
 | 
			
		||||
 | 
			
		||||
//     await _mockFlashLoanReceiverInstance.setFailExecutionTransfer(true);
 | 
			
		||||
 | 
			
		||||
//     await expectRevert(
 | 
			
		||||
//       _lendingPoolInstance.flashLoan(
 | 
			
		||||
//         _mockFlashLoanReceiverInstance.address,
 | 
			
		||||
//         _daiAddress,
 | 
			
		||||
//         new BigNumber(500).multipliedBy(oneEther),
 | 
			
		||||
//         '0x10'
 | 
			
		||||
//       ),
 | 
			
		||||
//       'The actual balance of the protocol is inconsistent'
 | 
			
		||||
//     );
 | 
			
		||||
//   });
 | 
			
		||||
// });
 | 
			
		||||
    await expect(
 | 
			
		||||
      pool.flashLoan(
 | 
			
		||||
        _mockFlashLoanReceiver.address,
 | 
			
		||||
        dai.address,
 | 
			
		||||
        ethers.utils.parseEther("500"),
 | 
			
		||||
        "0x10"
 | 
			
		||||
      ),
 | 
			
		||||
      INCONSISTENT_PROTOCOL_BALANCE
 | 
			
		||||
    ).to.be.revertedWith(INCONSISTENT_PROTOCOL_BALANCE);
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
import {evmRevert, evmSnapshot} from "../../helpers/misc-utils";
 | 
			
		||||
import {evmRevert, evmSnapshot, BRE} from "../../helpers/misc-utils";
 | 
			
		||||
import {TEST_SNAPSHOT_ID} from "../../helpers/constants";
 | 
			
		||||
import {Signer} from "ethers";
 | 
			
		||||
import {
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +41,13 @@ export interface TestEnv {
 | 
			
		|||
  aDai: AToken;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
let buidlerevmSnapshotId: string = "0x1";
 | 
			
		||||
const setBuidlerevmSnapshotId = (id: string) => {
 | 
			
		||||
  if (BRE.network.name === "buidlerevm") {
 | 
			
		||||
    buidlerevmSnapshotId = id;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export function makeSuite(name: string, tests: (testEnv: TestEnv) => void) {
 | 
			
		||||
  describe(name, () => {
 | 
			
		||||
    const testEnv: TestEnv = {
 | 
			
		||||
| 
						 | 
				
			
			@ -56,7 +63,7 @@ export function makeSuite(name: string, tests: (testEnv: TestEnv) => void) {
 | 
			
		|||
    } as TestEnv;
 | 
			
		||||
    before(async () => {
 | 
			
		||||
      console.time("makeSuite");
 | 
			
		||||
      await evmSnapshot();
 | 
			
		||||
      setBuidlerevmSnapshotId(await evmSnapshot());
 | 
			
		||||
      const [_deployer, ...restSigners] = await getEthersSigners();
 | 
			
		||||
      const deployer: SignerWithAddress = {
 | 
			
		||||
        address: await _deployer.getAddress(),
 | 
			
		||||
| 
						 | 
				
			
			@ -97,7 +104,7 @@ export function makeSuite(name: string, tests: (testEnv: TestEnv) => void) {
 | 
			
		|||
    });
 | 
			
		||||
    tests(testEnv);
 | 
			
		||||
    after(async () => {
 | 
			
		||||
      await evmRevert(TEST_SNAPSHOT_ID);
 | 
			
		||||
      await evmRevert(buidlerevmSnapshotId);
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user